BLE(Bluetooth Low Energy)とは?GAPとGATT
BLEとは?
BLE(Bluetooth Low Energy)技術はアプリと連結される各種装置の通信で消耗される電力量を減らすための技術で、多くのブルートゥース機器がアプリと連結してデータをやりとりする時に活用されています。 BLEビーコンのように使い方によってはコイン電池で何年も電池交換せずに利用することができます。
BLEの特徴
- Bluetooth Classicより更に省電力にした通信方式です。
Bluetooth Classic
接続待ち状態 ・・・ 5mA
接続して通信中 ・・・ 30mA
Bluetooth Low Energy
接続待ち状態 ・・・ 200uA
接続して通信中 ・・・ 1mA
30分の1、条件によってはそれ以上の省電力を実現できます。
- スマートデバイスとの親和性が高いことです。
AndroidのBluetoothアーキテクチャ
Application Framework
アプリの開発者がユーザーがブルートゥース機器と連動する作業を遂行する画面とコンポーネント(サービス、ブロードキャスト)などを設定するレイヤーで、android.bluetoothパッケージのAPIを活用してブルートゥース機能を使用することができます。
Bluetooth Process
Bluetooth Serviceはシステムサービスで、フレームワークレイヤーに各種機能を提供し、Bluetooth Profileは各種Bluetooth機器との通信プロトコルを定義する。 このプロセスでJNIを通じてスマートフォンチップセットのブルートゥースデバイス(ハードウェア)と情報を交換する。
Bluetooth Profile
Bluetooth ProfileはBluetoothデバイス間の通信規約のことで、最も代表的なのがGAPとGATT方式だ。 GAP(Gerneric Access Profile)は、すべてのブルートゥーススキャンやデバイス間の接続に必要な処理を定義しているため、必須のプロトコルであり、開発過程で自然に遂行することになる。 GATT(Gerneric Attribute Profile)は低電力Bluetooth通信のためのプロトコルであり、別途の属性プロトコル(ATT)を使用するためGATT/ATTと表現することもある。
GAPとGATT
GAP(Generic Access Profile)
このプロファイルは、開発者が指定または選択するプロトコルではなく、すべてのBluetoothまたはBLE機器間のスキャンおよび接続に不可欠なプロセスを定義しています。 このプロトコルですべてのブルートゥース機器は一つ以上の役割(Role)が付与される。これを基盤にアンドロイドアプリ(スマートフォン)が心拍測定装置(BLE機器)を探すことができます。
ここで役割(Role)はスマートフォンのように求心点の役割を果たせる装置はCentral役割(Master Device)を引き受け、心拍測定装置のように低電力で動作し、制限されたリソースを持つ装置がPeripheral役割(Slave Device)を引き受けることになります。 Peripheral装置は、Central装置が自分を探して連結できるように、advertising packetを利用します。
私たちがスマートフォンでブルートゥース機能をONした後、リストに各種装置が表示されるのが見えるのがまさにGAPプロトコルに定義された内容が動作しており、このプロトコルを通じてPeripheral機器の各種情報(Macアドレス、名前、機器種類など)を調べることができます。
GATT
BLE装置が互いに連結されデータ通信準備が終われば、GATT方式でデータをやりとりします。 GATTではスマートフォンがGATT Clientとなり、心拍測定装置であるPeriperal機器がGATT Serverとなります。 したがって、GATT Clientであるスマートフォンアプリが機器に要請を送り、機器はその要請に応答する方式で作動します。 (Client-Server 方式)
GATT Server (Profile) は、自分が提供するサービス(サービス、機能大分類)と特性(Characteristic)と呼ばれるデータを次のように階層構造で保管しています。
GATT Profile
ここでProfileはBLE装置がどのような装置であるかを示す概念的な区分でです。(ここでいうProfileは、Bluetooth Profileと異なる概念です)一種のBluetooth製品を作るための一種の明細として使われることです。
GATT Service
通常、BLE装置には色んなセンサーが搭載されるが、各種センサーを抽象化したものがサービスとと思ったらいいです。 すなわち、以下の例で動き測定センサーが動き測定サービスに抽象化され、それぞれのセンサー値は特性データ(Characteristic)で表現されます。 サービスはお互いを区分するための固有の128bit UUIDまたはあらかじめ定義されたブルートゥース標準16bit UUIDを使用します。
- 例
Service UUID : 195AE58A-437A-489B-B0CD-B7C9C394BAE4
標準心拍数 Service UUID: 180D
GATT Characteristic
実際のデータを取り込んで管理するのがCharacteristicで、GATT Client(スマートフォン)はGATT Server(センサー機器)が測定して変更できるデータであるCharacteristicを読み取ることができます。 センサー機器は測定された値でCharacteristic値を変えることができ、スマートフォンはこれを読みます。 このようにアプリが測定されたセンサー値を受け取ることができます。
逆にスマートフォン(Client)がセンサー(Server)のCharacteristicに値を書くこともできます。 こうなればスマートフォンがセンサーに値を伝達することになります。
Characteristicもそれぞれを区分するUUID が指定されています。
Characteristicは、[Declaration、Value、Descriptor]で構成されていdます。
- Declaration
一種のヘッダーで、[Properties, Value Handle, UUID]のメタデータから構成されます。ここでPropertiesだけを見ると、Characteristicの特性を決定するのだが、Write、Write without response、Read、Notify、Indicateなどの特性を付与することができます。 ちなみにGATT Client(スマートフォン)の立場での特性を付与するものです。
NotifyはCharateristicのValueが変更が発生するたびにGATT Clientに知らせるPropertyです。 - Value
実際のデータを収める領域です。 - Descriptor
Notify、Indicateを設定するときに使用します。 Notify、IndicationをON/OFFするDescriptorであるCCCD Descriptorというのがあります。
Discussion