Core_V4.1によると、AttributeのPDUはこんな構成になっている。
図に注釈を付けると、こんな感じだ。
じゃあ、ATT_MTUはどういう値なんだろう?
これは、GATT(Vol. 3 Part G)の5.2章に書かれていた。
デフォルト値は23で、これは"not less than the default value"と書いてあるので、下限値のようだ。
つまり、デフォルトでのAttribute Paramsは22oct。
MTUのサイズを知るために、Exchange MTU Requestなるものがある。
Requestを投げるのはClient側で、まず自分の受信可能なMTUサイズ(Client Rx MTU)を投げる。
そのResponseとして、Server Rx MTUが返ってくる。
どちらもサイズが2octなので、65535byteまで可能・・・なのかしら?
しかし、これは「私はこれだけしか受信できませんのであしからず」というご挨拶なので、相手ができないことをできるようにするわけではない。
なので、1回に送る量が23octより大きくできる、という期待はしない方がよいだろう。
Packet index: 226Length: 23Raw data (hex): 58 AF 2C EB 0A 0E 0A 00 04 00 05 01 47 00 02 29 48 00 01 29 CE B4 D0RSSI [dBm]: -58CRC OK: 1
SensorTagのパケットを受信して、23byteのものを見てみた。
違う・・・。
これは、L2CAPも含んで23byteだ。
こういうのもあった。
58 AF 2C EB 0A 1B 17 00 04 00 09 15 49 00 0A 4A 00 00 00 00 00 00 00 00 B0 00 40 51 04 32 AA 00 F0 27 36 FF
これは、ATT Lengthが21byte(0x15)なので、ATT_MTUがデフォルトだったなら最大長になる。
青文字の範囲がATTだ。
ということは、それより外側はL2CAPになるのかな。
いやあ、バイナリが読めるようになってくると、興奮してきますな。
あれ・・・最後の一言だけで、よい記事のはずが台無しになった気がする。
s110/ble_gatts.hでは、こうなっていた。
23byte固定だそうな。
/** @brief Only the default MTU size of 23 is currently supported. */
#define GATT_RX_MTU 23
同じファイルに、ATTの最大データ長定義も書かれていた。
実は、これを探してたのだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。