找回密码
 立即注册

微信扫码登录

查看: 109|回复: 9

[BLE SDK] BLE 多连接SDK相关疑问

[复制链接]

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
发表于 6 天前 | 显示全部楼层 |阅读模式 来自 广东深圳
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TLSR8258
SDK及版本: V4.0.1.3_Patch
请教下,我目前使用的 多链接sdk 版本是V4.0.1.3_Patch,我当前使用了两个tlsr8258在官方demo进行开发,具体场景如下:
1、 使用官方多连接sdk,参考1m1s这个demo进行测试验证,1个tlsr8258做主机,另外一个tlsr8258做从机;
2、 在主机上通过app_le_adv_report_event_handle处理 从机的广播包,然后向从机发起连接,这一步是可以连接成功的
3、 在主机上处理HCI_SUB_EVT_LE_CONNECTION_COMPLETE 事件,在该事件处理中注册pp_register_service(&app_service_discovery) sdp服务;
4、 在app_service_discovery中调用host_att_discoveryService,通过blc_gatt_pushReadByTypeRequest(connHandle, startAttHandle, endAttHandle, uuid, uuidLen)发送请求给slave;

上述 第4步这里出问题了,通过打印blc_gatt_pushReadByTypeRequest接口返回值,发现是发送成功了,但是一直没有收到 slave的响应报文;
image.png
image.png
我想请教如下问题(关于sdp这部分):
1、  通过blc_gatt_pushReadByTypeRequest发送的报文,通过空口工具可以抓到嘛,我通过工具发现没有抓到;
2、 在slave中对blc_gatt_pushReadByTypeRequest发送的报文的处理对应处理函数具体是哪里;

另外slave中同样的代码,我用 谷雨蓝牙小程序可以连接上,并能发现相关的uuid,理论上用微信小程序连接slave应该也有sdp相关的部分把,但是我通过空口工具并没有发现有sdp相关的这部分数据包,因此有点想不明白,麻烦帮忙解答下,感谢。
image.png

0

主题

12

回帖

56

积分

不屈白银

积分
56
发表于 6 天前 | 显示全部楼层 来自 上海
1、“关于 blc_gatt_pushReadByTypeRequest 相关的空中抓包,能否麻烦提供一下?”
2、“blc_gatt_pushReadByTypeRequest 的处理函数是协议栈内部接口,归属 host 层,目前没有对外开放。”
3、“关于‘谷雨蓝牙小程序’的具体细节,我们暂不了解;不过存在一种情况:若设备已知晓对端的 ATT 表,是可以不发起 SDP(服务发现协议)流程的。”

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 6 天前 | 显示全部楼层 来自 广东深圳
感谢回复,多谢。
1.   相关报文见附件:另外贴了个图片,mac地址 74:cb:dc:38:c1:a4 是从机, c7:d2:78 是主机, 抓包看上去 连接成功之后就没有了,也没有见sdp相关的报文;
2.   关于blc_gatt_pushReadByTypeRequest这个接口,我看demo源码中的确是用的有,demo中的相关源码如下,我也是参考源码而来的,blc_gatt_pushReadByTypeRequest这个接口我加返回值打印,结果是成功的BLE_SUCCESS
       int app_char_discovery(u8* reslut, u16 connHandle, u16 startAttHandle, u16 endAttHandle, u8*uuid, u8 uuidLen)
       {
            blc_gatt_pushReadByTypeRequest(connHandle, startAttHandle, endAttHandle, uuid, uuidLen);
            return host_att_service_wait_event(connHandle, reslut, 1000000);
        }
        blc_gatt_pushReadByTypeRequest这个接口尝试修改了各种参数,发现也不行;

3.  这个是有可能的;

总上: 就是这种使用场景下(主从设备都是8258), 主从设备上完整的sdp流程 我想全面跑通
Snipaste_2025-09-04_16-30-51.jpg

空口报文.rar

868 Bytes, 下载次数: 1

0

主题

10

回帖

58

积分

不屈白银

积分
58
发表于 5 天前 | 显示全部楼层 来自 上海
connHandle 需要用 connect complete 里面传入的,不是0,1这样的序号,另外可以把blc_gatt_pushReadByTypeRequest 返回值打印出来,这个是相关的错误原因

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 5 天前 | 显示全部楼层 来自 广东深圳
TL_MY 发表于 2025-9-5 09:23
connHandle 需要用 connect complete 里面传入的,不是0,1这样的序号,另外可以把blc_gatt_pushReadByType ...

connHandle入参数错的,传就是实际连接的句柄,另外接口blc_gatt_pushReadByType的返回是BLE_SUCCESS  是成功的。

0

主题

10

回帖

58

积分

不屈白银

积分
58
发表于 5 天前 | 显示全部楼层 来自 上海
你使用原来的 sdp 可以发现服务成功吗吗? 源码自带的host_att_discoveryService , 若返回值是成功的,应该空中有报文才对

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 5 天前 | 显示全部楼层 来自 广东深圳
原来一直用的做从机,没有调试过sdp,现在想调试多主多从,才开始调试sdp这部分,
host_att_discoveryService 函数返回超时了,在host_att_discoveryService 中调用的blc_gatt_pushReadByTypeRequest, blc_gatt_pushReadByTypeRequest接口返回值是成功的,

ble_sts_t  host_att_discoveryService (u16 handle, att_db_uuid16_t *p16, int n16, att_db_uuid128_t *p128, int n128)
{
        att_db_uuid16_t *ps16 = p16;
        att_db_uuid128_t *ps128 = p128;
        int i16 = 0;
        int i128 = 0;

        ps16->num = 0;
        ps128->num = 0;

        // char discovery: att_read_by_type
    // hid discovery: att_find_info
        u8  dat[256];//according to MTU to set size.//MTU_M_BUFF_SIZE_MAX
        u16 s = 1;
        u16 uuid = GATT_UUID_CHARACTER;
        do {
                dat[6] = ATT_OP_READ_BY_TYPE_REQ;
                if (app_char_discovery(dat, handle, s, 0xffff, (u8 *)&uuid, 2)) // 1s
                {
                        return  GATT_ERR_SERVICE_DISCOVERY_TIEMOUT;                        //timeout
                }

                // process response data
                ble_att_readByTypeRsp_t *p_rsp = (ble_att_readByTypeRsp_t *) dat;
                if (p_rsp->opcode != ATT_OP_READ_BY_TYPE_RSP)
                {
                        break;
                }

                if (p_rsp->datalen == 21)                //uuid128
                {
                        u8 *pd = p_rsp->data;
                        while(p_rsp->l2capLen > 21){
                                s = pd[3] + pd[4] * 256;
                                if (i128 < n128)
                                {
                                        p128->property = pd[2];
                                        p128->handle = s;
                                        memcpy (p128->uuid, pd + 5, 16);
                                        i128++;
                                        p128++;
                                }
                                p_rsp->l2capLen -= 21;
                                pd += 21;
                        }
                }
                else if (p_rsp->datalen == 7) //uuid16
                {
                        u8 *pd = p_rsp->data;
                        while (p_rsp->l2capLen > 7)
                        {
                                s = pd[3] + pd[4] * 256;
                                if (i16 < n16)
                                {
                                        p16->property = pd[2];
                                        p16->handle = s;
                                        p16->uuid = pd[5] | (pd[6] << 8);
                                        p16->ref = 0;
                                        i16 ++;
                                        p16++;
                                }
                                p_rsp->l2capLen -= 7;
                                pd += 7;
                        }
                }
        } while (1);

        ps16->num = i16;
        ps128->num = i128;

        //--------- use att_find_info to find the reference property for hid ----------
        p16 = ps16;
        for (int i=0; i<i16; i++)
        {
                if (p16->uuid == CHARACTERISTIC_UUID_HID_REPORT)                //find reference
                {
                        dat[6] = ATT_OP_FIND_INFORMATION_REQ;
                        if (app_find_char_info(dat, handle, p16->handle, 0xffff)) // 1s
                        {
                                return  GATT_ERR_SERVICE_DISCOVERY_TIEMOUT;                        //timeout
                        }

                        ble_att_findInfoRsp_t *p_rsp = (ble_att_findInfoRsp_t *) dat;
                        if (p_rsp->opcode == ATT_OP_FIND_INFO_RSP && p_rsp->format == 1)
                        {
                                int n = p_rsp->l2capLen - 2;
                                u8 *pd = p_rsp->data;
                                while (n > 0)
                                {
                                        if ((pd[2]==U16_LO(GATT_UUID_CHARACTER) && pd[3]==U16_HI(GATT_UUID_CHARACTER)) ||
                                                (pd[2]==U16_LO(GATT_UUID_PRIMARY_SERVICE) && pd[3]==U16_HI(GATT_UUID_PRIMARY_SERVICE))        )
                                        {
                                                break;
                                        }

                                        if (pd[2]==U16_LO(GATT_UUID_REPORT_REF) && pd[3]==U16_HI(GATT_UUID_REPORT_REF))
                                        {
                                            //-----------                read attribute ----------------
                                                dat[6] = ATT_OP_READ_REQ;
                                                if(app_read_char_value(dat, handle, pd[0])){
                                                        return  GATT_ERR_SERVICE_DISCOVERY_TIEMOUT;                        //timeout
                                                }

                                                ble_att_readRsp_t *pr = (ble_att_readRsp_t *) dat;
                                                if (pr->opcode == ATT_OP_READ_RSP)
                                                {
                                                        p16->ref = pr->value[0] | (pr->value[1] << 8);
                                                }

                                                break;
                                        }
                                        n -= 4;
                                        pd += 4;
                                }
                        }
                } //----- end for if CHARACTERISTIC_UUID_HID_REPORT

                p16++;
        }

        return  BLE_SUCCESS;
}

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 5 天前 | 显示全部楼层 来自 广东深圳
另外请教下,多主多从的话 参考当前的那一个demo比较好。

0

主题

12

回帖

56

积分

不屈白银

积分
56
发表于 前天 09:37 | 显示全部楼层 来自 上海
可以参考b85m_demo.
b85m_demo: 同时广播和扫描,自身可同时作为 Peripheral 或 Central 与其他设备连接的参考代码,默认配置为 C4P4,使能 SMP,Suspend 休眠。

2

主题

5

回帖

40

积分

英勇黄铜

积分
40
 楼主| 发表于 前天 10:12 | 显示全部楼层 来自 广东深圳
TL_ZRL 发表于 2025-9-8 09:37
可以参考b85m_demo.
b85m_demo: 同时广播和扫描,自身可同时作为 Peripheral 或 Central 与其他设备连接的 ...

好的,有空的话再帮忙看下上面的问题哈,感谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2025-9-10 02:15 , Processed in 0.105304 second(s), 24 queries .

Powered by Telink 隐私政策

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

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