【已解决】bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


梁修道
Posts: 41

你好 我们使用基于bk3432的涂鸦蓝牙sdk进行二次开发,子设备绑定网关后,子设备端低功耗断开连接后,需要主动连接网关上报数据,需要如何操作,比如调整广播内容?相关代码和调用api方法可以指导下吗

User avatar
zengyun
Posts: 34

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版本。

User avatar
zengyun
Posts: 34

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

补充一点,你需要在请求网关连接的同时将广播间隔设置为一个较小的值(100ms以内)以便网关快速发现并连接。在超时取消后恢复原有的间隔以降低功耗。

梁修道
Posts: 41

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 这个版本,麻烦看下修改的方式一不一致 谢谢

梁修道
Posts: 41

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

早期版本里面没有 tuya_ble_adv_data_connecting_request_set 这个函数

User avatar
zengyun
Posts: 34

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));

}
梁修道
Posts: 41

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

好的 是否可以用这个函数替代以前的tuya_ble_adv_change?

User avatar
zengyun
Posts: 34

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

梁修道 2022年 Nov 24日 19:05

好的 是否可以用这个函数替代以前的tuya_ble_adv_change?

不建议哈,tuya_ble_adv_change在基线里有调用。

梁修道
Posts: 41

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

你好 2.x.x版本对比1.3的版本,有哪些升级,我们目前开发新产品,是否需要移植过去?

User avatar
zengyun
Posts: 34

Re: bk3432 涂鸦蓝牙sdk,子设备端如何主动连接网关上报数据

新产品的话建议您升级。在2.x.x中,我们有适配新的能力,传输速率上也有提升,还有其他的优化,例如支持广播名自定义,最大14字节。

Post Reply