ble: gattlib (5)
2025/05/17
はじめに
前回…1ヶ月前の続きで gattlib で BLE の central 操作するのを検討している。
- ble: gattlib - hiro99ma blog
- ble: gattlib (2) - hiro99ma blog
- ble: gattlib (3) - hiro99ma blog
- ble: gattlib (4) - hiro99ma blog
bluetoothctl
接続が一回ではうまく行かないことが多いのは1ヶ月前と同じだ。 というよりも、この1ヶ月何もしてないので変化はないのだ。
Raspberry Pi でやるとこうなるのか、Bluez なのか、gattlib なのか切り分けができていない。
x86ネイティブな Linux 環境を持っていないので、gattlib を使うからなのかどうかくらいの切り分けになりそうだ。
bluetoothctl
を実行するとコマンド待ちになる。
終了は “exit”。
“help” でヘルプが出力される。
[dev]
は対象デバイスの MACアドレス(xx:xx:xx:xx:xx:xx) を与えるようだ。
[bluetoothctl]> help
Menu main:
Available commands:
-------------------
advertise Advertise Options Submenu
monitor Advertisement Monitor Options Submenu
scan Scan Options Submenu
gatt Generic Attribute Submenu
admin Admin Policy Submenu
player Media Player Submenu
endpoint Media Endpoint Submenu
transport Media Transport Submenu
mgmt Management Submenu
monitor Advertisement Monitor Submenu
assistant Media Assistant Submenu
hci HCI Submenu
list List available controllers
show [ctrl] Controller information
select <ctrl> Select default controller
devices [Paired/Bonded/Trusted/Connected] List available devices, with an optional property as the filter
system-alias <name> Set controller alias
reset-alias Reset controller alias
power <on/off> Set controller power
pairable <on/off> Set controller pairable mode
discoverable <on/off> Set controller discoverable mode
discoverable-timeout [value] Set discoverable timeout
agent <on/off/auto/capability> Enable/disable agent with given capability
default-agent Set agent as the default one
advertise <on/off/type> Enable/disable advertising with given type
set-alias <alias> Set device alias
scan <on/off/bredr/le> Scan for devices
info [dev/set] Device/Set information
pair [dev] Pair with device
cancel-pairing [dev] Cancel pairing with device
trust [dev] Trust device
untrust [dev] Untrust device
block [dev] Block device
unblock [dev] Unblock device
remove <dev> Remove device
connect <dev> [uuid] Connect a device and all its profiles or optionally connect a single profile only
disconnect [dev] [uuid] Disconnect a device or optionally disconnect a single profile only
wake [dev] [on/off] Get/Set wake support
bearer <dev> [last-seen/bredr/le] Get/Set preferred bearer
menu <name> Select submenu
version Display version
quit Quit program
exit Quit program
help Display help about this program
export Print environment variables
script <filename> Run script
まず “scan on” で Advertising している機器のスキャンを開始。
“scan off” で止めることはできるが、たぶん止めないのが正解だと思う(後述)。
“scan on” すると、機器を検出したら [NEW]
、変化があったら [CHG]
のログを出し続ける。
[CHG]
は主に RSSI だ。
機器の local name は [NEW]
のときにしか出力されないので、接続したい MACアドレスは最初から知っていた方が楽かもしれない。
“connect [MACアドレス]” で接続することができる。 切断は “disconnect [MACアドレス]”だ。
bluetoothctl
で試した結果
何回か試したが、接続はおそらく失敗せずにできた。 そう書くと「gattlib のせいか!」となるのだが、もう少し落ち着いておくれ。
最初はこうやっていた。
- “scan on” でスキャン開始
- 接続したいデバイスが出てきたら “scan off” でスキャン停止
- “connect [MACアドレス]” で接続開始
この手順だと、最初は接続できなかった。
“scan on” にしたままにしたら接続できた。
そう書くと「手順のせいか!」となるのだが、これも待っておくれ。
手順を確認していたのだが、”scan on” していなくても接続できるようになっていたのだ。
ペアリングというかボンディングはしないのだが、接続したことあるデバイスなら再接続を簡易化することはできたような記憶がある。
しかし Bluez がそうしているなら gattlib がそうなっていてもおかしくはないのだが。
よくわからん。
今はスキャンを止めてから接続させているので、それを止めないようにすれば良いだけかと思ったが、
まだうまくいっていない。
Central の気持ちが分かっていないからだろうか。。。