2020年2月1日土曜日

BLE機器にgatttoolで接続しようとして失敗したけど -t random を付けたら成功した話



遭遇した現象と対応

UbuntuやRaspberry PiなどLinuxで動くPCから、下記のようなコマンドでBLE機器に対してhcitoolで検索してgatttoolで接続しようとしたところ、何故か失敗する現象に遭遇しました。
(hcitoolやgatttoolの使い方は以前書いた記事(ubuntuからESP32にbluetooth接続して信号を送受信する方法)が参考になると思います。)
$ sudo hcitool lescan
LE Scan ...
C1:BB:FB:1B:B5:33 (unknown)
$ sudo gatttool -b C1:BB:FB:1B:B5:33 -I
[C1:BB:FB:1B:B5:33][LE]> connect
Attempting to connect to C1:BB:FB:1B:B5:33
Error: connect error: Connection refused (111)
[C1:BB:FB:1B:B5:33][LE]>

Androidの動作確認アプリからは接続できていたので、PCのLinuxからでも接続できると信じて検索をしたところ、いくつかのサイトでgatttoolに -t random オプションを付けたら良いと紹介されているのを見つけました。

Stack Overflow: Cannot connect to BLE device on Raspberry Pi
Raspberry Pi Forum: RaspberryPi 3 B cannot connect GATT BLE devices

試してみたら接続できました。
$ sudo gatttool -t random -b C1:BB:FB:1B:B5:33 -I
[C1:BB:FB:1B:B5:33][LE]> connect
Attempting to connect to C1:BB:FB:1B:B5:33
Connection successful
[C1:BB:FB:1B:B5:33][LE]>

randomとは?

Raspberry Pi Forumで紹介されていたMicrochip社のページ(Bluetooth® Low-Energy Device Address)によると、 BLEのアドレスにはpublic1種類とrandom3種類の合計4種類があるらしいです。

gatttoolの標準のアドレス設定はpublicとなっているため、random形式でアドレスを扱う機器に接続できなかったようです。

まとめ

BLEのアドレスにはpublic1種類とrandom3種類の扱い方があるらしく、gatttoolの標準設定ではpublicなものしか見てくれないため、random形式の機器に接続するには-t randomオプションを付ける必要がありました。

動作確認環境

Ubuntu
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic

bluez (gatttoolはbluezに含まれます)
$ dpkg --status bluez | grep '^Version:'
Version: 5.48-0ubuntu3.2

0 件のコメント :