微信小程序的setBLEMTU說明

最近在做微信小程序的藍牙功能,連接的設備是MPOS,但是收發數據發現,如果手機端接收的數據超過20byte就無法有效收到。

查詢了很多資料,也嘗試了抓報藍牙的btsnoop_hci.log來進行分析,發現並沒有收到notify的數據,說明手機端沒有收到。

網上大多數的結論是:BLE做了收發的data最大數據限制,單個數據包的默認系統最大長度是23byte(字節),超過了就會出問題【20byte的Data數據 + 3byte的藍牙 Header】。之前微信也沒有做相關的處理,其實Android本身如果做BLE連接的話是可以修改單個數據包的最大長度值的,也就是MTU值。

這個問題在IOS上是不存在的。

有兩種解決辦法:

1.藍牙模塊的BLE底層修改,廠商更改發包邏輯,每次最大發包的長度不超過23byte就行。【這種情況一般比較難】

2.微信在2.11.0的lib庫支持了修改BLEMTU值來更改系統的默認值,代碼如下:

const mtu = 512;
    wx.setBLEMTU({
      deviceId: that.data.deviceId,
      mtu,
      success:(res)=>{
        console.log("setBLEMTU success>>", res)
      },
      fail:(res)=>{
        console.log("setBLEMTU fail>>", res)
      }
    }),

支持設置的範圍是(20,512);

調試發現,我的小米9手機如果設置超過180byte就會報錯,

但是失敗了貌似還是有效,初步判斷如果設置超過了系統的最大值,默認使用系統支持的最大值?這個無法判斷,但是確認更改有效,即使設置顯示失敗。後續多測試幾種類型的android手機再做結論。

設置了該值之後,就可以正常收發了。我的藍牙設備單個包最大數據長度爲129byte,超過了就會分包,所以在實際開發的過程中,只要滿足自己藍牙設備發送單個包的最大長度就可以實現接收數據了。

發送分包類似,對於太大的數據,最好做分包發送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章