即使把MTU设置为251,使用Notification方式发送,数据长度大于20字节都仍会被分解成20字节/包分多次发送!
BT4.2以后不是可以支持大于20字节数据发送了吗?为何会出现这种现象?
BT5.0协议我也查了,没有查到Notification的数据长度,请大神解惑,谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
调用下面函数看看是不是返回251
uint16 L2CAP_GetParamValue | ( | void | ) |
Get the L2CAP parameter value.
GATT Client 可以通过使用GATT_ExchangeMTU()
在连接期间请求更大的ATT_MTU
。在此过程中,客户端请求服务器其最大支持的接收MTU大小,服务器回复其最大支持的接收MTU大小进行。只有客户端可以启动此过程。当成功交换该值后,ATT_MTU
是客户端MTU和服务器MTU值的最小值。如果客户端表示可以支持200字节的MTU,并且服务器响应最大大小为150字节,该ATT_MTU连接的大小为150。
采取以下步骤配置协议栈以支持较大的MTU值。
MAX_PDU_SIZE
预处理器符号设置为所需的值,以达到L2CAP PDU所需的最大大小。最大ATT_MTU
大小总是比MAX_PDU_SIZE
小4字节。GATT_ExchangeMTU()
(仅限GATT客户端)。传递给此函数的MTU参数必须小于或等于步骤1GATT Servier 中的定义ATT_MTU
。ATT_MTU_UPDATED_EVENT
以验证MTU是否已成功更新。此更新要求调用已注册的GATT消息任务。尽管可以将协议栈配置为支持MAX_PDU_SIZE
最大为255个字节,但每个低功耗蓝牙最初连接时都使用默认的27字节(ATT_MTU= 23字节),直到交换MTU过程中出现更大的MTU。必须在每个蓝牙低功耗连接上执行交换MTU过程,且须由客户端发起。
注意:如果启用安全连接BLE 4.2功能,连接时默认的MTU大小为69。详情查看ble_user_config.h。
增加ATT_MTU
大小可以在单个ATT数据包中发送更多数据。单个数据包中发送的最长属性为(ATT_MTU
-1)个字节。如果是通知,则有额外的长度限制。如果一个属性值的长度为100个字节,则读取该整个属性需要读取请求来获取第一个(ATT_MTU
-1)字节,然后是多个读取blob请求以获得后续(ATT_MTU-1)字节。要传输整个100字节的有效载荷数据,默认ATT_MTU值为23字节,需要五个请求或响应过程,每个字节返回22个字节。如果执行了交换MTU过程,并且将ATT_MTU其配置为101字节(或更大),则可以在单个读取请求或响应过程中读取整个100个字节。
注意:由于内存和处理的限制,并不是所有的蓝牙低功耗系统都支持更大的MTU尺寸。在定义系统的行为时,了解预期对等设备的功能。如果对等设备的能力未知,请设计系统使用默认的27字节L2CAP PDU/23字节ATT_MTU 大小。例如,发送长度大于20字节(ATT_MTU-3)字节的通知会导致在不支持较大MTU大小的设备上截断数据。
DLE默认打开的,参考
http://software-dl.ti.com/lprf/simplelink_cc2640r2_latest/docs/blestack/ble_user_guide/html/ble-stack-3.x/data-length-extensions.html?highlight=dle#le-data-length-extension-dle