本文基于泰凌微TLSR8258 M1S1 demo。
1.DLE:LE Data Packet Length Extension
中文全称:低功耗蓝牙数据包长度扩展。
这是一个在2014年12月2日正式发布的bluetooth for BLE添加的新特性,以支持在LL Data PDU更长的数据,最大支持了251 Octets。
在bluetooth 4.2之前的版本,在LL Data PDU,如果只算payload,那么payload长度最大仅支持27 Octets;如果MIC计算在内,那么则支持31 Octets。
2.MTU:MAXIMUM TRANSMISSION UNIT
MTU在L2CAP LE-U链路中最小值为23 Octets。这时候的MTU也是ATT_MTU。
设备支持的ATT MTU不是协商的值,是设备本身在L2CAP层能够接收的最传输单元固有特性,也就是一个ATT包的最大长度。但是双方通信时所支持的ATT MTU通过ATT_EXCHANGE_MTU_REQ 和 ATT_EXCHANGE_MTU_RSP PDU控制指令,来交换告知对方设备各自所能支持的ATT MTU,然后在后面的通信中,使用交换值中的最小值ATT MTU作为数据包的上限,默认是23 Octets,最大支持517 Octets。
综上,设备支持的ATT MTU不是协商的值,但是实际的ATT MTU可以认为是一个协商的值,因为上限取决于交换双方最小的ATT MTU。
2.1.如何设置MTU?
在TLSR8258工程的demo中找到app_buffer.h
2.1.1.设置本机作为Master的ATT MTU
#define ATT_MTU_MASTER_RX_MAX_SIZE 23
2.1.1.设置从机作为Master的ATT MTU
#define ATT_MTU_SLAVE_RX_MAX_SIZE 23
3.PDU:Protocol data unit
中文全称:协议数据单元。
虽然这样的翻译和理解没有问题,在很多的文档中也是这样简单描述的,但实际上这并不是准确的描述。更准确的英文全称:Data PDU length。如果你试着翻译成中文,那更难以理解了。通常你在文档中看到的PDU,更多时候指的就是LL Data PDU length。当然还有各种PDU,但一般情况,很少开发者会涉及到。
LL Data PDU length决定了一个空中数据包的最大长度,通常支持0~251 Octets。如果把MIC计算在内,则支持255 Octets。
设备自身的接收和发送LL Data PDU length并不要求完全一致。比如设备作为Slave,接收LL Data PDU length可以是27 Octets,而发送的LL Data PDU length可以是251 Octets。
Master(Central)和Slave(Periphral)通过LL_FEATURE_REQ PDU和LL_FEATURE_REQ PDU交换LL Data PDU length,LL Data PDU length也是设备自身固有的支持特性,最终以双方较小的值作为生效的LL Data PDU length。
3.1.如何设置PDU?
在TLSR8258工程的demo中找到app_buffer.h
3.1.1.设置本机接收的LL Data PDU length
这里主从一体共存,在Telink的SDK中,他们接收的PDU长度只能为一样的长度,这并不是Bluetooth SIG的规范,所以不同的芯片平台是可能不同的,取决于厂商的具体实现。
#define ACL_CONN_MAX_RX_OCTETS 251
3.1.2设置本机作为Master的发送LL Data PDU length
#define ACL_MASTER_MAX_TX_OCTETS 27
3.1.3.设置本机作为Slave的发送LL Data PDU length
#define ACL_SLAVE_MAX_TX_OCTETS 251