iOSでCore Bluetoothを使ってBLE(Bluetooth Low Energy)の通信をプログラミングしてみます。今回はまずはBLEの仕様概要についてです。ただしですが、BLEの仕様についてはいろいろなサイトや書籍等での解説がありますのでここでは実際のBLEデバイスを使いながら簡単に仕様を整理してみます。
まずBLEとはBluetooth4.0で追加された仕様です。Bluetooth4.0 イコール BLEということではなくBluetoothの仕様のひとつです。もともとは Wibreeという名称でNokiaによって開発されたものでBluetooth4.0に統合されました。特徴は近距離での通信向けに通信速度はそれほどでもないですが、省電力での通信が可能なことです。
ここではBLEの通信仕様については主に以下のCore Bluetoothプログラミングガイドを参考にしています。
Core Bluetooth プログラミングガイド
実際のBLEデバイスとして以下のTI(テキサスインスツルメンツ社)のSensorTagを使ってみます。
CC2541 SensorTag 開発キット
詳細は上記メーカのサイトを参照して頂くとして以下のようなデバイスです。各種センサが搭載されていてBLEで通信が出来ます。
大きさの比較のためにiPhone4Sと並べてみました。
このデバイスのデータを表示するためのアプリがメーカから提供されていますのでそれを使います。(※開発の参考にもなるサンプルアプリのソースも公開されているようです。)
ここではiPad miniを使っています。以下のような画面になります。まず起動画面です。
SensorTagは後でまた使います。
ここから本題のBLEの通信の仕様概要です。
セントラルとペリフェラル
BLE通信では別の役割を持ったセントラル(中央装置、Centrals)とペリフェラル(周辺装置、Peripherals)で通信を行います。ペリフェラルはデータを保持して提供する側です。セントラルはペリフェラルのデータを利用して何かしらのタスクを実行します。
クライアント、サーバの役割に当てはめるとセントラルがクライアントでペリフェラルがサーバです。通常、サーバというと大型で多量の電力が必要というイメージですが、BLE機器は省電力で通信機能の機器は小型です。今回のデバイスでは、SensorTagがペリフェラルで、iPad miniがセントラルです。
セントラル ←→ ペリフェラル
(データを利用) (データを提供)
(ここではiPad mini) (ここではSensorTag)
アドバータイズ
ここでのアドバータイズとはペリフェラルが自身の存在を知らせるために出す「広告」のことです。セントラルは必要なデータを提供してくれるペリフェラルがないか走査(スキャン)します。
上記のiPad miniのアプリの最初のスクリーンショットではアドバータイズしているSensorTagをスキャンして検知した状態です。この状態から検知したSensorTagに接続すると次の画像になってセンサーの値を見ることが出来ます。
サービスとキャラクタリスティック
BLE通信はGeneric Attribute (GATT) プロファイルという通信規定で通信を行います。このプロファイルは一つ以上のサービスと各サービスを構成するキャラクタリスティックから成り立ちます。
サービス1
→ キャラクタリスティック1-1
→ キャラクタリスティック1-2
・・・
サービス2
→ キャラクタリスティック2-1
→ キャラクタリスティック2-2
・・・
・・・
このサービスやキャラクタリスティックには既に決まっているものがあり、それらは2バイトのUUIDで表現されます。独自のものは16バイトのUUIDを独自に生成し使用します。既に決まっている仕様等の詳細は以下を参照して下さい。
GATT Specifications
今回のSensorTagのサービスやキャラクタリスティックの仕様は今現在以下から見ることが出来ます。currentとなっている日付からPDFファイルがダウンロード出来ます。
File:BLE SensorTag GATT Server.pdf
これを見ると、例えば、Device Information Serviceといったサービスは2バイトのUUIDが記述されていて、IR Temperature Serviceといったサービスは16バイトのUUIDが記述されています。iPad miniのアプリはこの仕様のサービス、キャラクタリスティックからデータを取得して利用者に分かるように表示(※上記のアプリのスクリーンショット参照)しています。
それではこのサービス、キャラクタリスティックを別のアプリで直接見てみたいと思います。ここではBLExplrというアプリを使いました。(※今現在は300円です。)
起動すると以下のような画面になります。画面のプルダウンでスキャンを開始します。
SensorTagを検知しています。(※この画面のみ他人のデバイスが表示されていたので一部加工しています。)
サービス一覧の画面です。UnknownとなっているのはBLExplrがSensorTagのサービス、キャラクタリスティクスを認識していないからです。
このサービス一覧からサービスを選択してキャラクタリスティクスを選択していくと値を見ることが出来ます。まずは分かりやすいと思われるSimple Keys Serviceを見てみます。Simple Keys Serviceは0xFFE0というIDなのでこれを選択します。ボタンの状態が0xFFEのIDのキャラクタリスティクスなのでそれを選択します。(※途中の画像は省略します。)
Enable NotifyボタンでEnableの状態にします。そうすると、SensorTagのボタン(正面の上部に2つあります。)を押すと以下のようにボタンの状態を読むことが出来ます。Value Hexの値がボタンの状態によって変化します。
次に何かセンサーの値を見てみます。分かりやすそうなセンサーとして動かせばすぐに値が変わるということで加速度センサーを見てみます。
加速度センサーのサービスIDは仕様書を見ると、F000AA10-0451-4000-B000-000000000000 です。その値のキャラクタリスティクスIDがF000AA11-0451-4000-B000-000000000000のようです。これを探してNotifyをEnableにすると確かに値が表示されました。以下はキャラクタリスティクス一覧と値を表示するキャラクタリスティクスの画面です。SensorTagを動かすと値が変化するのが確認出来ました。
以上のようにSensorTagでのサービスとキャラクタリスティクスを見てきました。このようにBLEの通信では、実際のデータはサービス、キャラクタリスティクスとして構成して実装していきます。
これで、簡単にですがBLEの通信の仕様を把握したとして、次回からは実際にiOS上でCoreBluetoothを使ってセントラル、ペリフェラルを実装していきます。