Host層(続き)
Generic Attribute Profile(GATT)
Generic Attribute Profile(GATT) は、特定のアプリケーションが提供する機能の集合体で、ATTの上で動作します。 BLEアプリケーションは全てこのGATTを使用して構築されます。GATTはアプリケーションの振る舞いをProfile、Service、Characteristicという構造を用いて定義します。
Profile
Bluetoothアプリケーションの提供する機能の集合はProfileと呼ばれます。 Profileは異なるメーカの製品間で命令をやりとりするためのインターフェイスとして働きます。
GATT Profileには、Bluetooth SIGが公式に提供しているものと、ユーザが独自に提供しているものがあります。 Bluetooth SIGの定義しているProfileには次のようなものがあります(参照)。
- Alert Notification (アラートの通知)
- Blood Pressure (血圧計)
- Health Thermometer (体温計)
- Heart Rate (心拍数)
- Location and Navigation (血圧計)
ここで挙げているProfileはすべてBluetooth LE用に定義されたもので、特に「GATT Profile」と呼ばれます。 GATT Profileは、クラシックBluetooth用に定義されたProfileと互換性がないことに注意が必要です。 例えば、ヘッドフォン、プリンタ、マウスやキーボードなどのProfileの多くはクラシックBluetooth用です。
ServiceとCharacteristic
Profileは複数のServiceからなり、それぞれのServiceは複数のCharacteristicを持ちます。 それぞれ、ちょうどオブジェクト指向でいうオブジェクトとメソッドに相当すると考えると分かりやすいと思います。
Serviceは、機器の単一の機能を指します。例えば、照明器具の場合、消費電力の計測、明るさの検出、明るさの制御は、個別に3つのServiceとして実装されます。
Characteristicは、各ServiceのプロパティやServiceに対する命令を示します。例えば、エアコンの気温を検出するサービスなら、センサの値などが該当します。
ServiceやCharacteristicsもまたProfileと同じようにBluetooth SIGによって定義されたものがあります(Service一覧、Characteristics一覧)。
Profileの階層構造
Profileやそれに含まれるServiceやCharacteristicの階層構造を次の図に示します。
Serviceには、外部に公開するためのPrimary Serviceと、内部で参照するためのSecondary Serviceがあります。 また、Serviceは別のServiceを継承して新たなCharacteristicを付与できます。 上図のIncludedは、継承元のServiceを示しています。
Characteristicは、各々が次のプロパティを持っています。 それぞれがフラグとして独立してON/OFFを切り替えられることに注意が必要です。 BroadcastをONに設定しておくと、Advertising時の情報に含めることができます。
| プロパティ | 説明 |
|---|---|
| Broadcast | Advertisingでのブロードキャスト |
| Read | 読み出し可能 |
| Write Without Response | レスポンスなしの書き込み |
| Write | Responseありでの書き込み |
| Notify | Notification |
| Indicate | Indication |
| Authenticated Signed Writes | Signature付きの書き込み |
| Extended Properties | プロパティの拡張定義 |
ATTによるServiceの定義(例)
ここで、GATTが下位のプロトコルにATTを使用していることを例で確認してみましょう。
ServiceおよびCharacteristicは、Handleの連続する複数のAttributeで定義します。 例えば、Primary Serviceの宣言を表すAttribute Typeは0x2800、Characteristicの宣言を表すAttribute Typeは0x2803などと決まっています。次の図は、2つのServiceとそれに付随するCharacteristicを定義した例です。
CharacteristicとAttributeの関係は1対1ではありません。Characteristicの宣言と値はそれぞれ別のAttributeで表されており、ちょうどメモリのアドレスと同じようにして参照先に値が書かれています。
