BLE傳輸性能主要受以下幾個因素影響:操作類型,Connection Interval,每個Connection Event內發送的幀數、每一幀數據的長度。具體參見如下鏈接:
https://en.wikipedia.org/wiki/Bluetooth_low_energy
https://devzone.nordicsemi.com/question/3440/how-do-i-calculate-throughput-for-a-ble-link/
https://atmosphere.anaren.com/wiki/Data_rates_using_BLE
https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android
目前的一個項目對BLE傳輸性能有較高要求,將以上幾個因素逐一確認,使用協議支持的最優值,其中Connection Interval設置為7.5ms,每一幀數據長度為20字節,每個Connection Event根據業務需要設置為2,依此計算出的理論傳輸速度約為5600Bps。為了測試實際效果,在Android端寫了一個小程序,將數據流和時間戳打印出來,如下:
[21]:TS 238.794720 PN 20780 [1]: [21]:TS 238.795954 PN 20780 [2]: [21]:TS 238.802182 PN 20781 [1]: [21]:TS 238.802373 PN 20781 [2]: [21]:TS 238.810432 PN 20782 [1]: [21]:TS 238.832608 PN 20782 [2]: [21]:TS 238.832650 PN 20783 [1]: [21]:TS 238.832728 PN 20783 [2]: [21]:TS 238.832751 PN 20784 [1]: [21]:TS 238.832820 PN 20784 [2]: [21]:TS 238.832843 PN 20785 [1]: [21]:TS 238.833862 PN 20785 [2]: [21]:TS 238.839201 PN 20786 [1]: [21]:TS 238.839403 PN 20786 [2]: [21]:TS 238.848280 PN 20787 [1]: [21]:TS 238.848894 PN 20787 [2]: …… [21]:TS 288.128815 PN 27346 [1]: [21]:TS 288.128977 PN 27346 [2]: [21]:TS 288.136323 PN 27347 [1]: [21]:TS 288.136908 PN 27347 [2]: [21]:TS 288.159292 PN 27348 [1]: [21]:TS 288.159569 PN 27348 [2]: [21]:TS 288.159922 PN 27349 [1]: [21]:TS 288.165079 PN 27349 [2]: [21]:TS 288.167879 PN 27350 [1]: [21]:TS 288.168157 PN 27350 [2]: [21]:TS 288.173809 PN 27351 [1]: [21]:TS 288.173906 PN 27351 [2]:
其中21為數據長度、TS為時間戳、PN為包號,1和2是一個Connection Event內的包的類型。可以看到,一般情況下,一個Connection Event發送兩幀數據,這兩幀數據的時間間隔在1ms以內,兩個Connection Event之間的時間間隔約為7ms。為了直觀呈現測試結果,在PC端寫了一個工具以分析抓取的LOG,主要根據包號、包的類型、字節長度和時間戳,統計丟包率和傳輸速度,如下圖所示。
可以看到,一共傳輸了約16.3萬個包,沒有數據丟失,兩幀之間最大時間間隔約為22.384ms,最大傳輸速度為5641Bps,平均速度約為5583Bps,與理論值(5600Bps)相差不多。Connection Interval對傳輸性能的影響對比下圖,其Connection Interval為11.25ms。
BLE傳輸延遲(Latency)主要是指設備端將數據放至藍牙協議棧到Android主機收到的時間間隔。由於通信雙方時間戳不統一,無法按照前面通過打印時間戳的方式來做統計傳輸延遲,只能通過硬件信號做同步。設備端將數據放至藍牙協議棧時給出一個信號,Android主機收到該數據時也給出一個信號,使用示波器抓取兩個信號即可得到數據通過藍牙BLE傳輸的延遲,如下圖所示。
Channel3為發送端的信號,Channel2為接收端的信號,可以看到BLE傳輸延遲約為8ms左右,會上下波動。
數據傳輸延遲還跟Android端軟件讀取數據的均勻程度有關,Android端軟件需及時將數據從緩存中讀取出來,否則也會造成一定的延遲。評估數據讀取均勻程度的方法同上,也是通過示波器抓取波形來看,如下圖所示。
其中1通道為設備端發送數據,2通道為Android端讀取數據,雙方節奏基本保持一致,確保了及時讀取和分發設備端上報的數據。
本文主要是通過打流和抓波形的方法,驗證了藍牙BLE的傳輸性能和延時。實際調試過程中還可以使用FTS4BT工具分析btsnoop_hci.log文件,以探究BLE建立鏈接、Update Parameters和數據傳輸等細節。