本記事では、個人のCore資料の理解と忘備録を兼ねて、Core資料に沿ってBluetoothの各役割や通信の流れについて整理していきたいと思います。
(解釈が誤っている部分があれば指摘いただけると嬉しいです!)
本日はホストの通信プロトコル/プロファイルなどアーキテキチャブロックについてまとめていきたいと思います。
前回と同じ図がわかりやすいので、図を載せて説明していきたいと思います。
通信プロトコルとその役割
ざっくりとホストにおけるそれぞれの通信プロトコルと役割です。
プロトコル | 役割 |
---|---|
L2CAP | 基本的なデータフレームの転送を管理 |
ATT | 属性データのやり取り(GATTの基盤となる) |
SDP | BR/EDR用のサービスディスカバリ |
SMP | 暗号鍵の交換やペアリングの管理 |
プロファイル | 役割 |
---|---|
GATT | サービスとキャラクタリスティックの管理 |
GAP | デバイスの検出や接続管理、セキュリティ設定 |
それぞれ詳細を説明していきます。
ロジカルリンクコントロールアンドアダプーテーションプロトコル(L2CAP)
L2CAPは、データ転送を管理するプロトコルです。アプリケーションや上位プロトコルのデータを受け取り、パケットの分割・再構成を行います。また、QoS(Quality of Service)を制御します。BR/EDRとLEの両方で使用され、論理チャネルの管理も担当します。
セキュリティマネージャープロトコル(SMP)
SMPは、BLEにてセキュリティ機能を担うプロトコルです。L2CAPチャネル上で動作します。
主に下記の3つの機能があります。
・暗号化キー:ペアリング時に、デバイス同士で共有する暗号鍵を交換します。
・識別キーの管理:デバイスの識別情報(例:IRK)を管理し、ランダムアドレスを解決します。
・ペアリングとセキュリティの確立:デバイス間で認証を行い、安全な通信を保証します。
また、SMPはホスト側で実装され、HCIコマンドを介してコントローラと連携します。
一部の機能はコントローラ側に任せるホストもあれば、ホスト側で生成することもあります。(DHKEYなど)
一方、Classic(BR/EDR)では、同様の機能がリンクマネージャ(Link Manager)によってコントローラ側で処理されます。
アトリビュートプロトコル(ATT)
ATTは、ATTサーバとATTクライアント間の1対1通信を実装するプロトコルです。
ATTクライアントは、リモートデバイスのATTサーバと、L2CAPチャネルを介して通信します。
ATTクライアントは、コマンド、リクエスト、確認メッセージをATTサーバに送信し、ATTサーバはレスポンス、通知、インディケーションをクライアントに送信します。
これにより、ATTクライアントはピアデバイス(ATTサーバ)上の属性(Attribute)の値を読み書きできるようになります。
ジェネリックアトリビュートプロファイル(GATT)
GATTは、ATTサーバの機能、および必要に応じてATTクライアントの機能を定義します。
このプロファイルでは、ATTサーバ内のサービス、キャラクタリスティック(特性)、および属性の階層構造を規定しています。
GATTは、サービスやキャラクタリスティックの探索(ディスカバリ)、読み取り、書き込み、通知(Indication)を行うためのインターフェースを提供します。
ジェネリックアクセスプロファイル(GAP)
GAPは、すべてのBluetoothデバイスに共通する基本的な機能を提供するプロファイルです。
GAPは、以下のような機能を定義します。
- デバイスの検出
- 接続モードの管理
- セキュリティと認証
- デバイスペアリングの仕組み
- サービスディスカバリ
GAPは、Bluetoothの通信プロトコルやアプリケーションプロファイルの基盤となる重要なプロファイルになっています。
サービスディスカバリプロトコル(SDP)
サービスディスカバリプロトコル(SDP)は、クライアントが必要なサービスを検索できる仕組みを提供するプロトコルです。
検索は、特定のサービス属性に基づいて行われるほか、サービスの種類(クラス)による検索や、データベース全体のブラウジングも可能です。
SDPはBR/EDRデバイスで使用され、BR/EDRプロファイルのサービスディスカバリに利用されます。
SDPは、Bluetoothデバイス上で提供されるサービスの検出に特化しており、一度サービスを発見した後のアクセス方法(通信方法)は、サービスごとに異なる仕様となります。
Classicはあまり触ったことがなく、SDPの説明はCoreの資料そのまま持ってきています。間違えてしまっていたら、教えていただけると嬉しいです。
次回は、コントローラの通信プロトコルにします。