Bluez を使用したSensorTagへのアクセス 」でBluez を使用してSensorTagへアクセスしましたが、今回はRaspberry Pi 3に実装されているBluetoothを使用して、Bluetooth Low Energy(BLE)プロトコルで、Bluezのコマンドを使用して SensorTagへアクセスします。hcidump ユーティリティを使用して、SensorTagとのプロトコルをデータダンプします。

BluezとSensorTagのBLE接続確認

前回の「Bluez を使用したSensorTagへのアクセス 」では、Bluezのソースコードを取得してコンパイル・インストールを行いましたが、Raspberry Pi 3ではすでにBluezは標準のイメージ含まれており、実行できるように設定されていました。SensorTagと次のコマンドで接続します。

次のコマンドで、インストールされているバージョンを確認します。バージョンは、5.23-2+rpi2でした。

$ apt-cache show bluetooth
Package: bluetooth
Source: bluez
Version: 5.23-2+rpi2
Architecture: all
Maintainer: Debian Bluetooth Maintainers 
Installed-Size: 69
Depends: bluez
Suggests: bluez-cups, bluez-obexd
Homepage: http://www.bluez.org
Priority: optional
Section: admin
Filename: pool/main/b/bluez/bluetooth_5.23-2+rpi2_all.deb
Size: 36526
SHA256: 98addfa78c275010edd8140f6931fcaaaf16338de3647979036e9cdf08349c7a
SHA1: 119a0fe987902df09cc6f272cbc851077217a10a
MD5sum: af7f5638734939e1a107a71f8c32f8a9
Description: Bluetooth support
 This package provides all of the different plugins supported
 by the Bluez bluetooth stack.
Description-md5: c9c3278c19393dc7c6582892d29bf660

まず、BLEの電源を入れます。hciconfigコマンドで「UP RUNNING」になっていることを確認します。

$ sudo hciconfig hci0 up

$ sudo hciconfig
hci0:   Type: BR/EDR  Bus: UART
        BD Address: B8:27:EB:2E:E0:10  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING
        RX bytes:717 acl:0 sco:0 events:42 errors:0
        TX bytes:1532 acl:0 sco:0 commands:42 errors:0

SensorTagをRaspbianに登録するにはBD(Bluetooth Device)アドレスが必要なので、SensorTagの側面のスイッチを押してアドバタイズ状態にし、hcitoolコマンドを実行します。

$ sudo hcitool lescan
LE Scan …
70:56:81:EC:D8:8C (unknown)
B4:99:4C:64:CD:DF (unknown)
B4:99:4C:64:CD:DF SensorTag
^Z
[1]+  Stopped                 sudo hcitool lescan

hcitoolコマンドでSensorTagに接続します。

$ sudo hcitool lecc B4:99:4C:64:CD:DF
Connection handle 64

atttoolコマンドを使用して、対話的にSensorTag のセンサーの情報を読み込みます。次の例では、SensorTagと接続します。

$ sudo gatttool -b B4:99:4C:64:CD:DF --interactive
[B4:99:4C:64:CD:DF][LE]> connect
Attempting to connect to B4:99:4C:64:CD:DF
Connection successful

hcidumpコマンドは、標準のイメージではインストールされていないので、次のコマンドでインストールします。

$ sudo apt-get install bluez-hcidump

Bluezのhcidump ユーティリティは tcpdump と似ています。 これはターミナル上の Bluetooth パケットの内容の表示および Bluetooth パケットのHCI データをファイルにダンプするために使えます。hcidump -Rを起動したまま、SensorTagに対してgatttoolコマンドを実行すると、Bluetooth パケットが得られます。

$  sudo hcidump -R &
[1] 25307
$ HCI sniffer – Bluetooth packet analyzer ver 5.21
device: hci0 snap_len: 1500 filter: 0xffffffff
$ sudo hcitool lescan
< 01 0B 20 07 01 10 00 10 00 00 00
> 04 0E 04 01 0B 20 00
< 01 0C 20 02 01 01
> 04 0E 04 01 0C 20 00
LE Scan ...
> 04 3E 0F 02 01 00 00 DF CD 64 4C 99 B4 03 02 01 05 D0
B4:99:4C:64:CD:DF (unknown)
> 04 3E 20 02 01 04 00 DF CD 64 4C 99 B4 14 0A 09 53 65 6E 73
  6F 72 54 61 67 05 12 50 00 20 03 02 0A 00 BF
B4:99:4C:64:CD:DF SensorTag
^Z
$ sudo gatttool -b  B4:99:4C:64:CD:DF --interactive
[B4:99:4C:64:CD:DF][LE]> connect
Attempting to connect to B4:99:4C:64:CD:DF
[B4:99:4C:64:CD:DF][LE]> 
< 01 0D 20 19 60 00 30 00 00 00 DF CD 64 4C 99 B4 00 28 00 38
  00 00 00 2A 00 00 00 00 00
> 04 0F 04 00 01 0D 20
> 04 3E 13 01 00 40 00 00 00 DF CD 64 4C 99 B4 36 00 00 00 2A
  00 00
< 01 16 20 02 40 00
> 04 0F 04 00 01 16 20
> 04 3E 0C 04 00 40 00 01 00 00 00 00 00 00 00
Connection successful
[B4:99:4C:64:CD:DF][LE]> char-read-hnd 0x25
[B4:99:4C:64:CD:DF][LE]> 
< 02 40 00 07 00 03 00 04 00 0A 25 00
> 02 40 20 09 00 05 00 04 00 0B 00 00 00 00
Characteristic value/descriptor: 00 00 00 00
[B4:99:4C:64:CD:DF][LE]> 
> 04 13 05 01 40 00 01 00
char-write-cmd 0x29 01
[B4:99:4C:64:CD:DF][LE]> 
< 02 40 00 08 00 04 00 04 00 52 29 00 01
> 04 13 05 01 40 00 01 00
char-read-hnd 0x25
[B4:99:4C:64:CD:DF][LE]> 
< 02 40 00 07 00 03 00 04 00 0A 25 00
> 02 40 20 09 00 05 00 04 00 0B AE FE 78 0E
Characteristic value/descriptor: ae fe 78 0e
[B4:99:4C:64:CD:DF][LE]> 
> 04 13 05 01 40 00 01 00
exit
(gatttool:1027): GLib-WARNING **: Invalid file descriptor.
< 01 06 04 03 40 00 13
> 04 0F 04 00 01 06 04
> 04 05 04 00 40 00 16

hcidumpからのデータは、見やすいようにまとめています。