应用开发

更新时间: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

设备蓝牙初连接或蓝牙绑定后,移动端应用会发送查询指令,触发设备上报当前的 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;
	}
}

在 App 上解绑设备

当设备处于连接状态时,若用户在移动端应用上点击 解除绑定 按钮,设备将解除用户绑定关系并进入未绑定状态。与此同时涂鸦蓝牙 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;
	}
}

在 App 上重置设备

当设备处于连接状态时,若用户在移动端应用操作了移除并清除云端数据,表示对设备进行重置操作,此时云端会擦除该设备虚拟 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