🛜

BLE通信:ソフト構成概要①

に公開

概要

BLEスタックのシステム構成は以下。メインは GATTGAP と思ってます。

引用: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