BLE通信:ソフト構成概要①
概要
BLEスタックのシステム構成は以下。メインは GATT と GAP と思ってます。

引用:VVDN
-
GAP:コネクション対象の判断などを行うレイヤーと理解しています。
Peripheralの場合はアドバタイズパケットのセット、セントラルだと逆に受信と解析、Scanレスポンスの送信などですね。 -
GATT:コネクション後のやり取りを行うレイヤーと認識しています。
各サービスのUUID、キャラクタリスティックの定義が中心です。
接続〜サービス利用の流れ
以下にBLE通信の典型的な一連の流れ(スキャン → 接続 → 例:Notify受信)をシーケンス図で示します。

主なサービスの一覧
| サービス名 | UUID | 用途概要 |
|---|---|---|
| Generic Access | 0x1800 |
デバイス名や接続インターバルなどの基本情報 |
| Generic Attribute | 0x1801 |
サービス変更通知など、GATT全体に関わる |
| Battery Service | 0x180F |
バッテリー残量の通知/読み取り |
| Heart Rate | 0x180D |
心拍数の通知、スポーツ系デバイスに多い |
| Device Information | 0x180A |
製造者名やモデル番号などの基本情報 |
| Custom Service(例) |
0xFFF0〜 |
ベンダー独自定義(自由に使用可能) |
GATT構造の要素(概念図)
peripheralにはServiceを定義し、その中にCharacteristicという箱を用意します。
接続後はこのserviceのCharacteristic単位でやり取りをすると思ってください。
Service(サービス)
└── Characteristic(キャラクタリスティック)
├── UUID(識別子)
├── Properties(プロパティ)
└── Value(実データ)
キャラクタリスティックは「箱」のようなもので、データの送受信を行う単位です。
この中に実データ(Value)が格納されます。

引用:ムセンコネクト
上記のような箱がいくつかある、と理解できます。Readとかが下記のプロパティです。自由に設定できます。
Characteristicのプロパティ一覧
| プロパティ | 説明 | 主な用途 | 主導側 |
|---|---|---|---|
Read |
値を読み取る | センサーデータの取得 | セントラル主導 |
Write |
値を書き込む(応答あり) | デバイス設定変更など | セントラル主導 |
Write Without Response |
値を書き込む(応答なし) | 軽量コマンド、連続書き込み | セントラル主導 |
Notify |
値の変化を通知(応答なし) | 心拍や温度などのPush型データ | ペリフェラル発信(要CCCD設定) |
Indicate |
値の変化を通知(応答あり) | 安全性の高い通知(医療等) | ペリフェラル発信(要CCCD設定) |
細かいですがここでいうCCCDというのは、central側のperipheral起点の通知を受け入れるか、の手順です。あくまでcentralがメイン側なので勝手にアクションするのにcentralの許可を要するようにしている、と個人的には理解してます。
まとめ
当時は割と混乱しましたが、振り返ってまとめてみると結構わかりやすい構成しています。
サービスとキャラクタリスティックのイメージがつけば、BLEのGATT実装は割と取り組みやすいかと思います。
基本的な構造をしっかり理解しておくと、独自プロトコルの設計やデバッグもしやすくなります。
Discussion