Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

メカトラックス株式会社様より、アルプスのセンサネットワークモジュールをお借りすることができました。アルプスのセンサネットワークモジュールは、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スプレッドシートへのセンサ情報の保存)
TomoSoft
始めまして。私は、制御系のソフトウェアエンジニアです。近年、センサー系の制御システムをネットワークに接続されるようになり、特に私は、クラウドにセンサーを接続し、情報の提供や機器の監視を行うシステムに関心を持っています。作業のご依頼がございましたら、ご連絡ください。宜しくお願いします。
https://tomosoft.jp/design/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした