Lower层简介
Lower协议层用于处理网络层以下的功能,包括节点的广播、重传、路由和网络拓扑等,是实现蓝牙mesh网络的关键协议之一。其中Lower协议层中最主要的一部分工作就是mesh数据的分片和组包。
Lower层是将Upper层发过来的数据,进行封装并传递给下层,当Upper层数据较长时,Lower层会对数据进行分片处理,发送给下层。同样的,当接收到来自下层的数据包后,Lower层会解析并判断数据,如果数据是分片的,Lower层会对数据进行组包,组包完成后,将其发送给Upper层。
Lower层数据包
蓝牙mesh Lower层的数据包根据CTL标志位和SEG标志位的不同,分为四种数据类型,分别为不分包的Access数据包、分包的Access数据包、 不分包的Control数据包和分包的Control数据包。
下面分别对四种数据包进行介绍。
不分包的Access数据包
数据包格式如下图:
下面分别介绍下每个字段的含义:
SEG: 表示数据包是否是分包数据, 不分包的数据该字段为0
AKF:表示数据包应用层加解密是使用appkey还是devkey。 0:devkey 1: appkey
AID: 表示appkey的ID,该字段只有AKF为1时才生效,否则该字段为0.
Upper Transport Access PDU: 这个就是应用层真正的数据。
分包的Access数据包
下面分别介绍下每个字段的含义:
SEG: 表示数据包是否是分包数据,分包的数据该标志位为1
AKF:表示数据包应用层加解密是使用appkey还是devkey。 0:devkey 1: appkey
AID: 表示appkey的ID,该字段只有AKF为1时才生效,否则该字段为0.
SZMIC:表示消息认证码的长度
SeqZero: SEQ的低13位,是在Upper层进行设置的
SegO: 表示当前分包的包数,数值是从0开始的
SegN: 表示最后一包的包数
Upper Transport Access PDU: 这个就是应用层真正的数据。
Segment m : 表示分包的数据, 字节长度1-12个字节,数据包分包长度每包为12个字节(除了最后一包)。
分包数据中的每包中,AKF, AID, SZMIC, SeqZero, and SegN这些字段的数值都是一样的。
不分包的Control数据包
下面分别介绍下每个字段的含义:
SEG: 表示数据包是否是分包数据,不分包的数据该标志位为0
Opcode: 0x00:表示回复数据, 0x01 - 0x7F表示Control数据的Opcode,具体的Control数据我们上个章节有讲到。
Parameters:表示Control数据的具体数据包。长度为0-11个字节
上面说了Opcode为0表示是回复数据,下面我们看下Control的回复数据包格式是怎样的?
Control回复数据包
下面分别介绍下每个字段的含义:
SEG: 表示数据包是否是分包数据,不分包的数据该标志位为0
Opcode: 该字段为0,表示回复数据
OBO: 表示该数据包是否是Friend节点与低功耗节点交互的数据。 如果是则为1, 否则为0。
SeqZero: 该数值表示Seq,是上层Upper层决定的数据。
BlockAck:表示接收到了多少包分包的数据,每包使用一个bit表示。
分包的Control数据
下面分别介绍下每个字段的含义:
SEG: 表示数据包是否是分包数据,不分包的数据该标志位为1
Opcode: 数值0x01 - 0x7f
RFU: 保留位
SeqZero: 表示Seq的最低13bit,有Upper层决定。
SegO: 当前的分包值,数值从0开始计算
SegN: 最后一包的分包值
Segment m: 分包数据,长度为1-8个字节
每个分包的Control数据的 Opcode, SeqZero, and SegN这几个字段的数值是相同的。
分片与组包
Lower层的一个非常重要的功能就是对数据进行分片和组包。当Upper层的数据超过15个字节后,就需要在Lower层对数据进行分片。
下面这个图片很好的表示了数据的在每一层上的格式和封装,大家可以仔细分析下这张图
Access层的数据进入到Upper层之后, 会使用appkey对Access的数据进行加密,生成密文Access PDU 和消息认证码TransMIC, 当Upper层的数据超过15个字节后,就会在Lower层对数据进行分包处理。数据分包的格式我们前面已经介绍过了,分包之后会传递到下层的network层,使用netkey进行网络层加密,这个我们下一章节会再细讲。
总结
蓝牙Mesh中的Lower层主要的功能就是对网络数据包进行分片和组包,是位于Upper层和Network层之间,对蓝牙Mesh的分层加密起着非常重要的作用。