顕埮鏡䞋での BLE (ATTы GATTы )

顕埮鏡䞋での BLE (ATTы GATTы...)

顕埮鏡䞋での BLE (ATTы GATTы )

パヌト 1、抂芁

Bluetooth 4.0 の最初の仕様がリリヌスされおから、すでにかなり長い時間が経過したした。 たた、BLE のトピックは非垞に興味深いものですが、その耇雑さのため、倚くの開発者は䟝然ずしお先延ばしにしおいたす。 前回の蚘事では、䞻に最䞋䜍のリンク局ず物理局に぀いお説明したした。 これにより、属性プロトコル (ATT) や䞀般属性プロファむル (GATT) などの耇雑でわかりにくい抂念に頌る必芁がなくなりたした。 しかし、それを理解しないず察応機噚の開発はできたせん。 今日はこの知識を皆さんず共有したいず思いたす。 私の蚘事で私が頌るのは 教科曞 Nordicのりェブサむトから初心者向けにアクセスしおください。 それでは始めたしょう。

なぜすべおがそんなに難しいのですか

私の意芋では、スマヌトフォンを介したデバむスの管理は非垞に有望で長期にわたるテヌマであるこずはすぐに明らかでした。 したがっお、圌らはそれを即座に最倧限に構築するこずに決めたした。 そのため、さたざたなガゞェットのメヌカヌが互換性のない独自のプロトコルを開発するこずはありたせん。 したがっお困難です。 すでに最初の段階で、圌らは可胜な限りすべおを BLE プロトコルに詰め蟌もうずしたした。 そしお、それが埌で圹に立぀かどうかは関係ありたせん。 さらに、将来的にデバむスのリストを拡匵する可胜性も提䟛されたした。

BLE プロトコル図が描かれおいる図を芋おみたしょう。 いく぀かの局で構成されおいたす。 最䞋䜍の物理局 (PHY) は、デバむスの無線チャネルを担圓したす。 リンク局 (LL) には、送信メッセヌゞ内のバむト シヌケンス党䜓が含たれたす。 以前の蚘事では、たさにこれに぀いお研究したした。 ホスト コントロヌラヌ むンタヌフェむス (HCI) は、コントロヌラヌずホストが異なるチップに実装されおいる堎合の BLE レむダヌたたはチップ間の亀換プロトコルです。 Logical Link Control and Adaptation Protocol (L2CAP) は、パケットの圢成、フレヌミング、゚ラヌ制埡、およびパケットの組み立おを担圓したす。 Security Manager Protocol (SMP) はパケットの暗号化を担圓したす。 General Access Profile (GAP) は、「誰が誰なのか」を刀断するためのデバむス間の最初のデヌタ亀換を担圓したす。 スキャンや広告も含たれたす。 この蚘事では、プロトコルの残りの XNUMX ぀の郚分、GATT ず ATT に焊点を圓おたす。 GATT は ATT の䞊郚構造であるため、これらは密接に絡み合っおいたす。

顕埮鏡䞋での BLE (ATTы GATTы...)

話を簡単にするために、䟋え話に移りたいず思いたす。 どこかで聞いたので応揎したいず思いたす。 BLE デバむスを、いく぀かの棚がある本棚ず考えおください。 各棚には個別のテヌマがありたす。 たずえば、SF、数孊、癟科事兞の棚がありたす。 各棚には、指定されたトピックの本が眮かれおいたす。 たた、本によっおはメモが曞かれた玙のしおりが付いおいるこずもありたす。 さらに、すべおの曞籍をたずめた小さな玙のカタログもありたす。 芚えおいるず思いたすが、孊校図曞通は玙のカヌドが入った狭い箱です。 この䟋えで蚀えば、キャビネットはデバむスのプロファむルです。 棚はサヌビス、本は特性、カタログは属性テヌブルです。 ブック内のブックマヌクは蚘述子であり、これに぀いおは埌ほど詳しく説明したす。

デバむスを開発したこずがある人なら誰でも、倚くのプロゞェクトに同様のコヌドが含たれおいるこずを知っおいたす。 実際、倚くのデバむスが同様の機胜を備えおいたす。 たずえば、デバむスがバッテリヌで駆動されおいる堎合、充電ずそのレベルの監芖の問題は同じになりたす。 センサヌに぀いおも同様です。 実は、プログラミングに察するオブゞェクト指向のアプロヌチ 「プロパティず動䜜を自己完結型のナニオンに結合し、再利甚できるオブゞェクトを䜜成する機胜を提䟛したす。」。 私の意芋では、BLE も同様のアプロヌチを詊みたした。 プロファむルは Bluetooth Special Interest Group (SIG) によっお開発されたした。 同じプロファむルを持぀異なるメヌカヌのデバむスは、問題なく盞互に動䜜するはずです。 プロファむルは、サヌビスず、蚘述子によっお補足された特性のサヌビスで構成されたす。 䞀般的には次のようになりたす。

顕埮鏡䞋での BLE (ATTы GATTы...)

たずえば、心拍数モニタヌ (フィットネス ブレスレット) のプロファむル図を考えおみたしょう。 これは XNUMX ぀のサヌビスずいく぀かの特城で構成されたす。 そこから、プロファむルの階局がすぐに明らかになりたす。 チェックポむント特性により、総消費カロリヌ数がれロにリセットされたす。

1. 心拍数サヌビスには 0 ぀の特性 (180xXNUMXD) が含たれたす。
    a) 必須の心拍数特性 (0x2A37)
    b) オプションのボディセンサヌ䜍眮特性 (0x2A38)
    c) 心拍数制埡ポむント (0x2A39) の条件特性
2. バッテリヌ保守サヌビス (0x180F):
    a) 必須のバッテリヌ充電レベル特性 (0x2A19)

UUID

プロファむル芁玠 (サヌビス、特性、蚘述子) に䞀意にアクセスするには、䜕らかの方法ですべおに番号を付ける必芁がありたす。 この目的のために、Universally Unique ID (UUID) や Universally Unique Identifier などの抂念が導入されたす。 UUID は各行の括匧内に瀺されおいたす。 そしおここには䞀぀の特城がありたす。 UUID に぀いおは、長さ 16 ビットず 128 ビットのコヌドを䜿甚するこずにしたした。 なぜ聞くの BLE プロトコルでは、すべおが省゚ネです。 したがっお、16 ビットのサむズは非垞に合理的です。 近い将来、65 を超える数が䜜成される可胜性は䜎いです。 ナニヌクなサヌビスず特城。 珟時点では、数えられるものはすべおすでに数えられおいたす (これがどこから来たのか芚えおおいおください - 「圌はあなたも数えたした」:-)) 番号付きの芁玠 プロフィヌル, サヌビス, 特性 О 蚘述子 リンクを芋るこずができたす。

しかし、むンタヌネット䞊の 4 バむトの IP アドレスの話を誰もが芚えおいるず思いたす。 最初はこれで十分だず思っおいたしたが、今ではただ 6 バむトのアドレスに切り替えるこずができたせん。 この間違いを繰り返さず、DIY ナヌザヌの遊び心に自由を䞎えるために、SIG はただちに 128 ビット UUID の導入を決定したした。 これは個人的に、無線チャンネルからあらゆる皮類のクリビンに䞎えられた無認可の 433 MHz 垯域を思い出させたす。 私たちの堎合、サヌビスず特性の 128 ビット識別子が抜出されたした。 これは、サヌビスやデバむスでほがすべおの 128 ビット倀を䜿甚できるこずを意味したす。 それでも、同じ UUID が芋぀かる確率はれロになる傟向がありたす。

実際、短い 16 ビット UUID には 128 ビット倀ぞの拡匵がありたす。 仕様では、この拡匵子は Bluetooth Base UUID ず呌ばれ、倀は 00000000-0000-1000-8000-00805F9B34FB です。 たずえば、16 ビット属性 UUID の倀が 0x1234 である堎合、同等の 128 ビット UUID の倀は 00001234-0000-1000-8000-00805F9B34FB になりたす。 そしお、察応する匏も䞎えられたす。

                                128 ビット倀 = 16 ビット倀 * 2^96 + Bluetooth_Base_UUID

この魔法の数字がどこから来たのかはわかりたせん。 読者の䞭に知っおいる人がいたら、コメントに曞き蟌んでください (Sinopteek ずいうニックネヌムのナヌザヌがすでにこれを行っおいたす。コメントを参照しおください)。 128 ビット UUID の取埗に関しおは、原則ずしお特別な UUID を䜿甚できたす。 発電機誰があなたのためにやっおくれるのでしょう。

アッティガッティ...

実際、そこから楜しいこずが始たりたす。 ATT はクラむアントずサヌバヌの関係に基づいおいるこずを思い出しおください。 次に、サヌバヌデバむスに泚目したす。 センサヌ倀、照明スむッチの状態、䜍眮デヌタなどの情報が含たれたす。 すべおの「パレヌドの参加者」に番号が付けられたので、䜕らかの方法でそれらをデバむスのメモリに配眮する必芁がありたす。 これを行うために、属性テヌブルず呌ばれるテヌブルにそれらを配眮したす。 これをよく芚えおおいおください。 これはたさに BLE の栞心です。 これに぀いおはさらに怜蚎しおいきたす。 ここで、各行を属性ず呌びたす。 このテヌブルはスタックの奥深くに䜍眮しおおり、原則ずしお、テヌブルに盎接アクセスするこずはできたせん。 私たちはそれを初期化しおアクセスしたすが、内郚で䜕が起こっおいるかは XNUMX ぀の封印の背埌に隠されおいたす。

仕様から党䜓像を芋おみたしょうが、その前に、甚語、぀たり蚘述子においお頻繁に混同されおいる点にすぐに泚意を喚起したいず思いたす。 蚘述子の圹割は、特性の説明を補完するこずです。 機胜を拡匵する必芁がある堎合は、蚘述子が䜿甚されたす。 これらは属性でもあり、サヌビスや特性ず同様に、属性テヌブルに配眮されたす。 蚘事の埌半で詳しく芋おいきたす。 ただし、蚘述子が属性テヌブルの行番号を参照する堎合がありたす。 このこずを念頭に眮いおおかなければなりたせん。 混乱を避けるために、これらの目的には「属性ポむンタヌ」ずいう甚語を䜿甚したす。
顕埮鏡䞋での BLE (ATTы GATTы...)

したがっお、属性は、次のプロパティが関連付けられた個別の倀です。
1. 属性ハンドルは、属性に察応するテヌブル むンデックスです。
2. 属性タむプは、そのタむプを説明する UUID です。
3. 属性倀は、属性ポむンタによっおむンデックス付けされたデヌタです。
4. 属性パヌミッションは属性の䞀郚であり、属性プロトコルを䜿甚しお読み曞きするこずはできたせん。

これらすべおをどうやっお理解すればよいでしょうか 属性ポむンタは、盞察的に蚀えば、テヌブル内のその番号です。
これにより、クラむアントは読み取りたたは曞き蟌みリク゚ストで属性を参照できるようになりたす。 行 (属性) には 0x0001 から 0xFFFF たでの番号を付けるこずができたす。 本棚ずの関係では、これは玙のカタログのカヌド番号です。 同様に、図曞通カタログず同様に、カヌドは番号の昇順に配眮されたす。 埌続の各行の番号は、前の行の番号より倧きくなければなりたせん。 図曞通ず同じように、時々カヌドが倱われるこずがあるので、私たちの堎合、行番号にギャップが生じる可胜性がありたす。 これは蚱可されおいたす。 重芁なこずは、それらは埐々に進むずいうこずです。

属性タむプによっお、属性が䜕を衚すかが決たりたす。 C蚀語から類掚するず、
ここにはブヌル倀、数倀倉数、文字列があるため、ここにありたす。 認識される属性タむプごずに
私たちが䜕に取り組んでいるのか、そしおどのようにしおこの属性を扱い続けるこずができるのか。 以䞋では、いく぀かの特定の皮類の属性を芋おいきたす。 䟋えば、「サヌビス宣蚀」(0x2800)、「特性宣蚀」(0x2803)、「蚘述子宣蚀」(0x2902)。

属性の倀は、同語反埩を蚱しおください、その実際の意味です。 属性タむプが文字列の堎合、属性倀は、たずえばスロヌガン「Hello World !!!」になりたす。 属性タむプが「サヌビス宣蚀」の堎合、その倀はサヌビス自䜓です。 たた、これは他の属性ずそのプロパティを芋぀ける堎所に関する情報である堎合もありたす。

属性のアクセス蚱可により、サヌバヌは読み取りたたは曞き蟌みアクセスが蚱可されおいるかどうかを認識できたす。
これらのアクセス蚱可は属性倀にのみ適甚され、ポむンタヌ、タむプ、たたはアクセス蚱可フィヌルド自䜓には適甚されないこずに泚意しおください。 それらの。 属性の蚘録が蚱可されおいる堎合は、たずえば「Hello World !!!」ずいう行を倉曎できたす。 「おはよう」のラむンに。 ただし、改行を犁止したり、属性の型を倉曎しおその行を「サヌビス宣蚀」ずするこずはできたせん。 クラむアントがサヌバヌに接続するず、クラむアントはその属性を芁求したす。 これにより、クラむアントはサヌバヌが䜕を提䟛できるかを知るこずができたす。 ただし、倀を読み曞きする必芁はありたせん。

それがどのようなものか

GATT の抂念は、属性テヌブル内の属性を非垞に具䜓的か぀論理的な順序でグルヌプ化するこずです。 以䞋の心拍数プロファむルを詳しく芋おみたしょう。 この衚の巊端の列はオプションです。 これは、この行 (属性) が䜕であるかを単に説明しおいるだけです。 他のすべおの列はすでによく知られおいたす。

顕埮鏡䞋での BLE (ATTы GATTы...)

各グルヌプの先頭には垞にサヌビス宣蚀属性がありたす。 そのタむプは垞に 0x2800 で、ポむンタヌはテヌブル内にすでに存圚する属性の数によっお異なりたす。 その暩限は垞に読み取り専甚であり、認蚌や蚱可はありたせん。 これらの抂念に぀いおは埌ほど説明したす。 倀は、サヌビスが䜕であるかを識別する別の UUID です。 衚では、倀は 0x180D で、Bluetooth SIG によっお心拍数サヌビスずしお定矩されおいたす。

サヌビスの発衚に続いお、特城の発衚。 圢匏的にはサヌビス宣蚀に䌌おいたす。 その UUID は垞に 0x2803 で、そのアクセス蚱可は認蚌や承認なしで垞に読み取り専甚です。 いく぀かのデヌタを含む属性倀フィヌルドを芋おみたしょう。 これには垞に、ポむンタヌ、UUID、および䞀連のプロパティが含たれたす。 これら XNUMX ぀の芁玠は、その埌の特性倀の宣蚀を蚘述したす。 ポむンタは圓然、属性テヌブル内の特性倀宣蚀の䜍眮を瀺したす。 UUID は、どのような皮類の情報たたは倀が期埅できるかを瀺したす。 たずえば、枩床倀、照明スむッチの状態、たたはその他の任意の倀です。 そしお最埌に、特性倀をどのように操䜜できるかを蚘述するプロパティです。

ここでたた別の萜ずし穎が埅っおいたす。 これは、属性暩限ず特性プロパティに関連付けられおいたす。 仕様のビット フィヌルド プロパティの図を芋おみたしょう。

顕埮鏡䞋での BLE (ATTы GATTы...)

ご芧のずおり、ここには読み取りおよび曞き蟌み機胜を提䟛するフィヌルドもありたす。 なぜ属性ずプロパティに察する読み取り/曞き蟌み暩限があるのか​​疑問に思われるかもしれたせん。
特性倀の読み取り/曞き蟌み? それらは垞に同じであるべきではないでしょうか? 実際のずころ、特性倀のプロパティは、実際には GATT 局およびアプリケヌション局で䜿甚されるクラむアントに察する掚奚にすぎたせん。 これらは、クラむアントが特性宣蚀属性から䜕を期埅するかに぀いおの単なるヒントです。 これをさらに詳しく芋おみたしょう。 属性にはどのような皮類の暩限がありたすか?

1. アクセス蚱可:
     - 読む
     - 蚘録
     - 読み曞き
2. 認蚌蚱可:
     - 認蚌が必芁です
     - 認蚌は必芁ありたせん
3. 認可暩限
     - 認蚌が必芁です
     - 蚱可は必芁ありたせん

属性解決ず特性プロパティの䞻な違いは、前者はサヌバヌに適甚され、埌者はクラむアントに適甚されるこずです。 サヌバヌは特性倀の読み取りを蚱可されおいる堎合がありたすが、認蚌たたは蚱可が必芁な堎合がありたす。 したがっお、クラむアントが特性のプロパティをリク゚ストするず、読み取りが蚱可されるこずを受け取りたす。 しかし、読み取ろうずするず゚ラヌが発生したす。 したがっお、プロパティに察するアクセス蚱可の優先順䜍に぀いおは、安党に議論できたす。 クラむアント偎では、属性にどのような暩限があるかに぀いおの情報を取埗できたせん。

ディスクリプタ

テヌブルに戻りたしょう。 特性の倀を宣蚀した埌、次の属性宣蚀が可胜になりたす。
1. 特性の新しい宣蚀 (サヌビスは倚くの特性を持぀こずができたす)
2. 新しいサヌビス宣蚀 (衚には倚数のサヌビス宣蚀が含たれる可胜性がありたす)
3. ハンドルの宣蚀

心拍数枬定特性の堎合、この衚では、特性倀の宣蚀に蚘述子の宣蚀が䌎いたす。 蚘述子は、特性に関する远加情報を含む属性です。 蚘述子にはいく぀かの皮類がありたす。 それらに぀いおは、この蚘事の埌半で詳しく説明したす。 ここでは、Client Characteristic Configuration Descriptor (CCCD) に぀いおのみ觊れたす。 UUID は 0x2902 です。 この蚘述子を䜿甚するず、クラむアントはサヌバヌ䞊での衚瀺たたは通知を有効にするこずができたす。 それらの差は小さいですが、それでも存圚したす。 通知にはクラむアントからの受信確認は必芁ありたせん。 衚瀺にはこれが必芁ですが、GATT レベルで発生し、アプリケヌション レベルには達したせん。 なぜそうなるのですか ああ、これはわかりたせん。 北欧の専門家は通知の䜿甚を掚奚しおいるずだけ蚀っおおきたす。 さらに、どちらの堎合でも、パッケヌゞの敎合性のチェック (CRC を䜿甚) が行われたす。

たずめ

蚘事の最埌にこれを蚀いたいず思いたす。 最埌の衚は少しわかりにくいです。 しかし、䞎えられたのでそれを遞びたした статье私が頌りにしおいるもの。 蚘事の埌半では、BlueTooth 4.0 仕様をさらに詳しく掘り䞋げる予定です。 そこではより正確な図や図面が私たちを埅っおいたす。 XNUMX 番目のパヌトでは、ガゞェットの XNUMX ぀から Wireshark プログラムを䜿甚しお取埗したログを解析し、研究しおいるすべおの理論を「ラむブ」で確認したいず思いたす。

グルヌプ䌁業の埓業員 「シヌザヌサテラむト」
ペチェルスキフ・りラゞミヌル

出所 habr.com

コメントを远加したす