蓝牙mesh(二)

2 Mesh网络补充介绍

2.1 承载层介绍

2.1.1 Advertising bearer

Mesh消息的任何广播数据都应是不可连接和不可扫描的无定向广播事件。如果一个节点收到了一个可连接或者可扫描的广播事件,这个消息应该被忽略。

一个只支持广播载体的设备应该执行被动扫描,其工作周期应尽可能接近100%,以避免丢失任何传入的Mesh消息。
所有设备应同时支持GAP观察者角色和GAP广播者角色。

2.1.2 GATT bearer

Gatt承载层,包含一个GATT的客户端与GATT的服务器,通过连接的方式进行消息的交互。
发送一个代理PDU,GATT承载层的client应该使用 Write without response去写PDU数据。
接收一个代理PDU,GATT承载层的client会收到一些列的Notification。
收到中继包时,是在网络层判断是都需要进行重传发送。

2.2 Network Layer

2.2.1 设备地址

网络层定义了四个基本的地址类型:未分配地址、单播地址、虚拟地址、组地址。地址为16bits(2 bytes)长度。

蓝牙mesh(二)
当disabble一个model的publish时,可以通过设置这个model的pusblish address为0x00。
蓝牙mesh(二)

2.2.2 Network PDU

蓝牙mesh(二)

2.2.3 Network Message Cache

为了减少不必要的安全检查和过度的中继,节点应该包含所有最近看到的网络pdu的消息缓存。如果一个消息已经在消息缓存中了,消息应该被立即丢掉。

节点不需要缓存整个网络PDU,并且可以只缓存一部分用于跟踪,例如NetMIC、SRC/SEQ或其他值。但是,只要在设备功能的限制下实现了多次不处理相同网络PDU的条件,就可以实现这个功能。

如果网络缓存满了,这时候还有新的消息进入,这时需要替换掉最老的一个缓存消息。

网络消息缓存应该能够存储至少两个网络pdu,但是强烈建议网络消息缓存的大小与预期的网络密度相适应。传入消息处理过程的细节留给设备开发者实现。

2.3 Lower transport Layer

较低的传输层会进行分包和组包处理,会从较高的传输层拿数据进行分包发送,也会将收到的数据进行组包,然后传递给较高的传输层。

2.3.1 PDU数据格式

较低传输PDU的前八位的最重要的位是SEG字段,该字段用于确定较低传输PDU的格式是分段的还是未分段的消息。
根据网络PDU中的CTL字段和较低传输PDU中的SEG字段的值,可以使用四种格式:
蓝牙mesh(二)
具体是数据格式可以查阅profile文档的3.5.2章节。

2.3.2 分段和重组

为了传输大于15个字节的较高传输层pdu,较低的传输层分段和重组这个pdu数据。使用块确认方案将这些段交付给对等的较低传输层,以最小化需要由较低传输层传输的消息数量。
分段、重组的过程如下:
蓝牙mesh(二)
上层传输access PDU的每段长度为12个字节,最后一段长度可以短一些。
上层传输control PDU的每段长度为12个字节,最后一段长度可以短一些。

2.4 Upper transport Layer

较高的传输层从access层获取数据,并加上自己的传输层控制信息,负责将这些信息传递给对端设备的upper transport layer。

对于来自access层的消息,使用应用程序**执行消息的加密和身份验证。这允许上层传输层收到消息时,对接收到的消息进行身份验证。

传输的控制消息上层传输层能自身产生,并且加密和授权只在网络层。

Mesh Profile中3.6.5章节定义了低功耗节点和Friend节点之间数据交互的格式。

2.4.1 friendship

Friendship主要包含三个参数:

  1. ReceiveDelay:这个时间是低功耗节点发送一个request信息查询,到开始监听的整个时间。
  2. ReceiveWindows:低功耗节点监听一个response的时间,当低功耗节点从Friend node接收到消息后,它能够停止监听其它消息。
  3. PollTimeout:是低功耗节点连续发送request的间隔。
    蓝牙mesh(二)
    如果friend节点在收取分段消息时,只有在收到全部的分段后,才会发送给低功耗节点。

2.5 Access layer

Access层定义了上层如何使用上层传输层,它定义了应用数据的格式,它定义和控制应用数据在上层应用层的加密和解密,并且判断收到的应用数据是否来自正确的网络。

2.6 Mesh beacons

2.6.1 未配置的设备beacon

数据格式:
蓝牙mesh(二)
蓝牙mesh(二)

2.6.2 Secure Network beacon

数据格式:
蓝牙mesh(二)

2.7 Mesh 网络管理

2.7.1 Mesh网络的创建过程

创建一个mesh网络,一个provisioner是必须的。Provisioner需要产生网络秘钥,提供IV Index(被设置为0x00000000),并且申请一个单播地址。

Provisioner通过主动扫描和被动扫描来发现未配置的设备。发现设备后分为两步(1)Provisioner去provision这些设备,使其变成mesh网络的一个节点。(2)Configuration Client然后config这些节点,提供给节点application key,并设置发布和订阅地址,这样使节点之间能够相互通信。

Device key是为了多个Provisioner之间通信使用的。

2.7.2 Key的刷新过程

Key的刷新包含三个过程:
(1)第一个阶段是分发新的key到每一个节点。这些节点会继续使用旧的秘钥发送数据,但是可以用新的和旧的秘钥接收数据。
(2)第二阶段包括传输一个安全的网络beacon,该beacon向网络发出信号,表明所有节点都拥有新**。然后,节点将使用新key进行发送,但可以使用旧key和新key接收。
(3)第三阶段涉及传输另一个安全网络beacon,该beacon向网络发出信号,所有节点都应该丢弃旧**。节点将仅使用新秘钥进行发送和接收。