一般建设网站需要多少预算,上优化seo,海淀网站建设龙岩,能看全世界地图的app【蓝牙mesh】Upper协议层介绍
Upper层简介 Upper协议层用于处理网络层以上的功能#xff0c;包括设备的应用层数据、安全、群组等信息#xff0c;是实现蓝牙mesh应用功能的关键协议之一。Upper层接收来自Access层的数据或者是Upper层自己生成的Control数据#xff0c;并且将…【蓝牙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层是网络层和应用层中非常重要的一部分。