コンテンツにスキップ

Top

BlueZ の example-gatt-server と example-gatt-client の使い方

2台のLinux PC(ここではRaspberry Pi)を用意し、それぞれをサーバー、クライアントとして、BlueZのサンプルコードを実行する方法を述べる。

大きな流れとしては、bluetoothctlを使ってサーバーとクライアントを接続し、あとはexample-gatt-server と example-gatt-client をそれぞれのPCで動かして通信することを確認する。

bluetoothctl を使って セントラルとペリフェラルを繋げる

サーバーとかクライアントとか言ってたくせに、セントラルとペリフェラルってなんじゃい!と思うかもしれないけど、サーバー、クライアントはあくまでGATTにおけるサーバークライアントであって、それぞれの機器同士の接続状態でいえばセントラルとペリフェラルになる。

例えばスマホとBluetoothキーボードがあったとして、サーバーはBluetoothキーボード、クライアントはスマホになります。 んで、セントラルはスマホでペリフェラルはBluetoothキーボードになります。

あんまり難しく考えずに、
まずサーバーとクライアントは、データを渡すほう受け取るほう、で考える。
セントラルとペリフェラルは、接続するほうとされるほう、で考える。

まぁただの呼び方の違いなので慣れれば違和感は...ありますね。

んで、サンプルコードでサーバーとクライアントがやり取りするためには、まずは、セントラルとペリフェラルをBluetooth的に接続しなければいけません。

これをコマンドラインでするのに bluetoothctl というツールを用います。

bluetoothctlはBlueZに含まれているのでBlueZが入っているLinuxであれば通常は入っています。

昔はhciconfigとか別のコマンドを使って対応したりもしていましたが、現在ではbluetoothctl一択です。 (多分)

まずはペリフェラル側から。

■ペリフェラル(サーバー)側

1
2
3
4
5
6
$ bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# advertise on

ペリフェラルの準備が終わったら、もう一台のPCでセントラル側を実行です。
ここではペリフェラルのBluetoothアダプタのBDアドレスが、AA:BB:CC:DD:EE:FFだったとします。
BDアドレスわからん!という人は、hciconfig hci0 コマンドで確認できます。

1
2
3
4
5
6
$ hciconfig hci0
hci0:   Type: Primary  Bus: UART
        BD Address: AA:BB:CC:DD:EE:FF  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN INQUIRY 
        RX bytes:734580 acl:574 sco:0 events:20448 errors:0
        TX bytes:26602 acl:139 sco:0 commands:2808 errors:0

■セントラル(クライアント)側

1
2
3
4
5
6
$ bluetoothctl
[bluetooth]# power on
[bluetooth]# scan on
[bluetooth]# power on
[bluetooth]# pair AA:BB:CC:DD:EE:FF
[bluetooth]# connect AA:BB:CC:DD:EE:FF

これで(成功していれば)ペリフェラルとセントラルはつながりました。
そもそもpower onでonできなかったり、pairとかやってもエラーになったりいろいろあるのでここで詰まるケースはあると思いますが、環境によっていろいろ違うので知らん。ぐぐれ。

example-gatt-server と example-gatt-client を動かす

サーバー(ペリフェラル)側のPCでexample-gatt-serverを実行します。

1
./example-gatt-server

ちなみにデフォルトだと通信しないので(きちんと規約にのっとってクライアント側がいろいろやれば動くみたいだけど)、ソースコードの中を検索して、 self.notifying = False となっている個所を = True に変えてあげれば動くはず。
(なんか最初につながったときにここTrueにするようにクライアント側がNotify投げるらしいんだけど現実うまく動いてないので最初っからTrueにしとく)

んで、クライアント(セントラル)側で、example-gatt-clientを実行します。

1
./example-gatt-client

でおけまる牧場。

スマホアプリからも接続できちゃうぞ

クライアントもサンプルコードにしたが、スマホにアプリをいれてそこからサーバーにアクセスすることもできる。

代表的なアプリは以下の2つ。

・nRF Connect
・LightBlue

どっちか入れて、起動して、接続すれば、値を見ることができる。

ちなみに、Androidアプリからは制限があるのでHID(HOGP)の通信はできない。
なので上記アプリでHIDデバイス(キーボードとか)と接続しても値を読んだり書いたりできない。

想像だが、勝手にHIDデバイスと接続してキー操作できるアプリがあると、セキュリティ上まずいからだと思う。

以上!