1、問題現象
問題:在開發微信小程序藍牙通信功能時,常常會遇到莫名其妙的錯誤,查閱官方文檔可能也無法找到答案。如在寫入藍牙數據時,報了這樣的錯誤:
{errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOWN (239)"},無從入手。
查閱官方文檔,10008錯誤碼給出的提示是:“其余所有系統上報的異常”
可能在蘋果手機還好好的,到了安卓就不行了,其實啊,這是最大傳輸單元沒有協商好的問題,我們仔細看下官網的注意事項大概能猜到:
2、問題分析
MTU(Maximum Transmission Unit,最大傳輸單元) 是指 BLE(Bluetooth Low Energy,低功耗藍牙) 通信中 單次數據傳輸的最大字節數。它決定了設備之間一次能發送/接收多少數據,直接影響通信效率和速度。
2.1. BLE MTU 的基本概念
-
MTU = 協議頭(3字節) + 有效數據(Payload)
-
標準 BLE 4.0/4.1 的默認 MTU 是 23 字節(其中 3 字節用于協議頭,實際有效數據只有 20 字節)。
-
BLE 4.2+ 支持更大的 MTU(如 247、512 甚至更高),但需要設備和手機都支持。
-
-
MTU 越大,傳輸效率越高:
-
如果 MTU=23,每次最多只能發 20 字節有效數據。
-
如果 MTU=512,一次可以發 509 字節有效數據,減少分包次數,提高傳輸速度。
-
2.2. MTU 由誰決定?
MTU 不是單方面決定的,而是 手機(主機)和 BLE 設備(從機)協商 的結果:
- 手機(主機) 可以發起 MTU 請求(如
wx.setBLEMTU(512)
)。 - BLE 設備(從機) 會返回它能支持的最大 MTU(如 185 字節)。
- 最終 MTU 取兩者中的較小值(比如手機請求 512,設備支持 185,最終 MTU=185)