はじめに
Bluetoothは今やとても身近な存在になりました。ワイヤレスイヤホン、スマートウォッチ、忘れ物防止タグなど、様々な製品に使用されています。
今回は、そんな身近なBluetooth規格のうち、Bluetooth Low Energyの技術的な入門記事として、用語や概念を中心に紹介します。
Bluetoothの規格
Bluetoothには大きく分けて2つの規格があります。これらの規格はお互いに特性や用途が全く異なるものです。
Bluetooth Classic
元々のBluetoothです。名前に「Classic」とありますが、現在でも広く使われている規格です。
主な用途は、音声ストリーミング、ファイル転送、TCP/IPによるネットワーク構築などです。
最新規格のBluetooth 5.1では、通信速度の理論値が2Mbpsとなっています。
接続する際の手順として、ペアリングしてから接続するという手順となっていることも特徴です。
BLE(Bluetooth Low Energy)
元々はNokkia社の「Wibree」という規格でしたが、Bluetooth 4.0で統合されました。そのため、Bluetooth Classicとは用途や仕様が全く異なります。
BLEでは、低電力に重きを置いており、例えば小型のIoTデバイスが長時間駆動できるように設計されています。
さらに、一度に通信できるデータ長が最大で512octetsとなっており、これを超えるデータをやり取りするには、何度も通信する必要があります。そのため、大きなデータを通信する場合にはスループットが大幅に低下するため、そのような場合はBluetooth Classicか、他の手段を検討した方が良いと言えます。
BLEの役割
BLEでは次のような役割があります。
- セントラル
スキャンや接続を行う側です。周囲のデバイスをスキャンし、接続したいデバイスが見つかったら接続しに行きます。 - ペリフェラル
セントラルから接続される側です。セントラルに対し、サービスやキャラクタリスティックを提供することで、データを送受信します。
BLEで接続する手順は次の通りです。
- ペリフェラルがアドバタイズを発信する
- セントラルがペリフェラルのアドバタイズを見つけ、接続したいデバイスに接続する。
- セントラルとペリフェラルの接続が確立したら、セントラル側から読み込みもしくは書き込みのリクエストを送信する。
- ペリフェラル側は、読み取りリクエストの場合はデータをレスポンス、書き込みリクエストの場合はセントラルからのデータを受け取る。
このように、セントラル・ペリフェラルの関係性は、クライアント・サーバ のような関係性にあるといえます。
サービスとキャラクタリスティック
BLEでよく使われるプロトコルのひとつに「GATT」があります。GATTではサービスとキャラクタリスティックという概念のもと、セントラルと通信します。
サービスとは、キャラクタリスティックの集合体です。セントラルは、ペリフェラルとの通信が確立すると、まずはサービスを選択することになります。
接続が確立すると、ペリフェラルは、サービスの一覧をセントラルの提供するので、セントラルはその中から利用したいサービスを選択します。
サービスを選択すると、次はキャラクタリスティックに対して、データの読み書きをすることになります。キーバリュー型のデータ構造に似ていて、セントラルはUUIDをもとにペリフェラル側にデータを書き込んだり、読み込んだりすることができます。
また、GATTではサービスやキャラクタリスティックを一意に判別するために「UUID」を使用します。このUUIDはあらかじめ定められたものがありますが、自分で生成したUUIDを使用して独自のサービスやキャラクタリスティックとしても構いません。
あらかじめ定められたUUIDの例として、次のようなものがあります。
サービス
- 0x1805: 現在時刻 (Current Time)
- 0x180D: 心拍数 (Heart Rate)
- 0x180F: バッテリー (Battery)
キャラクタリスティック
- 0x2A07: 日時 (Date Time)
- 0x2A37: 心拍数 (Heart Rate Measurement)
- 0x2A39: センサーの取り付け場所 (Body Sensor Location)
- 0x2A19: バッテリーレベル (Battery Level)
その他の定義済みのUUIDについては以下の資料に記載されています。
16-bit UUID Numbers Document (PDF)
ペリフェラルからの更新通知
セントラルからのリクエストによってデータを取得するだけでなく、ペリフェラルドリブンでデータを配信することもできます。
セントラルがキャラクタリスティックの更新通知を受けるようにすることで、ペリフェラル側から随時送信されて来るデータを受信することができます。
BLEを実装する方法
BLEを始められる方法を紹介します。もし、iOSやAndroidの開発機環境があれば、アプリ上にセントラル・ペリフェラル側の両方を実装することができます。そのほかにも、以下のパッケージを使用すれば、macOSやLinuxが動作するシステムで実装することができます。
- noble: Node.jsでセントラルの実装ができるパッケージ
https://github.com/noble/noble - bleno: Node.jsでペリフェラルの実装ができるパッケージ
https://github.com/noble/bleno
さいごに
Bluetoothは年々バージョンアップされていて、利便性が増しています。特に、BLEは開発の敷居が低いと思うので、今後もブログで記事にしていきたいと思います!