更新时间:2022-11-24 09:20:11下载pdf
本文介绍了涂鸦蓝牙 SDK 开发过程中常使用的功能,方便您更快的进行设备应用程序开发。
设备应用程序需要通过蓝牙上报数据给移动端应用或涂鸦蓝牙网关。可以调用 tuya_ble_dp_data_send
函数,上报 DP 数据,同步设备状态。
代码示例
static uint32_t test_sn = 0;
uint8_t dpvalue[128]={0x0A, 0x01,0x00,0x01,0x00};
tuya_ble_dp_data_send(test_sn++, 0, 0, 0, dpvalue, 5);
//设备主动上报 DP10,bool 类型,长度为 1,数据为 false
当产品需要需要设备上报离线缓存的数据时,可使用带时间戳上报函数 tuya_ble_dp_data_with_time_send
。该函数与数据上报函数类似。
代码示例
static uint32_t test_sn = 0;
uint8_t dpvalue[128]={0x0A, 0x01,0x00,0x01,0x00};
uint8_t time[128]="1628648755000" //2021-08-11 10:25:55
tuya_ble_dp_data_with_time_send (test_sn++, 0, 0, &time[0], dpvalue, 5);
//设备主动上报 DP10,bool 类型,长度为 1,数据为 false,并附带时间戳。
若移动端应用发送 DP 数据,蓝牙 SDK 则会发送 TUYA_BLE_CB_EVT_DP_DATA_RECEIVED
事件给设备应用程序。
通常设备在收到 DP 数据后,会进行相应的设备本地逻辑处理,然后再上报 DP 数据,使面板显示与设备状态保持一致。
接收数据格式:
typedef struct {
uint32_t sn; // sn :移动端应用定义的发送序号,逐次累加,设备应用程序按需使用。
uint8_t *p_data; // p_data 格式,详见 API 文档介绍。
uint16_t data_len; // data 长度
} tuya_ble_dp_data_received_data_t;
在消息队列的回调函数的 TUYA_BLE_CB_EVT_DP_DATA_RECEIVED
事件下,补充对应的处理逻辑。
代码示例
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_DP_DATA_RECEIVED: {
//执行设备本地操作,如开关控制
tuya_ble_dp_data_send(event->dp_received_data.sn, 0, 0, 0, event->dp_received_data.p_data, event->dp_received_data.data_len); //上报接收到的dp数据
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_DP_DATA_RECEIVED");
} break;
}
}
涂鸦蓝牙 SDK 每次蓝牙状态的变更,都会发送 TUYA_BLE_CB_EVT_CONNECTE_STATUS
事件给设备应用程序。各类状态如下所示:
typedef enum {
UNBONDING_UNCONN = 0, //未绑定未连接
UNBONDING_CONN, //未绑定已连接已认证
BONDING_UNCONN, //绑定未连接
BONDING_CONN, //已绑定已连接已认证
BONDING_UNAUTH_CONN, //已绑定已连接未认证
UNBONDING_UNAUTH_CONN, //未绑定已连接未认证
UNKNOW_STATUS //未知
} tuya_ble_connect_status_t;
当您需要在蓝牙状态变更时,触发设备某类逻辑时。可以在消息队列的回调函数 TUYA_BLE_CB_EVT_CONNECTE_STATUS
事件下,补充对应的处理逻辑。
代码示例
static tuya_ble_connect_status_t current_connect_status = UNKNOW_STATUS;
static tuya_ble_connect_status_t last_connect_status = UNKNOW_STATUS;
static void tuya_cb_handler(tuya_ble_cb_evt_param_t* event)
{
int16_t result = 0;
tuya_ble_status_t err_code;
switch (event->evt)
{
case TUYA_BLE_CB_EVT_CONNECTE_STATUS:
TUYA_APP_LOG_INFO("received tuya ble conncet status update event,currentconnect status = %d",event->connect_status);
if((event->connect_status == BONDING_CONN)&&(last_connect_status!=BONDING_CONN))
{
// 例如,设备应用程序需要按照状态的改变来触发某个功能时,就需要比较上一次收到的状态是否一样。Do something,比如设备 LED 闪烁方式变化
}
last_connect_status = event->connect_status;
break;
default:
break;
}
}
设备蓝牙初连接或蓝牙绑定后,移动端应用会发送查询指令,触发设备上报当前的 DP 初始值,以使面板同步设备当前的状态。此时涂鸦蓝牙 SDK 会发送 TUYA_BLE_CB_EVT_DP_QUERY
事件给设备应用程序。这里需要设备应用程序在消息队列的回调函数 TUYA_BLE_CB_EVT_DP_QUERY
事件下,补充对应的数据上报逻辑。
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_DP_QUERY: {
//上报设备初始 DP 数值。
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_DP_QUERY");
} break;
}
}
当设备处于连接状态时,若用户在移动端应用上点击 解除绑定 按钮,设备将解除用户绑定关系并进入未绑定状态。与此同时涂鸦蓝牙 SDK 会发送 TUYA_BLE_CB_EVT_UNBOUND
事件给设备应用程序。
若设备应用程序有相应的逻辑需要处理,可以在消息队列的回调函数 TUYA_BLE_CB_EVT_UNBOUND
事件下,补充对应的处理逻辑。
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_UNBOUND: {
//可补充对应处理函数
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_UNBOUND");
} break;
}
}
当设备处于连接状态时,若用户在移动端应用操作了移除并清除云端数据,表示对设备进行重置操作,此时云端会擦除该设备虚拟 ID 关联的设备历史数据。
当涂鸦蓝牙 SDK 收到该指令后则会清除 SDK 存储的设备虚拟 ID 信息,并且蓝牙状态将变成未绑定未连接状态。
涂鸦蓝牙 SDK 在收到该指令后,会发送 TUYA_BLE_CB_EVT_DEVICE_RESET
事件给设备应用程序。您可以在消息队列的回调函数下,补充对应的处理逻辑。
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_DEVICE_RESET: {
//可补充对应处理函数,通常设备亦可进行本地的初始化操作,比如恢复默认出厂设置。
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_DEVICE_RESET");
} break;
}
}
异常解绑又称作 离线移除。它指的是移动端应用在未连接蓝牙设备的情况下,在移动端应用上对该设备进行 解除绑定/解绑并清除数据,操作成功并同步至云端,此时设备端由于没收到蓝牙事件通知,因此依然处于绑定状态。
此后,设备进行蓝牙广播(绑定状态),如果任一移动端应用扫描到该设备,发现其广播是绑定状态但是该设备在云端的状态为未绑定状态,则会主动对其进行蓝牙连接,连接成功后发送异常解绑指令(该过程,移动端应用界面无任何变化),此时蓝牙设备将收到异常解绑事件,并进行异常解绑操作。
该触发事件为 TUYA_BLE_CB_EVT_ANOMALY_UNBOUND
。您可以在消息队列的回调函数 TUYA_BLE_CB_EVT_ANOMALY_UNBOUND
事件下,补充对应的处理逻辑。
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_ANOMALY_UNBOUND: {
//可补充对应处理函数
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_ANOMALY_UNBOUND");
} break;
}
}
设备应用程序可通过调用 tuya_ble_device_unbind()
完成设备本地解绑操作。解绑功能等同于移动端应用的 移除设备 操作。
该功能对产品来说非常重要,建议设备应用程序增加设备本地解绑的功能(如无此功能,容易出现设备被别人绑定,导致无法重新绑定设备的现象)。
该功能通常被用于外部按键或类似操作的触发,设备应用程序则调用该函数通知蓝牙 SDK 解除绑定关系。该函数不会清除涂鸦蓝牙 SDK 绑定信息中的设备虚拟ID。
tuya_ble_device_unbind()
和 tuya_ble_device_factory_reset()
是异步 API,被调用后并不会立即执行对应操作,而是会发送了对应的消息给涂鸦蓝牙 SDK,涂鸦蓝牙 SDK 执行完后便会发送该事件(TUYA_BLE_CB_EVT_UNBIND_RESET_RESPONSE
)给设备应用程序告知执行结果,所以设备应用程序调用完这两个 API 后不能阻塞时延时,也不能立即重启,否则可能会执行失败。
通过调用 tuya_ble_device_factory_reset()
完成设备重置操作,重置功能等同于移动端应用的 移除并清除云端数据 操作。
该功能通常被用于外部按键或类似操作的触发,设备应用程序则调用该函数通知蓝牙 SDK 解绑并清除数据。该函数会清除蓝牙 SDK 绑定信息中的设备虚拟 ID。
tuya_ble_device_unbind()
和 tuya_ble_device_factory_reset()
是异步API,被调用后并不会立即执行对应操作,而是会发送了对应的消息给涂鸦蓝牙 SDK,涂鸦蓝牙 SDK 执行完后便会发送该事件(TUYA_BLE_CB_EVT_UNBIND_RESET_RESPONSE
)给设备应用程序告知执行结果,所以设备应用程序调用完这两个 API 后不能阻塞时延时,也不能立即重启,否则可能会执行失败。
设备应用程序可通过调用 tuya_ble_time_req()
函数,从移动端应用处查询网络时间。用于同步设备本地时间。
移动端应用收到 SDK 的查询网络时间请求后,则将返回字符串格式的时间戳给 SDK。SDK 继而发送 TUYA_BLE_CB_EVT_TIME_STAMP
事件给设备应用程序。设备应用程序可以在对应消息队列的回调函数下,补充对应的处理逻辑。
数据格式
typedef struct{
uint8_t timestamp_string[14];
int16_t time_zone; //actual time zone Multiply by 100.
}tuya_ble_timestamp_data_t;
示例代码
static void tuya_ble_sdk_callback(tuya_ble_cb_evt_param_t* event)
{
switch(event->evt)
{
case TUYA_BLE_CB_EVT_TIME_STAMP: {
//可补充对应处理函数
TUYA_APP_LOG_INFO("TUYA_BLE_CB_EVT_TIME_STAMP");
} break;
}
}
如果设备应用程序想要获得当前的蓝牙网络状态。可通过调用 tuya_ble_connect_status_get()
查询。
想要了解更多附件功能详情,请参考 API。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈