Open3

Bluetooth LEの通信性能を最大化するには

okuokuokuoku

Bluetooth LE(BLE)が割と普及した無線プロトコルになりつつあるので、それを活用してデバイスを無線化したい。が、なかなか難しそうなことがわかってきた。

結論

  • 対向がAndroidやiOSの場合は、普通のUARTくらいの速度、つまり、 〜 50kb/sec (= 400kbps)くらいが関の山となる
  • ギリギリを攻めれば倍の 100kb/sec 弱が狙えなくもないが、専用機同士の通信となる
  • Web Bluetoothはもっと厳しい; GATTしか使えず、GATTのMTUを得る方法が無い
okuokuokuoku

要点

なぜかこの領域は需要が高いらしく、多くのチュートリアルがある。

https://punchthrough.com/ble-throughput-part-4/

https://interrupt.memfault.com/blog/ble-throughput-primer

また、Apple WWDCのBluetoothセッションにもBluetooth LEのスループットについての言及がある。

https://developer.apple.com/videos/play/wwdc2017/712/

https://developer.apple.com/videos/play/wwdc2019/901/

特にWWDC2017の講演はBLEのスループットについて一節を割いている。

これらをまとめると、

  • (そもそもL2CAPの接続指向チャンネルが使えないか検討する -- オーダー等も面倒をみてくれるので)
  • 可能ならBluetooth 5.0の2Mbps PHYを使用する(iPhone8、AppleTV 4K、Watch series2以降)
  • Data Length Extension を使用して可能な限り大きなMTUを使用する
  • 十分に短いConnection intervalを使用する(15ms in iOS、ただしtvとwatchでは設定できない) & 7.5msは短すぎる
  • 非同期のリクエストを使用する。 Requestではなく Command 、 Indication ではなく Notification