2014年1月19日

BluetoothLowEnergy(BLE)の勉強 - その2 - Linux+BlueZでBLE通信内容確認(1)

前回のエントリで、BlueZのgatttoolを使ってBluetooth Low Energy(BLEデバイス)との通信を試みました。今回はその出力の詳細を確認していきます。

primaryの出力
BLEデバイスに対してgatttoolの"primary"コマンドで以下の出力が得られました。
  [CON][44:13:19:02:F8:A9][LE]> primary
  [CON][44:13:19:02:F8:A9][LE]>
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
  attr handle: 0x0008, end grp handle: 0x000a uuid: 00001803-0000-1000-8000-00805f9b34fb
  attr handle: 0x000b, end grp handle: 0x000d uuid: 00001802-0000-1000-8000-00805f9b34fb
  attr handle: 0x000e, end grp handle: 0x0010 uuid: 00001804-0000-1000-8000-00805f9b34fb
  attr handle: 0x0011, end grp handle: 0xffff uuid: 0000180f-0000-1000-8000-00805f9b34fb
まずはこれについて見ていきます。

そもそも、"primary"とは何か?というところからです。これはBLEの肝となっているGATT/ATTに関わる内容になります。GATTは"Generic Attribute Profile"、ATTは"Attribute Protocol"です。(私もまだ勉強中ですが)BLEは基本的にAttributeの読み出し・書き込みを行うことで実現される技術であり、『Attributeにアクセスするための通信プロトコルがATT』『ATT上でどのようなAttributeを構成するかを規定したプロファイルがGATT』という位置付けになります。
Attributeには複数の種別があり、各AttributeにはUUIDが割り当てられています。上記出力では、BLEデバイス(ぶるタグ)が保持するAttributeの内、"Primary Service"のAttributeを取得・ダンプした結果になります。
# ATT/GATTを含めBluetooth規格はBluetooth SIGのサイトで仕様書を確認できます

では、実際の出力結果からもう少し詳細を見ていきます。

primaryの1エントリ(uuid: 00001800-0000-1000-8000-00805f9b34fb)
primaryの出力結果が複数行(エントリ)ありましたが、最初のエントリについて細かく見ていきます。
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
最初に注目するのはuuidです。"00001800-0000-1000-8000-00805f9b34fb"となっています。この値はBluetooth SIGによる"Generic Access"のサービス用に規定されたUUIDです。
# Bluetooth SIGのサイトで、採択番号を参照することができます(リンク

少し話がそれますが、上記リンク先では "Generic Access"サービスのUUIDとして "0x1800" と記述されていますが、対応関係について簡単に記載おきます。UUIDは128ビットの値ですが、Bluetoothの基幹IDとして "0000XXXX-0000-1000-8000-00805F9B34FB" が設定されており、XXXXの16ビット部分のみで128ビットのUUIDを表すようになっています。

primaryの残りの部分ですが、attr handleとend grp handleはAttributeに対するハンドルのグループを指定してます。この例では、0x0001自体がこのPrimary Service(Generic Accessサービス)のハンドルで、0x0007までがこのサービスのハンドルということを示しています。

では、primaryの出力結果を眺めてみる
最初のエントリを含め、全体のエントリの出力結果を見てみると以下のようになります。
各UUIDに対応するサービスを出すと、BLEデバイスが提供するサービスが見えてきました。
  handle 0x0001 - 0x0007 : Generic Access Service (0x1800)
  handle 0x0008 - 0x000a : Link Loss Service (0x1803)
  handle 0x000b - 0x000d : Immediate Alert Service (0x1802)
  handle 0x000e - 0x0010 : Tx Power Service (0x1804)
  handle 0x0011 - 0xffff : Battery Service (0x180f)

今日はここまで。
次回は、Characteristicsに関しても見ていきたいと思います。


2014年1月12日

BluetoothLowEnergy(BLE)の勉強 - その1 - Linux+BlueZでBLE通信を試す

Bluetooth Low Energey (BLE) の個人勉強用に、LinuxでBLE通信を試してみました。
その手順等について以下記載します。

環境
ThinkPad X201上のGentooLinux環境で試しました。Linuxカーネルは3.10.17、BlueZ(Bluetoothスタック)は4.101をインストールしています。
ThinkPad X201はBLE対応(Bluetooth Ver4.0以降)のホストを搭載していないので、USBドングル(Princeton PTM-UBT7)を接続しました。通信相手となるBLEデバイスには、iPhone対応しているふるタグ(Logitec LBT-MPVRU01BK)を使います。

BLEデバイスのスキャン
コマンドラインでhcitoolを使ってスキャンします。
  $ hcitool lescan
以下のような出力が続き、LBT-MPVRU01BKが見つかりました。
  44:13:19:02:F8:A9 LBT-VRU01
  44:13:19:02:F8:A9 (unknown)
LBT-MPVRU01BKのBluetoothアドレスは、44:13:19:02:F8:A9ということがわかります。

デバイスへのアクセス
見つかったアドレスに対して、gatttoolを使ってアクセスしてみます。"-I"オプションをつけることでインタラクティブに通信操作を行うことができます。(太字の部分が実際に入力した箇所です)
  $ gatttool -i hci0 -b 44:13:19:02:F8:A9 -I
  [   ][44:13:19:02:F8:A9][LE]> connect
  [CON][44:13:19:02:F8:A9][LE]> primary
  [CON][44:13:19:02:F8:A9][LE]>
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
  attr handle: 0x0008, end grp handle: 0x000a uuid: 00001803-0000-1000-8000-00805f9b34fb
  attr handle: 0x000b, end grp handle: 0x000d uuid: 00001802-0000-1000-8000-00805f9b34fb
  attr handle: 0x000e, end grp handle: 0x0010 uuid: 00001804-0000-1000-8000-00805f9b34fb
  attr handle: 0x0011, end grp handle: 0xffff uuid: 0000180f-0000-1000-8000-00805f9b34fb
  [CON][44:13:19:02:F8:A9][LE]> characteristics
  [CON][44:13:19:02:F8:A9][LE]>
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x0a, char value handle: 0x000a, uuid: 00002a06-0000-1000-8000-00805f9b34fb
handle: 0x000c, char properties: 0x04, char value handle: 0x000d, uuid: 00002a06-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x02, char value handle: 0x0010, uuid: 00002a07-0000-1000-8000-00805f9b34fb
handle: 0x0012, char properties: 0x02, char value handle: 0x0013, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0014, char properties: 0x02, char value handle: 0x0015, uuid: 00002a1a-0000-1000-8000-00805f9b34fb
handle: 0x0016, char properties: 0x12, char value handle: 0x0017, uuid: 00002a1b-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a3a-0000-1000-8000-00805f9b34fb
  [CON][44:13:19:02:F8:A9][LE]> char-write-cmd 0x000d 02
  [CON][44:13:19:02:F8:A9][LE]> char-write-cmd 0x000d 01

最後の2つのコマンドで、実際にBLEデバイス(LBT-MPVRU01BK)に対する通信操作を行うことができました。
"char-write-cmd 0x000d 02"でLBT-MPVRU01BKからメロディが流れます。
また、"char-write-cmd 0x000d 01"でLBT-MPVRU01BKのLEDが点滅します。

gatttoolでの操作および出力がBLEの肝になるような雰囲気ですが、これらについては後日記載したいと思います。

参考ページ
スキャンや通信に関しては、以下のページを参考にしました。(ほぼそのままです…)
http://i-miss-erin.blogspot.jp/2010/12/gatttool-in-bluez-over-bredr.html