Part Number:CC2642ROther Parts Discussed in Thread:SYSCONFIG
SDK版本:simplelink_cc13xx_cc26xx_sdk_7_10_00_98(最新版本)
硬件:自制最小系统板5287.原理图 蓝牙模块-CC2642_V1.3.pdf
现象:
使用TI的simple_central和simple_peripheral测试,主机扫描到从机,建立连接后,会调用GATT_ExchangeMTU更新MTU:
static void SimpleCentral_startSvcDiscovery(void)
{
bStatus_t status;
attExchangeMTUReq_t req;
// Initialize cached handles
svcStartHdl = svcEndHdl = 0;
discState = BLE_DISC_STATE_MTU;
// Discover GATT Server's Rx MTU size
req.clientRxMTU = scMaxPduSize – L2CAP_HDR_SIZE;
// ATT MTU size should be set to the minimum of the Client Rx MTU
// and Server Rx MTU values
//VOID GATT_ExchangeMTU(scConnHandle, &req, selfEntity);
status = GATT_ExchangeMTU(simpleBLEConnHandle, &req, selfEntity);
if(status == 0){
sprintf(printbuf,"Request was queued successfully.\r\n");
}else{
sprintf(printbuf,"Error:status=%d.\r\n",status);
}
PRINT_LOG;
}
SimpleCentral_processGATTMsg(gattMsgEvent_t *pMsg)函数中收到ATT_MTU_UPDATED_EVENT情况非常少见,大部分情况是收不到,在收不到ATT_MTU_UPDATED_EVENT的情况下,连接会自动断开。
GATT_ExchangeMTU()函数的返回状态是0,即成功,我尝试更新的 ATT MTU 大小的值是65,这是工程默认可改MTU的最大值。
simple_peripheral用手机连接改MTU每次都是正常的。此问题应该与simple_peripheral无关。
Alex Zhang:
您好,已经跟进您的问题,这需要一些时间谢谢。
,
Alex Zhang:
函数是否调用simple_central.c文件中的GATT_MSG_EVENT?
您这边是否只有其主板存在此问题?
,
Nick Yao:
GATT_MSG_EVENT是肯定调用了的。
我并不能确定问题出在哪里。
我这边早期的一个实现同样central功能的项目,使用CC2640R2芯片,SDK版本simplelink_cc2640r2_sdk_1_40_00_45,其并没有此类问题。
,
Alex Zhang:
您好,已经跟进您这边的问题,这需要一些时间,谢谢
,
Alex Zhang:
我需要知道的是,GATT_MSG_EVENT是否是由GATT_Exchange_MTU函数触发的?
安全连接BLE功能是否已启用?
最好在BLE5-Stack > GATT > MTU部分查看用户指南,以确切了解MTU大小的工作原理。
https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gatt.html
这里是链接。
,
Nick Yao:
您好,
1.GATT_ExchangeMTU()会触发GATT_MSG_EVENT。我碰到的问题是,有时候,在连接建立之后,central调用GATT_ExchangeMTU(),SimpleCentral_processGATTMsg会在大约30秒后,收到一个ATT_EXCHANGE_MTU_RSP,然后连接就断开了(SimpleCentral_processGapMsg收到了GAP_LINK_TERMINATED_EVENT)。
2.在哪里查看安全连接BLE功能是否已启用?
3.MTU大小的工作原理已认真阅读并了解。
,
Alex Zhang:
您好,您的问题我已经跟进,这需要一些时间,谢谢。
,
Alex Zhang:
sysconfig中设置的值最大PDU大小值是多少? (BLE>General configuration)
在ATT_EXCHANGE_MTU_RSP事件中,MTU的值是多少?
您也可以在sysconfig中检查安全连接。
,
Nick Yao:
sysconfig中主、从机的Max size of PDU(bytes)都是69.
ATT_EXCHANGE_MTU_RSP事件中,我在central中SimpleCentral_processGATTMsg函数内加入了以下代码来打印:
当失败时,打印ATT_EXCHANGE_MTU_RSP,MTU Size: 0
当成功是,打印ATT_EXCHANGE_MTU_RSP,MTU Size: 65
,
Alex Zhang:
您好,已经跟进您的问题,这需要一些时间谢谢。
,
Alex Zhang:
您的意思是该功能成功通过,但不是每次都成功通过?
当该功能导致断开设备时,您是否有上下文?
,
Nick Yao:
是的,不是每次都成功。
请问您需要哪些上下文,我可以在代码中添加打印。
,
Alex Zhang:
您好,您的问题我已经跟进,预计下周一回复您,谢谢
,
Alex Zhang:
您在同一连接中多次尝试更改MTU大小?
默认的MTU大小是多少?
为什么他您需要将其更改为65?
Nick Yao 说:当成功是,打印ATT_EXCHANGE_MTU_RSP,MTU Size: 65
这是他们在连接后做的第一件事吗?
两个主板都是您这边的主板?还是说一个是您定制的另一是ti官方的?
你们是否尝试更改代码中的GATT_ExchangeMTU本地化,例如在计时器结束时触发函数?
蓝牙低能耗跟踪应有助于了解此问题如何重现以及实际发生的情况。
,
Nick Yao:
我在同一次连接中只更改一次MTU大小。
默认的MTU大小是23,
我现在需要一次传输超23个字节所以需要更改MTU。
2个主板都是我们自己设计。
连接后第一时间不会马上更改MTU而是启动一个定时器,定时6秒,时间到才去更改。
我想知道您测试过、遇到过这个情况吗
,
Alex Zhang:
您好,我这边已经跟进您的问题,有更新我会及时联系您,谢谢
,
Alex Zhang:
您好,工程师那边回复到:
有关信息,处理此线程的工程师今天由于美国假期而不在办公室。 请耐心等待,因为我可能错过了讨论中的一些细节。
如果尚未完成,我建议使用蓝牙嗅探器收集蓝牙跟踪数据,并比较在工作和非工作情况下交换的数据包的内容。
如果您需要帮助进行分析,请分享您这边跟踪到的蓝牙数据。
,
Nick Yao:
您好,请问蓝牙嗅探器是什么,我没有使用过此类设备。
,
Alex Zhang:
我这边给您提供链接 https://software-dl.ti.com/lprf/packet_sniffer_2/docs/user_guide/html/introduction.html
您可以查看如上文档链接这是如何使用LaunchPad, 配合SmartRF Packet Sniffer 2+Wireshark来作为sniffer去对设备进行抓包。