Open3
Bluetooth LEの通信性能を最大化するには
Bluetooth LE(BLE)が割と普及した無線プロトコルになりつつあるので、それを活用してデバイスを無線化したい。が、なかなか難しそうなことがわかってきた。
結論
- 対向がAndroidやiOSの場合は、普通のUARTくらいの速度、つまり、 〜 50kb/sec (= 400kbps)くらいが関の山となる
- ギリギリを攻めれば倍の 100kb/sec 弱が狙えなくもないが、専用機同士の通信となる
- Web Bluetoothはもっと厳しい; GATTしか使えず、GATTのMTUを得る方法が無い
要点
なぜかこの領域は需要が高いらしく、多くのチュートリアルがある。
また、Apple WWDCのBluetoothセッションにもBluetooth LEのスループットについての言及がある。
特に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 。
Web BluetoothはMTUを取れない
まぁ通常はMTU既知のデバイスとしか通信しないもんなぁ。。