Data PDU(★)

Data PDUは、データチャネル(37ch)でやり取りするパケットです。このチャネルでやり取りしているということは、すでに接続状態にあります。

Data PDUは、下記のフォーマットになりますが、LLIDによって、LL Control PDU(制御通信)と、LL Data PDU(データ通信)にさらにわかれます。
ユーザーが使っているようなアプリケーションデータは、LL Data PDUを使って送受信されます。

ヘッダー
(2Byte)
ペイロード
(N Byte:種類によってさまざま)

ヘッダーには、LLID(2bit)、Length(8bit)等が含まれます。LLID=11bの時は、LL Control PDUになります。LLID=10bの時は、LL Data PDUで、最初のL2CAPのパケットが入ります。LLID=01bの時は、LL Data PDUで、途中のL2CAPのパケットを示します。

LL Control PDUのフォーマット

LL Control PDUは、切断、接続情報の更新、暗号化などの制御を行うために使われます。
下記のようなフォーマットになっています。

OpCode
(1Byte)
パラメータ
(0-26Byte)

OpCodeの代表的なものは、下記になります。煩雑になるため、暗号関係のものは抜いてあります。

OpCode 説明
LL_TERMINATE_IND 切断するときに送る。パラメータには、1Byteのエラーコードを付ける。
LL_CONNECTION_UPDATE_REQ 接続パラメータ(Connection Interval, Supervision Timeout等)を更新する時に送る。パラメータには、11Byteの更新する接続パラメータを付ける。Master側だけが送れる。

LL Data PDUのフォーマット

LL Data PDUは、ユーザーデータなどの通信に利用するL2CAPパケットを送る時に利用します。
L2CAPは、Version 3.0までのClassic Bluetoothでも使われています。しかし、Bluetooth Low EnergyでのCID(Channel識別子)を、Version 3.0までは使われていない0x04, 0x05, 0x06にすることで、同じL2CAPという呼び名であっても別のプロトコルに定義しなおしています。
Bluetooth Low Energyで使うCIDは、ATT(CID=004), Signaling(CID=0x05), SecurityManager(CID=0x06)だけです。

L2CAPのフォーマットは下記のようになっています。ここのCIDによって、Bluetooth Low Energyかどうかを分けています。結局、L2CAPの上にATT, Signaling, SecurityManagerの情報を載せてしまうので、L2CAPを使わないなど、もう少し考えようがあったと思います。

Length
(2Byte)
CID
(2Byte)
Payload
(0-65535Byte)