Energy)の開発依頼は、フィールドデザインまでお気軽にお問い合わせください。]接続処理が完了すると、マスター、スレーブともにデータチャネルに移ります。どちらかがサーバになり、もう一方がクライアントになります。通常は、アドバータイズをしている側(スレーブ側)が、サーバになります。そのサーバに対して、スマートフォンなどのクライアントがアクセスに行くことになります(1つの機器で、サーバの役割、クライアントの役割とも持つことが可能です)。下記のようなプロトコルスタックになっています。正確にはGAPからLinkLayerにアクセスするケース(スキャン時、接続時)など例外的なパスはありますが、おおよそこの図で説明できます。上記のプロトコルスタック図は、サーバ側、クライアント側の両方で共通です。LinkLayerは、LLと略すこともあります。Chipで処理されていますので、このレイヤはなくなっています。Protocolの略です。Profileの略です。Profileの略です。これらの詳しい説明は、以降で行います。LayerとかProfileとかProtocolとかいろいろな名称が使われてますが、通信ですので中身はプロトコル(約束事)です。属性(Attribute)サーバには属性(Attribute)というデータの箱があり、それにクライアント側からアクセスします。この属性のやり取りをするプロトコルをATT(Attribute)プロトコルと呼んでいます。この属性(Attribute)を複数組み合わせて、GATTデータベースというものを作ります。そのGATTデータベースにアクセスするには、ATTプロトコルを組み合わせて使います。属性(Attribute)は、下記の集まりです。これらはサーバ内部で保存しておく値ですので、どのような形で保存しておいてもかまいません。16Byte)Attribute値(0-512Byte)AttributeパーミッションAttributeハンドルは、通し番号です。Attributeタイプは、UUIDという識別子で、その値によってサービス名(Service)を示したり、キャラクタリスティック(Characteristic)と言われるものを示したりします(なお、ServiceとかCharacteristicというのは、GATTでの概念で、ATTでは定義されていません)。Attribute値は、アプリケーションレイヤが利用するデータが入ります。Attributeパーミッションは、読み書きできるとか、読み込みのみとか、暗号化ありとかの属性です。この属性(Attribute)が、いくつも集まりGATTデータベースとなっています。ATTプロトコル属性(Attribute)にアクセスするATTプロトコルで使われるパケットフォーマットです。このパケットを使って、サーバとクライアントが通信をします。Parametersに、Handle番号が入ります。ATTプロトコルでは主に下記の操作ができます。OpCode:0x0B)というのを返してきます。このATTプロトコルは低レベルのプロトコルなので、温度計の値を読みこむとかの操作はできません。センサーの値を読むときなどは、一つ上のレイヤのGATTの処理(procedure)が必要になります。GATTデータベース属性(Attribute)を集めたGATTデータベースですが、イメージがしづらいので、実際のセンサーの値を格納したデータベースで説明します。Energy規格では、この辺が非常に理解しずらいです。理解しづらいのは、サービスの宣言までが、1つの属性(Attribute)に割り当てられてしまっているからです。通信の世界ではなく、MySQL等のデータベースの世界になっています。具体的な温度計のGATTデータベースは下記のようになります。1行ずつは、属性(Attribute)になってます。Read実際は、サービスは、キャラクタリスティックの集まりとして定義されています。Descriptorの集まりとして定義されます。そのため、上記は、下記のような構造になります。Descriptor0x2901(=ユーザーデータ)GATT処理(procedure)GATT処理(procedure)は、MTUを変更するものや、GATTデータベースに対してアクセスするものなど、いくつかのATTプロトコルの組み合わせで行います。使われる処理には下記のようなものがあります。Energyには、いろいろな長さがあり、混乱することがあります。下記ではそれらを説明します。LinkLayer物理レイヤであるLinkLayerでの最大データ長は、ver4.1までは27byteで、ver5.2からは251byteとなっています。LL_LENGTH_RSPの交換処理によって、セントラルとペリフェラル両者で最適な値を決定します。L2CAPL2CAPでは、長さフィールが2byteであるため、0から65535までの長さを取ることが可能です。Energyでは、上位レイヤにATT,GATTを使うことから、最大長はATTの最大長になってしまいます。物理レイヤが27byteである時に、L2CAPでデータ100byteを送る場合は、複数に分割して送ることになります。Request/Responseによって、セントラルとペリフェラル両者で最適なATTプロトコルでの最大長(ATT_MTU)を決定します。ATT_MTUの最小値は23です。最大値は定義されていません。L2CAPで送ることを考えると、65535-4以下であることは間違いありません。Attribute値の長さは512byte以下であることが仕様で決まっているので、ATT_MTUを515以上にしておけば、どのようなAttribute値でも転送可能です。転送スピードを出したい時は、物理レイヤの長さが251byteの場合、L2CAPの4byteを除いた247byteにATT_MTUを設定し、フレームが分割されることのないようにします。下記のように、GATTの操作によって、送れるAttribute値のデータ長は変わってきます。characteristicの長さはAttribute値を使うので、最大で512byteということになります。