Bluetooth LE APIの調査
企画の細かいところを詰めるために各社プラットフォームのBluetooth APIを調査する。 ...といっても、消費電力やチップの都合でいわゆるClassic Bluetoothが使えないので、Bluetooth LEだけの範囲となる。現代的には、全てのiOSプラットフォームと十分に新しいAndroidはBLEをサポートしているため大きな問題ではないと判断した。
prev
Web Bluetooth
- MDN: https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API
- W3C: https://webbluetoothcg.github.io/web-bluetooth/
Chrome専用、またChromeも仕様を完全には実装していない (getDevices
がbehind flag)。Secure context専用(= 要HTTPS)、GATTプロファイル専用。
特に、 Central roleのみをサポートしていて、GATTクライアント機能しか持たない 点に注意する。端的に言えばPC同士の通信には使用できない。物理層への依存は無いため、仮にGATTサーバを提供するBluetooth Classicデバイスが存在したならばアクセスできても不思議ではない ...が基本的にはBLE専用だろう。
プライバシ
最低限のプライバシが要求されている。スキャンの開始にはユーザジェスチャ( https://html.spec.whatwg.org/#tracking-user-activation )が必要。
Blocklist
Web BluetoothにはBlocklist( https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt )があり、特定のUUIDをブロックするように制御されている。
ポリシ( https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist_policy.md )では2通りのブロック例が挙げられている。
- どうかんがえてもWebサイトには不要なもの。例としてはFIDOがある。AuthenticatorはOS側で処理されるべきでWebサイトが直接制御するモチベーションはない。
- 脆弱なもの。 ... BLE経由でのファームウェアアップデートで、かつ署名のチェックがないものがいくつか挙げられている。
各種マイコン向け
... これ星の数ほど有るんじゃないか。。?手持ちのものだけとりあえず。
メモリ的な都合で、サポートするGATTキャラクタリスティックを事前に宣言する必要があるといった特徴がある。
BTstack
組込み向のBluetoothスタック。Free for non-commercial use + 商用ライセンス。libusb経由でPCでも動作させられる。
ESP32 ESP-IDF
ESP32はBluedroidとNimBLEの2種類のBluetoothスタックをサポートしている。更にBTstackもESP32のVHCIをサポートしているため、プロトコルスタックの選択肢がやたら広いことになっている。
Bluedroidはその名の通りAndroidのBluetoothスタックを移植したもの
NimBLE( https://github.com/apache/mynewt-nimble )はNordic向けに書かれたBLEスタックを移植したもので、BLEのみのサポートとなっている。
Seeed studio rpcBLE と ESP32 Arduino BLE
SeeedのライブラリはESP32用Arduinoと互換らしい。
Nordic SoftDevice と Bluefruit
- https://infocenter.nordicsemi.com/index.jsp?topic=%2Fstruct_nrf52%2Fstruct%2Fs140.html
- https://github.com/adafruit/Adafruit_nRF52_Arduino/tree/master/libraries/Bluefruit52Lib
NordicのnRF5シリーズ ではいわゆるHCIではなくSoftDeviceの形でBIOS的にプロトコルスタックごとblobで提供している。
NimBLEはこのSoftDeviceを置換する形で実装している。
SoftDeviceのサンプルには、この界隈では割とメジャーなNordic UART Service( https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v14.0.0%2Fble_sdk_app_nus_eval.html )がある。
Apple CoreBluetooth
- 本家: https://developer.apple.com/documentation/corebluetooth
- PunchThroughの解説: https://punchthrough.com/core-bluetooth-basics/
AppleのCoreBluetoothはペリフェラルとセントラルの両者に対応していて、かつ、iPhone/iPodではアプリケーションが起動していないときでも OS側から接続イベント等でアプリを起動してもらうことができる 。
もっともiOS上のバックグラウンドアプリはリソースに制約があり、 長期間バックグラウンドで動作していたアプリは自動的にkillされる 。このためBLEでは間欠的な通信を行わざるを得ない。
Android
- 本家: https://developer.android.com/guide/topics/connectivity/bluetooth/ble-overview?hl=en
- https://source.android.com/devices/bluetooth/ble_advertising?hl=en -- Bluetooth 5.0でのアドバタイジング拡張の利用
- PunchThroughの解説: https://punchthrough.com/android-ble-guide/
- サンプル: https://github.com/android/connectivity-samples
Androidではセントラルにのみ対応している 。一応GATT Serverを実装することはできるので、 BluetoothLeAdvertiser
経由でサービスをアドバタイズすることで他のセントラルからの接続を受け入れることは可能となっている。(サンプル: BluetoothLeChat
)
Dozeとの関連はよくわからない。たぶん exemption listに入れる ことで問題なく通信できるんではないかと思うが。。
ペリフェラルのサポート
本家のドキュメント( https://source.android.com/devices/bluetooth/ble?hl=en )では
Devices supporting Bluetooth 4.1 and earlier can only use BLE in central mode. Older device chipsets may not support BLE peripheral mode.
とあるので最近のデバイスはサポートしていると見做してよさそうだ。
スタックの変遷
- 〜 Android 4.1 はBlueZだった。Android 5.xまではBlueZ for Androidが存在した。
- Android 4.2 〜 5.1 はBluedroidだった。これはESP-IDFにも移植されている。
- Android 6.0 〜 はBluedroidをベースにしたFluorideが使用されている。FluorideはLinuxでも動く。
Windows
伝統的にかなり充実している。ただし、LEのAPIはUWP側にあるのでWin32ネイティブアプリから呼出すには一工夫必要となる。
- https://learn.microsoft.com/en-us/windows/uwp/devices-sensors/bluetooth-low-energy-overview
- FAQ: https://learn.microsoft.com/en-us/windows/uwp/devices-sensors/bluetooth-dev-faq
- https://www.chromium.org/developers/how-tos/file-web-bluetooth-bugs/ WindowsのETLを使用したパケットキャプチャ手法の説明
ペリフェラルのサポート
オプショナル。 BluetoothAdapter.IsPeripheralRoleSupported
。
Linux(BlueZ)
いわゆるRaspberry Pi等で利用されているのはBlueZ。BlueZは基本的に全てがD-bus制御になるためAPIドキュメンテーションもD-busオブジェクトのドキュメントになっている。例えばGATTであれば https://github.com/bluez/bluez/blob/master/doc/gatt-api.txt 。