2014/12/06

[ble]ATT_MTU

Core_V4.1によると、AttributeのPDUはこんな構成になっている。

image

 

図に注釈を付けると、こんな感じだ。

image

 

じゃあ、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: 226
Length: 23
Raw data (hex): 58 AF 2C EB 0A 0E 0A 00 04 00 05 01 47 00 02 29 48 00 01 29 CE B4 D0
RSSI [dBm]: -58
CRC OK: 1

SensorTagのパケットを受信して、23byteのものを見てみた。

image

違う・・・。
これは、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

image

これは、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。