hiro99ma blog

ble: gattlib (5)

2025/05/17

はじめに

前回…1ヶ月前の続きで gattlib で BLE の central 操作するのを検討している。

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 のせいか!」となるのだが、もう少し落ち着いておくれ。

最初はこうやっていた。

  1. “scan on” でスキャン開始
  2. 接続したいデバイスが出てきたら “scan off” でスキャン停止
  3. “connect [MACアドレス]” で接続開始

この手順だと、最初は接続できなかった。
“scan on” にしたままにしたら接続できた。

そう書くと「手順のせいか!」となるのだが、これも待っておくれ。
手順を確認していたのだが、”scan on” していなくても接続できるようになっていたのだ。 ペアリングというかボンディングはしないのだが、接続したことあるデバイスなら再接続を簡易化することはできたような記憶がある。
しかし Bluez がそうしているなら gattlib がそうなっていてもおかしくはないのだが。

よくわからん。
今はスキャンを止めてから接続させているので、それを止めないようにすれば良いだけかと思ったが、 まだうまくいっていない。
Central の気持ちが分かっていないからだろうか。。。


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage