属性プロトコル(ATT)と汎用属性プロファイル(GATT)
前の章では、GAP レイヤーがアドバタイジングを通じて Bluetooth LE デバイス同士を見つけるのに役立つことを学びました。接続後は、データを送受信するための方法が必要になります。ここで ATT レイヤーと GATT レイヤーが登場します。これらは、データがどのように構造化され、デバイス間でどのように送受信されるかを定義します。
クライアント・サーバーモデル
GATT には 2 つの役割があります: Server と Client。サーバーはデータを属性として保持し、クライアントはこのデータにアクセスします。通常、ペリフェラルデバイス(センサーなど)がサーバーとして動作し、セントラルデバイス(スマートフォンなど)がクライアントとして機能します。
GATT におけるクライアントとサーバーの役割は、GAP におけるペリフェラルとセントラルの役割とは独立しています。つまり、セントラルデバイスはクライアントにもサーバーにもなれ、ペリフェラルデバイスにも同じことが当てはまります。
たとえば、スマートフォンとフィットネストラッカーのシナリオでは、フィットネストラッカー(ペリフェラル)は通常 GATT サーバーとして動作し、心拍数や歩数などのセンサーデータを保存します。一方、スマートフォン(セントラル)は GATT クライアントとして動作し、このデータを読み取ってアプリに表示します。
ただし、スマートフォンが設定情報をトラッカーに送る必要がある場合(例: 画面の明るさを調整する、アラームを設定するなど)、一時的にスマートフォンがサーバーとなり、フィットネストラッカーがクライアントとしてそれらの設定を受信します。
属性プロトコル(ATT)- 基盤
ATT は、データが属性としてどのように保存されるかを定義します。属性は基本的な土台であり、構成要素でもあります。各属性には、一意のハンドル、タイプ(16 ビットの識別子または 128 ビット UUID)、パーミッション(例: 読み取り可能、書き込み可能)、およびデータ(実際の値)があります。クライアントはデータを読み取り、書き込み、またはサブスクライブできます。
汎用属性プロファイル(GATT)- データの整理
GATT は、データに構造と意味を加えることで ATT を拡張します。これは、データがどのようにグループ化され、アクセスされるかを定義します。
GATT は属性を次のように整理します:
-
Characteristic: デバイスが共有できる単一のデータ項目です。他のデバイスはこれを読み取り、書き込み、または更新を受け取ることができます。たとえば、Heart Rate Measurement characteristic は現在の心拍数を保持し、それが変化したときに更新を送信できます。
-
Service: 関連するキャラクタリスティックをまとめた集合です。たとえば、Heart Rate Service には、心拍数測定とセンサーの身体上の位置に関するキャラクタリスティックが含まれます。
-
Profiles: 関連するサービスの集合です(例: Heart Rate Service、Device Information Service)。
次の図は、Heart Rate Sensor のプロファイル、サービス、およびキャラクタリスティックを示しています

キャラクタリスティックディスクリプター
ディスクリプターは、追加情報を提供したり、キャラクタリスティックの振る舞いを制御したりするためのオプションの属性です。
最もよく使われるディスクリプターは Client Characteristic Configuration Descriptor(CCCD)です。これにより、クライアント(スマートフォンなど)は、サーバー(心拍数センサーなど)からの notification または indication を有効化または無効化できます。
たとえば Heart Rate Service では、クライアントは CCCD に書き込んで更新をサブスクライブできます。これにより、心拍数センサーは、スマートフォンが繰り返し問い合わせなくても、新しいデータをスマートフォンにプッシュできます。
UUID
属性における UUID の部分を改めて見てみましょう。各サービスとキャラクタリスティックは、一意の ID 値を持つ必要があります。UUID は、Bluetooth-SIG が定義した標準 UUID(16 ビット)またはカスタム UUID(128 ビット)のいずれかです。
事前定義された UUID の一覧は、こちらで確認できます: https://www.bluetooth.com/specifications/assigned-numbers/
Heart Rate Service 用の事前定義 UUID:

Heart Rate Monitor characteristic 用の事前定義 UUID:

カスタム UUID:
カスタム UUID は、標準の事前定義済み Bluetooth サービスに含まれていないサービスを実装する場合に使用します。ただし、心拍数モニターやバッテリーレベルのような一般的なサービスを実装する場合は、Bluetooth 仕様で提供されている公式 UUID を使用するのが最善です。
カスタム UUID を生成するには、UUID Generator にアクセスして、サービスとキャラクタリスティック用の一意な UUID を作成できます。