アルプスのセンサネットワークモジュールをラズパイ3と3GPIで使ってみる(其の1 BLEパケット構造解析)

  • 8
    いいね
  • 1
    コメント

メカトラックス株式会社様より、アルプスのセンサネットワークモジュールをお借りすることができました。アルプスのセンサネットワークモジュールは、Bluetooth Low Energy(BLE)を用いて、モーションデータと共に、気圧、温度・湿度などの環境データを取得できます。今回は、センサネットワークモジュールを、BLEを用いて、次のようにRaspberry Pi 3と接続しました。

写真ではRaspberry Pi 3の上に、メカトラックス株式会社様の3GPI(Raspberry Pi向け3G通信モジュール)を載せています。最終的には、センサネットワークモジュールで取得した環境データを3GPI経由でネットワーク上にアップロードします。なお、今回提供された3GPIに同梱されている接続設定済Raspbian入microSDカードは、現状(2016/08/17現在)のままだと、Bluetoothのデバイスを認識しませんでした。Raspbianのアップデート方法をこのブログの最後に記述しておきます。

Bluezのコマンド「gatttool」を使って、アルプスのセンサネットワークモジュールとRaspberry Pi 3とBLE接続し、温度データ、湿度データ、気圧データを取得します。同時に、BLE接続に使用しているBLEパケットをパケットキャプチャソフト「tshark」を使ってキャプチャし、BLEパケットの構造解析を行います。なお、Raspberry Pi 3にtsharkのインストールする方法およびその使用方法については、「tsharkによるBLEパケットのキャプチャ 」を参照ください。

センサネットワークモジュールから環境データの取得

Bluezのコマンド「gatttool」を使って、最初にセンサネットワークモジュールのアドレスの取得し、次に、取得したセンサネットワークモジュールのアドレスを使用して、対話的にセンサネットワークモジュールのセンサー情報を読み出します。

センサネットワークモジュールのアドレスの取得

センサネットワークモジュールを接続するには、BD(Bluetooth Device)アドレスを必要とするため、センサネットワークモジュールの下部のスイッチをONにして、次のhcitoolコマンドを実行します。Bluetoothのネットワークスキャンにより、センサネットワークモジュールが検出されると、その結果が表示されます。センサネットワークモジュールのアドレスが「28:A1:83:E1:58:96」、名称が「SNM00」になっていることがわかります。

$  sudo hcitool lescan
LE Scan ...
28:A1:83:E1:58:96 SNM00
28:A1:83:E1:58:96 (unknown)
(ctrl c) 

対話的なセンサー情報の読み込み

Raspberry Pi 3で、Bluezのコマンド「gatttool」を使って、対話的にセンサネットワークモジュールのセンサー情報を読み込みます。センサネットワークモジュールのコマンドガイド「Sensor Network Module評価キットApplication Note Command Guide」の「2.2 コマンドによる設定例」を参考にして、次のような設定にしました。

  設定    機能
計測モード Slowモード
計測間隔 1分
Acceleration
Geo-Magnetic
Pressure
Humidity
Temperature
UV
Ambient Light

センサネットワークモジュールのコマンドガイドの「Appendix1 Service1 Database」に記述されているService1のパケットデータは、gatttoolコマンドの「char-write-req」を使用すると出力できます。char-write-reqで与える二つのパラメータのうち、最初のパラメータは「Attribute Handle」、二番目のパラメータは、センサネットワークモジュールのコマンドガイドの「4. コマンド構造 (Custom3)」に従ってコマンドを設定します。gatttoolコマンドの実行時のパラメータ、および対話的に入力するchar-write-reqのデータを次に示します。

gatttool -i hci0 -b 28:A1:83:E1:58:96 -I 
connect
char-write-req 0x0018 200300
char-write-req 0x0018 230301

char-write-req 0x0013 0100
char-write-req 0x0016 0100

char-write-req 0x0018 2F0303
char-write-req 0x0018 01031C
char-write-req 0x0018 040300
char-write-req 0x0018 05043C00

char-write-req 0x0018 200301
char-write-req 0x0018 230300

gatttoolコマンドのchar-write-reqを使用し、センサネットワークモジュールにパケットデータを出力した結果を、次に示します。最後に表示されている「Notification handle = 0x0012 value: f3 14 c8 e2 76 16 4f 0d 00 80 00 80 00 00 00 00 01 0a 0f 02」と「Notification handle = 0x0012 value: f3 14 c8 e2 76 16 4f 0d 00 80 00 80 00 00 00 00 01 0a 0f 02」がセンサネットワークモジュールからのデータパケットとなります。

$ gatttool -i hci0 -b 28:A1:83:E1:58:96 -I
[28:A1:83:E1:58:96][LE]> connect
Attempting to connect to 28:A1:83:E1:58:96
Connection successful
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 200300
Characteristic value was written successfully
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 230301
Characteristic value was written successfully
[28:A1:83:E1:58:96][LE]> char-write-req 0x0013 0100
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 00 9b 0b 00 01 00 00 00 00 00 00 00 00 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0016 0100
Characteristic value was written successfully
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 2F0303
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 01031C
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 040300
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 05043C00
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 200301
Characteristic value was written succe
ssfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
Notification handle = 0x0012 value: f2 14 00 80 00 80 00 80 00 80 00 80 00 80 00 00 24 09 00 00
Notification handle = 0x0012 value: f3 14 ce e2 75 16 52 0d 00 80 00 80 00 00 00 00 01 0a 0f 00
[28:A1:83:E1:58:96][LE]> char-write-req 0x0018 230300
Characteristic value was written successfully
Notification handle = 0x0012 value: e0 14 00 00 00 00 d3 9f 0b 00 01 00 00 00 00 00 00 00 00 00
Notification handle = 0x0012 value: f2 14 00 80 00 80 00 80 00 80 00 80 00 80 00 00 24 0a 00 01
Notification handle = 0x0012 value: f3 14 ce e2 71 16 50 0d 00 80 00 80 00 00 00 00 01 0a 0f 01
Notification handle = 0x0012 value: f2 14 00 80 00 80 00 80 00 80 00 80 00 80 00 00 24 0b 00 02
Notification handle = 0x0012 value: f3 14 c8 e2 76 16 4f 0d 00 80 00 80 00 00 00 00 01 0a 0f 02
Notification handle = 0x0012 value: f2 14 00 80 00 80 00 80 00 80 00 80 00 80 00 00 24 0c 00 03
[28:A1:83:E1:58:96][LE]> exit

(gatttool:837): GLib-WARNING **: Invalid file descriptor.

tsharkによるBLEパケットの解析

Raspberry Pi 3によりgatttoolコマンドで、センサネットワークモジュールから、温度データ、湿度データ、気圧データを取得しましたが、この時同時に、パケットキャプチャソフト「tshark」でBLEパケットをキャプチャします。このキャプチャしたBLEパケットとBluetooth仕様書「Specification of the Bluetooth system Core_v4.2」を対応させてパケット構造を解析します。また、センサネットワークモジュールのコマンドガイド「Sensor Network Module評価キットApplication Note Command Guide」とキャプチャしたBLEパケットを対応させて構造解析します。

BLEプロトコルスタックアーキテクチャ

BLE通信を実現するプロトコルスタックは、次のような階層構造を持っています。左側には、ATTとL2CAOのパケット構造を示します。

パケットキャプチャソフト「tshark」では、次のレイヤのBLEパケットがキャプチャできます。

ATT (Attribute Protocol)

上位レイヤのGATT通信を実現する通信手順の仕様を規定しています。センサネットワークモジュールのコマンドガイドは、このレイヤのBLEパケットフォーマットを規定しています。
・データ構造の形式
・データの読み書き
・データの更新通知
・データの分割と復元

L2CAP (Logical Link Control and Adaptation Protocol)

ホスト部とコントローラ部の橋渡しとなる通信制御を規定しています。
・セッションの制御/管理
・パケットの分割と復元

HCI (Host Controller Interface)

ホスト部とコントローラ部を接続するデータ通信の仕様を規定しています。このレイヤーのフォーマットについては、「Rasberry Pi 3でのBLEのパケット構造解析」を参照してください。

L2CAPでのBLEバケット構造解析

Raspberry Pi 3とセンサネットワークモジュール間でBLE接続が完了すると、センサネットワークモジュールから「Connection Parameter Update Request (0x12)」のBLEパケットが転送され、Raspberry Pi 3は、その応答を返します。次にtsharkでキャプチャしたRaspberry Pi 3とセンサネットワークモジュール間のBLEパケットのシーケンスを示します。

センサネットワークモジュールから送られてきた「Connection Parameter Update Request (0x12)」のパケットフォーマットを示します。このBLEパケットフォーマットは上記のFrame 15を示します。詳細なフォーマットは、Bluetooth仕様書「[Vol 3, Part A] 4.20 CONNECTION PARAMETER UPDATE REQUEST (CODE 0x12)」を参照してください。

Frame 15: 21 bytes on wire (168 bits), 21 bytes captured (168 bits) on interface 0
Bluetooth L2CAP Protocol
    Length: 12
    CID: Low Energy L2CAP Signaling Channel (0x0005)
    Command: Connection Parameter Update Request
        Command Code: Connection Parameter Update Request (0x12)
        Command Identifier: 0xd1
        Command Length: 8
        Min. Interval: 144 (180 msec)
        Max. Interval: 160 (200 msec)
        Slave Latency: 4 LL Connection Events
        Timeout Multiplier: 600 (6 sec)

ATTでのBLEバケット構造解析

ATTレイヤーを使用して、Raspberry Pi 3とセンサネットワークモジュール間で、Raspberry Pi 3からセンシング設定、Bluetooth® Smart設定、動作指示、システムのコマンド(センサネットワークモジュールのコマンドガイド「3. コマンド表」)をセンサネットワークモジュールにパケット送信し、センサネットワークモジュールからデータパケット1と2、および、ステータス通知(センサネットワークモジュールのコマンドガイド「5. 通知データ構造 (Custom1)」)をRaspberry Pi 3が受け取ります。次にtsharkでキャプチャしたRaspberry Pi 3とセンサネットワークモジュール間のBLEパケットのシーケンスを示します。

ATTレイヤーでの「Write Request」パケットフォーマットを次に示します。Write Requestパケットフォーマットに示されている「Handle: 0x0018」は、センサネットワークモジュールのAttribute Handleを示します。「Value: 200300」はセンサネットワークモジュールの動作指示コマンドを示します。詳細なフォーマットについては、Bluetooth仕様書「[Vol 3, Part F] 3.4.5 Writing Attributes」とセンサネットワークモジュールのコマンドガイド「4.3動作指示コマンド」を参照してください。

Frame 22: 15 bytes on wire (120 bits), 15 bytes captured (120 bits) on interface 0
Bluetooth L2CAP Protocol
    Length: 6
    CID: Attribute Protocol (0x0004)
Bluetooth Attribute Protocol
    Opcode: Write Request (0x12)
        0... .... = Authentication Signature: False
        .0.. .... = Command: False
        ..01 0010 = Method: Write Request (0x12)
    Handle: 0x0018
    Value: 200300

ATTレイヤーでの「Handle Value Notification」パケットフォーマットを次に示します。Handle Value Notificationパケットフォーマットに示されている「Handle: 0x0012」はセンサネットワークモジュールのAttribute Handleを示します。「Value: f314cee27516520d0080008000000000010a0f00」はセンサネットワークモジュールのデータパケット2を示します。詳細なフォーマットについては、Bluetooth仕様書「[Vol 3, Part F] 3.4.7.1 Handle Value Notification」とセンサネットワークモジュールのコマンドガイド「5.2 データパケット2」に示します。

Frame 56: 32 bytes on wire (256 bits), 32 bytes captured (256 bits) on interface 0
Bluetooth L2CAP Protocol
    Length: 23
    CID: Attribute Protocol (0x0004)
Bluetooth Attribute Protocol
    Opcode: Handle Value Notification (0x1b)
        0... .... = Authentication Signature: False
        .0.. .... = Command: False
        ..01 1011 = Method: Handle Value Notification (0x1b)
    Handle: 0x0012
    Value: f314cee27516520d0080008000000000010a0f00

3GPI用Raspbianのアップデート方法

今回提供された3GPIに同梱されているRaspbianでは、次に示すようにRaspberry Pi 3でhciconfigコマンドを入力してBluetoothデバイスを確認しても、Bluetoothデバイスが認識されませんでした。

$ sudo hciconfig

メカトラックス株式会社様に問い合わせて、確認したところ、次の手順でRaspbianをアップデートすれば、Bluetoothデバイスが認識できるようになりました。なお、最終的には、Raspberry Pi 3でもBluetoothデバイスが認識できるRaspbianが、近日中にリリースされるそうです。

  1. 次のコマンドでインストールされているパッケージを更新します。

    
    $  sudo apt-get update
    $  sudo apt-get upgrade
    
  2. 次のコマンドでBluetoothパッケージをインストールします。

    
    $  sudo apt-get install pi-bluetooth
    $  sudo systemctl enable bluetooth.service
    $  sudo systemctl enable hciuart.service
    
  3. 次のコマンドで「99-com.rules.dpkg-dist」 を 「99-com.rules」 にリネームします(使用していたファイルは保存します)。

    
    $  sudo cp /etc/udev/rules.d/99-com.rules /etc/udev/rules.d/99-com.rules.old
    $  sudo cp /etc/udev/rules.d/99-com.rules.dpkg-dist /etc/udev/rules.d/99-com.rules
    
  4. 再起動します。

    
    $  sudo reboot
    
  5. 再起動後、次のコマンドでBluetoothデバイスを確認します。「hci0」が表示されれば Bluetoothデバイスが認識されています。

    
    $  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
    

 関連URL

  1. アルプスのセンサネットワークモジュールをラズパイ3と3GPIで使ってみる(其の2 C言語によるBLEソフト)
  2. アルプスのセンサネットワークモジュールをラズパイ3と3GPIで使ってみる(其の3 Googleスプレッドシートへのセンサ情報の保存)