找回密码
 立即注册

微信扫码登录

查看: 608|回复: 10

[BLE SDK] tc321xl连接部分蓝牙从设备,为什么有的蓝牙从设备会配对失败呢?

[复制链接]

7

主题

15

回帖

77

积分

不屈白银

积分
77
发表于 2025-9-11 15:25:47 | 显示全部楼层 |阅读模式 来自 广东深圳
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: tc321x
SDK及版本: tc_ble_sdk-v4.0.2.1
你好,请问下,我现在用tc321x设备作为主设备,想要连接蓝牙从设备;
蓝牙从设备为从网上买的心率带和指拨设备;
当tc321x想要连接心率带的时候,会配对失败 [APP][SMP] paring fail;
当tc321x想要连接指拨的时候,可以配对成功 [APP][SMP] Security process done event:

为什么有的设备可以配对成功,有的设备配对不成功呢?
如果体现在telink sdk中,这个绑定配对的密码是由哪个函数接口来处理的呢?

额外再问一下,为什么有的蓝牙从设备绑定的时候,只要点配对就可以了,不用输入配对码;
而有的蓝牙从设备绑定的时候,点了配对需要输入配对pin码呢?
这两个步骤是什么函数接口处理的?
就比如,如果这时蓝牙从设备要求我输入一个密码,这个输入的pin码是由哪个函数接口调用处理的?
把函数接口告诉我下,我结合上下文调用看看它的流程步骤是咋样的;

谢谢;

0

主题

13

回帖

66

积分

不屈白银

积分
66
发表于 2025-9-11 19:54:34 | 显示全部楼层 来自 上海
你好:
      1. 首先,BLE 配对分为三个阶段——配对特性交换、密钥生成阶段和密钥分发;
      2. 不同设备绑定时,配对和配对码不同的问题,取决于配对特性交换阶段交换的输入输出能力和是否存在 OOB,逻辑如下图,tc_ble_sdk 可以使用 blc_smp_setSecurityParameters API 来控制当前设备的 OOB 和 IO Capabilities,输入的pin码 可以通过 blc_smp_setDefaultPinCode、blc_smp_setAclPeripheralPinCode 等 API 来设置当前设备的 pincode

image.png image.png image.png image.png

      3. 至于配对失败问题,可能由于支持的配对方式不同、配对时间较长等原因导致失败,可以把对应的错误码发给我们,我们可以做初步分析,但进一步的问题,可能需要抓包分析。

0

主题

13

回帖

66

积分

不屈白银

积分
66
发表于 2025-9-11 19:55:38 | 显示全部楼层 来自 上海
此外,tc_ble_sdk/feature_test/feature_smp 中也提供了相应的例程供参考。

7

主题

15

回帖

77

积分

不屈白银

积分
77
 楼主| 发表于 2025-9-11 21:15:39 | 显示全部楼层 来自 广东深圳
本帖最后由 we_3043576536 于 2025-9-12 11:44 编辑
TL_TZH 发表于 2025-9-11 19:54
你好:
      1. 首先,BLE 配对分为三个阶段——配对特性交换、密钥生成阶段和密钥分发;
      2. 不同设 ...

好的,谢谢;

发现蓝牙从设备绑定失败,返回的错误码是05,是因为蓝牙从设备心率传感器是不支持绑定的设备;只要连接后订阅即可收到心率传感器数据;

所以现在的问题是
1  如何只保留连接流程,把tc321x的acl_conne_demo中的绑定流程去掉呢?
   (tc321x作为central需要连接多个pheriph,指拨外设需要加密绑定流程,心率传感器不需要绑定流程)
2  tc321x作为master设备,在代码中如何订阅心率传感器uuid为2a37的notify属性呢?
    (怀疑可能是因为central没订阅,然后phriph没有上传数据)
3 当心率传感器uuid为0x2a37的notity属性订阅完之后,此时tc321x应该可以自动接收来自心率传感器的心率数据了,那么此时的心率数据应该从什么函数接口中取出呢?

十分感谢;

7

主题

15

回帖

77

积分

不屈白银

积分
77
 楼主| 发表于 2025-9-12 10:37:36 | 显示全部楼层 来自 广东深圳
TL_TZH 发表于 2025-9-11 19:54
你好:
      1. 首先,BLE 配对分为三个阶段——配对特性交换、密钥生成阶段和密钥分发;
      2. 不同设 ...

你好,再请教一个问题

目前我用BLE调试助手app,想要模拟从机设备跟tc321x通讯;
当使用蓝牙主机连接模拟的tc321x进行通讯时,返回错误码如下,请问这是为什么呢?

[APP][CMD] create connection success: 82 1e d7 5b 3d 72

[10:27:32.934]收←◆[APP][EVT] Connection complete event: 80 00 00 01 82 1e d7 5b 3d 72 19 00 00 00 90 01 00

[10:27:33.049]收←◆[APP][EVT] disconnect event: 80 00 3e

谢谢;

0

主题

13

回帖

66

积分

不屈白银

积分
66
发表于 2025-9-12 14:22:02 | 显示全部楼层 来自 上海
1. ACL_PERIPHR_SMP_ENABLE/ACL_CENTRAL_SMP_ENABLE 宏关闭即可
2. 可以使用 API  blc_gatt_pushWriteRequest 来订阅(实际是通知 peripheral 可以上传对应的信息),在 app_service_discovery 的末尾调用,但该 API 需要对应的 ATT Handle 而不是 UUID
PixPin_2025-09-12_14-19-30.jpg
3. 可以在 app_gatt_data_handler 里处理

0

主题

13

回帖

66

积分

不屈白银

积分
66
发表于 2025-9-12 14:29:15 | 显示全部楼层 来自 上海

0x3e 代表连接超时,即 Central 发送 CONNECT_IND 包后,有六次交互的机会,但在这六次的交互机会中都没有连接上 Periphr (对包失败),这是正常现象,可以多尝试几次。
image.png

7

主题

15

回帖

77

积分

不屈白银

积分
77
 楼主| 发表于 2025-9-12 15:30:26 | 显示全部楼层 来自 广东深圳
本帖最后由 we_3043576536 于 2025-9-12 16:27 编辑
TL_TZH 发表于 2025-9-12 14:22
1. ACL_PERIPHR_SMP_ENABLE/ACL_CENTRAL_SMP_ENABLE 宏关闭即可
2. 可以使用 API  blc_gatt_pushWriteReque ...

好的,谢谢;

再请问下,蓝牙从设备是其他厂家的心率传感器和踏频传感器,不是tc321x;那么这个 attHandle 我应该从哪里获取呢?
tc321x有提供获取蓝牙从设备attHandle的接口吗?

0

主题

13

回帖

66

积分

不屈白银

积分
66
发表于 2025-9-12 18:55:00 | 显示全部楼层 来自 上海
可以使用 blm_att_findHandleOfUuid128 或 blm_att_findHandleOfUuid16 根据 UUID 获取对应的 ATT  Handle。
微信图片_20250912184924_34_63.jpg

7

主题

15

回帖

77

积分

不屈白银

积分
77
 楼主| 发表于 2025-9-15 17:17:05 | 显示全部楼层 来自 广东深圳
TL_TZH 发表于 2025-9-12 18:55
可以使用 blm_att_findHandleOfUuid128 或 blm_att_findHandleOfUuid16 根据 UUID 获取对应的 ATT  Handle ...

谢谢回复,不好意思还要再问一下;

目前我在app_service_discovery()代码段如下,我只注释了cur_sdp_device.char_handle[2]的代码修改成我想要的uuid;
发现实际代码打印出来的char_handle都是 00 00;
这样的话显然没有读成功,请问这是为什么呢?

/**
* @brief   SDP handler.
*          !!! Note: This is a simple SDP processing implemented by telink.
* @param   none.
* @return  none.
*/
void app_service_discovery (void)
{
    tlkapi_printf(APP_SMP_LOG_EN, "app_service_discovery() \n");

        att_db_uuid16_t         db16[ATT_DB_UUID16_NUM];
        att_db_uuid128_t         db128[ATT_DB_UUID128_NUM];
        memset (db16, 0, ATT_DB_UUID16_NUM * sizeof (att_db_uuid16_t));
        memset (db128, 0, ATT_DB_UUID128_NUM * sizeof (att_db_uuid128_t));

        if ( central_sdp_pending && host_att_discoveryService (central_sdp_pending, db16, ATT_DB_UUID16_NUM, db128, ATT_DB_UUID128_NUM) == BLE_SUCCESS)        // service discovery OK
        {
                cur_sdp_device.char_handle[0] = blm_att_findHandleOfUuid128 (db128, my_MicUUID);            //MIC
               
                //cur_sdp_device.char_handle[2] = blm_att_findHandleOfUuid128 (db128, my_OtaUUID);                        //OTA
                cur_sdp_device.char_handle[2] = blm_att_findHandleOfUuid128 (db128, my_cscMeasure);                        //caeAdd for cscMeasure 我修改的
               
                cur_sdp_device.char_handle[3] = blm_att_findHandleOfUuid16 (db16, CHARACTERISTIC_UUID_HID_REPORT,
                                        HID_REPORT_ID_CONSUME_CONTROL_INPUT | (HID_REPORT_TYPE_INPUT<<8));                //consume report(media key report)
                cur_sdp_device.char_handle[4] = blm_att_findHandleOfUuid16 (db16, CHARACTERISTIC_UUID_HID_REPORT,
                                        HID_REPORT_ID_KEYBOARD_INPUT | (HID_REPORT_TYPE_INPUT<<8));                                //normal key report
                //cur_sdp_device.char_handle[6] = blm_att_findHandleOfUuid128 (db128, TelinkSppDataServer2ClientUUID);                //BLE Module, SPP Server to Client
                //cur_sdp_device.char_handle[7] = blm_att_findHandleOfUuid128 (db128, TelinkSppDataClient2ServerUUID);                //BLE Module, SPP Client to Server

                /* add the peer device att_handle value to conn_dev_list after service discovery is correctly finished */
                dev_char_info_add_peer_att_handle(&cur_sdp_device);

                /* peer device att_handle value store in flash */
                dev_char_info_store_peer_att_handle(&cur_sdp_device);

        tlkapi_send_string_data(APP_SMP_LOG_EN,"my_MicUUID", (u8*)&cur_sdp_device.char_handle[0], 2);        //这些打印打开后,发现打印出来的handle都是00 00
                tlkapi_send_string_data(APP_SMP_LOG_EN,"my_cscMeasure", (u8*)&cur_sdp_device.char_handle[2], 2);
                tlkapi_send_string_data(APP_SMP_LOG_EN,"CMKEY handle", (u8*)&cur_sdp_device.char_handle[3], 2);
                tlkapi_send_string_data(APP_SMP_LOG_EN,"KBKEY handle", (u8*)&cur_sdp_device.char_handle[4], 2);
        }

        central_sdp_pending = 0;  //service discovery finish
}


另外关于blm_att_findHandleOfUuid16函数在sdk文档中没有说明,如果我想要获取心率或踏频等标准service的atthandle, 关于参数ref应该如何赋值呢?

(另外补充一点,关于蓝牙从设备,不是tc321x, 而是其他厂家的心率传感器和踏频传感器;)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2025-10-12 17:44 , Processed in 0.107724 second(s), 24 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表