1. 蓝牙mesh数据包的结构
蓝牙mesh数据包的结构如下图:
总长31个字节。
Length (1Byte):数据长度
Type (1Byte):广播类型
IVI (1bit):用来认证加密Network PDU的IV index的最低位
NID (7bits):网络ID,network ID。从网络密钥(NetKey)派生的值,用于识别保护此PDU的加密秘钥和隐私密钥。决定使用哪个mesh网络传递数据
CTL (1bit):网络控制,用于确定消息是否包含访问消息或者控制消息
TTL (7bits):生存时间。0 不会被中继,1 不会被中继,2-126可能已被中继,并且可以被中继,127 没有被中继过,可以被中继。
SEQ (3Byte):序列号,每个Mesh信息的SEQ必须不同。
SRC (2Byte):源地址,必须是一个单播地址
DST (2Byte):目标地址,可以使单播地址、组播地址、虚拟地址。
MIC(4 Byte):网络消息完整校验值
Header (1Byte):包头
TMIC(4 Byte):传输层消息完整校验值
Opcode(3 Byte):操作可以是1、2或3个字节序列,操作码的第一个字节决定了使用字节的数量。如果操作码第一个字节的最高位是0,那么操作码只包含一个字节。如果最高两位是10,那么操作码包含2个字节。如果最高的两位是11,那么操作码包含3个字节。
1-octet 操作码是蓝牙SIG定义的应用操作码,最多可以定义127个1-octet操作码,0x7F是保留给未来使用的。
2-octet也是蓝牙SIG定义的应用操作码,最多可以定位16384个2-octet操作码
3-octet操作码是供制造商使用的操作码,每一个公司共有64个3-octet操作码。
Parameters(8 Byte):有效负载
2. Lower Transport PDU
底层传输层将来自上层传输层的PDU发送给另外一个节点,如果数据不需要分包,就单个底层传输层PDU发送出去,如果长度太长,则需要对数据分包之后再发送出去。接收消息时,也会判断是否是分包数据,如果是分包数据,则再组装之后,再传给上层传输层。
底层传输层PDU的第一个字节的最高位是SEG字段,也是最重要的一个位,该字段用来确认此PDU是经过分包的还是未分包消息。在网络层中,CTL字段确定消息是访问消息还是控制消息。根据这两个字段值的不同,可以将消息分为4种类型:1.未分包访问消息 2.分包访问消息 3未分包控制消息 4.分包控制消息
CTL | SEG | 底层传输层PUD类型 |
---|---|---|
0 | 0 | 未分包访问消息 |
0 | 1 | 分包访问消息 |
1 | 0 | 未分包控制消息 |
1 | 1 | 分包控制消息 |
2.1 未分包访问消息
字段 | 长度(bits) | 备注 |
---|---|---|
SEG | 1 | 0=未分包消息 |
AKF | 1 | 应用秘钥标志位 |
AID | 6 | 应用秘钥标识 |
Upper Transport Access PDU | 40~120 | 上层传输层访问PDU |
PDU格式:
2.2 分包访问消息
字段 | 长度(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字段应该具有相同的值。
2.3 未分包控制消息
未分包控制消息用于传输一个应答消息或者传输控制消息。
字段 | 长度(bits) | 备注 |
---|---|---|
SEG | 1 | 0=未分包消息 |
Opcode | 7 | 0x00=分包应答\n 0x01到0x7F=传输控制消息的OPCode |
Parameters | 0到88 | 传输控制消息参数 |
分包应答消息的Opcode字段应设为0,底层传输层使用分包应答消息来确认分包消息。Parameters字段根据Opcode字段的需要来设置。
分包应答消息格式
字段 | 长度(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.
2.4 分包控制消息
当传输控制消息不适合使用单个网络层PDU来传输的时候,就使用分包控制消息来传输。
分包控制消息的格式
文章来源:https://www.toymoban.com/news/detail-441128.html
字段 | 长度(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值。文章来源地址https://www.toymoban.com/news/detail-441128.html
到了这里,关于蓝牙mesh数据包格式解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!