0%

MTU exchange

BLE MTU exchange 流程。

MTU exchange

根据Core_5.2 | Vol 3, Part G, 4.3.1

Client 通过此 sub-procedure 来发起 ATT_MTU 协商,最终选择两个设备 ATT_MTU 中较小的那个作为本次连接的 ATT_MTU。 MTU exchange 一次连接中只能启动一次

Client 向 server 发送ATT_EXCHANGE_MTU_REQ,包含自己的 MTU

Server 会回复ATT_EXCHANGE_MTU_RSP,包含自己的 MTU

Zephyrbt_gatt_exchange_mtu用以实现 MTU exchange 流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** @brief Exchange MTU
*
* This client procedure can be used to set the MTU to the maximum possible
* size the buffers can hold.
*
* @note Shall only be used once per connection.
*
* @param conn Connection object.
* @param params Exchange MTU parameters.
*
* @return 0 in case of success or negative value in case of error.
*/
int bt_gatt_exchange_mtu(struct bt_conn *conn,
struct bt_gatt_exchange_params *params);

MTU 在prj.conf中配置,若无配置,则默认为23

1
2
CONFIG_BT_L2CAP_RX_MTU=247
CONFIG_BT_L2CAP_TX_MTU=247

若 MTU 大于 23,则还需要配置Data Length Extension

1
2
CONFIG_BT_CTLR_DATA_LENGTH=y
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251

抓包分析

Master 发送ATT_EXCHANGE_MTU_REQ,Rx MTU=251。

Slave 回复ATT_EXCHANGE_MTU_RSP,Rx MTU=247。

最终选择 Rx MTU 为 247。

抓包数据:MTU.pcapng

坚持原创技术分享,您的支持将鼓励我继续创作!