你好 我们使用基于bk3432的涂鸦蓝牙sdk进行二次开发,子设备绑定网关后,子设备端低功耗断开连接后,需要主动连接网关上报数据,需要如何操作,比如调整广播内容?相关代码和调用api方法可以指导下吗
【已解决】bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
你好,当你的设备需要上报数据到网关的时候,你可以在广播标志中置位请求网关的连接,当网关收到携带该标志的时候会主动连接该设备,此时,你的设备可以进行数据上报。
具体的做法如下:
在2.x.x 的sdk中,对应3432_2.1.2sdk,API原型为tuya_ble_status_t tuya_ble_adv_data_connecting_request_set(uint8_t on_off);
on_off为1时,表示请求网关连接;on_off为0时,表示不请求。
你可以在设备需要被网关连接时,
(1). 调用tuya_ble_adv_data_connecting_request_set(1),同时启动一个一般30S超时的定时器,在超时后tuya_ble_adv_data_connecting_request_set(0)恢复。
(2). 另外,在TUYA_BLE_CB_EVT_CONNECTE_STATUS 事件里判断event->connect_status == BONDING_CONN时,取消(1)里面的定时器。然后在收到TUYA_BLE_CB_EVT_DP_QUERY事件后开始上报你的DP数据。
如果你使用的sdk是更早版本的,请告诉我你的sdk版本。
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
补充一点,你需要在请求网关连接的同时将广播间隔设置为一个较小的值(100ms以内)以便网关快速发现并连接。在超时取消后恢复原有的间隔以降低功耗。
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
zengyun 2022年 Nov 22日 18:23你好,当你的设备需要上报数据到网关的时候,你可以在广播标志中置位请求网关的连接,当网关收到携带该标志的时候会主动连接该设备,此时,你的设备可以进行数据上报。
具体的做法如下:
在2.x.x 的sdk中,对应3432_2.1.2sdk,API原型为tuya_ble_status_t tuya_ble_adv_data_connecting_request_set(uint8_t on_off);
on_off为1时,表示请求网关连接;on_off为0时,表示不请求。你可以在设备需要被网关连接时,
(1). 调用tuya_ble_adv_data_connecting_request_set(1),同时启动一个一般30S超时的定时器,在超时后tuya_ble_adv_data_connecting_request_set(0)恢复。
(2). 另外,在TUYA_BLE_CB_EVT_CONNECTE_STATUS 事件里判断event->connect_status == BONDING_CONN时,取消(1)里面的定时器。然后在收到TUYA_BLE_CB_EVT_DP_QUERY事件后开始上报你的DP数据。如果你使用的sdk是更早版本的,请告诉我你的sdk版本。
你好 我们用的是## [sdk_1.3.1] - 2021-05-12 这个版本,麻烦看下修改的方式一不一致 谢谢
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
早期版本里面没有 tuya_ble_adv_data_connecting_request_set 这个函数
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
对于1.3.1的sdk,你可以将如下函数复制到tuya_ble_main.c 中tuya_ble_adv_change()函数定义之后的位置,并且在tuya_ble_api.h中声明它。
代码如下:
Code: Select all
void tuya_ble_adv_data_connecting_request_set(uint8_t on_off)
{
uint8_t *aes_buf = NULL;
uint8_t aes_key[16];
uint8_t encry_device_id[DEVICE_ID_LEN];
memcpy(adv_data,adv_data_const,TUYA_BLE_ADV_DATA_LEN);
memcpy(&scan_rsp_data,scan_rsp_data_const,TUYA_BLE_SCAN_RSP_DATA_LEN);
adv_data[7] = 4+tuya_ble_current_para.pid_len;
adv_data[11] = tuya_ble_current_para.pid_type;
if(TUYA_BLE_DEVICE_SHARED)
{
scan_rsp_data[8] |=0x02 ;
}
else
{
scan_rsp_data[8] &=(~0x02);
}
scan_rsp_data[9] = TUYA_BLE_PROTOCOL_VERSION_HIGN;
scan_rsp_data[10] = TUYA_BLE_SECURE_CONNECTION_TYPE;
scan_rsp_data[11] = TUYA_BLE_DEVICE_COMMUNICATION_ABILITY>>8;
scan_rsp_data[12] = TUYA_BLE_DEVICE_COMMUNICATION_ABILITY;
if(tuya_ble_current_para.sys_settings.bound_flag == 1)
{
scan_rsp_data[8] |=0x80 ;
//
memcpy(aes_key,tuya_ble_current_para.sys_settings.login_key,LOGIN_KEY_LEN);
memcpy(aes_key+LOGIN_KEY_LEN,tuya_ble_current_para.auth_settings.device_id,16-LOGIN_KEY_LEN);
aes_buf = tuya_ble_malloc(200);
if(aes_buf==NULL)
{
return;
}
else
{
memset(aes_buf,0,200);
}
tuya_ble_encrypt_old_with_key(aes_key,tuya_ble_current_para.auth_settings.device_id,DEVICE_ID_LEN,aes_buf);
memcpy(&adv_data[12],(uint8_t *)(aes_buf+1),tuya_ble_current_para.pid_len);
tuya_ble_free(aes_buf);
memset(aes_key,0,sizeof(aes_key));
memcpy(aes_key,&adv_data[12],tuya_ble_current_para.pid_len);
tuya_ble_device_id_encrypt(aes_key,tuya_ble_current_para.pid_len,tuya_ble_current_para.auth_settings.device_id,DEVICE_ID_LEN,encry_device_id);
memcpy(&scan_rsp_data[14],encry_device_id,DEVICE_ID_LEN);
}
else
{
scan_rsp_data[8] &=(~0x80);
memcpy(&adv_data[12],tuya_ble_current_para.pid,tuya_ble_current_para.pid_len);
tuya_ble_device_id_encrypt(tuya_ble_current_para.pid,tuya_ble_current_para.pid_len,tuya_ble_current_para.auth_settings.device_id,DEVICE_ID_LEN,encry_device_id);
memcpy(&scan_rsp_data[14],encry_device_id,DEVICE_ID_LEN);
}
if(on_off)//on_off:1-Request Connection, 0-Cancel the requested connection.
{
scan_rsp_data[8] |= 0x01 ;
}
else
{
scan_rsp_data[8] &= (~0x01);
}
TUYA_BLE_LOG_INFO("adv data changed ,current bound flag = %d",tuya_ble_current_para.sys_settings.bound_flag);
tuya_ble_gap_advertising_adv_data_update(adv_data,sizeof(adv_data),scan_rsp_data,sizeof(scan_rsp_data));
}
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
好的 是否可以用这个函数替代以前的tuya_ble_adv_change?
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
不建议哈,tuya_ble_adv_change在基线里有调用。
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
你好 2.x.x版本对比1.3的版本,有哪些升级,我们目前开发新产品,是否需要移植过去?
Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据
新产品的话建议您升级。在2.x.x中,我们有适配新的能力,传输速率上也有提升,还有其他的优化,例如支持广播名自定义,最大14字节。