蓝牙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)部分,并与该协议共享??最低层。在广播中,蓝牙网状网络物理表示与现有蓝牙低功耗设备兼容,因为网状网络消息包含在蓝牙低功耗广告数据包的有效负载内。然而,蓝牙网状网络指定了一个全新的主机层,尽管共享一些概念,但蓝牙网状网络与蓝牙低功耗主机层不兼容。
蓝牙网络主要针对简单的控制和监控应用,如灯光控制或传感器数据收集。数据包格式针对小型控制数据包进行了优化,可以发出单个命令或报告,而不适用于数据流或其他高带宽应用。
使用蓝牙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)的结构相对应,并遵循相同的命名约定:
下图演示了数据包是如何在蓝牙网格堆栈结构中的网状网络节点及其层之间流动的。
例如,按下源节点上的灯开关后,会发生以下过程:
网络数据包被解密,如果接收节点不是其目的地,则数据包的TTL值减少1,然后用相同的网络密钥重新加密并传递回承载层进行中继。
目标节点
一旦数据包被转发到目标灯泡节点,其网络层将解密数据包并将其传递给传输层。
一旦以这种方式接收到所有传输层的段数据包,就可以使用应用程序密钥对组装的消息进行解密,并将其传递给访问层。
接入层检查操作码(opcode)、应用程序密钥(app key)和目标地址(destination address),并将消息传递给所有符合条件的模型。
如果其中一个模型是灯泡模型,则该模型解析消息的内容,并通知应用程序打开或关闭灯泡。
灯泡模型可能响应确认传输,按照相同的过程返回到灯开关节点,灯开关节点可以通知应用程序已接收到开/关消息。