蓝牙Mesh Profile | Bluetooth® Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth® Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开发和发布的,它允许一对一、一对多和多对多通信。它使用BLE协议在网络节点之间交换消息。节点之间可以相互通信,只要它们在彼此的直接无线电范围内,或者有足够的设备能够侦听和转发这些消息。
终端用户应用程序(例如灯具控制)是在蓝牙网状网络模型规范(Mesh Model | Bluetooth® Technology Website)中定义的客户端-服务器蓝牙网状模型的帮助下定义的。
蓝牙Mesh基于蓝牙 4.0 规范的蓝牙低功耗(BLE)部分,并与该协议共享最低层。在广播中,蓝牙网状网络物理表示与现有蓝牙低功耗设备兼容,因为网状网络消息包含在蓝牙低功耗广告数据包的有效负载内。然而,蓝牙网状网络指定了一个全新的主机层,尽管共享一些概念,但蓝牙网状网络与蓝牙低功耗主机层不兼容。
(nRF5 SDK)
(NCS)
蓝牙网络主要针对简单的控制和监控应用,如灯光控制或传感器数据收集。数据包格式针对小型控制数据包进行了优化,可以发出单个命令或报告,而不适用于数据流或其他高带宽应用。
使用蓝牙mesh会导致比传统蓝牙低功耗应用更高的功耗。这主要是由于需要保持收音机持续运行。因此,与蓝牙低功耗广告不同,主动网状网络设备不能长时间使用硬币电池。
蓝牙mesh在一个网络中最多支持32767个设备,最大网络直径为126跳。
蓝牙Mesh是一种基于广播的网络协议,网络中的每个设备都可以向无线电范围内的所有设备发送和接收所有消息。
在网状网络中没有连接的概念。网络中的任何设备都可以中继来自任何其他设备的消息,这使得蓝牙mesh设备通过让一个或多个其他设备向目的地中继消息来向无线电范围外的设备发送消息成为可能。此属性还允许设备随时移动并进出网络。
蓝牙mesh利用蓝牙低功耗广告人(BLE advertiser)和扫描仪(BLE advertiser)角色,通过蓝牙低功耗广告包进行通信。广告包被附近的蓝牙mesh设备接收,并像其他蓝牙低功耗广告包一样处理。蓝牙mesh数据包用唯一的AD类型表示,并添加到广告数据包负载中。
蓝牙低功耗设备以固定的发布间隔(advertisement intervals)发送广告包,mesh包也不例外。然而,与传统广告不同的是,蓝牙mesh设备将在每次传输时改变其广告负载,在堆栈中排队广播新的蓝牙mesh数据包。
如果蓝牙网状网络或蓝牙网状堆栈中没有流量,或者如果应用程序不生成任何消息,则设备保持沉默,直到有东西要传输。
蓝牙网通过传递信息来扩展网络的范围。任何蓝牙mesh设备都可以被配置为中继设备,并且不需要专门的中继设备来构建网络。
每个充当中继的设备将减少接收到的消息中的生存时间(Time To Live, TTL)值,如果TTL等于2或更高,则转发它们。这种无向中继被称为消息泛洪(Message flooding),它确保了消息传递的高概率,而不需要网络拓扑上的任何信息。
蓝牙mesh profile规范没有提供任何路由机制,所有消息都由所有中继转发,直到TTL值为零。为了避免消息被相同的中继一次又一次地转发,所有蓝牙mesh设备都维护一个消息缓存。此缓存用于过滤掉设备已经处理过的数据包。
基于泛洪的消息中继方法会在空中产生大量冗余通信量,从而影响网络的吞吐量和可靠性。因此,强烈建议限制网络中中继的数量来限制这种影响。
网络中启用中继的设备的数量是消息路由冗余和可靠性之间的权衡。它应该根据以下因素进行调整:
为了实现基于广播的通信,设备必须持续将其无线电保持在收听模式。与典型的蓝牙低功耗设备相比,这会导致明显更高的功耗。
为了使低功耗设备能够加入mesh网络,蓝牙mesh包含了一个友谊(Friendship)特性。该协议允许低功耗设备与常规蓝牙mesh设备建立关系,后者将定期缓存和转发消息到低功耗设备。这节省了低功耗设备必须保持监听传入消息。
为了支持不支持接收网状网络数据包的传统蓝牙低功耗设备,蓝牙mesh定义了一个单独的协议,用于在蓝牙低功耗GATT协议上隧道化网格消息。为此,蓝牙网格配置文件规范定义了GATT承载层(GATT bearer)和相应的GATT代理协议(GATT Proxy Protocol)。该协议允许传统蓝牙低功耗设备通过建立GATT连接到启用代理功能的蓝牙mesh设备来参与蓝牙mesh网络。
传统设备会被分配一个地址和必要的密钥,以成为网络的正式成员。设备通过常规发放过程或带外机制接收安全凭据。
蓝牙mesh寻址方案不同于蓝牙低功耗寻址方案。它具有三种类型的地址:
当设备添加到网络时,会为其分配一系列代表该设备的单播地址。设备的单播地址无法更改,并且始终是连续的。单播地址空间支持在单个蓝牙网状网络中拥有 32767 个单播地址。任何应用程序都可以使用单播地址直接向设备发送消息。
组地址的分配和指定是网络配置过程的一部分。一个组地址可以代表任意数量的设备,并且一个设备可以是任意数量的组的一部分。在一个网状网络中最多可以有16127个通用组地址。
虚拟地址可以看作是组地址的一种特殊形式,可以用来表示任意数量的设备。每个虚拟地址是一个由文本标签生成的128位UUID。虚拟地址不必由网络配置设备跟踪,并且通过这种方式,用户可以在部署之前生成虚拟地址,或者可以在网络中的设备之间自组织地生成地址。
为了标准化不同供应商设备之间的通信,蓝牙网状网络配置文件规范定义了一个接入层(Access layer),用于在设备中的各种模型(Models)之间路由蓝牙网状网络消息。模型表示特定的行为或服务,并定义一组作用于这些状态的状态和消息。蓝牙网状网络配置文件规范(Bluetooth mesh profile specification)和蓝牙网状网络模型规范(Bluetooth mesh model specification)各自定义了一组模型,以涵盖设备配置、传感器读数和灯光控制等典型使用场景。除此之外,供应商还可以自由定义自己的模型以及附带的消息和状态。
设备中的模型(Models)属于元素(Elements)。每个设备都有一个或多个元素,每个元素都充当蓝牙网状网络中的虚拟实体,具有自己唯一的单播地址。每条传入消息均由元素中的模型实例处理。为了能够唯一地解析消息的处理方式,每个元素只有一个模型实例可以实现特定消息操作码的处理程序。如果一个设备具有同一模型的多个实例,则必须将每个实例指定给单独的元素。同样,如果两个模型实现同一消息的处理程序,则这些模型必须位于不同的元素中。
为了以最少的消息和状态重复来表示复杂的行为,模型可以由其他模型组成,可能跨越多个元素。这些模型称为扩展模型。纯粹自包含(独立)的模型称为根模型。
模型通过发布和订阅系统(Publish-and-subscribe system)相互通信。每个模型都可以订阅一组组地址和虚拟地址,并且该模型将仅处理发布到其订阅地址之一或包含元素的单播地址的消息。任何模型都可以维护其发布消息的发布地址。此发布地址可以是任何类型。
每个要加入蓝牙mesh网络的新设备必须经过以下几个阶段才能成为蓝牙mesh网络节点:
这两个阶段通常由充当提供者和配置者(Provisioner and configurator)的一个设备执行。
通过执行节点重置过程(将节点从网络中移除),蓝牙mesh节点可以恢复为未启用的设备。
还可以使用密钥刷新过程强制将节点排除在网络之外。一旦完成了网络中其余节点的密钥刷新过程,就可以将节点的单播地址分配给新的未启用设备。
在设备可以参与正常的蓝牙mesh操作之前,必须对其进行启用。
启用是由Provisioner完成的,它是一个受信任的设备,可以访问网络中设备的完整列表及所有设备的配置数据。在启用了名为Provisionee的新设备之后,提供程序使用新设备的设备密钥建立一个安全通道来配置它。
蓝牙mesh将网络配置留给中央网络配置器(Central network configurator)。设备不需要自己进行任何类型的服务发现。
为了控制其他设备,新设备必须由Provisioner配置,通过用户交互或从数据库加载预先确定的配置。每个设备都必须在其第一个元素中实现一个强制配置服务器模型(Mandatory Config Server model),该模型用于配置其其余模型。
一旦配置完成,Provisioner就使用其配置客户端模型(Configuration Client)的实例向新设备提供一组应用程序密钥和地址。除非重新配置,否则设备将在其网络生命周期内使用这些密钥和地址。
蓝牙Mesh采用多种安全措施来防止第三方干扰和监控:
设备身份验证是启用过程的一部分,它允许用户确认添加到网络中的设备确实是他们认为的设备。
蓝牙网格配置文件规范定义了一系列带外(out-of-band)身份验证方法,例如:
为了确保启用过程的安全,使用椭圆曲线Diffie-Helman(ECDH)公钥加密。启用设备后,它就是网络的一部分,其所有消息都被认为是经过身份验证的。
蓝牙mesh具有两个级别的AES-CCM加密,128位密钥用于通过网络的所有消息:
应用密钥(App key)用于区分网络中不同应用的访问权限,而设备密钥(Device key)用于管理网络中的设备。
每个设备都有一个唯一的设备密钥,只有Provisioner和设备本身知道。设备密钥用于为设备配置新的加密密钥(网络或应用程序密钥)或地址,以及设置其他设备相关参数。它还可以通过向网络中的所有其他设备传输新密钥(在传输密钥时使用它们各自的设备密钥)来驱逐网络中的恶意设备。这个过程称为密钥刷新过程(Key Refresh Procedure)。
每个加密层都包含一个消息完整性检查值,用于验证消息的内容是否使用指定的加密密钥进行了加密。
所有蓝牙mesh消息有效载荷都是完全加密的。消息元数据(如源地址和消息序列号)与从网络密钥派生的隐私密钥混淆,即使对于公共标头字段也提供有限的隐私。
为了防止恶意设备重播/中继以前的消息,每个设备都保留一个运行序列号,用于出站消息。每条蓝牙mesh报文都使用一对唯一的序列号和源地址发送。接收消息时,接收设备会存储序列号,并确保它比从同一源地址接收到的最后一个序列号更新。
Mesh堆栈由许多子系统组成,这些子系统通过一组API模块进行接口,并参与蓝牙mesh网络数据流。API模块隐藏了其子系统的复杂性。API中提供的功能足以使蓝牙mesh设备正常工作,因此不需要绕过API。
蓝牙网状栈的结构与蓝牙网状网规范(Bluetooth mesh specification)的结构相对应,并遵循相同的命名约定:
nRF Connect SDK中的Bluetooth®mesh stack是Zephyr Bluetooth®mesh stack的扩展。Zephyr蓝牙Mesh栈实现了蓝牙Mesh配置文件规范(参见蓝牙Mesh配置文件),而nRF Connect SDK在Access层API之上提供了来自蓝牙Mesh模型规范的额外模型实现。
网格栈的结构与蓝牙网格规范的结构相对应,并遵循相同的命名约定:
下图演示了数据包是如何在蓝牙网格堆栈结构中的网状网络节点及其层之间流动的。
例如,按下源节点上的灯开关后,会发生以下过程:
网络数据包被解密,如果接收节点不是其目的地,则数据包的TTL值减少1,然后用相同的网络密钥重新加密并传递回承载层进行中继。(nRF5 SDK)/然后使用相同的网络密钥重新加密并传回蓝牙LE控制器进行中继。(NCS)
目标节点
一旦数据包被转发到目标灯泡节点,其网络层将解密数据包并将其传递给传输层。
一旦以这种方式接收到所有传输层的段数据包,就可以使用应用程序密钥对组装的消息进行解密,并将其传递给接入层。
接入层检查操作码(opcode)、应用程序密钥(app key)和目标地址(destination address),并将消息传递给所有符合条件的模型。
如果其中一个模型是灯泡模型,则该模型解析消息的内容,并通知应用程序打开或关闭灯泡。
灯泡模型可能响应确认传输,按照相同的过程返回到灯开关节点,灯开关节点可以通知应用程序已接收到开/关消息。
这些模型定义了通过网状网络传输的所有数据的行为和通信格式。蓝牙网格模型相当于低功耗蓝牙的GATT服务,是特定行为或服务的独立、不可变的实现。所有蓝牙mesh通信都是通过模型进行的,任何通过mesh暴露其行为的应用程序都必须通过一个或多个模型来引导通信。
蓝牙mesh规范为典型的使用场景定义了一组不可变的模型,但是供应商也可以自由地实现他们自己的模型。
接入层控制设备的模型组成。它包含以下引用:
当设备接收到蓝牙mesh消息时,接入层发现消息是针对哪个模型的,并将它们转发给模型实现。(访问层在Zephyr中实现。NCS)
设备状态管理器存储蓝牙网格栈使用的加密密钥和地址。当模型通过配置服务器获得应用程序密钥并发布地址时,设备状态管理器存储原始值并为这些值提供句柄。模型可以在引用这些值时使用句柄。
设备状态管理器将其数据存储在持久存储中,可以在启动时恢复。(nRF5 SDK)
蓝牙Mesh核心模块由网络层和传输层组成,为消息提供特定于网格的传输。
传输层通过使用应用程序密钥加密蓝牙网格数据包并将其分成可以在空中传输的更小的部分来提供网络内安全性。传输层重新组装传入的数据包段,并将完整的蓝牙网格消息呈现给接入层。
网络层使用网络密钥对每个传输层数据包段进行加密,并填充源地址和目的地址字段。当接收到蓝牙mesh数据包时,网络层对该消息进行解密,检查源地址和目的地址,并决定该数据包是否打算发送给该设备以及网络层是否应该转发它。
Mesh Core通过两层加密、重放保护和数据包头混淆,提供针对蓝牙Mesh网络的恶意行为和攻击的保护。(蓝牙Mesh核心在Zephyr中实现。NCS)
启用是将设备添加到蓝牙网状网络的行为。启用模块通过实现提供者角色(网络所有者)和被提供者角色(要添加的设备)来处理这个过程的两个方面。
承载器是低级无线电控制器,它为上层的无线电包发送和接收提供异步接口。它强制蓝牙低能耗的数据包格式和定时,并通过SoftDevice时隙API直接在无线电硬件上操作。
Bearer是一个内部模块,应用程序通常不需要访问它。(nRF5 SDK)
设备固件升级模块通过与引导加载程序合作,在蓝牙网格上提供固件更新功能。它能够在不停止应用程序的情况下将并发的、经过身份验证的固件传输到网络中的所有设备。(nRF5 SDK)
Mesh Stack模块是一个围绕顶级蓝牙Mesh模块的薄包装器,它使开始使用蓝牙Mesh变得容易。它负责网格初始化和启用。它还包含用于存储和擦除供应和状态相关数据的函数。(nRF5 SDK)
串行模块提供蓝牙mesh API的完整串行化,允许其他设备通过UART接口控制nRF5 mesh设备。用于网络网关和类似的复杂应用,串行接口提供了一种通过北欧设备访问网状网络的方法,而无需使其成为设备的主控制器。(nRF5 SDK)
蓝牙®mesh支持由CONFIG_BT_MESH控制,这取决于以下配置选项:
蓝牙Mesh栈中的可选功能必须显式启用:
蓝牙Mesh供应和配置数据的持久存储是通过CONFIG_BT_SETTINGS启用的。有关详细信息,请参阅蓝牙堆栈体系结构Bluetooth Stack Architecture (nordicsemi.com)中的持久存储部分。
nRF Connect SDK蓝牙网格模型实现是可选功能,每个模型都有单独的Kconfig选项,必须明确启用。有关详细信息,请参阅Bluetooth Mesh型号Bluetooth Mesh models (nordicsemi.com)。
以下配置选项用于配置蓝牙网状网络的行为和性能。有关影响Bluetooth Mesh内存占用空间的配置选项的更多信息,请参阅Bluetooth Mesh的内存占用空间优化指南Configuring Bluetooth Mesh in nRF Connect SDK (nordicsemi.com)。
本节列出了可用于配置蓝牙Mesh的行为和性能的其他配置选项。所提供的值仅作为建议,应根据每个应用程序单独调整。
这些选项仅与支持低功耗蓝牙(LE) v4.2或更高版本的设备兼容。
以下配置选项允许将完整的中继网格广告帧装入单个链路层有效载荷:
以下选项允许在单个连接间隔内发送多个数据帧:
以下配置选项用于配置蓝牙低功耗的行为和性能:
以下特性选项默认情况下在示例中是禁用的,但如果应用程序需要它们中的任何一个,则需要考虑启用它们:
在对存储重放保护列表(RPL)数据要求很高的大型网络中,应该考虑以下配置选项。这将需要额外的硬件。有关详细信息,请参阅紧急数据存储Emergency data storage (nordicsemi.com)。
低功耗节点(LPN)是蓝牙Mesh特有的功耗优化功能。
使用LPN特性时,以下配置选项是相关的: