Bluetooth Low Energy通信(1)
今回は、センサーの値を送信する手段としてBluetoothを利用します。Bluetoothといっても、実は従来のBluetooth(クラシックBluetoothとも呼ばれます)と、省電力にウェートを置いて設計されたBluetooth Low Energy(以下、BLEと表記)の2つの方式があります。BLEは、Bluetooth 4.0で追加された規格で、従来のクラシックBluetoothとは変更点が多く、互換性はありません。今回の記事では、BLEの標準仕様を基に解説しています。
BLEは、消費電力が低い特徴があるため、IoTデバイスでの通信に広く利用されています。
BLEでの通信モデル
BLEの通信は、以下の2つの主要なデバイスによって構成されています。
- ペリフェラル(Peripheral):データを送信するデバイス
- セントラル(Central):データを受信するデバイス
ペリフェラル、セントラルという呼び方は聞き慣れないかもしれません。ペリフェラルは、センサーなどのデータを送信する側のデバイスで、セントラルとはスマートフォンやPCといった、ペリフェラルからのデータを受ける側のデバイスのことです。
通信手順
BLE通信の特徴は、ペリフェラルから発信されている信号をセントラルが見つけて、目的のペリフェラルであれば通信を開始するという手順にあります。
基本的な通信手順は、次のようになります。
1.アドバタイズ
ペリフェラルが、自身の存在を知らせるために周期的に信号を送ります。この動作や信号のことをアドバタイズと呼びます。
2.スキャン
セントラルは、ペリフェラルを探すためにスキャンを行います。
3.コネクションの確立
セントラルが目的のデバイスに接続要求を送信します。接続が受け入れられると、ペアリングが行われて接続が確立します。
4.データ交換
接続後、デバイス間でデータを交換します。データの読み取りは、通常セントラルからのリクエストに応じて行われ、書き込みはセントラルからのデータ送信によって行われます。また、ペリフェラルは、データの変更などを任意のタイミングでセントラルに対して通知することができます。
5.切断
一連の通信が終了すると、セントラルが接続を切断します。
なお、BLE通信には、セントラルと接続せずに、ペリフェラルがブロードキャストする通信モードもあります。その場合は、ペリフェラルがアドバタイズした信号をセントラルが受信するだけの、一方向の通信となります。
データ構造
BLEでやりとりする基本のデータは、サービス(Service)とキャラクタリスティック(Characteristic)という要素で構成されています。
サービス
サービスとは、特定の機能をグループ化したコンテナ(機能の集合)です。ペリフェラルでは、複数のサービスを持つことができます。各サービスには、ユニークな識別子(UUID)が付与されており、これによって特定のサービスを識別します。
キャラクタリスティック
キャラクタリスティックは、単一のデータ値を表し、サービス内のデータの最小単位です。各キャラクタリスティックは、データの読み取り、書き込み、通知などの有効な機能を表すプロパティを持つことができます。またキャラクタリスティックにもUUIDがあり、サービス内で一意に識別されます。
例えば、今回の環境センサーであれば、以下のようなデータ構造となります。
- サービス:環境モニタリング
- キャラクタリスティック:計測値
- 各キャラクタリスティックのプロパティ:読み取り、通知
キャラクタリスティックは同一のサービスで複数となってもかまわないので、計測値を気温、気圧などと分割しても問題ありません。
BLE通信におけるUUID
UUIDは、世界中のリソースを一意に識別するために使用される汎用的な数値です。BLEでは、特定のサービスやキャラクタリスティックの識別に使用します。BLE通信でのUUIDの形式には、次の2種類があります。
標準UUID
標準UUIDとは、Bluetooth SIG(Bluetoothの標準化などを行う非営利組織)で定義されたUUIDで、16ビットに短縮されたUUIDです。一般的なサービスやキャラクタリスティックに使用されます。
カスタムUUID
ユーザーが独自に定義した128ビットのUUIDで、通常、12345678-1234-1234-1234-123456789ABのような形式です。
今回のアプリでは、カスタムUUIDを使うことにしました。UUIDを生成する方法は、いろいろありますが、次の方法が手軽でしょう。
(1)WindowsのPowerShellから、以下のコマンドを実行する
> [Guid]::NewGuid()
(2)オンラインツールを利用する