前編はこちらから。
Host層
Attribute Protocol(ATT)
BLEでは Attribute Protocol(ATT) というプロトコルに従って、Client/Serverアーキテクチャを実現します。 多くのアプリケーションではPeripheralがServer、CentralがClientになりますが、必ずしもそうである必要はなく、逆でも構いません。
ClientとServerそれぞれが所有するデータは、AttributeというKey-Valueの集合で管理されています。 各Attributeは次の4つの値で構成されます。
値 | 説明 |
---|---|
Handle (attribute handle) |
連番のインデックス。値の範囲は0x0001から0xffff(2 octets)まで |
Type (attribute type) |
Attributeの型を表す128bitのUUID。Bluetooth SIGが定義しているものに関しては、次のxxxx に入る16bitの値だけで表すことができる。0000xxxx-0000-1000-8000-00805F9B34FB |
Value | 属性値。サイズは512バイトまで |
Permission | 読み書きの権限。値の意味はAttribute Protocolではなく上位層(GATT)で決められる |
各Attributeの値を読み書きするために、ATTでは次の3つの機能を提供しています。
Find | AttributeのHandleなどの取得 |
---|---|
Read | Attribute値の読み取り |
Write | Attribute値の書き込み |
アクセス方式
ATTではAttributeにアクセスするために、6種類のメソッドが提供されています。
Request | クライアントからサーバにデータを要求する |
---|---|
Response | Requestに対する応答 |
Command | クライアントからサーバに命令を送る。返答は要求しない |
Notification | サーバからクライアントに通知を送る。受け取りの確認は必要ない |
Indication | サーバからクライアントに通知を送る。受け取りの確認が必要 |
Confitmation | Indicationを受け取ったことの確認をクライアントからサーバに送信する |
Request/ResponseとIndication/Confitmationはそれぞれ対でトランザクションになります。 クライアントとサーバが同時に持てるトランザクションは1つまでで、トランザクションが完了するまで次のRequest(Indication)を送ることはできません。 このシンプルな仕組みによって、フロー制御やロック機構を実装する必要性はありません。
一方、CommandとNotificationはトランザクションを持たず、任意のタイミングで送信することができます。 フロー制御がないため、大量のコマンドを送受信して処理が追いつかない場合の振る舞いを上位層で決めておく必要があります。
Attribute値の読み取り機能であるFindやReadは値の返却を待つため、アクセス方法はRequestやIndicationになります。 Writeの場合は確認が必要な場合はRequest、必要ない場合はCommandなどと使い分けることができます。