1 介绍
蓝牙Mesh Profile规范定义了实现蓝牙低功耗无线技术的可互操作Mesh网络解决方案的基本要求。
1.1 一致性
如果声明符合本规范,则应以指定的方式(过程强制性)支持本规范强制规定的所有功能。这也适用于支持被指示的所有可选和有条件的功能。
1.2 蓝牙规范版本兼容性
本规范应与以下内容一起使用:
• 核心规格附录6结合允许的蓝牙核心规范(参见第1卷,D部分,第1.2节,表1.3),或
• 任何v5.0版本之后的蓝牙核心规格。
如果 支持 第 5.2.2 节定义的GATT Provisioning Bearer 或第 3.3.2 节定义的GATT Bearer, 则需要通用属性配置文件(GATT) 被支持。
1.3 语言
1.3.1 语言约定
在规范的开发过程中,蓝牙SIG设立了以下约定使用的词语 , 应当,必须, 将要, 应该, 可以, 可能, 是,以及注意。
- 应当(shall), 需要 - 用于定义需求。
- 必须(must),是一种自然的后果 - 仅用于描述不可避免的情况。
- 将要(will), 确实如此 - 仅用于事实陈述。
- 应该(should),建议 - 用于表示在几种可能性中有一种推荐为特别合适,但不是必需的。
- 可以(may),被允许 - 用于允许选项。
- 可能(can),能够 - 以因果方式将陈述关联起来。
- 是(is),被定义为 - 用于进一步解释以前需要的元素或允许 。
- 注意(note),用于指示仅用于提供信息的文本,而不是为实现该规范所需的。一份说明中的信息性文字延续到段落的末尾。
为了清楚说明这些术语的定义,请参阅核心规范第1卷E部分第1节。
1.3.1.1 保留供将来使用
在数据包,协议数据单元(PDU)或其他数据结构中的字段被描述为“保留供将来使用(Reserved for Future Use)”(不管是大写还是小写),创建结构的设备应将其值设置为零,除非特别指定。任何接收或解释结构的设备都应忽略该字段;特别是它不应该由于该字段的值而拒绝该结构。
在字段,参数或其他变量对象可以在一个范围内取值并且某些值被描述为“保留供将来使用”的情况下,发送该对象的设备不应将该对象设置为这些值。接收具有这种值的对象的设备应该拒绝它,并且包含它的任何数据结构都是错误的;但是,这不适用于将对象描述为可被忽略或指定可忽略无法识别的值的上下文中。
当字段值是一个位字段时,未分配的位可以被标记为保留以备将来使用,并且应该被设置为0。接收包含未使用的保留位的消息设置为1的实现将像该位设置为0一样理处该消息,除非另有规定。
首字母缩略词RFU相当于“保留供将来使用”。
1.3.1.2 禁止
当字段值是枚举时,未分配的值可以标记为“禁止(Prohibited)”。这些值永远不会被实现使用,并且任何收到的包含禁止值的消息都应该被忽略,并且不会被处理,也不会被回应。
如果字段,参数或其他变量对象可以取一个范围内的值,并且某些值被描述为“禁止”,则设备不得将该对象设置为任何被禁止的值。接收具有这种值的对象的设备应该拒绝它,并且包含它的任何数据结构都是错误的。
“禁止”永远不会缩写。
1.3.2 缩略语
缩写或简称 | 含义 |
---|---|
ACK | 确认 |
AD | 广告数据 |
AES | 高级加密标准(Advanced Encryption Standard) |
AID | 应用程序密钥标识符(Application Key Identifier) |
AKF | 应用程序密钥标志(Application Key Flag) |
ASCII | 美国标准信息交换码 |
ATT | 属性协议(Attribute Protocol) |
ATT_MTU | 属性协议最大传输单位 |
BR/EDR | 基本速率/增强数据速率 |
CCM | 用CBC-MAC的计数器 |
CID | 公司标识符(Company Identifier) |
CMAC | 基于密码的消息认证码(Cipher-based Message Authentication Code) |
CTL | 网络控制消息指示(Network control message indication) |
DST | 目的地 |
ECB | 电子代码簿(Electronic CodeBook) |
ECDH | 椭圆曲线Diffie-Hellman(Elliptic Curve Diffie-Hellman) |
FCS | 帧检查序列(Frame Check Sequence) |
FIPS | 联邦信息处理标准(Federal Information Processing Standards) |
FSN | Friend序列号(Friend Sequence Number) |
GAP | 通用访问配置文件(Generic Access Profile) |
GATT | 通用属性配置文件(Generic Attribute Profile) |
ID | 识别码 |
IEEE | 电气和电子工程师协会 |
IKM | 输入密钥材料(Input Key Material) |
IVI | 初始化向量索引(Initialization Vector Index) |
JSON | JavaScript对象表示法 |
LED | 发光二极管(Light Emitting Diode) |
LSO | 最低有效八位字节(Least Significant Octet) |
MAC | 消息认证码(Message Authentication Code) |
MD | 更多数据(More Data) |
MIC | 消息完整性检查(Message Integrity Check) |
MSO | 最高的八位字节(Most Significant Octet) |
MTU | 最大传输单位 |
NID | 网络标识符(Network Identifier) |
OBO | 代表(另一个元件) |
OKM | 输出密钥材料(Output Key Material) |
OOB | 带外 |
PDU | 协议数据单元 |
PID | 产品标识符 |
RFU | 保留供将来使用 |
RPL | 重播保护列表(Replay Protection List) |
RSSI | 接收信号强度指示 |
SAR | 分割和重组(Segmentation And Reassembly) |
SEG | 分割指示位(Segmentation indication bit) |
SEQ | 序列号 |
SIG | 特殊兴趣小组 |
SRC | 源端 |
SZMIC | 消息完整性检查的大小 |
TTL | 生存时间 |
URI | 统一资源标识符 |
UUID | 通用唯一标识符 |
VID | 版本标识符 |
WG | 工作小组 |
表1.1:缩写和首字母缩略词
1.3.3 术语
术语 | 定义 |
---|---|
地址 | 一个或多个节点中一个或多个元件的标识。 |
配置客户端 | 实现配置客户端(Configuration Client)模型的节点。 |
目的地 | 消息发送到的地址。 |
设备 | 一个能够配置到Mesh网络上的实体。 |
元件(Element) | 设备内的可寻址实体。一台设备至少需要一个元件。 |
信息 | 从源发送到目标的八位字节序列。 |
邻居 | 直接射频范围内的节点(单跳)。 |
网络 | 一组共享公共地址空间的节点。 |
节点 | 一个已配置设备。 |
配置(Provision) | 对设备认证和提供基本信息的过程(包括单播地址和网络密钥)。设备必须经过配置才能成为节点。一旦预配置,节点可以传输或在Mesh网络中接收消息。 |
置备(Provisioner) | 能够将设备添加到Mesh网络的节点。 |
中继(Relay) | 接收并重新传输消息的节点。 |
源端 | 消息起始发送的地址。 |
状态(State) | 表示由节点的元件显露的元件状况的值 |
子网(Subnet) | 一组可以相互通信的节点。 |
表1.2:术语
2 Mesh系统架构
本节概述了Mesh网络操作和分层系统体系结构。
2.1 分层架构
Mesh Profile 规范被定义为 如图2.1 所示的分层体系结构 。
2.1.1 模型层
模型层定义了用于标准化典型用户场景操作的模型,并在蓝牙Mesh模型规范 [11] 或其他更高层规格中定义。较高层模型规格的例子包括照明和传感器模型。
2.1.2 基础模型层
基础模型层定义配置和管理Mesh网所需的状态,消息和模型。
2.1.3 接入层(Access layer)
接入层定义了高层应用如何使用高层传输层(upper transport layer)。它定义了应用程序数据的格式;它定义和控制在上层传输层中执行的应用数据加密和解密;它会检查传入的应用程序数据是否在正确的网络和应用程序密钥的上下文中被接收,然后再将其转发到更高层。
2.1.4 上层传输层(Upper transport layer)
上层传输层对应用数据进行加密,解密和认证,并被设计为提供接入消息的机密性(confidentiality of access messages)。它还定义了如何使用传输控制消息来管理节点之间的上层传输层,包括由Friend功能使用时的情形。
2.1.5 低层传输层(Lower transport layer)
低层传输层定义如何将高层传输层消息分段并重新组装成多个较低传输PDU以将较大的较高传输层消息传递到其他节点。它还定义了一个控制消息来管理分段和重组。
2.1.6 网络层(Network layer)
网络层定义了传输消息如何寻址一个或多个元件。它定义了允许传输PDU由Bearer layer传输的网络消息格式。网络层决定是否中继/转发消息,接受它们以供进一步处理,或拒绝它们。它还定义了网络消息如何加密和认证。
2.1.7 Bearer layer
Bearer层定义了网络消息如何在节点之间传输。定义了两个Bearer,广告Bearer和GATT Bearer。未来可能会定义其他Bearer。
2.2 Mesh操作概述
本规范定义的Mesh网络操作旨在:
• 使消息能够从一个元件发送到一个或多个元件;
• 允许通过其他节点中继消息来扩展通信范围;
• 安全的消息以抵御已知的安全攻击,包括窃听攻击,中间人攻击,重放(replay)攻击,垃圾桶(trash-can)攻击,暴力(brute-force key)攻击以及可能出现的其他安全攻击。
• 在当今市场上的现有设备上工作;
• 及时发送消息;
• 当一个或多个设备移动或停止运行时可以继续工作;以及
• 具有内置的前向兼容性,以支持未来版本的Mesh Profile规范。
该规范定义了基于泛洪管理(managed-flood-based)的Mesh网络,该网络使用广播信道传输消息,以便其他节点可以接收消息并转发这些消息;从而扩大原始消息的范围。只要有足够密度的设备监听和中继消息,受管理的泛洪(managed-flood)Mesh网络中的任何设备都可以随时发送消息。增加路由功能和定义基于路由的(routing-based)Mesh网络的增强可以考虑用于本规范的未来版本。
本规范使用多种方法来限制受管泛洪Mesh网络中消息的无限中继。使用的两种主要方法是网络消息缓存(network message cache)方法和生存时间(time to live)方法。
网络消息缓存(network message cache)旨在通过将所有消息添加到缓存列表来防止设备中继先前收到的消息。收到消息时,会根据列表进行检查,如果已经存在则忽略。如果尚未收到,则将其添加到缓存中,以便将来可以忽略它。为了防止这个列表变得太长,缓存的消息数量受到实现的限制。
每条消息都包含一个生存时间(TTL)值,用于限制消息中继的次数。每次收到一条消息,然后由设备中继(最多126次),TTL值就会减1。
2.2.1 网络和子网
Mesh网络由共享四种公共资源的节点组成:
• 用于识别消息来源和目的地的网络地址(见第 3.4.2 节 );
• 用于在网络层保护和认证消息的网络密钥(见第 3.8.6.3 节 );
• 用于在接入层保护和认证消息的应用密钥(见第 3.8.6.2 节 ); 和
• 用于延长网络寿命的IV索引(见第 3.8.4 节 ) 。
网络可以有一个或多个便于“区域”隔离的子网(例如,酒店网络内的隔离的酒店房间子网)。子网是一组可以在网络层互相通信的节点,因为它们共享一个网络密钥。通过知道一个或多个网络密钥,节点可能属于一个或多个子网。在配置(provisioning)时,设备被配置到一个子网,并且可以使用配置模型(Configuration Model)添加到更多的子网。
有一个称为主子网(primary subnet)的特殊子网,它基于主NetKey(见第 3.8.6.4 节 )。主子网上的节点参与IV更新过程(请参见第
3.10.5节), 并将IV更新(IV updates)传播到其他子网,而其他子网上的节点只传播IV 索引更新(IV Index updates)到这些子网。
网络资源由实现配置客户端(Configuration Client)模型(称为配置客户端,通常为智能电话或其他移动计算设备)的节点管理,并在配置时分配给节点(参见第 5 节 ), ,配置时使用配置服务器(Configuration Server)模型(参见第 4.4.1 节 ) 。特别是,Provisioner管理地址分配以确保没有重复的单播 地址分配,而配置客户端(Configuration Client)生成并分配网络和应用密钥,并确保需要相互通信的设备为网络层和接入层共享适当的密钥。配置客户端也知道设备密钥(device keys)(参见第 3.8.6.1 节 ), 用于保护与每个单独节点的通信,包括分发 更新的网络和应用程序密钥。
2.2.2 设备和节点
不是Mesh网络成员的设备称为未配置设备。作为Mesh网络成员的设备称为节点。Provisioner用于管理未配置设备和节点之间的转换。
未配置的设备不能发送或接收Mesh消息;然而,它将它的存在告知Provisioner。Provisioner会在未经过验证的设备通过验证后邀请其进入Mesh网络,并将该未经过验证的设备转换为节点。
节点可以发送或接收Mesh消息,并由配置客户端管理,该配置客户端也可以是与配置器(Provisioner)相同的设备,通过Mesh网络来配置节点与其他节点的通信方式。配置客户端可以从Mesh网络中删除一个节点,这将该节点恢复为未配置的设备。
设备可以通过在已经配置到Mesh网络之后将其自身提供给另一个Mesh网络来支持节点的多个实例。Mesh网络的每个实例都由设备在配置期间获取的地址和设备密钥确定。
2.2.3 将设备添加到Mesh网络
设备被配置器(Provisioner)添加到Mesh网络中,此时它们成为节点。将设备配置到Mesh网络中不同于蓝牙无线技术中通常使用的点对点绑定和配对。通过使用简单的广告Bearer(Advertising Bearer)或基于点对点的GATT Bearer(GATT-based Bearer)来启用设备配置。两个Bearer使用同一个配置协议(provisioning protocol)。通过基于广告的Bearer进行配置是由所有设备实现的。通过基于GATT的Bearer来配置,允许诸如传统电话的设备(即,不支持通过原生广告Bearer配置的设备)成为配置器(Provisioners)。
为了协助配置多个设备,设备具有可由配置器设置的关注计时器(attention timer)。当设置为非零值时,设备使用任何可能的方式识别自己。例如,该设备可以闪灯,发出声音或振动。当关注计时器到期时,设备停止识别自身。这允许配置器向设备发送单个消息以使其自身识别,并且设备在给定时间后自动停止识别自身。
在这两个Bearer上运行的协议是蓝牙核心规范v4.2的安全管理器协议的衍生,用于引入验证具有非常有限的用户界面的设备(如灯泡或交换机)的能力。安全管理器协议需要可靠的Bearer,这是广告配置Bearer(advertising provisioning Bearer)不能保证的;因此本规范中使用的协议旨在实现与Bearer无关的可靠消息传递。与安全管理器协议的相似性可以在已实现此功能的设备上大量重用现有代码。
2.2.4 通信支持
许多当前设备不能在未更新的情况下发广告或理解Mesh消息。为了使这些设备能够与Mesh网络中的节点进行通信,而无需进行操作系统更新或类似的硬件/软件更新,该规范支持对所有现有设备使用GATT连接。
2.2.5 低功耗支持
本规范中的特性使Mesh网络中的许多设备可以使用电池供电,或使用诸如能量采集等技术。这些设备可能受限于它们如何用作Mesh网络的一部分(例如,与之交互时仅发送数据的设备)。本规范不要求设备协调传输,建立连接或在每个连接上重新启动安全性;从而促进低功耗操作。需要低功耗支持的设备可以使用称为Friendship的概念(参见第 3.6.6 节 ) 将自己与始终在线的设备相关联,该设备代表它们存储和中继消息 。然而,中继消息的设备大多数时间都会接收消息并转发消息,并且可能使用的功耗要比典型的小电池或电容器提供的功耗大得多。
2.3 架构概念
Mesh网络体系结构使用几种不同的概念:状态(states),消息(messages),绑定(bindings),元件(elements),寻址(addressing),模型(models),发布 - 订阅(publish-subscribe),Mesh密钥(mesh keys)以及关联(associations)。
2.3.1 状态(States)
状态是表示元件状态的值。
暴露状态的元件(element)被称为服务器(server)。例如,最简单的服务器是一个通用开关服务器(Generic OnOff Server),表示它要么是打开的,要么是关闭的。
访问状态的元件被称为客户端(client)。例如,最简单的客户端是通用开关客户端(Generic OnOff Client)(二进制开关),它能够通过通用开关模型(Generic OnOff Model)定义的消息来控制通用开关服务器(Generic OnOff Server)。
由两个或更多值组成的状态称为组合状态(composite states)。例如,变色灯可以通过色彩饱和度(color saturation)和亮度(brightness)分开控制色调(color hue)。
2.3.2 绑定状态(Bound states)
当一个状态被绑定到另一个状态时,一个状态的变化会导致另一个状态的变化。绑定状态(Bound states)可能来自一个或多个元件中的不同模型。例如,一个常见类型的绑定位于Level级别和OnOff状态之间:将Level更改为0会将绑定的OnOff状态更改为Off,并将Level更改为非零值会将绑定的OnOff状态更改为On。
2.3.3 消息(Messages)
Mesh网络内的所有通信都通过发送消息来完成。消息按状态进行操作。对于每个状态,都有一组定义的消息,服务器支持并且客户端可以使用该消息请求状态值或更改状态。服务器也可以传输携带关于状态和/或改变状态的信息的未经请求(unsolicited messages)的消息。
消息被定义为具有操作码,相关参数和行为。一个操作码可以是一个八位字节(对于需要最大可能的有效负载的特殊消息),2个八位字节(对于标准消息)或3个八位字节(对于供应商特定的消息)。
包括操作码的总消息大小由下面的传输层确定,其可以使用分段和重组(Segmentation and ReassemblySAR)机制。为了最大限度地提高性能并避免SAR的开销,设计目标是将消息放入单个段中。传输层为非分段消息提供多达11个八位位组,当使用1个八位字节操作码时最多可以提供10个八位位组参数,在使用2个八位位组操作码时最多可以提供9个八位位组参数,当使用供应商专用的3字节操作码时,可以使用8个八位字节作为参数。
传输层提供了一个能够传输多达32个段的SAR机制。使用SAR时的最大消息大小是384个八位字节。这意味着(排除一个应用MIC),当使用1字节操作码时,最多379个八位字节可用于参数,当使用2个八位字节操作码时,最多378个八位字节可用于参数,而当使用3个八位字节的供应商特定操作码时,最多可以有377个八位字节用于参数。
SAR不会在每个分段的接入层有效载荷上施加任何额外的开销:一个10字节的消息作为未分段的消息传输,而20个八位字节的消息作为使用两个分段的分段消息传输。
消息定义包含参数表。在消息有效载荷中,参数跟随操作码,除非另有说明,参数偏移量以八位字节为单位。
消息被定义为有确认(acknowledged)或无确认(unacknowledged)两种。有确认的消息(例如Get消息)需要响应,而无确认的消息(例如状态消息)不需要响应。
Set,Clear,Recall和Store消息定义为两种变体:有确认和无确认。
消息变体在语义上是相同的,但使用单独的操作码。
2.3.4 元件(Elements)
元件是节点内的可寻址实体。每个节点至少有一个元件,主要元件(primary element),并可能有一个或多个附加的次要元件(secondary elements)。元件的数量和结构是静态的,并且在节点的整个生命周期中都不会改变(即只要该节点是网络的一部分期间)。
使用在配置期间分配给节点的第一个单播地址(unicast address)来寻址主要元件。使用随后的地址寻址每个附加的次要元件。这些单播元件地址允许节点识别节点内的哪个元件正在传输或接收消息。
如果元件的数量和结构发生变化(例如由于固件更新),则必须重新配置节点。当执行更改元件数量或结构的固件更新时,将使用 “节点移除”过程(请参阅第 3.10.7 节 )。
消息在基于操作码和元件地址的模型内分派。
一个元件不允许包含多个使用相同消息的模型实例(例如,“On”消息)。当同一元件中的多个模型使用相同的消息时,这些模型被称为“重叠”。为了在单个节点内实现重叠模型的多个实例(例如,控制可以打开和关闭的多个灯具),该节点需要包含多个元件。
例如,灯具可能有两个灯泡,每个灯泡实现Light Lightness Server模型的实例和Generic Power OnOff Server模型的实例。这要求节点包含两个元件,每个灯泡一个。当它收到“开启”消息时,该节点使用该元件的单播地址来标识该消息寻址到哪个通用开关服务器(Generic Power OnOff Server)模型的实例。
在另一个示例中,双插槽电源板包含两个独立的能量测量传感器,可以测量连接到插座的设备消耗的功耗。这将要求节点具有两个传感器数据状态,每个状态都在一个单独的元件中。第一个元件即主要元件将使用该节点的单播地址进行标识,并且将包含第一个能量传感器的状态以及表示节点配置的状态。第二个元件(次要元件)将使用单播元件地址进行识别,并将包含第二个能量传感器的状态。
每个元件都有一个GATT蓝牙命名空间描述符(GATT Bluetooth Namespace Descriptor) 5 值,有助于识别此元件所代表的是节点的哪一部分。这些名称空间描述符值使用与GATT相同的定义。例如,温度传感器的元件将使用“内部(inside)”和“外部(outside)”的值。
2.3.5 地址(Addresses)
地址可以是单播地址(unicast address),虚拟地址(virtual address)或组地址(group address)。还有一个特殊的值来表示未被分配的地址,在消息中不使用该地址。
单播地址被分配给一个元件,并且总是表示一个节点的单个元件。每个Mesh网络有32767个单播地址。
虚拟地址是多播地址(multicast address),可以表示一个或多个节点上的多个元件。每个虚拟地址在逻辑上代表一个标签UUID,它是一个128位的值,不需要集中管理。发送到标签UUID的每条完整标签UUID消息,都包含用于验证该消息的消息完整性检查值(message integrity check value)。为了减少检查每个已知标签UUID的开销,使用标签UUID的哈希值。有16384个哈希值,每个哈希值编码一组虚拟地址。虽然在虚拟地址中仅使用16384个哈希值,但每个哈希值可能代表数百万个可能的标签UUID;因此,虚拟地址的数量被认为是非常大的。
组地址是多播地址(multicast address),可以表示一个或多个节点上的多个元件。每个Mesh网络有16384个组地址。有一组固定组地址(fixed group addresses)用于根据这些节点的功能来定位节点的所有主要元件的子集。所有其他组地址都称为动态分配的组地址(dynamically assigned group addresses)。有256个固定组地址和16128个动态分配的组地址。
2.3.6 模型(Models)
模型定义了节点的基本功能。一个节点可能包含多个模型。模型定义了所需的状态(如 2.3.1 节所述 ),作用于这些状态的消息(如 2.3.3 节所述 )以及任何相关的行为。
一个Mesh应用程序使用以发布 - 订阅范式进行通信的客户端 - 服务器体系结构指定。由于Mesh网络的特性以及对配置客户端执行的行为配置的认识,因此应用程序未在单个端到端规范(如配置文件)中定义。相反,应用程序是在客户端模型(client model),服务器模型(server model)和控制模型(control model)中定义的。
本规范定义了三种类型的模型:服务器模型,客户端模型和控制模型:
• 服务器模型: 服务器模型由跨越一个或多个元件的一个或多个状态组成。 服务器模型定义了它可以发送或接收的一组强制性消息,元件在发送和接收此类消息时所需的行为,以及在发送或接收消息之后发生的任何其他行为。
• 客户端模型: 客户端模型定义了一组客户端的消息(包括必需的和可选的) 用于请求,更改或使用由服务器模型定义的相应服务器状态。客户端模型没有状态。
• 控制模型: 控制模型可能包含客户端模型功能与其他服务器模型通信 ,以及服务器模型功能与其他客户端模型进行通信。控制模型也可以包含 控制逻辑 , 控制逻辑 是协调控制模型连接的其他模型之间的交互作用的一组规则和行为。
单个设备可能包括服务器,客户端和控制模型。
例如, 图2.2 显示了一个设备的元件模型结构,实现具有状态并支持消息R,S,T,X,Y,Z的服务器模型(设备C);以及两个实现客户端模型的设备,设备A支持消息X,Y和Z,设备B支持消息R,S,T和Z。
在另一个例子中, 图2.3 显示了实现控制模型的设备的元件模型结构。设备C可以作为客户端与服务器模型进行通信(分别支持消息X,Y和Z以及消息R,S和T),并且可以作为服务器(支持消息A,B和C)与客户端模型进行通信。
照明控制器是控制模型实施的一个例子。照明控制器需要作为传感器(用于测量占用率(occupancy)和/或环境光(ambient light))和光源(如灯泡或其他照明设备)的客户端。照明控制器还可以作为设置客户端的服务器(例如配置其参数的智能手机应用程序)。这样的照明控制器可以被包括在传感器或光源内,或它可以是单独的设备。
模型可以定义做为网络节点的设备的功能,如密钥管理,地址分配和消息中继。模型还定义了围绕网络节点构建的设备的物理行为,如功耗控制,照明控制和传感器数据收集。可能有节点仅实现与网络相关的功能,例如中继节点或代理节点,而大多数节点能够通过控制电力,控制光发射或感测环境数据来与物理世界交互。
一条消息可以被多个不同的模型使用。消息行为在每个模型中都是相同的,因此可以在客户端,服务器和控制模型之间达成共识,因为无论发送和处理消息的模型如何,其行为都是一致的。
模型规格设计得非常小巧且独立。在规范定义的时候,模型可能需要其他模型,这些模型也必须在同一个节点中实例化。这称为 扩展 ,这意味着模型可以扩展其他模型。
不扩展其他模型的模型被称为 根模型 。
模型规范是不可变的:不可能删除或向模型添加行为,无论期望的行为是可选行为还是强制行为。模型没有版本并且没有特征位。
如果模型中需要额外的行为,就定义一个新的扩展模型,公开所需的行为,并可以与原始模型一起实施。
因此,知道元件所支持的模型,就知道了该元件所暴露的确切行为。
模型可能由Bluetooth SIG定义并采用,也可能由供应商定义。Bluetooth SIG定义的模型被称为SIG采用的模型,供应商定义的模型被称为供应商模型。模型由唯一的标识符标识,对于SIG采用的模型,可以是16位,对于供应商模型可以是32位。
例如, 图2.4 显示了一个设备的元件模型结构,该设备实现了具有两个绑定状态的根模型和一组在每个状态下运行的消息。根模型位于主要元件内,并由扩展模型进行扩展,在次要元件上添加另一个状态。消息不能区分同一元件上同一状态的多个实例。因此,当设备上存在多于一个给定状态的实例时,每个实例都需要位于一个单独的元件中。在这个例子中,状态X的第二个实例需要位于第二个元件上,因为它是一个相同类型的状态,因此具有相同类型的消息。
此示例结构可能会在复合设备中被倍乘。例如,复合设备可能有多个相同根模型(或扩展模型)的实例,每个实例都在一个单独的元件(或一组元件)上。另外,如果一个模型(根或扩展)需要一个特定状态的多个实例,该状态必须分布在多个元件上,以至于任何给定状态的单个实例至多在一个元件上。
图2.5说明图2.4设备的元件模型结构如何可能被执行在一个复合设备中。该装置的元件模型结构是由组合数据(Composition Data)(见描述 4.2.1) , 其由配置客户端部署后读(见第5节 ),使用配置服务器模型和配置客户端模型(参见第 4.4 0.1 和 4.4.2 ) 。
2.3.7 示例设备
为了帮助解释元件内部模型的排列方式如何确定设备的状态和行为,我们将使用双插槽智能电源板设备(如图 2.6 所示 ) 作为示例。该设备具有蓝牙低功耗的单一无线电和两个独立的电源插座,每个电源插座均可控制功耗输出。这个例子包括Mesh Model规范 [11]中 定义的状态,消息和模型 。
该设备具有两个 代表两个电源插座的 元件(见第 2.3.4 节 ) 。每个元件都有一个分配给它的单播地址。
每个元件的功能由通用功耗级别服务器(Generic Power Level Server)模型定义。该模型定义了服务器上的一组状态,以及一组对这些状态进行操作的消息。
通用功耗级别设置(Generic Power Level Set)消息可以被发送到设备以控制输出功耗。该消息被发送到一个元件并在目标地址(DST)字段中携带该元件的地址(见第 2.3.8 节 )。
插槽也可以通过实现通用级别客户机(Generic Level Client)模型的通用设备(如调光器)进行控制(并且不知道任何有关功耗控制的内容)。该模型简单地将期望水平设置为零,最大值或两之间的值。通过状态绑定来控制插座的电源。在每个电源插座中,通用电源实际状态都绑定到通用电平状态。通用级客户端将通用级消息发送到通用级服务器。通用级别状态发生改变,反过来(通过已定义的绑定)改变控制功耗输出的通用功耗实际状态。
元件可以报告状态。在我们的例子中,每个插座可以报告功耗水平以及插入插座的设备的能量消耗。使用Sensor Server模型定义的消息报告能耗。每个消息的SRC字段中都有元件的地址,用于标识套接字(请参见第 3.4.4.6 节 ) 。
图2.7 说明 双插槽设备的单元模型结构。功能上,这两个要素 的设备具有相同的特征。唯一的区别是除了其他模型之外,主要元件还处理用于网络管理的配置服务器模型。每个元件可以定义其他模型,如Health Server模型(参见第 4.4.4 节 )或Mesh Model规范 [11]中 定义的模型 。
2.3.8 发布 - 订阅和消息交换
Mesh网络内数据的发布和订阅被使用使用发布 - 订阅范例来描述。生成消息的节点将消息发布到单播地址,组地址或虚拟地址。有兴趣接收消息的节点将订阅这些地址。
生成的消息被发送到的目标Mesh地址可以是单播,预先配置的组地址或虚拟地址。消息可以作为对其他消息的回复发送,也可以是未经请求的消息。当模型的实例发送回复消息时,它将传入消息始发的源地址用作目标地址。当模型的实例发送未经请求的消息时,它将使用模型发布地址(model publish address)作为目标地址。节点中的每个模型实例都有一个发布地址。
在接收端,节点内模型的每个实例可以订阅一个或多个组地址或虚拟地址。无论何时发送到模型预订列表中的某个组地址或虚拟地址的消息到达时,该消息都将由该节点处理。
当目的地址是接收元件的单播地址,或目的地址是该设备所属的固定组地址时,也会处理该消息。如果一个节点有多个元件,那么该消息在被寻址的每个元件上处理一次。
由更高层规范定义的模型的发布地址和预订列表(Publish addresses and subscription lists)使用由配置服务器模型(Configuration Server Model)管理的模型发布和预订列表状态(Model Publication and Subscription List states)。
节点可以为模型元件的每个实例拥有任意数量的订阅,尽管节点可能会限制支持的订阅数量。使用多个订阅地址允许节点响应发布到不同组的消息。例如,灯可以订阅发送到床头灯组,卧室组,楼上组和家庭组的消息。
每条消息都从一个单播地址(一个元件地址)发送,并使用唯一的序列号进行排序,以便检测和防止重放攻击。
消息可以被确认或无确认(见第 3.7.5 节 )。有确认的消息(例如Get消息)会产生响应消息;无确认的消息(例如,状态消息)不会引起响应。
2.3.9 安全
所有消息都使用两种密钥进行加密和验证。一种密钥类型用于网络层通信,使得Mesh网络内的所有通信都将使用相同的网络密钥。另一种密钥类型用于应用程序数据。分离网络和应用的密钥允许将敏感访问消息(例如,用于建筑物的访问控制)与非敏感访问消息(例如,用于照明)分开。Mesh网络中没有未加密或未认证的消息。
2.3.9.1 应用程序和网络安全
在上层传输层和网络层对消息进行加密和认证的目的是保护Mesh网络内的通信,防止窃听和恶意攻击。每层保持不同的密钥以允许应用程序和网络实体之间的分离。
从网络密钥中分割应用密钥可实现应用消息的安全中继传输:中继节点可以在网络级别对消息进行身份验证,而无需访问应用程序数据。例如,充当中继节点的灯泡应该无法打开门。
这意味着节点可以使用从网络密钥导出的密钥中继访问消息,而无需知道应用密钥;因此他们将无法更改或理解应用程序数据。预计网络密钥将被网络中的许多节点广泛知晓,从而增加中继节点的密度,同时保护不同的应用区域。这需要为每个应用程序分配密钥。例如,敏感的门安全应用将与非敏感的门铃和照明应用分开。
应用程序密钥(application key)直接与相关的应用程序密钥标识符(application key identifier)一起使用,该标识符在特定上下文中用于标识所使用的应用程序。但是,网络密钥始终通过密钥派生函数(key derivation function)使用,以生成直接使用的其他密钥。这种密钥的例子包括加密和保密密钥(encryption and privacy keys)。这允许更改单个网络密钥,且所有从此密钥导出的相关值都能被快速导出。
与应用密钥一样,网络密钥也用于派生网络密钥标识符(见第 3.8.6 节 ) 。
安全模型定义了三个单独的密钥(设备密钥(DevKey),应用密钥(AppKey)和网络密钥(NetKey))来保护消息。当一个节点被给予一个密钥时,它被授权使用该密钥。在多个节点之间共享的密钥使任何具有该密钥的节点能够使用该密钥发送和接收消息。
设备密钥(device key)便于配置客户端和单个节点之间的密钥材料的机密性和身份验证(confidentiality and authentication)。应用程序密钥便于在预定节点之间发送的应用程序数据的机密性和身份验证。网络密钥便于网络消息的隐私性,机密性和真实性。节点可能具有单个设备密钥,多个应用密钥和多个网络密钥的知识。
设备密钥类似于应用密钥,因为其设计用于保护上层传输层中的应用发送的信息。但是,设备密钥仅由配置客户端和单个节点知道。Configuration Client知道所有节点的设备密钥,这允许Configuration Client通过发送这些用每个单独节点的设备密钥保护的密钥来安全地将密钥分发给一组节点,从而允许密钥分发仅针对那些需要知道的节点。设备密钥的使用旨在防止“垃圾桶(trash-can)”攻击(一种从丢弃的设备中检索信息的技术,可用于对网络执行攻击),方法是允许仅限选定的设备分发新的网络和应用程序密钥。
应用程序密钥只能与单个网络密钥一起使用。这意味着网络密钥有一个或多个与之相关的应用密钥。这种关联(association)被称为密钥绑定(key binding)。
访问层安全的粒度基于每个模型。每个服务器模型(server model)都有一组绑定的应用程序密钥,用于定义应该用于加密和验证要由模型处理的消息的可能密钥。这允许多个实体操作某些节点功能。最多可以将251个应用程序密钥绑定到模型。例如,Light Lightness服务器模型有三个密钥绑定到它,因为管理员,用户和来宾都可以打开灯光。但是,只有管理员可以配置指示灯,因此配置服务器模型(Configuration Server Model)只有管理应用程序密钥绑定到它。
2.3.9.2 混淆
网络安全模型利用称为混淆(obfuscation)的隐私机制,该机制利用AES使用私钥对源地址,序列号和其他头信息进行加密。混淆的目的是使跟踪节点更加困难。
2.3.9.3 网络和应用程序密钥标识
一个节点可能有多个网络或应用程序密钥。
通过使用密钥标识符,可以识别哪个密钥子集(subset of keys)用于保护消息。例如,节点可能只需要检查密钥标识符具有相同最低有效位的两个密钥,而无需检查20个密钥。如果收到的消息中有一个未知的密钥标识符,则该节点可以立即丢弃该消息。
密钥标识符是使用密钥派生函数从网络或应用密钥生成的。
该规范为网络密钥和应用密钥定义了一个单独的标识符。网络密钥标识符使用7位值在每个网络PDU中传送,而应用密钥标识符使用6位值在每个低层传输层(Lower Transport)PDU中传送。
2.3.9.4 初始化向量索引
一个网络PDU包含一个24位序列号,允许一个元件发送16,777,216个网络PDU。序列号用于安全随机数(security nonce)以提供唯一性;因此序号不能换行。如果某个元件以2 Hz发送新消息,那么这些序列号将在97天后耗尽。为了使Mesh网络能够运行比序号空间允许的更长时间段,定义了一个附加的4字节值,称为IV索引(IV Index),该值包含在安全随机数(security nonce)中。例如,使用相同的2Hz消息频率将在数十亿年内使用IV索引来测量网络的生命周期。
为了实现从一个IV索引到下一个索引的逐步过渡,每个网络PDU包括用于传输该消息的IV索引的最低有效位。节点还可以使用IV更新过程(IV Update procedure)向对等节点发信号通知它正在更新IV索引。此过程至少需要八天时间才能从旧IV索引转换到新IV索引,从而将节点发送消息的频率限制在24 Hz内。但是,节点不应在任何10秒的窗口内发送超过100个网络PDU,因此通常需要耗费大约19天的时间。
2.3.10 Friendship
低功耗节点使用Friendship来限制他们需要收听的时间。如果一个节点不能连续接收,那么它可能不会收到它应该处理的Mesh消息。这包括维护网络安全所需的安全更新以及正常的Mesh消息。
如果低功耗节点没有收到这样的消息,那么它可能无法按预期运行,并且它也可能无法保持最新的网络安全状态,并且如果在它不知道的情况下更改了此安全性,它最终会退出网络。
Friendship是一个低功耗节点和一个邻居Friend节点(Friend node)之间的特殊关系。这些节点必须位于彼此的单跳内并处于同一子网内。
Friendship首先由低功耗节点建立和发起;一旦建立,Friend节点将执行一些操作,以帮助降低低功耗节点上的功耗。Friend节点为低功耗节点维护一个Friend Queue,该节点存储发往低功耗节点的所有传入消息。当低功耗节点请求时,Friend节点将这些消息传递给低功耗节点。另外,Friend节点将安全更新传递给低功耗节点。
当在低功耗节点和一个Friend节点之间建立Friendship时,这两个节点被认为是“Friend”。
Friend节点可以是多个低功耗节点的Friend。低功耗节点只能是单个Friend节点的Friend。
图 2.3.12中 显示并描述了一个说明Friend节点和低功耗节点的Mesh网络的示例拓扑 。
2.3.11 特性
节点的功能取决于它们支持的特性。所有节点都有能力发送和接收Mesh消息。节点还可以选择支持一个或多个附加特性:
- 中继(Relay)特性 - 通过广告Bearer接收和转发Mesh消息以启用大型网络的能力。
- 代理(Proxy)特性 - 在GATT和广告Bearer之间接收和转发Mesh消息的能力。
- 低功耗特性 - 只在支持Friend功能的节点支持下就能在Mesh网络中运行并大幅降低接收器占空比的能力。
- Friend特性 - 通过存储指向这些节点的消息来帮助支持低功耗功能的节点进行操作的能力。
支持某个特性的节点可能启用或禁用该特性,并且特性启用时,可能正在使用或未使用。
支持中继(Relay)特性的节点可能禁用了此功能,但它仍然可以支持中继功能,只是它没有执行该特性所需的功能。支持中继特性并启用中继特性的节点称为中继节点。
支持代理特性的节点可能禁用了此特性,但它仍然可支持代理特性,只是它没有执行该特性所需的功能。支持代理特性并启用代理特性的节点称为代理节点。
支持低功耗特性的节点不能禁用此特性,并且必须与支持Friend特性的其他节点建立Friendship,然后才能使用低功耗特性来减少接收器占空比。支持低功耗特性并与支持Friend特性的节点建立Friendship的节点称为低功耗节点。
支持Friend特性的节点可能禁用了此特性,但它仍然可以支持Friend特性,只是它没有执行该特性所需的功能。支持Friend特性的节点启用了Friend特性,并且与支持Low Power特性的节点之间具有Friendship的节点被称为Friend节点。
2.3.12 拓扑
支持上述各种特性的节点可以形成Mesh网络。图2.8 显示了Mesh网络的图示
如图2.8 所示 三个中继节点:Q,R和S.支持Friend功能的三个节点分别是N, O和P,但是N没有任何Friendship;因此只有O和P是Friend节点。有五个低功耗节点:I,J,K,L和M.节点I,J和K以P为Friend,而L和M以O为Friend。节点T仅使用GATTBearer连接到Mesh网络;因此S必须将所有消息中继给T.
例如,如果消息要从T发送到L,则T将使用GATTBearer将消息发送到节点S.节点S将使用广告Bearer重传此消息。节点H,R,N和O在节点S的无线电范围内;因此他们会收到此消息。作为节点L的Friend的节点O将存储该消息,并且如果该消息是分段消息,则节点O将在下层传输层处用确认进行响应。稍后,L将轮询节点O以检查新消息,使得O将T最初发送的消息转发给L.
2.4 Mesh网关
Mesh网关是能够在Mesh网络和非蓝牙技术之间转换消息的节点。节点可能能够通过Mesh网关发送和接收Mesh消息,而不在任何中继节点的范围内。该转换超出了本规范的范围。
2.5 并发极限和限制(Concurrency limitations and restrictions)
受本规范约束的节点没有做并发极限或限制。
2.6 拓扑极限和限制(Topology limitations and restrictions)
与蓝牙低功耗传输一起使用时,本规范没有做拓扑极限或限制。