NCS更改MTU大小
一、 什么是MTU
MTU(Maximum Transmission Unit)即最大傳輸單元,它定義了藍牙網絡層協議一次能傳輸的最大數據量。在藍牙低功耗(BLE)通信中,MTU的大小直接影響到數據傳輸的效率和性能
MTU過小的影響
當MTU設置過小時,會導致以下問題:
- 數據分片增加 :數據需要被分成更小的片段進行傳輸,增加了傳輸的次數和復雜性。
- 傳輸效率降低 :頻繁的數據分片和重組會消耗更多的帶寬和時間。
- 連接穩定性下降 :過小的MTU可能導致數據包丟失或傳輸錯誤,影響連接的穩定性
所以為了能夠單包發送更大的數據,服務器和客戶端都需要更新它們的MTU。MTU需要滿足主機和從機之間允許的最小值,必須支持更大的MTU的遷就支持更小的
MTU
在Zephyr里面CONFIG_BT_BUF_ACL_RX_SIZE
和 CONFIG_BT_L2CAP_TX_MTU
這兩個宏決定了ZephyrMTU的大小,下圖是MTU的關系已經Kconfig對應表
調用這個發送函數會報-128錯誤
二、如何修改MTU大小
1、增加主機向從機配置的MTU大小
在prj.conf添加如下幾個宏:
CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_BUF_ACL_RX_SIZE=251
CONFIG_BT_BUF_ACL_TX_SIZE=251
添加如上幾個宏,從機就支持支持最大的247的MTU了,但是這個是初始化協議棧的時候設置的,而MTU交換是主機和從機建立連接之后進行協商,所以主機可以在連接之后,主動設置從機的MTU大小了,那么怎么設置從機主動發起MTU請求和請求的大小呢:
有兩個辦法
1.1 第一個辦法:固定MTU大小
再上面的宏里面,再添加一個宏就可以實現連接后自動更新NTU大小了
CONFIG_BT_GATT_AUTO_UPDATE_MTU=y
在這里插入圖片描述
使用Kconfig search 查詢MTU,可以看到下面的描述連接后自動申請MTU大小,為什么我要多此一舉呢,因為有些客戶不需要申請這么大的MTU,需要動態去修改MTU大小或者自己隨著在某個操作里面修改MTU大小,
2、第二個辦法:使用函數從機主動向主機申請增加MTU大小
2.1 添加宏
CONFIG_BT_GATT_CLIENT
2.2 在函數里面添加如下代碼,然后再connect回調時間里面調用
/*MTU exchange*/
static struct bt_gatt_exchange_params mtu_exchange_params[CONFIG_BT_MAX_CONN];
static void mtu_exchange_cb(struct bt_conn *conn, uint8_t err,
struct bt_gatt_exchange_params *params)
{
LOG_INF("MTU exchange %u %s (%u)", bt_conn_index(conn),
err == 0U ? "successful" : "failed", bt_gatt_get_mtu(conn));
}
static int mtu_exchange(struct bt_conn *conn)
{
uint8_t conn_index;
int err;
conn_index = bt_conn_index(conn);
LOG_INF("MTU (%u): %u", conn_index, bt_gatt_get_mtu(conn));
mtu_exchange_params[conn_index].func = mtu_exchange_cb;
err = bt_gatt_exchange_mtu(conn, &mtu_exchange_params[conn_index]);
if (err) LOG_INF("MTU exchange failed (err %d)", err);
else LOG_INF("Exchange pending...");
return err;
}
在connect回調調用:
三、測試
我們使用nrf下面的串口服務例程進行測試,具體怎么編譯程序和燒錄可以看我之前寫的博客
3.1 添加LOG
void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
{
LOG_INF("Updated MTU: TX: %d RX: %d bytesn", tx, rx);
}
static struct bt_gatt_cb gatt_callbacks = {
.att_mtu_updated = mtu_updated,
};
隨后在main函數注冊回調:
3.2 可以看到,默認例程的MTU大小只有23字節大小,每包數據發送超過了這個大小就會報錯,
3.3、在手機上面申請
兩個都是一樣的,可以看到,連接之后,通過主機更新或者從機和主機申請交換MTU大小也會改變,
3.4 添加自動連接更新MTU的宏&自己在連接添加MTU更換的宏
審核編輯 黃宇
-
NCS
+關注
關注
1文章
11瀏覽量
9225
發布評論請先 登錄
NCS怎么添加.c.h文件到工程

更改最大數據包大小時無法識別USB設備如何解決?
nRF Connect SDK(NCS)/Zephyr固件升級詳解 – 重點講述MCUboot和藍牙空中升級

media player 調用屏幕大小會隨分辨率大小自動調整無法固定
怎么更改電腦上的云存儲位置,更改電腦上的云存儲位置教程

mtu大小對云服務的影響
mtu和網絡安全的關系
mtu配置步驟詳解 mtu與數據包丟失的關系
常見的mtu相關問題及解決方案
mtu在不同網絡協議中的應用
mtu與網絡性能的關系 mtu調整對網絡的影響
mtu是什么?解釋和定義
新港海岸NCS8803,HDMI to EDP帶Scaler

世界最小的Intel Core Ultra超高效能主板---PICO-MTU4

評論