【蓝牙mesh】Upper协议层介绍
Upper层简介
Upper协议层用于处理网络层以上的功能,包括设备的应用层数据、安全、群组等信息,是实现蓝牙mesh应用功能的关键协议之一。Upper层接收来自Access层的数据或者是Upper层自己生成的Control数据,并且将其传输到对端设备的Upper层。 来自Access层的数据使用appkey来进行加密和认证的,这就需要在Upper层来验证这些数据。 而Control数据是不用appkey的,它只是用netkey来加密,因为Control数据是不用传递给上层。
下面解释一下Access数据和Control数据, Upper层的数据分为Access数据和Control数据。
先说什么是Access数据,我们平常应用层传下来的数据,以及接收到的需要抛给应用层的都是Access数据,比如我们的控制灯开关的指令,获取对方开关状态的指令,以及配置mesh节点信息的指令,都是Access指令。
那什么又是Control数据呢,Control数据主要是Friend节点存的数据,比如节点A是一个低功耗设备,在节点A休眠的时候,如果网络内有发给A的数据, 则通过节点B将发给A的数据缓存到B中,那节点B收到的这些数据就是Control数据,这些数据不经过节点B 的appkey解密,也不用传递给上层。
另外节点转发的其他设备的数据也是不经过appkey加解密,也不用传递给上层,这也是蓝牙Mesh基于安全性考虑进行设计的, 比如A节点是一个灯,B节点是一个门锁,A节点转发B节点的开锁数据,因为转发数据根本不经过Access层,也不用appkey进行解密,这就保证了数据的安全性。
Upper层Access数据包
上面提到了Control数据和Access应用数据,在Access层有一个专门的标志位CTL来区分这两种设备。 当CTL为0则表示设备是Access应用数据,Access数据使用appkey或者devkey来进行加解密和校验。其中Upper层传输的Access数据分为两部分,一部分是加密的数据包,第二部分是认证码,认证码可以使用32位,也可以使用64位,如下:
加密的数据包
根据我们上一篇文章Access层的介绍,如果认证码使用32位,则数据包的长度最大可以是380个字节,如果认证码使用64位,则数据包的长度最大可以是376个字节。 当然只要数据超过12个字节,数据包会在Lower层进行分片和组包,这个我们会在下篇文章介绍。
认证码
认证码是用来校验上面数据包是否被篡改的,使用的是AES_CBC的加密认证方式。对于分包的数据,认证码的长度取决于Lower层数据包中 SZMIC标志位的值。 对于不分包的数据,认证码就是32位。
另外说明一下,Control数据是不需要认证码的。
Upper层Control数据包
当CTL标志位为1是,Upper层传输的数据就是Control数据包。Control数据有一个7-bit的Opcode,表示不同的Control数据。 所有的Control数据在Upper层是没有认证的,所有的认证是在下层的网络层中做的,在网络层是使用的是64bit的认证码。Control数据在下层Lower层的分包如下:
由上图可以看出Control数据最大是256个字节。
Upper层 Access数据收发
发送数据
Upper层的Access数据使用appkey或者devkey进行加解密,在Upper层的数据会有一个SEQ, 表示消息的序列号,每次发送消息该SEQ都会自增,SEQ长度是3个字节,SEQ耗尽后,会触发IV_index更新。
在下层还有一个AKF 和 AID的标志位,AKF 就是appkey flag的简称,用来表示该数据包是使用appkey来加密还是使用devkey来加密。如果AKF为1,则AID用来表示appkey的ID,如果AKF未0, AID的值也为0。
接收数据
当Upper层接收到数据后,会根据AKF和AID的标志位判断是使用appkey还是使用devkey对数据进行解密,并且验证数据的认证码。 数据解码完成后,会校验设备的源地址和目的地址,如果数据是发给自己的,则抛到上层进行处理。如果发现设备不是发给自己的,则会判断是否是传给自己作为Friend节点的低功耗设备的,如果是则存储到对应的Friend列表中。
Upper层 Control数据介绍
Control数据主要是用在Mesh设备的Friend特性,通过Friend特性和低功耗LowPower节点之间建立联系。Control数据就是下面的这几条命令,除此之外Upper层的所有数据都是Access数据。
Friend节点与LowPower节点建立关系的流程如下:
-
要建立 Friendship关系,首先LowPower节点向空中发送 Friend Request 请求(地址类型是 all-friend)
-
如果一个节点支持 Friend feature 同时开启了这个 feature 的话,那么当他接收到 Friend Request 消息的时候,就会回复一条Friend Offer命令。如果LowPower节点周围有多个Friend节点的话,那么多个节点都会回复Friend Offer命令。
-
LowPower节点收到一条或多条 Friend feature 的节点发送的 Friend Offer 消息后,选择其中希望建立 Friendship 的,使用 Friend Poll 进行应答。 选择与谁建立Friendship可以由Lowpower节点自行决定,可以根据信号强度、先后顺序等因素。
-
接收到 LowPower 的 Friend Poll 应答后,Friend 节点回复 Friend Update,正式建立友谊;
-
至此两者之前便建立了Friendship关系,LowPower节点休眠后,网络内发往LowPower的消息会由Friend节点进行缓存,当LowPower节点从休眠唤醒后,会从Friend节点中将缓存的消息读出来。
总结
蓝牙Mesh中的Upper层主要用于将应用层数据,封装并解密后传给网络层,以及将接收到的网络层数据进行解析和解密并传递给应用层, Upper层是网络层和应用层中非常重要的一部分。