pMyScan->start(); if (advertisedDevice.hasServiceUUID()) { standard characteristics defined by the Bluetooth SIG, the Heart Rate Measurement characteristic, Introduction to Bluetooth Low Energy Created by Kevin Townsend, Peripheralデバイスは、小型、省電力、リソースが限られており、もっと強力なリソースを持つCentralに接続する。例えば、心拍数モニターや、BLEの近接タグがこれに当たる。, Centralデバイスは、普通はスマホとかタブレットなどのペリフェラルよりもプロセッサーやメモリが強力なものである。, GATTのデータはProfile,Service,Characteristicsからなり、Serviceはそのデータの用途を表すUUIDと、実データであるCharacteristicsを含む, you can read useful information later efficiently. 和訳文はGoogle翻訳の方がマシみたいな書き方になっているところが多々あり、読みづらくてすみません。    return *(double*)getValue(); pMyScan->setAdvertisedDeviceCallbacks(new MyCallbacks()); 特にGATTなど、まだまだ理解が不十分なところは見えていますが、これをとっかかりにしてどんどん理解を進めていきたいです。   } Bluetooth(BLE)の通信を実現するプロトコルスタックは 下記のような階層構造となっています。 今回はこの中でも開発者が良く触る「GAP」「GATT」「ATT」について 簡易にその役割をまとめます。 GAP(Generic Access Profile) Profileの概要 (https://adafru.it/E8u), GATTプロファイルは、サービスとキャラクタリスティックから構成されるということでいいと思います, サービスはデータをロジックエンティティ(実体)に落とし込むために使われ、キャラクタリスティックと呼ばれる特定のデータの塊を含んでいる。 gattとは、1947年からはじまった自由主義的な国際貿易のルールであり実質的な国際組織です。1995年にwtoが設立されたことでgattはwtoのルールの一部になりました。gattの理念、歴史、現状まで詳しく解説しています。 BLESan* pMyScan = BLEDevice::getScan(); この記事では、GPSと位置情報サービスは、我々がそのようにユビキタスになった方法について説明します... このセッションでは、Bluetooth mesh -ベースの照明器具間ネットワークの統一されたアーキテクチャについて議論します。, フィリップスがどのようにしてカシアネットワークスと提携し、COVID-19 の蔓延との戦いを支援したかをご覧ください。.   pCharacteristic->setValue("Hello world"); Why not register and get more from Qiita? ② 双方向通信ができる プロファイルは、実際にはBLEペリフェラル自体には存在せず、単純に定義済みのサービスのコレクションであ …   bool isNotify). LinkLayerは、LLと略すこともあります。HCIは、Host Control Interfaceの略ですが、昔はこのレイヤでHost CPUとBluetoothデバイスがUART等で接続され制御していたのですが、現在はすべてSingle Chipで処理されていますので、このレイヤはなくなっています。    次にGATTの階層構造を表します。厳密な階層構造を規定して、クライアントとサーバー間の情報のアクセスや       // we found a useful device … このペイロードは、デバイスをデザインする人がアドバタイジングデータにプラスして、例えばデバイスの名前などを送信することを可能する。, GAPのレイヤーでは、ペリフェラルはアドバタイジングパケットというパケットを投げることが決められているということのようです。   // Connect the client to the server AndoridはAndroid4.3からOSレベルでGATT APIに正式対応していますが、4.3では不具合があり、実質、Android4.4以降と考えて良さそうです。AndroidもBLEへの対応が進められていますが、iOSに比べると、機種によって動作が不安定な場合があり、その点がネックと言えます。 セントラルデバイスは常にこのリクエストに応えることはできるわけではない。なぜならば、他のペリフェラルとの通信を行っていたり、システムリソースが足りなかったりするためだ。, 次の図は、ペリフェラル(GATTサーバー)とセントラル(GATTクライアント)がデータをやり取りする様子を示したものである。すべてのトランザクションはマスターデバイスから始まっている。, HTTPの場合と比較して、サーバーとクライアントの命名が逆になっているように感じますね。   void onRead(BLECharacteristic* pCharacteristic) { What is going on with this article?   uint8_t* data,   // Set the characteristic value その接続がブレークするまでは、他のデバイスはそのペリフェラルを接続はもちろん検知もできない。, 接続を確立することはまた、2方向通信をおこなうための唯一の方法である。接続下では、セントラルはペリフェラルにデータを送ることができるし、その逆もまた可能である。, とりあえず、次のことがポイントな気がします この2つのペイロードは同じで、ともに31バイトを上限としている。しかし、必須なのはアドバタイズデータだけである。というのも、アドバタイズデータは周囲のセントラルデバイスに自分が存在することを知らせるためにコンスタントに送信するものであるためだ。 gatt という単語が出てきたら ble を使うものだと考えていただいて大丈夫です。 これまでの Bluetooth とは互換性はないため、ホスト側は、これまでの Bluetooth 3.0 とデュアルモードとして、どちらも使用できるようにとして実装される場合が多いです。 さらに理解が進んだら第二弾を書きたいと思います。, ハードウェアのエンジニアをしています。 ① GAPによって接続を確立したあとのはなし (adsbygoogle = window.adsbygoogle || []).push({}); GATT体制のもとでは繰り返しラウンド交渉が行われましたが、第8回ラウンド交渉(ウルグアイ・ラウンド/1986年-1994年)で、WTO(世界貿易機関)の設立が決められました。, と思われるかもしれませんが、厳密に言えば、GATTの協定は一部が改訂され、WTO協定という新たなルールの体系の中に付属書として含まれました。そのため、GATTのルールは当初の「1947年GATT」と「1994年GATT」に区別されています。, WTOが設立されたのは、加盟国の増加や交渉分野の拡大から、新たなルール・制度が求められたからです。, そこでWTOは正式な国際機関となり、大幅に権限も強化され、以下のようにルール化されました。, 特に大きな変化が、紛争解決手段の明確化です。WTOではWTO協定に違反するような行為が起こった場合、以下のプロセスで紛争解決が進められます。, 二国間協議で解決されない場合は、第三者である紛争処理委員会が介入することで、紛争の解決を図るようになっています。, こうして紛争解決の力はWTOの設立によって高まりましたが、一方でラウンド交渉でのルール作りは、停滞するようになりました。, そのため、貿易・投資などの国際的なルール作りの場は、ラウンド交渉よりもFTA(自由貿易協定)によるものへ変化しています。, 繰り返しになりますが、GATTでは一部の国が損するような協定を作ることを制限しました。しかし一方で、例外的にFTA(自由貿易協定)という、二国間で締結する協定も認めました。, FTAとは、二国間以上の国家間で貿易や投資を拡大するために、障壁となる関税や非関税障壁を撤廃することを決める協定のことです。, つまり、特定の国家間で関税や非関税障壁を下げることは認めるが、それ以外の国に対して関税を引き上げるようなことは駄目だということです。, しかしこれは、特定の国に対して与えた最高の待遇について、他のすべてのGATT加盟国にも与えなければならないという「最恵国待遇」には反するものです。, ですが、ラウンド交渉によるルール作りが停滞したために、90年代以降はFTAによる貿易・投資のルール作りが主流になりました。, 1章でも触れたように、GATTは第二次世界大戦の反省から構想されたものです。GATTの開始からWTO設立までの歴史を概観します。, 繰り返しになりますが、GATTは第二次世界大戦への反省から、「自由貿易をグローバルに進めよう」という理念から作られたものでした。, 第二次世界大戦の原因となったのが、1929年の世界恐慌の影響から各国が取った「ブロック経済」「保護主義」的な政策です。, イギリスはイギリス本国とカナダ連邦・オーストラリア連邦・ニュージーランド・南アフリカ連邦・アイルランド自由国・ニューファンドランドらの自治領との間で「オタワ協定」を締結しました。オタワ協定の締結で、イギリスは帝国内の自治領との間で貿易圏を作り、「ブロック経済」化したのです。, アメリカは、スムート・ホーレー法により輸入品に高い関税をかけ、保護主義に傾斜しました。, 経済的な強国(持てる国)がブロック経済・保護主義に向かったことで、世界の貿易量は3分の1になってしまいます。, そして、日本、イタリア、ドイツのような「持たざる国」は資源獲得のために帝国主義的侵略を進め、それが第二次世界大戦の原因になりました。.     // Do something with the found device ... [BLE(Bluetooth Low Energy)の開発依頼は、フィールドデザインまでお気軽にお問い合わせください。], 接続処理が完了すると、マスター、スレーブともにデータチャネルに移ります。どちらかがサーバになり、もう一方がクライアントになります。通常は、アドバータイズをしている側(スレーブ側)が、サーバになります。そのサーバに対して、スマートフォンなどのクライアントがアクセスに行くことになります(1つの機器で、サーバの役割、クライアントの役割とも持つことが可能です)。, 下記のようなプロトコルスタックになっています。正確にはGAPからLinkLayerにアクセスするケース(スキャン時、接続時)など例外的なパスはありますが、おおよそこの図で説明できます。 Copyright (c) FIELD DESIGN INC. All Rights Reserved.   // Get a reference to a specific remote characteristic owned by the service 接続が不要な通信(逆に接続をするためにセントラルに見つけてもらうために出すパケット)で、スキャンレスポンスはアドバタイジングパケットに入りきらないデータがあれば送る。という理解でいいのかと思います, 次のイラストはアドバタイジングのプロセスとアドバタイジングペイロードとスキャンレスポンスペイロードがどのように働いているかを説明したものだ。 GATTとは.   BLEサーバーは図のように構成されています(『BLE C++ Guide.pdf』から引用)。, ⇒ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers, Simultaneous LE and BR/EDR to Same Device Capable (Controller), Simultaneous LE and BR/EDR to Same Device Capable (Host), descriptorのCharacteristic Extended Propertiesを使用できる, Characteristic Propertyの拡張プロパティと合わせて使用する。Queued Write / Writable Auxiliariesを指定できる。, Characteristicの説明文字列。ユーザーが可読できる記述(UTF-8文字列)が含まれる。, CCCDと略され、最も重要でよく使われるディスクリプタ。2ビットのフィールドから成り、NotifyとIndicateの許可を制御する。, Format,Exponent,Unit,Namespaceで構成され、Valueのフォーマットを指定する。利用できるフォーマットは、論理型、文字列型、整数型、浮動小数型、汎用の型付けされていないバッファーなど。. BLE、機械学習に興味があって取り組んでいます. ・キャラクタリスティックの通知(Notification)と通告(Indication), GATTサブプロシージャを使用することで、ユーザーは簡単にアプリケーションを実現できます。  ここでは、ライブラリーの概要について、開発者自身が公開している「BLE C++ Guide.pdf」を要約します。ポイントだけをピックアップし意訳しているので、ぜひ原典の一読をお勧めします。   void onRead(BLECharacteristic* pCharacteristic) { GATTの詳細については、Bluetooth®コア仕様のVolume 0、Section 6をご覧ください。 変更点を示す情報文書」欄の文書は、Bluetooth®仕様の2つのバージョン間の変更点を読者が識別できるようにするための礼儀として提供されています。 シルビアは、Bluetooth mesh の強力な擁護者であり、Bluetooth mesh ... "インフラに投資するときは、信頼性の高いものでないとダメだ!"- というのは、どのバイヤーも言っていました... ここでは、政府、医療機関、雇用者が使用しているトップ4のテクノロジーをご紹介します。.  Bluetoothのコア仕様はBluetooth SIG (Special Interest Group)で維持されています。, BLEには1種類のパケットフォーマットと、2種類のパケット(アドバタイジング・パケットとデータ・パケット)しか存在しません。これによって、プロトコルスタックの実装が大幅に簡略化されています。プロトコルスタックは、通信を実現するための一連の通信プロトコル群のことで、後で細かく吟味することになりますが、それに先だって、パケットの内容を見ておきましょう。, プロトコルスタックは、通信プロトコル(規約や手順)を階層構造で表したものです。Bluetoothのアーキテクチャはコントローラーとホスト、それにアプリケーションから成り立っていますが、その構成別にプロトコルスタックをとらえると、ごく大まかに図のように表すことができます。なお、この図ではHostとControllerの間に位置するHCI(Host Controller Interface)は省略しています。, アプリケーション開発との関わりが強いGeneric Access Profile(GAP)とGeneric Attribute Profile(GATT)については次節で取り上げることにして、その他の部分を簡単に眺めておきましょう。  ○BLEサーバーの構成   void onResult(BLEAdvertisedDevice advertisedDevice) {  ESP32でのアプリケーション開発では、Neil Kolban氏が開発した「Arduino IDE ESP32 BLE Library」を使用します。とても良くできたライブラリーで、BLEの多様な機能をモデル化した多くのクラスから構成されています。   }   BLEAdvertisementData advertisementData; GATTはAttribute protocol(ATT)という汎用のdataプロトコルを使用しており、ここではServices,Characteristicsと関連するデータを各エントリーが16bit IDであらわされたシンプルなルックアップテーブルを使用している。, GATTは、専門のコネクションが2つのデバイス間で張られたときに動くもので、これは既にGAPによってアドバタイジングプロセスは済んでいることを表している。, GATTとコネクションに関して一番に覚えるべきことは、コネクションは排他的であるということである。 すべての通信がクライアント(セントラル)から始まるのは、直感的にそうな気がします。接続間隔がペリフェラルから通知されるのは、それぞれのデバイスごとに必要な接続インターバルが異なるからだと思われます。, BLEのGATTのトランザクションは、高レベルでネストされた(入り組んだ?)Profiles, Services, Characteristicsと呼ばれるオブジェクトに基づいている。つぎの図にその様子を示す。, プロファイルは、実際にはBLEペリフェラル自体には存在せず、単純に定義済みのサービスのコレクションである。Bluetooth SIGまたは周辺機器の設計者によって事前にコンパイルされている。たとえば、心拍数プロファイルでは、心拍数Serviceとデバイス情報Serviceを組み合わされる。 サービスと類似してキャラクタリスティックも16bitか128bitの事前に定義されたUUIDで同定できる。我々は自由にstandard characteristics defined by the Bluetooth SIG を使用できるし(which ensures interoperability across and BLE-enabled HW/SW)、もしくは独自に自分のペリフェラルとソフトウェアだけが理解できるキャラクタリスティックを定義しても良い。, 例としてthe Heart Rate Measurement characteristicはthe Heart Rate Serviceには必須で、UUIDは0x2A37を使用している。このキャラクタリスティックは、HRM data形式の8bitの値(UINT8やUINT16など)ではじまり、この設定されたバイト数分の心臓の拍動データを含んでいる。   // Get a reference to a specific remote service on the server 主要な機能とサブプロシージャはこちらを参照願います。, ・GATTは、ATTを用いてデータを構造化する方法と、アプリケーション間でのやり取りの方法を定義する。, ・Bluetooth low energyのアプリケーションは、すべてこのGATTを使用して構築されることから、GATTはBluetooth low energyのデータ転送の主軸となるものである。, ・GATTプロファイルは、「サービス」、「キャラクタリスティック」、「ディスクリプタ」の3つのアトリビュートで構成されている。, ・GATTプロファイルはサービスの集合体であり、サービスはキャラクタリスティックの集合体。, ・GATT機能とは、GATTに基づくデータのやり取りのための手順でATTが提供する操作に基づく。, ・GATT機能にはサブプロシージャがあり、データアクセス機能をユーザーに提供する。, Bluetooth v4のアドレス(Bluetooth Device Address). 3回にわたりGATTについて概要を説明してきましたが、すこし煩雑になった感があるので、ここでGATTについて一度まとめます。, GATT(Generic attribute profile)-汎用アトリビュートプロファイルは、ATT(アトリビュートプロトコル)を用いてデータを構造化する方法と、アプリケーション間でのやり取りの方法を定義します。Bluetooth low energyのアプリケーションは、すべてこのGATTを使用して構築されることから、GATTはBluetooth low energyのデータ転送の主軸となるものです。, GATTには、Bluetooth SIGが公式に提供しているプロファイルと、機器メーカなどの独自提供のものがあります。Bluetooth SIGが定義しているプロファイルには、Alert Notification(アラート通知)、Blood Pressure(血圧計)、Health Thermometer(体温計)、Heart Rate(心拍数)、Location and Navigation(位置とナビ)などがあります。これらはすべて、Bluetooth low energy用に定義されたもので、Bluetooth v3以前のプロファイルとは互換性がありません。, GATTプロファイルは、「サービス」、「キャラクタリスティック」、「ディスクリプタ」の3つのアトリビュートで構成されています。GATTプロファイルは、「1つ以上のサービス」から構成されます。サービスは、「ゼロ個以上のキャラクタリスティック」から構成されます。キャラクタリスティックは、「プロパティ、バリュー、ゼロ個以上のディスクリプタ」で構成されます。, つまり、GATTのプロファイルはサービスの集合体であり、サービスは他のサービスへの参照とキャラクタリスティックの集合体です。(右図参照)。この構造は、Bluetooth LEにおいては厳密に適用され、GATTプロファイルのすべてのアトリビュートは、これら3つのいずれかに含まれます。, 全体的な流れとしては、クライアントは遭遇した任意のサーバと接続した後、GATTプロファイルに基づくプロファイルで情報の取得や書き込みを行います。この情報のやり取りには、キャラクタリスティックまたはディスクリプタの値を使用します。, GATTのサービスとは、機器(サーバ)の機能をあらわすものです。例えば、体温計のハードウェアの機能が、体温の測定と測定完了の通知音を発することの2つだとすれば、温度測定をするサービスと通知音を発するサービスが、それぞれ1個ずつ計2個の独立したサービスが実装されていることになります。これらのサービスは、体温計という機器の個別機能ではなく、あくまでも温度測定と通知音を鳴らすとった独立した機能です。したがって、これらのサービスは他の機器でも使用することが可能です。, GATTのキャラクタリスティックとは、その機器(サーバ)の内部状態、動作指示、外部センサ値などを読み書きするアトリビュートで、アクセス方法を定義するプロパティとディスクリプタで構成されています。先程の体温計の例では、温度測定のサービスには温度を読み出すキャラクタリスティック、通知音のサービスには通知音のオンオフ指示を書き込むキャラクタリスティックが含まれていると考えることができます。, ディスクリプタとは、キャラクタリスティクスのバリューの変数の型や単位などの情報の追加と、そのバリューが変更された時にクライアントへの通知の有無といった動作指示に使います。キャラクタリスティックによっては、ディスクリプタを含まないものもあります。, GATT機能とは、GATTに基づくデータのやり取りのための手順で、ATTが提供する様々な操作に基づいています。機能(プロシージャ:Procedure)にはサブプロシージャ(Sub-procedure)があり、以下のような機能をユーザーに提供します。, ・クライアントとサーバの設定情報の交換 一つのペリフェラルは、一つのセントラル(スマホなど)にしか接続できないが、セントラルは複数のペリフェラルに接続可能である, もし2つのペリフェラル間でデータを交換する必要が出てきた場合には、すべてのメッセージがセントラルデバイスを介してやり取りされるcustom mailbox systemを実装する必要がある。, 一度ペリフェラルとセントラルの間でコネクションが確立されると、コミュニケーションは双方向に行うことができるようになる。これは、GAPとアドバタイジングデータだけを使う場合の一方向ブロードキャスティングのアプローチとは異なる。, 1セントラルは複数台のペリフェラルと接続可能、というのは覚えておいた方がよさそうです。確かに、パソコンはBLEのマウス、イヤホンなど複数台のデバイスとBluetooth接続していますね。, GATTに関連して理解すべき重要なコンセプトにサーバー/クライアントの関係がある。, ペリフェラルはGATT serverとして知られている。これは、ATT lookup data,serviceとcharacteristicsの定義, サーバーへリクエストを送るGATT client(スマホ/タブレット)を保持している。, すべてのデータ取引はマスターデバイスであるGATT Clientからはじまり、GATT ClientはスレーブデバイスであるGATT Serverからのリクエストを受けつける。, コネクションが確立されると、ペリフェラルは「接続間隔」をセントラルに提案する。するとセントラルデバイスは、毎接続間隔ごとにペリフェラルへの接続を行い新しいデータがあるかなどの確認を行う。 4.bleのプロトコルスタック ... データ層の最上位定義で、すべてのbleデバイスはgattで定義されている仕様に従ってデータのやり取りを行われなければなりません。言い換えると、bleアプリケーションは、すべてこのgattを使用して構築されることになります   pAdvertising->start(); BLEAdvertising* pAdvertising = pServer->getAdvertising();   BLERemoteCharacteristic* pMyRemoteCharacteristic = というのは、ユーザーはキャラクタリスティックに書き込むこともできるからである。    他のプロトコルやプロファイルと同様に、GATTでもデバイスの役割が定義されています。, ○アトリビュートとデータの階層構造 これはBLEの用語では「Broadcasting」として知られている。   // Create the server     pMyRemoteService->getCharacteristic(characteristicUUID); ・キャラクタリスティックの読み出し(Read)と書き込み(Write)   }  なお以下では、Peripheralをサーバー、Centralをクライアントと表現しているので注意してください。, (1)BLE サーバー   BLEService* pService = pServer->createService(ServiceUUID); BLEのGATTのトランザクションは、高レベルでネストされた(入り組んだ?)Profiles, Services, Characteristicsと呼ばれるオブジェクトに基づいている。つぎの図にその様子を示す。 Profiles. これらはまた、BLEのペリフェラルに(セントラルから)データを送り返す際にも使われる。 頻繁に新しい無線技術が登場し 全てを変えてしまいます私たちはこれを見てきました... このホワイトペーパーでは、Bluetooth Mesh プロファイルの概要といくつかのハイライトを提供しています。, パイオニア・マーケットは、カリフォルニア州マリポサとウォーターフォードで営業している家族経営の食料品店です。, Bluetooth Mesh は、すでに普及している技術を利用した大規模な産業展開のためのフレームワークを提供しています。.