要实现peripheral从机主动申请更新MTU
在蓝牙连接成功后我就调用
void autoUpdateMTU(void) {uint16_t connectionHandle = NULL;uint16_t mtuSize = 30;GAPRole_GetParameter(GAPROLE_CONNHANDLE, &connectionHandle);myLog("peripheral","processStateChangeEvt=>GATT_ExchangeMTU:%d %d \r\n",GAPROLE_CONNHANDLE,GATT_UpdateMTU(connectionHandle, mtuSize)); }
调用
// If RTOS queue is not empty, process app message.if (events & SBP_QUEUE_EVT){while (!Queue_empty(appMsgQueue)){sbpEvt_t *pMsg = (sbpEvt_t *)Util_dequeueMsg(appMsgQueue);if (pMsg){// Process message.SimplePeripheral_processAppMsg(pMsg);// Free the space from the message.ICall_free(pMsg);if(toUpdateMTU){toUpdateMTU = 0;autoUpdateMTU();}}}}
Viki Shi:
更改MTU大小只能由GATT客户端发起
user5289985:
回复 Viki Shi:
我看有一家模组方案商他们的不用的,不知道他们是怎么实现的
Alvin Chen:
回复 user5289985:
依据Bluetooth Spec规定如下: 3.4.2 MTU Exchange 3.4.2.1 Exchange MTU Request The Exchange MTU Request is used by the client to inform the server of the client’s maximum receive MTU size and request the server to respond with its maximum receive MTU size. 你可以去问他们的如何做的违反了协议。
user5289985:
回复 Viki Shi:
用了别人的模块,我客户端没有发起MTU更新,也可以实现>20的通信
user5289985:
回复 Alvin Chen:
请教个问题,GATT_UpdateMTU()这个API是peripheral的时候用的还是central的时候用的
user5289985:
回复 Alvin Chen:
设置这里只是限制最大值,如果没有updateMTU或者APP端request的话,实际通讯的字节数还是默认的20字节,能解释一下GATT_UpdateMTU的用法吗,我调用了这个API后能更新MTU了,但是产生ATT_MTU_UPDATED_EVENT事件后,APP端就获取不到服务UUID了,不知道是什么原因
user5289985:
回复 Alvin Chen:
还有个问题,我用APP去request MTU,响应了ATT_MTU_UPDATED_EVENT事件后,这个是可以正常使用
Alvin Chen:
回复 user5289985:
请看:
dev.ti.com/…/group__GATT__COMMON__API.html
user5289985:
回复 Alvin Chen:
按照里面的讲的,是不是3个API都要用到才可以,但是具体怎么用,有没有相关的例程?