找回密码
 立即注册

微信扫码登录

查看: 109|回复: 6

[BLE SDK] 蓝牙多链接

[复制链接]

6

主题

3

回帖

54

积分

不屈白银

积分
54
发表于 5 天前 | 显示全部楼层 |阅读模式 来自 广东深圳
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TLSR8258
SDK及版本: tc_ble_sdk-V4.0.2.1
各位大神,有人知道tlsr8258在多链接的时候,与指定的从机发送数据 具体要准备那些参数和步骤吗?目前使用的是tc_ble_sdk-V4.0.2.1 中acl_c1p1_demo作为主机 作为主机 最好有具体的代码可以参考求求 ,小白有点蒙现在

0

主题

4

回帖

28

积分

英勇黄铜

积分
28
发表于 5 天前 | 显示全部楼层 来自 上海
按照以下步骤实现与对端设备的通讯:
连接建立与句柄记录
   在连接完成事件回调中,记录系统分配的连接句柄(connHandle)。该句柄是后续所有操作的基础,用于唯一标识一个 BLE 连接。
服务发现(SDP)流程
   连接建立后,需通过 SDP 协议发现对端设备的服务(Service)和特性(Characteristic),从而获取您需要操作的特性的handle值。每个特性都有唯一的 UUID 和对应的 handle。
数据传输
   使用blc_gatt_pushWriteCommand或blc_gatt_pushWriteRequest函数发送数据,这两个函数均需传入connHandle和目标handle值。

详细介绍  参考handbook的BLE 模块
https://doc.telink-semi.cn/doc/z ... _connection_cn/#ble

6

主题

3

回帖

54

积分

不屈白银

积分
54
 楼主| 发表于 4 天前 | 显示全部楼层 来自 广东深圳
大神,tlsr8258在多链接的时候有多个从机设备,怎么才能找到目标从机的连接句柄呢
void send_data_to_target(u16 connHandle, u8 data) {
    dev_char_info_t* dev_info = dev_char_info_search_by_connhandle(connHandle);
    if (dev_info && dev_info->char_handle[9] != 0) { // char_handle[9] 对应目标特性
        u8 value = data;
            gpio_write(LED_PIN, 1);
        // 使用 Write Without Response (属性支持)
        blc_gatt_pushWriteCommand(connHandle, dev_info->char_handle[9], &value, 1);
    }
} 这是我自己发送函数
void app_service_discovery (void)
{


            // 修改为正确的UUID顺序
            static const u8 targetServiceUUID[16] = {0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5f,0x9b,0x34,0xfb};
            static const u8 targetCharUUID[16] = {0x00,0x10,0x01,0x00,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5f,0x9b,0x34,0xfb};

        //----
        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
        {
                  // 存储服务特征句柄
                // 新增:识别RX/TX特性并记录属性

                            cur_sdp_device.char_handle[8] = blm_att_findHandleOfUuid128(db128, targetServiceUUID);
                           cur_sdp_device.char_handle[9] = blm_att_findHandleOfUuid128(db128, targetCharUUID);
                //---
                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[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_DUMP_SDP_EN,"OTA handle", (u8*)&cur_sdp_device.char_handle[2], 2);
                //tlkapi_send_string_data(APP_DUMP_SDP_EN,"CMKEY handle", (u8*)&cur_sdp_device.char_handle[3], 2);
                //tlkapi_send_string_data(APP_DUMP_SDP_EN,"KBKEY handle", (u8*)&cur_sdp_device.char_handle[4], 2);
        }

        central_sdp_pending = 0;  //service discovery finish
}这段是案例代码的一个服务发现 目前是只能连接 发送数据不行

0

主题

6

回帖

36

积分

英勇黄铜

积分
36
发表于 3 天前 | 显示全部楼层 来自 上海
blc_gatt_pushWriteCommand 这个函数的返回值可以看看, 另外请检查 你  targetCharUUID 是否可以write,注意在服务里面注册的偏移,可以把att handle 打印出来跟实际你注册的便宜对照看一下


0

主题

6

回帖

36

积分

英勇黄铜

积分
36
发表于 3 天前 | 显示全部楼层 来自 上海
特别提醒一下, dev_info->char_handle, 这个最大存储个数是8 ,你需要用到9 ,记得把这个长度增加一下 ,#define CHAR_HANDLE_MAX                                        8

6

主题

3

回帖

54

积分

不屈白银

积分
54
 楼主| 发表于 3 天前 | 显示全部楼层 来自 广东深圳
#define CHAR_HANDLE_MAX        11这里我改的11
这是我修改后的dsp
void app_service_discovery (void)
{
        // 定义UUID常量
                static const u8 custom_service_uuid[16] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00};
                static const u8 custom_char_uuid1[16] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00};
                static const u8 custom_char_uuid2[16] = {0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00};





        //----
        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
        {
                  // 存储服务特征句柄
                // 新增:识别RX/TX特性并记录属性
                // 增加对自定义服务的处理
                        cur_sdp_device.char_handle[8] = blm_att_findHandleOfUuid128(db128, custom_service_uuid);
                        cur_sdp_device.char_handle[9] = blm_att_findHandleOfUuid128(db128, custom_char_uuid1);  // 00001001-xxx
                        cur_sdp_device.char_handle[10] = blm_att_findHandleOfUuid128(db128, custom_char_uuid2);  // 00001002-xxx
                //---
                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[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_DUMP_SDP_EN,"OTA handle", (u8*)&cur_sdp_device.char_handle[2], 2);
                //tlkapi_send_string_data(APP_DUMP_SDP_EN,"CMKEY handle", (u8*)&cur_sdp_device.char_handle[3], 2);
                //tlkapi_send_string_data(APP_DUMP_SDP_EN,"KBKEY handle", (u8*)&cur_sdp_device.char_handle[4], 2);
        }

        central_sdp_pending = 0;  //service discovery finish
}
这张图可以是我用手机给从机发送后 从机也回复了信息 是可以读写的
app.c中
* @brief      BLE Connection complete event handler BLE连接完成事件处理程序
* @param[in]  p         Pointer point to event parameter buffer.
* @return
*/
int app_le_connection_complete_event_handle(u8 *p)
{
        hci_le_connectionCompleteEvt_t *pConnEvt = (hci_le_connectionCompleteEvt_t *)p;

        my_connHandle = pConnEvt->connHandle; 这里我获取了句柄
......
        }
// 新建设据发送函数
void send_data_to_target(u16 connHandle, u8 data) {
    dev_char_info_t* dev_info = dev_char_info_search_by_connhandle(connHandle);

    if (dev_info && dev_info->char_handle[10] != 0) {
        u8 value = data;
        // 使用 Write Without Response (属性支持)
        gpio_write(LED_PIN, 1); // 连接时亮
       blc_gatt_pushWriteCommand(connHandle, dev_info->char_handle[10], &value, 1);
    }

//   ble_sts_t status = ble_gatt_pushReadByTyRequest()
}目前就是 连接时没有问题 就是或者句柄特征的存储 和获取有疑问?不知道到底要修改那些地方?
3274c5972db0da71b6c9cc107ba8185.jpg

0

主题

6

回帖

36

积分

英勇黄铜

积分
36
发表于 3 天前 | 显示全部楼层 来自 上海
这两个宏也注意一下,#define                ATT_DB_UUID16_NUM                20,#define                ATT_DB_UUID128_NUM                8, 注意数据溢出,另外你不是应该用handle[9] 去写吗? 从你手机操作截图看。  这个保存代码在这里 dev_char_info_store_peer_att_handle, 还是建议把返回值,相关参数在调用发送前打印对比一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2025-7-27 19:25 , Processed in 0.094058 second(s), 24 queries .

Powered by Telink 隐私政策

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

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