Open7

Bluetooth LE APIの調査

okuokuokuoku

企画の細かいところを詰めるために各社プラットフォームのBluetooth APIを調査する。 ...といっても、消費電力やチップの都合でいわゆるClassic Bluetoothが使えないので、Bluetooth LEだけの範囲となる。現代的には、全てのiOSプラットフォームと十分に新しいAndroidはBLEをサポートしているため大きな問題ではないと判断した。

prev

https://zenn.dev/okuoku/scraps/fcac398aec1ff1

https://zenn.dev/okuoku/scraps/fd956ad8f55129

https://zenn.dev/okuoku/scraps/16640a66a44fc1

okuokuokuoku

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通りのブロック例が挙げられている。

  1. どうかんがえてもWebサイトには不要なもの。例としてはFIDOがある。AuthenticatorはOS側で処理されるべきでWebサイトが直接制御するモチベーションはない。
  2. 脆弱なもの。 ... BLE経由でのファームウェアアップデートで、かつ署名のチェックがないものがいくつか挙げられている。
okuokuokuoku

各種マイコン向け

... これ星の数ほど有るんじゃないか。。?手持ちのものだけとりあえず。

メモリ的な都合で、サポートする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

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 )がある。

okuokuokuoku

Apple CoreBluetooth

AppleのCoreBluetoothはペリフェラルとセントラルの両者に対応していて、かつ、iPhone/iPodではアプリケーションが起動していないときでも OS側から接続イベント等でアプリを起動してもらうことができる

もっともiOS上のバックグラウンドアプリはリソースに制約があり、 長期間バックグラウンドで動作していたアプリは自動的にkillされる 。このためBLEでは間欠的な通信を行わざるを得ない。

okuokuokuoku

Android

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でも動く。
okuokuokuoku

Windows

伝統的にかなり充実している。ただし、LEのAPIはUWP側にあるのでWin32ネイティブアプリから呼出すには一工夫必要となる。

ペリフェラルのサポート

オプショナル。 BluetoothAdapter.IsPeripheralRoleSupported

okuokuokuoku

Linux(BlueZ)

いわゆるRaspberry Pi等で利用されているのはBlueZ。BlueZは基本的に全てがD-bus制御になるためAPIドキュメンテーションもD-busオブジェクトのドキュメントになっている。例えばGATTであれば https://github.com/bluez/bluez/blob/master/doc/gatt-api.txt