支持BLE 4.2的蓝牙SOC芯片与手机app之间的数据包长度(MTU)

3/3/2017来源:C/C++教程人气:3251

支持BLE 4.2的蓝牙SOC芯片与手机app之间的数据包长度(MTU)

在[BLE 4.2][6]之前,BLE芯片与手机通信的蓝牙数据包长度MTU是[23][6]字节,其中还包括2字节的handle值,1字节的Operation码,所以留给应用层的数据长度只有[20][6]个字节。 当SOC的蓝牙芯片(如TI的cc2640、NXP的KW41等)有大量数据需要透传时,受限于MTU,发送端只能数据分包进行流传输,而接收端需要进行组包,为了防止中间数据的丢失,在20个字节中还需要增加包ID等。带来的弊端就是代码的复杂度和传输的效率下降。

而在[BLE 4.2][6]中,MTU已经扩展到了[247][6]字节,除去3个字节,留给应用层的就是[244][6]字节可以使用,相应的传输效率大大增加,代码复杂度也相应的降低。

MTU的修改流程

为了兼容BLE4.2之前的设备,BLE 4.2中MTU的默认大小仍然是23字节,但可以在连接后进行修改。当peripheral和central建立连接之后,central设备会发送 [ATT_Exchange_MTU_Req][5] 的请求包,包含了central所支持的MTU大小;peripheral会回应 [ATT_Exchange_MTU_Rsp][6] 应答包包含peripheral所支持的MTU大小,取两者之间最小的MTU作为两者通信的MTU。

这里有个问题是,一般而言,手机作为central,soc的芯片做peripheral,因更新速度不够快,手机app基本上不会发出 [ATT_Exchange_MTU_Req][6] 包,这就无法修改MTU。

在NXP的KW41的SDK代码里面,我看到他们的实现方式是:

KW41的例程中需要link的library库是同时支持central和peripheral的library。 KW41芯片仍作为peripheral进行初始化和工作,只不过在建立连接后,KW41需要调用central的API函数发送MTU的请求。

通信抓包示意图

这里写图片描述