SIG Mesh协议学习
1. 简介
Bluetooth SIG组织在2017年7月17日发布了蓝牙Mesh标准. 蓝牙Mesh不同于传统Bluetooth Low Energy(BLE)协议的1对1, 1对多的通信方式, 它实现了多对多
的通信. 这使得mesh网络中的各个节点之间可以相互通信. 蓝牙Mesh协议建立在BLE的物理层和链路层之上, 也就是说它可以和BLE 4.0及以上版本的蓝牙设备通信. 注意这并不意味着它支持所有BLE最新的特性, 譬如低功耗蓝牙的LE Coded PHY及2M PHY, 在现有的Bluetooth Mesh规范中并不支持.
2. BLE 物理层和链路层
2.1 BLE 物理层
BLE工作在2.4GHz ISM频段2402MHz-2480MHz. BLE定义了40个信道, 每个信道2MHz宽度. 其中有3个广播信道, 图中绿色标示的37, 38, 39信道. 它们被用于设备的发现, 广播等功能. 这三个信道所处的频段正好避开了和同样工作在2.4GHz频段的WiFi最常用的第1, 6, 11信道 减少正常通信的干扰. 其他37个信道用做BLE建立连接后的双向数据传输, 叫做数据信道. 在打开蓝牙的自适用跳频功能后, 设备将会自动侦测干扰来选择合适的工作信道. 这两种信道类型正是对应于BLE的两种主要通讯模式Advertising 和 Connection. 蓝牙Mesh在网络内部节点间的通信只采用了Advertising的方式
2.2 BLE 链路层
Advertising是指蓝牙广播设备在3个广播信道里以特定的时间间隔发送消息, 同时蓝牙扫描设备以特定时间长度的的扫描窗口和间隔, 依次扫描3个广播信道来接收广播设备发送过来的信息. 图中三个不同颜色的柱状图表示37,38,39三个广播信道. 广播设备连续在三个信道里发送消息, 间隔为20ms. 而扫描设备的扫描窗口时间为30ms, 扫描间隔为40ms, 一次扫描一个信道. 蓝牙Mesh设备在网络内部通信时, 以尽可能接近100%的占空比来扫描广播信道. 也就是说扫描窗口时间等于扫描间隔, 以确保信息不会丢失. 蓝牙Mesh设备在发送特定信息的时候并不会像普通BLE广播要等一个广播间隔, 而是延迟一小段随机时间就立即发送出去.
3. 蓝牙Mesh发布/订阅系统
3.1 简介
Mesh网络中的发布-订阅系统(Publish-Subscribe system)是一种非常重要的通信实现方式。它基于订阅者(Subscriber)和发布者(Publisher)之间的事件通信,使得用户能够方便地向多个节点或设备传输数据或消息,进而区分不同目标设备分类收到相对应的信息。
在Mesh网络中,执行发布-订阅通信需要确定以下两个主要组件:
-
订阅者:负责接收或订阅感兴趣的消息或事件,并将其处理或转发给其他设备或节点。订阅者同时也会注册自己想要接受的消息类型、范围、地址等相关属性。
-
发布者:负责生成或发布消息或事件,同时向订阅者广播这些消息,以达到与目标设备或节点的通信目的。
具体来说,当发布者创建一个新的事件时,它将该事件域名、事件数据和发布者ID打包成一个消息,然后将该消息广播到与其成功链接的Mesh网络设备。当Mesh网络内的设备接收到该消息时,如果它被订阅者所订阅,那么该设备将处理该消息并将其传递给订阅者。
通过这种方式,设备可以轻松地互相发送消息,并向订阅者提供潜在数据源。此时,每个设备都可以作为发布者或订阅者,使得多个设备之间的消息传递在Mesh网络中自由、轻松和快速共享。
总之,Mesh网络的发布-订阅系统是一种高效、灵活、安全的通信机制,在 IoT 应用领域有着广泛的应用前景。它可以极大地简化设备之间的信息交流,并且具有很高的可扩展性和强大的适应性。
3.2 订阅方和发布方如何进行信息匹配呢?
在Mesh网络的发布-订阅系统中,需要以下信息来进行匹配:
-
订阅者节点所需的
消息类型或事件类型
:订阅者在注册时需要描述自己感兴趣的消息类型
或事件类型
,以便发布者能够将消息广播到正确的目标设备。 -
订阅者节点所需的
消息范围或地址范围
:即订阅者关注的消息传递的具体位置和范围。例如,当订阅者只希望接收某个楼层的温度数据时,可以通过设置特定楼层的地址范围来实现。 -
消息的
具体内容
:发布者所创建和广播的消息需要包含一系列的信息、属性或值。在接收消息的过程中,订阅者根据发布者发送的消息类型、数据等属性来判断这些消息是否适用自己的匹配要求。 -
网络拓扑结构:订阅者和发布者位于Mesh网络不同部分,需要建立稳定连接并了解网络拓扑结构,以确保有效地将消息传递给目标设备。
综上所述,可见订阅者需要告知发布者它的感兴趣分类数据范围,消息类型,节点地址以及其他相关信息。在消息发送过程中,发布者则会将这些属性打包进消息中广播,确保目标设备能够精确收到自己感兴趣的数据。完成这个基本机制需要发布订阅系统同时支持消息类型的订阅和多级话题的匹配等灵活功能。
4. Mesh的网络泛洪以及处理方式
蓝牙Mesh网络使得设备可以在广阔的区域中安装, 同时每个设备之间保持通信. 消息可以在在无线覆盖范围之内的设备之间直接通信, 也可以通过中继设备和无线覆盖范围之外的设备通信. 消息可以被多次中继, 从而实现非常广阔的消息传输. 蓝牙Mesh采用的是管理型网络泛洪方式来进行网络信息的传输, 即网络中所有具备中继功能的设备都会转发收到的消息.
-
优点是无需特定的路由设备, 确保消息多路径传输无障碍的到达目的设备
-
缺点是可能会对网络消息泛滥造成通信延迟.
所以蓝牙Mesh采用以下措施来优化泛洪通信来减少不必要的冗余信息传输
-
Message cache: Message cache通常用于缓存已经处理过的消息,以便设备能够更轻松和高效地处理来自其他节点的相同消息。通过使用Message cache技术,可以最大限度地减少冗余的数据操作和传输,并且可以提高网络的带宽利用率。但是,如果设备不及时清空Message cache缓存,可能会占据大量的内存资源,导致系统性能下降。
-
Time to Live(TTL): TTL则主要用于限制消息在Mesh网络中传播的范围和时间,避免数据包在网络中持续传递并占用过多的带宽资源。在Mesh网络中,每条消息都会包含TTL属性。当某个设备接收到一个TTL值为0的消息时,它将停止对该消息的进一步转发。因此,TTL可以有效地防止链式反应,避免因数据包的无限循环而使网络负载过度
Mesh网络中,泛洪是一种常见的消息路由技术,指在网络内部传递消息时将数据包广播到所有邻近节点的行为。当设备接收到一个新的数据包时,它会自动向与它邻近的节点广播该消息,并且这个广播过程将在整个Mesh网络上继续扩散,直至达到目标设备或达到最大跳数限制。
当然,采用泛洪方式进行数据包转发也存在许多问题和局限性,例如:
-
路由效率低下:由于消息的广播是不可控的、无法预测的,同时涉及到多个设备的处理和转发,导致在网络繁忙或拥塞时容易出现通信延迟较大的情况,并且可能占用大量带宽资源。
-
容易产生冲突:多个设备同时使用泛洪方式发送消息时,如果没有正确的协调机制,就会造成数据包的冲突和混乱,从而导致通信失败或者降低网络的稳定性。
-
安全隐患:采用泛洪方式发送数据包时,会将消息广播到整个Mesh网络中的所有设备,包括未经授权的设备,在某些场景中,这可能会给安全造成影响。
为了避免以上问题,Mesh网络在数据传输中通常采用以下方式进行泛洪的优化和处理:
-
设备间通信协议选用具有鲁棒性、快速响应和高效率的路由协议,例如优化的Flood Routing(OFR),Distributed Flooding(DF)等结合路由表策略的机制可以有效限制过度的泛洪消息数量及其范围.
-
对于大部分智能家居等应用场景,一般使用以低功耗蓝牙为基础构建起来的mesh协议,其不仅功耗较小,同时收发设备均简单,实现复杂度低与成本降低。
-
通过控制广播量、监视并限制每个节点所转发的泛洪数据包数量和频率来降低路由冲突和带宽耗费。
总之,Mesh网络的泛洪技术是一种灵活而高效的数据传输方法,但在具体实现时,需要采用一些优化和处理手段来优化网络效率、减少数据冲突和提高安全性。
5. Mesh的重要组成部分
在Mesh网络中,有三个重要的概念:组
、节点
和元素
。
5.1 Mesh的组
组是Mesh网络中的一个逻辑实体,指一组彼此关联的设备,它们可以互相交互、通信,并共享相同的广播通道。每个组都有一个唯一的组ID,设备可以选择加入到不同的组中,也可以同时处于多个组中。在Mesh网络中,通过组ID来标识某个设备所属的组,以便相关的设备能够互相通信和协同工作。
通过组的方式,Mesh网络能够实现许多有用的功能和好处。以下是一些常见的例子:
-
提高网络灵活性:通过将设备划分为不同的组,可以帮助用户将设备进行更细粒度的管理,并在需要时快速重新配置整个组。用户可以自由地加入或退出不同的组,并且可以随时更改组配置。
-
增强安全性:Mesh网络中的每个组都具有唯一的组ID,这使得设备之间的通信变得更加安全和可靠。只有拥有正确组ID的设备才能接收和发送特定组的消息,从而确保了网络通信的安全性和私密性。
-
提供灵活的控制和路由:通过组的方式,用户可以选择不同结点以及元素来完成各种灵活的控制和路由任务。Mesh节点可以充当原始设备、终端设备或路由设备,根据当前需要和部署条件,可在任意时刻进行调整.
-
降低通信延迟:通过限制数据包在网络上传播的距离并提高路由效率,组网可以降低通信延迟,从而增加 Mesh网络的响应速度。在广大的 IoT应用中具有特别重要的相关性能提升.
-
高度可扩展性:通过组的方式,Mesh网络可以轻松地添加新设备或扩展到更大的范围,无需重新整个网路拓扑结构进行重组或多次加入或移除单个节点。只需要确定设备的组归属属性,就能快速配备全部 Mesh 网络。
总之,组是构建 Mesh 网络的重要工具,它们可以使网络更加灵活、更易于管理和控制,并允许节点按照不同的类别和应用场景对数据包进行更有针对性的传输和路由,从而提供更高效、更安全、更健壮的物联网方案。
5.2 Mesh的设备节点
5.2.1 节点介绍
节点(Node)是Mesh网络中的一个基本单元,它是组成Mesh网络的设备或者板子,能够支持Mesh网络协议,并与其他节点互相通信和协同工作。节点可以充当原始设备、终端设备或路由设备。每个节点都有一个唯一的6字节地址(unicast address),用于标识节点在网络中的位置和身份。
一个蓝牙设备(如插座)在没有加网前被称为Unprovisioned Device. 启动配置设备(Provisioner)通过Provisioning蓝牙设备 完成认证, 创建网络密钥, 蓝牙设备成为未配置的蓝牙节点(Node).
未配置好的节点是不能做任何事情的, Provisioner再进行节点配置 绑定应用层和网络层密钥, 设置模型的发布/订阅等. 完成上述动作后蓝牙设备(Device)成为蓝牙Mesh网络里的功能节点(Node)
-
如果一个设备成为了蓝牙 mesh 网络的一部分,我们就把它叫做节点(node)。反之,我们就把它叫做“未配网的设备”(unprovisioned devices)。把未配网的设备变成节点的过程我们把它叫做 “配网”(provisioning)。配网过程会给设备分配net key和device key。
-
net key:network key在配网阶段由配网者分配给node,用于mesh网络层的消息解析,解析失败消息直接丢弃
-
device key:在配网阶段分配。只有节点自己和provisioner会持有。用于configuration消息解析(例如:绑定appkey,设置订阅地址,设置发布地址)
-
app key:在配网完成后的configuration阶段分配,用于upper transport层的接入消息解析
5.2.2 四种节点特性
在Mesh网络中,常见的四种节点特性包括:
-
Relay(中继)节点
:Relay节点是Mesh网络中最常见的节点类型之一,它可以接收、处理和转发消息,并与其他Relay节点一起充当信息传输的重要中转站,帮助扩展消息传输范围和距离,提高网络的信号覆盖和可靠性。 -
Proxy(代理)节点
:Proxy节点通常用于连接异构网络、管理多个虚拟子网或进行远程控制。Proxy节点可以在Mesh网络内外建立安全连接,并对访问该网络的设备进行身份验证和授权,从而保证了网络数据的安全性和隐私性。 -
Friend(朋友)节点
:Friend节点也是一种重要的节点类型,在Mesh网络中能够与低功耗节点建立有效的通信链接,并提供数据缓存、转发和发送功能,帮助低功耗节点实现长时间的待机模式,延长电池使用寿命,并极大地缩短网络恢复时间。 -
LPN(低功耗)节点
:LPN节点是指低功耗无线设备,通常用于IoT场景中需要长时间运行、稳定工作的设备上。LPN节点采用低功耗技术,能够延长设备使用寿命,在Mesh网络中具有较小的功耗、更高的可靠性和灵活性。
这四种节点类型在Mesh网络中具有不同的功能和特性,但它们都是构成Mesh网络的重要组成部分。通过合理地设计和分配节点类型,可以使Mesh网络实现更有效和高效的数据传输,同时也能够优化设备的配置、降低维护成本,并提高网络的安全性和稳定性。
可以举例说明Mesh网络中四种节点类型的各自应用场景:
-
Relay(中继)节点
:在家庭物联网应用中,Relay节点经常用于扩展无线局域网的信号覆盖范围和传输距离,如路由器和智能家居设备之间的通信。在工业和城市管道等现场监控应用中,Relay节点也可以作为分布式传感器和执行器之间的数据中转站,实现信息采集、处理和远程控制。 -
Proxy(代理)节点
:Proxy节点通常用于提供安全、可靠和高效的外部连接功能,连接Mesh网络和Internet,或与其他网络互联。这种节点特别适用于企业、政府、医疗机构等需要保护数据隐私和信息安全的应用中,如数据监测、电子商务、远程健康管理等应用。 -
Friend(朋友)节点
:Friend节点常用于连接低功率消耗设备,帮助它们减少耗电量并延长电池使用寿命。例如,在智能家居、健康医疗和工业设备监控等应用场景中,Friend节点可以作为嵌入式设备和传感器之间的中转站,提供数据存储和转发服务,并帮助控制设备的功耗和资源占用。 -
LPN(低功耗)节点
:LPN节点通常用于许多能源保护环境下需要长时间工作的物联网应用场景,如气象观测、农业生产、城市交通、基础设施管理等。这种节点可以采用低功耗模式,保证在连接网络时减少电源耗电量。同时,高效的端到端传输机制可以确保数据的高可靠性,使得网格网络在广泛的应用领域有重要的价值。
5.2 Mesh的元素
元素(Element)是一个实际物理上的设备或者板子,它可以包含多个服务(Service),而每个服务可以包含多个特性(Characteristic)。元素是使用Mesh进行通信的最小单元
,每个元素都有一个唯一的 16 位元素名称(element name),类似于命名空间,在整个 Mesh网络中为节点、服务和特性提供了一种机制。元素可以被认为是在其节点内部承载服务和特性的设备。
因此,在Mesh网络中,节点是网络的最基本单位,而组和元素则用于在节点之间建立逻辑关系,并使他们能够实现相互沟通和协作。节点可以拥有多个元素和组,这些元素和组可用于为该节点提供不同的功能和应用场景。
一个节点可以包含1个或多个元素(Elements), 比如一个双孔插座板, 每个插孔就是一个元素.
-
每个元素在加网的过程会被分配唯一的单播地址(Unicast Address), 地址范围是0x0001-0x7FFF.
-
还有一个组播地址(Group Address)就是前面讲到的发布/订阅机制里的厨房, 花园等. 元素订阅特定的组播地址, 就会收到发布者发送到此地址的消息. 组播地址范围0xC000-0xFEFF.
-
还有虚拟地址(Virtual Address), 每一个虚拟地址逻辑上对应一个128-bit的Label UUID. 通过对该Label UUID作哈希运算得出虚拟地址的低14位数值. 虚拟地址的范围为0x8000-0xBFFF.
5.3 模型
模型(Models)顾名思义就是定义了基本功能的最小单位模型, 比如设备的开关 灯光亮度调节等 模型包含了三个部分:
-
状态(State)表明一个元素的当前状态. 比如灯泡中包含开关和亮度的状态值. 不同状态可以设置为绑定关系(Bound State). 比如灯泡亮度为非零值时, 开关状态应该是开. 而灯泡亮度调整到0的时候, 其开关状态也应该被设置为关闭.
-
消息(Message)有SET/GET/STATUS三种类型, 分别用来设置请求发送状态值.
-
行为(Behavior)定义了模型在接收到消息后所作的动作行为. 比如开关模型定义的行为就是在收到了SET的消息后, On/Off的状态就要变为SET消息里给定的值. 如果收到了GET消息那么就把On/Off的状态通过STATUS消息传给询问方.
蓝牙Mesh的消息通信是基于服务器/客户端的架构, 对外提供状态访问接口的叫做服务器(server), 而来访问服务器端状态的叫做客户端(client). 模型分为三种:
-
服务器模型(Server model): 定义了一个包括状态,绑定状态和消息的集合. 比如灯包含有通用开关服务器模型(Generic OnOff Server) 和灯亮度服务器模型(Light Lightness Server).
-
客户端模型(Client model): 定义了一群消息用来请求改变服务器端的状态. 客户端模型不含有状态(State). 比如开关中含有通用开关客户端模型(Generic OnOff Client)以及灯亮度客户端模型(Light Lightness Client).
-
控制模型(Control model): 可以包含上述两种模型的功能
目前SIG定义好的模型包括Generic, Sensors, Time and Scenes, Lighting. 客户产品如果不在列表的话可以定义Vendor Model来实现相应的功能.
在蓝牙技术中,Vendor和Generic是两种不同类型的模型,它们有以下不同:
-
Vendor model:这是由特定厂商为其产品开发的专有模型。厂商可以根据自己的需求来定义该模型,以满足产品的特殊功能要求。因此,每个Vendor model都是独特的,只能被相应制造商的设备所识别和使用。
-
Generic model:相比之下,Generic model则是通用的、普适性强的蓝牙模型,任何符合规范的设备都能识别和使用。Generic model通常涉及一些标准或已定制的操作属性,内置了一些通用的数据类型,在进行数据交换时更加方便和灵活。
总之,Vendor model是特定设备生产商为满足其产品特殊需求而开发的专用模型,而Generic model是一个通用的、可适用于各种设备的蓝牙模型。
为了方便理解, 图中是灯和开关的模型简化示意图
左边灯的元素中含有通用开关(Generic OnOff)和灯的亮度(Light Lightness)服务器模型, 分别包含通用开关(Generic OnOff)和灯亮度(Light Lightness Actual)状态. 两个状态是绑定状态关系.
右边开关设备元素中包含了通用开关(Generic OnOff)和灯亮度(Light Lightness)客户端模型. 通过消息来获知设置服务器端元素的状态. 客户端模型不含有状态.
6. Mesh的网络拓扑
Mesh网络的网络拓扑结构是分布式的、网状的,不像传统的星形或总线结构。Mesh网络通常由大量的节点组成,在节点之间建立连接,形成一个复杂的网格。Mesh网络中的每个节点都可以直接和多个相邻节点进行通信和数据交换,也可以通过其他节点作为中继站来实现多跳传输。
在Mesh网络中,有两种常见的拓扑结构:全网Mesh和部分Mesh。全网Mesh是一种所有节点彼此直接相连的Mesh网络结构,适用于小型网络环境。部分Mesh则是一种随机的、大规模的Mesh网络结构,其中只有一部分节点能彼此直接通信,而其他节点之间需要经过多次跳转才能互相交流。这种拓扑结构具有较高的伸缩性和鲁棒性,可以适应大规模网络环境。
除了全网Mesh和部分Mesh,还有一些其他的Mesh拓扑结构,如混合Mesh、层级Mesh等。这些不同的Mesh拓扑结构根据具体的应用场景和需求选择和设计,旨在提供更好的网络覆盖和信号质量,同时还要考虑网络的安全性、可靠性和延迟等因素。
总之,Mesh网络的拓扑结构是分布式、网状的,具有高度互联性和弹性。通过合理设计网络节点和连接方式,可以让Mesh网络成为能够适应各种应用环境和场景的一种重要通信技术。
节点之间的连线表示无线信号覆盖范围内的直接连接, 对无线信号覆盖范围外的节点之间的通信需要经过中继节点. 如图中的Q,R,S进行消息转发到达目的节点. 图中有3个好友节点, 其中节点P和O分别有3个和2个低功耗节点组合, 好友节点N没有低功耗节点组合. 节点T是BLE设备, 通过GATT Bearer方式和代理中继节点S进行通信, 节点S必须转发所有和节点T的消息传输. 比如BLE节点T要发送消息给低功耗节点L. 首先节点T通过GATT Bearer在数据信道发消息给节点S, 然后节点S通过Advertising Bearer方式在广播信道转发消息. 节点H,R,O,N都在其无线信号覆盖范围并接收到消息, 节点O作为低功耗节点L的好友会储存收到的消息, 在节点L从睡眠中醒来后会查询好友节点O来取得这个发送给它的消息并做相应的处理.
7. Mesh的系统架构
蓝牙mesh的协议栈是层级结构
-
最低层就是BLE层, 就像一开始介绍的蓝牙mesh建立在BLE物理层和链路层之上, 采用Advertising和Connection两种数据传输方式.
-
承载层(Bearer Layer)把BLE层的数据抽象并供上层使用. 目前定义了两种承载: 广播承载和GATT承载. 分别对应BLE的Advertising和Connection方式.
-
网络层(Network Layer)负责基于地址的消息传输. 实现中继和代理特性以及对信息进行网络层加解密和认证行为.
-
底层传输层(Lower Transport Layer)负责将数据分段和重组.
-
上层传输层(Upper Transport Layer)负责应用层信息数据的加密, 解密和认证. 它还定义了节点间传输控制信息, 包括了朋友特性的应用实现.
-
接入层(Access Layer)负责定义应用数据的格式. 定义并控制应用数据在上层传输层的加密解密的过程. 它确保从下层接收到的数据是正确的并传输到更高层的应用.
-
基础模型层(Foundation Model Layer)负责定了状态, 消息, 模型等, 实现mesh网络的配置.
-
模型层(Model Layer)负责标准化用户应用场景的实例, 比如灯模型, 传感器模型等.