Web Bluetooth ではキャッシュされたサービスの UUID が使われる(ような気がする)
M5StickC 心拍計 のログをBLEで取得できるよう変更していたときに、 Web Bluetooh から新しく追加したサービスに接続できず、しばらく悩んでしまったのでメモなど。
接続できない状況
- Android(central) と M5StickC (peripheral) を PassKey ありでペアリングする。
- M5StickC 側でサービスを追加/変更する。今回はHeartRateMonitorBLE/src/BLEHeartRate.hの コメントアウトしてあるUUID から 新しいUUID へ変更してある状態。
- Android の Chrome 上で
requestDevice()
を実行すると、新しいサービスのUUID をキーにしてデバイスを見つけることはできる。 - しかし、実際に接続しようとすると、以下のようなエラーとなる。
対応方法
- Chrome で「 chrome://bluetooth-internals/ 」を開き、問題になっているデバイスへ接続する(古いサービスが表示されている)。
- 「Forget」をタップする。
- 環境によっては「Forget」で忘れないようなので、そのようなときは Android の「設定/接続済のデバイス」からデバイスを削除(ペアリングを解除)し再度ペアリングする。
- 再接続すると新しいサービスの UUID が表示される。
まとめ
Web Bluetooth ではオリジン間でデバイスID を推測できないような仕組みを要求されているような記述をみかけた記憶があるので(かなり曖昧な記憶ですね。。。)、 その辺のあれやこれやでブラウザ側でもデバイスを管理しているのかなという気もしますが、 サービスをうまく忘れてくれないのは不具合かなと言う気もしています。
とりあえずは、原因は不明ですが「Web Bluetooth でデバイスは見つかるのに新しいサービスに接続できない」という場合は、 ブラウザ側の状況を確認してみると解決できるかもしれません。