本文转载于:https://mp.weixin.qq.com/s?__biz=MzA4MTg3MTg2Mg==&mid=2651236896&idx=2&sn=5afe1fcd841d9beedc16220165f5c1f5&chksm=847c5cb9b30bd5af343a4467f4990b2f8969c3c41754a5db7fa43bcd535006cfea6cfc7140ae&mpshare=1&scene=1&srcid=0901lqCIs6GlSSeqTvNJbeDA#rd
这里只是为了方便学习,绝无抄袭之意!
原创2017-09-01 蓝牙技术联盟蓝牙技术联盟
Hi, 亲爱的开发者朋友及蓝牙爱好者们,又见面啦!本周跟大家分享解密蓝牙mesh系列第四篇,(点这里查看第一篇、第二篇和第三篇文章)同时也是蓝牙mesh网络基本概念的第二部分,快来阅读吧~
借助蓝牙mesh,您将能够创建大型网络并支持成千上万的设备之间进行安全、可靠的通信。在“蓝牙mesh网络基础概念”第一篇中,我们探讨了蓝牙mesh网络的一些基本概念,包括节点(node)、元素(element)、模型(model)和状态(state)。在本文中,我们将探讨寻址、消息、发布、订阅和列表,并详细介绍这些核心概念如何相互交织并构成蓝牙mesh网络。
蓝牙mesh架构
蓝牙mesh运行于低功耗蓝牙协议栈的顶部。下方的图1概述了蓝牙mesh协议栈,并定义了每层的功能。(关于每层mesh协议栈的定义,详见第二篇)
图 1 – 蓝牙mesh架构
正如我们在第一篇中所讨论的,节点(如照明装置、温控设备、制造设备和电动门)是蓝牙mesh网络中能够发送、接收或中继消息的设备。消息(message)用于在节点之间传输数据,地址(address)用于定义消息源(source)地址和目的(destination)地址。
地址(Address)
地址有四种类型,其中的三类用于消息的传送:单播(unicast)、虚拟(virtual)和群组(group)地址。第四种被称为未分配(unassigned)地址。地址长度为16位,并按下述定义进行编码(图2)。
图2 - mesh地址编码
未分配地址(Unassigned Address)
未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,它们不会用于消息的传送。
单播地址(Unicast Address)
在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。发送到单播地址的消息只能由一个元素进行处理。
虚拟地址(Virtual Address)
虚拟地址是与特定的UUID标签相关联的一组元素;这些地址可能会被发布或订阅。UUID标签是与多个来自一个或多个节点的元素相关联的128位值。
对于虚拟地址,15和14位分别设置为1和0(图2);13 – 0位被设置为散列值(hash value)(提供16,384个散列值)。散列(hash)来自于Label UUID。使用订阅元素(subscribing element)来检查完整的128位UUID是十分低效的,特别当UUID跨越多个消息段时更为低效。散列值提供了一种更为有效的方式来确定哪些消息被发送至哪些元素。
群组地址(Group Address)
群组地址是蓝牙mesh网络中的另一种多播地址(multicast address),它通常代表一个或多个节点中的多个元素,包含两种类型:
动态分配的地址(Dynamically Assigned) -> 0xC000-0xFEFF
固定地址(Fixed Address) – 由蓝牙技术联盟分配,分为五段:
保留供将来使用 (RFU) –> 0xFF00-0xFFFB
All-proxies -> 0xFFFC
发送到启用代理(proxy)功能的所有节点
All-friends -> 0xFFFD
- 发送到启用friend功能的所有节点
All-relays -> 0xFFFE
- 发送到启用中继(relay)功能的所有节点
All-nodes -> 0xFFFF
- 发送到所有节点
发送到固定节点的所有消息都由节点的主元素(primary element)
进行处理
消息(Message)
蓝牙mesh网络通过消息进行通信。消息可以分为控制消息和接入消息。
控制消息(Control Message) - 与蓝牙mesh网络操作有关的消息,例如心跳(heartbeat)和friend的请求消息。
接入消息(Access Message) - 该类消息允许客户端模型检索或设置服务器模型中的状态值,或被服务器用于报告状态值。
模型可实施并定义节点的功能。元素是节点内唯一可被寻址的实体(节点中可包含一个或多个模型),并由状态(state)定义元素的状况变化。对于每个状态,都有一组服务器模型支持的消息。例如请求状态值或请求改变状态的客户端模型、以及发送状态或状态改变相关消息的服务器模型。
消息可被操作码(opcode)识别,并具有相关参数。操作码可识别消息的操作。示例包括:
Generic OnOff Get – 用于为通用模型识别OnOff状态Generic
OnOff Get不具有参数
Generic OnOff Set – 用于设置通用模型的OnOff状态
参数:
OnOff – 目标值(开或关)
TID – 事务标识符(Transaction Identifier)– 消息是新的还
是转发的
转换时间(Transition Time)– 元素从一种状态转换到另一种
状态所需时长
延迟(Delay)– 消息执行延迟
接入消息分为两类:经确认的(acknowledged)和未经确认的(unacknowledged)。经确认的消息被发送至每个接收元素,并经其确认。响应通常为状态消息。对于未经确认的消息则不作出响应。例如蓝牙mesh网络的状态消息就是一种未经确认的消息。
消息安全
所有蓝牙mesh网络消息的安全保障都来自网络密钥(NetKey)和应用密钥(AppKey)对消息的加密和验证。NetKey用于网络层通信。假设蓝牙mesh网络没有子网,则该mesh网络内的所有通信都使用相同的网络密钥。
AppKey用于应用程序的数据。网络中的一些节点具有特定应用,并且根据应用的需要对一些潜在敏感数据的访问进行限制。这些节点具有特定的AppKey,并与特定应用相关联。会使用不同AppKey的领域通常包括安全(楼宇门禁、机房门禁和CEO办公室门禁)、照明(制造厂房、外部楼宇照明和人行道)和HVAC系统。
中继节点(relay node)(如灯泡或墙壁开关)通常具有有效的NetKey,能够在网络内中继敏感性消息。然而,这些节点无法访问各种限制区域(如楼宇控制或HVAC系统)的特定AppKey,,亦无法解密应用程序的数据。
消息交换
蓝牙mesh网络使用发布/订阅 (publish/subscribe) 模型来进行消息传输。生成消息的节点会发布消息。需要接收消息的节点会订阅它们所需的地址。消息可被发布至单播、群组或虚拟地址。
消息可以作为对其他消息的回复而发送,也可以作为非请求消息(unsolicited messages)被发送。当模型发送回复消息时,使用消息始发处的源地址作为目标地址。发送非请求消息时,模型将使用模型的发布地址作为目标地址。节点中的每个模型都有一个发布地址。
接收消息时,节点内模型(节点中可能存在多个模型)中的每个实例均可通过订阅方式从一个或多个群组或虚拟地址接收消息。
订阅消息的模型使用模型的订阅列表来定义用于接收消息的有效地址。当模型接收到消息时,模型将检查其订阅列表。当订阅列表上的地址设置为模型的元素单播地址或属于该节点的固定群组地址时,则视为一个匹配(match)。图3表示了接入消息的有效源地址和目标地址。
图 3 – 接入消息的有效源地址和目标地址
蓝牙mesh实体发布各种节点的状态时,无论其与发送数据的节点位置距离远近,整个蓝牙mesh网络中的系统均可订阅该数据。这就实现了网络一端的设备可通过低功耗无线消息与设施中的其他的管理者进行对话,而不受距离限制。
有关mesh的更多内容
蓝牙mesh网络凭借行业认可、全球互通性、成熟且可信赖的生态系统来创建工业级设备网络。现在对蓝牙mesh的基本概念已有进一步的了解,接下来就能够更深入地了解拓扑的复杂性。在后续的解密蓝牙mesh系列文章中,我们将探讨蓝牙mesh的安全(security)、启动配置(provisioning)、代理节点(proxy node)等,下周,不见不散~
截图: