蓝牙mesh底层传输层(消息格式)

底层传输层将来自上层传输层的PDU发送给另外一个节点,如果数据不需要分包,就单个底层传输层PDU发送出去,如果长度太长,则需要对数据分包之后再发送出去。接收消息时,也会判断是否是分包数据,如果是分包数据,则再组装之后,再传给上层传输层。

底层传输层PDU

底层传输层PDU的第一个字节的最高位是SEG字段,也是最重要的一个位,该字段用来确认此PDU是经过分包的还是未分包消息。在网络层中,CTL字段确定消息是访问消息还是控制消息。根据这两个字段值的不同,可以将消息分为4种类型:1.未分包访问消息 2.分包访问消息 3未分包控制消息 4.分包控制消息

CTL SEG 底层传输层PUD类型
0 0 未分包访问消息
0 1 分包访问消息
1 0 未分包控制消息
1 1 分包控制消息

1.未分包访问消息

字段 长度(bits) 备注
SEG 1 0=未分包消息
AKF 1 应用秘钥标志位
AID 6 应用秘钥标识
Upper Transport Access PDU 40~120 上层传输层访问PDU

上层传输层根据应用秘钥(Application Key)和设备秘钥(Device Key)来设置应用秘钥标志位(AKF)和应用秘钥标识(AID)的值。

PDU格式:


未分包访问消息.jpg

2.分包访问消息

分包访问消息.jpg
字段 长度(bits) 备注
SEG 1 1=分包消息
AKF 1 应用秘钥标志位
AID 6 应用秘钥标识
SZMIC 1 TransMIC长度
SeqZero 13 SeqAuth的低有效位
SegO 5 分包号
SegN 5 最后一包分包号
Segment m 8~96 上层传输层访问PDU中的Segment m

SZMIC字段表示上层传输层访问PDU中的TransMIC的大小。若SZMIC字段为0,则TransMIC是一个32bit的值;若SZMIC字段为1,TransMIC则是一个64bit的值。

SeqZero字段由上层传输层设置;SegO字段应被设置为该上层传输层PDU的m分包的分包号(从0开始);SegN字段应该被设置为该上层传输层PDU的最后一个分包号。

Segment m字段是分包号为m的内容,除最后一个分包外的分包Segment m,它的内容是从第12×m字节到第12×m+11字节,而最后一个分包内容则是从第12×m字段到消息结尾。

对于相同的上层传输层访问PDU,每个分包访问消息的AKF、AID、SZMIC、SeqZero和SegN字段应该具有相同的值。

3.未分包控制消息

未分包控制消息用于传输一个应答消息或者传输控制消息。

未分包控制消息.jpg
字段 长度(bits) 备注
SEG 1 0=未分包消息
Opcode 7 0x00=分包应答\n 0x01到0x7F=传输控制消息的OPCode
Parameters 0到88 传输控制消息参数

分包应答消息的Opcode字段应设为0,底层传输层使用分包应答消息来确认分包消息。Parameters字段根据Opcode字段的需要来设置。

分包应答消息格式

分包应答消息.jpg
字段 长度(bits) 备注
SEG 1 0=未分包消息
Opcode 7 0x00=分包应答
OBO 1 朋友代理低功耗节点
SeqZero 13 上层传输层PDU的SeqZero
RFU 2 保留
BlockAck 32 分包的块应答

OBO为0,表示接收信息的节点直接寻址;OBO字段为1,表示接收信息的是朋友节点,朋友节点代表低功耗节点应答此消息。

SeqZero字段应被设置为被应答的上层传输层消息的SeqZero。

BlockAck字段应被设置为收到的分包。最低有效位,即位0表示分包0;最高有效位,即位31表示分包31。如果位n被设置为1,则表示应答分包n。大于SegN的分包的位应被设置为0并在接收时忽略。

如果在接收的分包信息中TTL为0,则建议在发送分包应答消息中也将TTL设置为0.

4.分包控制消息

当传输控制消息不适合使用单个网络层PDU来传输的时候,就使用分包控制消息来传输。

分包控制消息的格式

分包控制消息.png
字段 长度(bits) 备注
SEG 1 1=分包消息
Opcode 7 0x00=保留\n 0x01到0x7F=传输控制消息的OPCode
RFU 1 保留
SeqZero 13 SeqAuth的低有效位
SegO 5 分包号
SegN 5 最后一包分包号
Segment m 8~64 上层传输层访问PDU中的Segment m
  • OPCode字段由上层传输层设置,0x00为保留值,收到后不得传输,直接忽略
  • SeqZero字段应由上层传输层设置。
  • SegO字段应被设置为该消息中包含的上层传输层PDU的分包号(从0开始)。
  • SegN字段应被设置为该上层传输层PDU的最后一个分包号。
  • Segment m字段是分包号为m的内容,除最后一个分包外的分包Segment m,它的内容是从第8×m字节到第8×m+7字节,而最后一个分包内容则是从第8×m字节到消息结尾。

对于相同的上层传输层控制PDU,每个分包控制消息应具有相同的OPCode、SeqZero和SegN值。

你可能感兴趣的:(蓝牙mesh底层传输层(消息格式))