“BLE-Mesh技术揭秘”的版本间的差异
(创建页面,内容为“蓝牙MESH的基本概念 蓝牙MESH是一个由蓝牙团体开发和发布的概要文件规范,该文档解释了蓝牙MESH的基本概念,并概述了…”) |
(→地址(Address)) |
||
(未显示2个用户的43个中间版本) | |||
第1行: | 第1行: | ||
− | + | 蓝牙技术是享誉全球的品牌之一,也是全世界应用最为普遍的无线通信技术之一。'''从2000年到现在,蓝牙技术已经广泛应用于数十亿台设备。就2016年而言,制造商的蓝牙设备出货量更是超过30亿台'''。 | |
− | + | 蓝牙的创新步伐从未停止。自面世以来,每一次改进都系统严谨,紧跟市场需求,一直支持和鼓励创新。 | |
+ | |||
+ | 蓝牙技术令人惊叹的故事还在继续着,蓝牙mesh网络翻开了最新篇章,'''150家蓝牙技术联盟会员公司都参与了mesh的创建'''。 | ||
+ | |||
+ | == 第一章节:Mesh介绍 == | ||
+ | 这是系列文章中的第一篇,将向您介绍蓝牙mesh网络。我们从两篇概述开始, 后续篇章中将更详细地探讨技术的各个方面。 | ||
+ | |||
+ | === 风格 OR 特性 === | ||
+ | 对蓝牙技术感兴趣的朋友一定有这样的习惯:定期查看蓝牙技术联盟采用的新版本。 | ||
+ | |||
+ | 通常,新版本为蓝牙提供附加特性,或者以某种方式改进现有功能。不管怎么说,蓝牙全新的“风格”已经面世;一款风格出众的蓝牙技术变体,将以完全不同的方式利用无线电,并针对一系列广泛的用例设计和应用进行了优化。 | ||
+ | |||
+ | '''蓝牙基础速率/ 增强资料速率(BR / EDR)是蓝牙发布的第一款风格''',旨在替代缆线连接,很快就成为无线音频市场的主宰,并推动了新型计算机外设(如无线鼠标和键盘)的发展。 | ||
+ | [[文件:BleMesh-蓝牙耳机.jpg|居中|750x750px|缩略图|蓝牙基础速率/ 增强资料速率(BR / EDR) 引发无线个人音频变革]] | ||
+ | '''随后登场的是低功耗蓝牙(Bluetooth Low Energy)'''。它经过优化,极大程度地减少了设备功耗,仅使用硬币大小的电池就能实现无线操作和通信,运行数年不在话下。 | ||
+ | |||
+ | '''低功耗蓝牙现已被广泛采用'''。如今很难找到不支持低功耗蓝牙的智能手机或平板电脑。健康、运动和健身器材,如运动追踪设备、以及智能手表等可穿戴设备,都有赖于低功耗蓝牙技术。这一款蓝牙风格可谓影响深远。 | ||
+ | [[文件:BleMesh-小米手环.png|居中|缩略图|750x750px|低功耗蓝牙是推动可穿戴设备发展的重要技术]] | ||
+ | |||
+ | '''“那么蓝牙mesh网络是蓝牙的全新风格呢?还是新特性呢?”''' | ||
+ | |||
+ | 其实'''两者都不是'''。现在就让我们来'''深入探讨一下这项惊人的、全新的蓝牙技术''',同时了解'''mesh与蓝牙其他形式之间的关系'''和'''自身工作原理'''。 | ||
+ | |||
+ | === 三大重要技术 === | ||
+ | 蓝牙BR / EDR和低功耗蓝牙是智能手机等设备上的常用技术,但是它们不会互相依赖对方的服务和功能。针对所有的意图和目的,这两款风格的蓝牙技术都能彼此独立工作。事实上,'''虽然他们能在同一台设备上很好地共存,但是使用蓝牙BR / EDR的设备与低功耗蓝牙设备之间却无法进行通信。'''对于它们来说,有彼此相伴固然开心,但彼此之间却没有对话。 | ||
+ | |||
+ | 相比之下,蓝牙mesh网络使用、并且依赖于低功耗蓝牙。'''低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈。''' | ||
+ | |||
+ | '''“蓝牙mesh并非无线通信技术,而是一种网络技术。”''' | ||
+ | |||
+ | 下图显示了蓝牙BR / EDR、低功耗蓝牙和蓝牙mesh之间的关系。 | ||
+ | [[文件:BleMesh-蓝牙mesh与低功耗蓝牙之间的关系.png|居中|缩略图|750x750像素|蓝牙mesh和低功耗蓝牙之间的关系]] | ||
+ | |||
+ | === 关于拓扑 === | ||
+ | 从最基本的层面来讲,蓝牙BR / EDR能够实现一台设备到另一台设备的连接和通信,建立“一对一”的关系,大多数人所熟悉的“配对”(pairing)一词就是这个意思。一些设备能够与其他设备建立多重“一对一”通信关系,并'''形成一种称为“微微网”(piconet)的hub/spoke拓扑''' 。 | ||
+ | [[文件:BleMesh-Carplay蓝牙链接.jpg|居中|缩略图|700x700像素|蓝牙BR / EDR和一对一拓扑]]但是低功耗蓝牙设备还能与其他设备形成“一对一”和hub/spoke关系,以无连接方式进行工作,其广播的数据,位于直接无线电传输围内的任何其他设备都可接收。'''这是“一对多”(1:m)的拓扑,其中m可以是一个非常大的数量!'''如果接收广播的设备本身不进行数据传输,那么广播设备的无线电频谱就仅仅是针对自己而言的,同时对于能够接收和利用其广播的其他设备数量没有明确的限制。'''蓝牙Beacon是这项功能的一个绝佳案例'''。 | ||
+ | [[文件:BleMesh-iBeacon应用.png|居中|缩略图|750x750像素|低功耗蓝牙的广播应用]] | ||
+ | '''蓝牙mesh能让我们建立无线设备之间的“多对多”(m:m)关系'''。此外,设备能够将数据中继到不在初始设备直接无线电覆盖范围内的其他设备。这样,mesh网络就能够跨越非常大的物理区域,并包含大量设备。 | ||
+ | [[文件:BleMesh-蓝牙Mesh多对多网络拓扑.png|居中|缩略图|750x750像素|BleMesh-蓝牙Mesh多对多网络拓扑]] | ||
+ | |||
+ | === 蓝牙Mesh的初衷 === | ||
+ | 对于满足日益普及的各种通信需求,mesh拓扑结构能提供最佳的方式,因此'''蓝牙mesh网络应运而生''','''典型的应用包括楼宇自动化和传感器网络等'''。这些通信需求包括: | ||
+ | # 覆盖面积广 | ||
+ | # 直联互通性 | ||
+ | # 监测和控制大量设备的能力 | ||
+ | # 经优化的、低功耗的 | ||
+ | # 有效利用无线电资源,有可扩展性 | ||
+ | # 与当前市场上的智能手机、平板电脑和个人电脑产品兼容 | ||
+ | # 符合行业标准,具有政府级安全性 | ||
+ | 虽然还有其他支持mesh拓扑的低功耗无线通信技术,但很多用户反馈显示,'''这些技术存在约束和限制,'''而且对于他们正在尝试解决的各种问题和希望创建的产品类型来说,也并非最佳选择。其他类似技术的问题包括低数据传输速率、在mesh上中继数据时的“跳数”限制、通常由无线电信道使用方式引起的可扩展性限制、以及按步骤更改mesh网络中设备组成的过程中出现的困难和延迟。 | ||
+ | |||
+ | 通常来说,'''其他mesh技术无法被标准智能手机、平板电脑和PC设备所支持,'''这是一个主要的限制因素。 | ||
+ | |||
+ | 创建符合行业标准的、基于低功耗蓝牙的mesh通信技术,就有可能满足他们的要求,同时没有相关的限制和约束。毕竟,'''互通性和能效是低功耗蓝牙最突出的特性'''。 | ||
+ | |||
+ | == 第二章节 Mesh网络基本概况 == | ||
+ | 在第一章节中,我们介绍了全新的'''蓝牙mesh网络技术'''。如果您还未阅读第一章节,建议先从头阅读,然后再进入第二章节。 | ||
+ | |||
+ | 本章节将介绍蓝牙mesh网络的基本概况,包括'''大型mesh网络中的消息传输方式'''、'''市场设备支持'''、'''安全性'''和'''mesh协议栈'''本身,在后续文章中也将继续探索这一技术方方面面的细节。 | ||
+ | |||
+ | === 以消息为中心的通信 === | ||
+ | '''蓝牙mesh网络使用发布/订阅 (publish/subscribe)消息系统'''。 | ||
+ | |||
+ | 设备可以将消息发送至特定地址,这些地址的名称和含义与用户能够理解的高级概念相对应,如“花园灯”(Garden Lights)。这被称为“发布”(publishing)。 | ||
+ | |||
+ | 设备经配置后,可接收由其他设备发送到特定地址的消息。这被称为“订阅” (subscribing) 。 | ||
+ | |||
+ | 当设备向特定地址发布消息时,订阅该地址的所有其他设备将收到该地址的副本,对其进行处理,并以某种方式作出回应。 | ||
+ | |||
+ | 想象一下花园里安装的一套户外灯, 每盏灯都已经过配置,以便其订阅“花园灯”消息。现在,想像一个蓝牙mesh电灯开关向“花园灯”地址发送了“开”的消息。没错,花园里的所有灯都会收到“ON”消息,并做出开灯的回应。 | ||
+ | |||
+ | 就是这么简单! | ||
+ | |||
+ | === 消息和设备状态 === | ||
+ | '''“状态” (state) 是蓝牙mesh网络中的一个关键概念'''。蓝牙mesh网络中的每台设备都具有一组独立的状态值,表示设备的某些状态。在花园灯的示例中,每盏灯都有一个状态值,表示设备当前是处于打开或关闭状态。通过发布一类在定义上意味着能够回应“开”或“关”状态值的消息,来改变状态值,蓝牙mesh电灯开关就能对灯泡进行控制。更改状态值会修改设备本身的物理状况,例如打开或关闭设备。 | ||
+ | |||
+ | 消息、状态、以及这些和其他概念相关的设备行为已被定义在规格中,称为“模型”(modules)。模型由蓝牙mesh设备实施。 | ||
+ | |||
+ | === 中继 === | ||
+ | '''得益于mesh网络,设备可以在非常广阔的区域中安装,同时彼此之间保持通信。'''想象一下购物中心、机场或办公大楼的占地空间有多广阔。因为存在墙壁和其他物理上的障碍物,楼宇中的设备可能无法与安装在同一楼宇远侧的设备、或临近楼宇中的设备建立直接的无线连接。而蓝牙mesh网络则能够将网络中的某些设备指定为“中继设备”,进而解决这一难题。 | ||
+ | |||
+ | '''中继设备能够转发从其他设备接收到的消息。'''在转发消息时,它们能够与位于初始消息发布设备无线范围以外的设备进行通信。消息可多次被中继,每一次中继即为一“跳”,最多可进行127跳,足以在一片广阔的物理区域中进行消息传输。 | ||
+ | [[文件:BleMesh-大型场馆中的Mesh中继.png|居中|缩略图|750x750像素|蓝牙 mesh网络在节点之间中继消息]] | ||
+ | |||
+ | === 管理型网络泛洪(Managed Flooding) === | ||
+ | '''蓝牙mesh网络采用一种称为“网络泛洪(flooding)”的方式来发布和中继消息。'''这意味着消息不会通过某一进程进行路由, 也不会沿着由一系列特定设备构成的特定路径来进行传输。相反,传输范围内的所有设备都会接收消息,负责中继的设备能将消息转发至其传输范围内的所有其他设备。 | ||
+ | |||
+ | “网络泛洪”这项技术在使用中往往是利弊参半。'''在蓝牙mesh网络的设计中,我们对此进行了针对性的优化,相信能够扬长避短'''。 | ||
+ | |||
+ | ==== 网络泛洪的优势 ==== | ||
+ | '''网络泛洪的优势在于无需特定设备专门扮演集中式路由器的角色。'''集中式路由器一旦发生故障,就可能会导致整个网络无法运行。没有特定的路由也可能对网络造成灾难性的影响,但这种情况也可以通过在mesh网络中采用网络泛洪的方法来避免。 | ||
+ | |||
+ | 网络泛洪的方式也意味着消息一般能够通过多重路径到达其目的地。'''这就构建了一个相当可靠的网络。''' | ||
+ | |||
+ | ==== 优化mesh网络 ==== | ||
+ | '''蓝牙mesh网络也采取了一系列措施,支持采用网络泛洪的方式,同时优化每台设备、甚至整体网络的能耗。''' | ||
+ | |||
+ | 所有数据包都包含一个称为TTL的字段,它可用于限制消息中继的跳数。由设备间歇性发送的心跳消息中包含的信息,能够让网络了解其拓扑结构、以及传到其他每台设备之间的跳数。这能够让设备将TTL设置为最佳值,从而避免不必要的中继操作。 | ||
+ | |||
+ | 每台设备都包含消息缓存,以确定自身是否已经中继过该消息。如果是,则会立即丢弃该消息,从而避免上层堆栈进行不必要的处理。 | ||
+ | |||
+ | 最有趣的是,功率非常受限的设备(例如由小型电池持续供电多年的传感器)可能被指定为“低功耗节点”。'''低功耗节点能够与一个或多个被指定为 “friends” 的设备协同工作。'''Friends并非功率受限,它可以作为低功耗节点,存储寻址到这一低功耗节点的消息,并且只有在低功耗节点需要时才传送消息。'''低功耗节点和“friends”之间的关系理所当然就称为“friendship”。''' | ||
+ | |||
+ | ==== “Friendship”具体如何运转? ==== | ||
+ | 下面我们从节能的角度来进行解读。 | ||
+ | |||
+ | 低功耗设备通常将大部分时间用于传输数据,例如传感器。每当温度低于或高于指定阈值时,传感器才会发送温度读数,这种情况也许每天只会发生两次。这种不频繁的传输方案本身就使这类设备保持相当低的能耗。 | ||
+ | |||
+ | ==== 但如果传感器需要不时地接收数据,又该怎么办呢? ==== | ||
+ | 例如,可能它需要确保网络中使用的安全密钥始终处于最新状态。或许需要根据季节修改这些温度阈值,采用不同的值。要使传感器直接接收消息,就需要开启无线电,以便数据接收。但大多数时候它什么都接收不到,但能量却会被消耗。 | ||
+ | |||
+ | 对设备来说,通过与“friends”的合作, 低功耗节点能够以合理的频率使用无线电来接收消息,但重要的是,相较于始终“聆听”所有消息,它能够以更低的频率工作,同时确保发送来的罕见事件也不会被遗漏。 | ||
+ | |||
+ | “Friends” 能帮助低功耗节点完成大量工作。它们能够为所服务的低功耗节点存储消息,并在低功耗节点明确要求的情况下向其提供消息,低功耗节点可按照自身的规划进行操作,从而最有效地利用无线电。 | ||
+ | |||
+ | === 市场上的蓝牙设备支持 === | ||
+ | 蓝牙mesh网络虽然推出不久,但'''低功耗蓝牙(Bluetooth Low Energy)'''却面世已久。 | ||
+ | |||
+ | '''那么市场上数十亿台设备呢?智能手机和平板电脑呢?它们能否访问蓝牙mesh网络?''' | ||
+ | [[文件:BleMesh-智能设备(手机)支持Mesh.png|居中|缩略图|750x750像素|低功耗蓝牙设备和mesh支持]] | ||
+ | 幸运的是,'''答案是YES!''' | ||
+ | |||
+ | '''蓝牙mesh网络会指定一台设备来扮演代理节点(proxy node)的角色。'''代理节点包含一项标准:低功耗蓝牙GATT服务,具有两个GATT特性,分别是mesh代理数据输入(Mesh Proxy Data In)和mesh代理数据输出(Mesh Proxy Data Out)。诸如智能手机等低功耗蓝牙设备均可使用这些特性,与mesh网络进行数据收发。 | ||
+ | |||
+ | '''这种mesh规格定义了一种代理协议(proxy protocol)''',同时通过代理节点的两个GATT特性交换的数据中包含代理协议PDU。 | ||
+ | |||
+ | 欲知代理节点的作用,请持续关注本系列后续文章~ | ||
+ | |||
+ | === 安全性 === | ||
+ | '''安全性是蓝牙mesh网络设计的核心,并且强制使用。''' | ||
+ | [[文件:BleMesh-蓝牙Mesh的安全.png|居中|缩略图|750x750像素|蓝牙mesh网络中强制性使用安全性]] | ||
+ | |||
+ | '''每个数据包都经过加密和认证'''。通过合理使用序列号能够防止中继攻击。在重要流程中使用不对称加密技术可防止中间人(Man-in-the-middle)攻击。同时针对利用废弃设备的垃圾桶攻击提供保护。'''必要时还会刷新安全密钥。''' | ||
+ | |||
+ | '''“安全分级考量”(Separation of Concerns)是蓝牙mesh网络安全性中体现的重要原则。'''网络的安全性,以及诸如照明、供暖、或实体建筑安全等个别应用的安全性彼此独立。可使用不同的安全密钥来保护网络层操作,例如中继、或保护特定应用的消息内容。论其结果,举例来说,由于灯泡和照明开关具有相同的应用密钥,因此灯泡能够全面访问照明开关所发送消息中的数据。但是,尽管相同的灯泡能够将来自蓝牙物理访问令牌的消息中继到前门中的锁,却无法阅读那些消息应用层的内容。 | ||
+ | |||
+ | 本系列的后续文章中也将详细介绍安全性。我们还将密切关注一个称为 '''“开通配置” (Provisioning)的安全流程,设备可通过这一流程变身为蓝牙mesh网络的一员。'''此外,我们还将探讨如何从网络中安全地删除设备,以及如何在有需要时刷新安全密钥。 | ||
+ | |||
+ | === 协议栈 === | ||
+ | '''蓝牙mesh网络引入了全新的协议栈'''。如之前所述,这一协议栈建立在低功耗蓝牙技术之上。下图描绘了'''协议栈的层级'''。 | ||
+ | [[文件:BleMesh-蓝牙Mesh协议栈.png|居中|缩略图|750x750像素|蓝牙mesh网络协议栈]] | ||
+ | 该规格是深入了解各层责任的最佳方式。为帮助您更好地了解其工作原理,以下列出了协议栈各层负责的工作: | ||
+ | * '''承载层(bearer layer)''':承载层定义了如何使用底层低功耗堆栈传输PDU。目前定义了两个承载层:广播承载层(Advertising Bearer)和GATT承载层。 | ||
+ | * '''网络层(network layer)''':网络层定义了各种消息地址类型和网络消息格式。中继和代理行为通过网络层实施。 | ||
+ | * '''底层传输层(lower transport layer)''':在需要之时,底层传输层能够处理PDU的分段和重组。 | ||
+ | * '''上层传输层(upper transport layer)''':负责对接入层进出的应用数据进行加密、解密和认证。它还负责称为“传输控制消息”(transport control messages)这一特殊的消息,包括与“friendship”相关的心跳和消息。 | ||
+ | * '''接入层(access layer)''':负责应用数据的格式、定义并控制上层传输层中执行的加密和解密过程,并在将数据转发到协议栈之前,验证接收到的数据是否适用于正确的网络和应用。 | ||
+ | * '''基础模型(foundation models)''':基础模型层负责实现与mesh网络配置和管理相关的模型。 | ||
+ | * '''模型(models)''':模型层与模型等的实施、以及诸如行为、消息、状态等的实施有关。 | ||
+ | |||
+ | === 蓝牙mesh网络的未来 === | ||
+ | 我们期待蓝牙mesh网络广泛应用于各行各业和各种应用,预计最初会从'''楼宇自动化、商业照明和传感器网络'''等应用开始。尤其令人兴奋的是'''蓝牙mesh网络在商业照明方面的应用'''。试想一下,有了正确的固件,照明系统能实现的就不仅是无线灯光控制,还能够成为楼宇中各种蓝牙服务的平台,如物资跟踪和定位服务! | ||
+ | |||
+ | == 第三章节:Mesh网络基本概念 == | ||
+ | 无论您想采用智能照明、温控和安全系统让家庭和办公室变得更加智能,还是想提高工业无线传感器网络(IWSN)的效率,'''蓝牙mesh网络都能为您与环境的交互开启全新的机遇。''' | ||
+ | |||
+ | 蓝牙mesh网络为创建大型设备网络奠定了基础,让成千上万的无线设备彼此之间可靠安全地进行通信。本文将深入探究这一创新网络拓扑背后的基本概念。 | ||
+ | |||
+ | 蓝牙mesh运行于低功耗蓝牙协议栈的顶部。下方的图1概述了蓝牙mesh协议栈,并定义了每层的功能。[[文件:BleMesh-蓝牙Mesh架构-分层说明.png|居中|缩略图|750x750像素|蓝牙mesh架构]] | ||
+ | |||
+ | === 节点(Node) === | ||
+ | 想象一下由数千台设备组成的网络,每台设备均通过低功耗蓝牙(LE)无线连接进行通信。'''蓝牙mesh网络中的这些设备被称为节点 (node) 。'''每个节点都能发送和接收消息。信息能够在节点之间被中继,从而让消息传输至比无线电波正常传输距离更远的位置。这样的节点网络可以被分布在制造工厂、办公楼、购物中心、商业园区以及更多环境中。 | ||
+ | [[文件:BleMesh-蓝牙节点Node.png|居中|缩略图|600x600像素|mesh网络中的节点]] | ||
+ | '''蓝牙mesh节点非常多样化,有助于在mesh网络中实现多重功能。'''照明器具、机械设备、安防摄像机、烟雾探测器和环境传感器仅仅是节点能实现的几个例子。 | ||
+ | |||
+ | === 元素(Elements) === | ||
+ | 一些节点(如传感器)的电池有可能会被耗尽,而其他节点(如照明设备、制造机械和安防摄像机)则会通过主电网来获取电力。一些节点的处理能力会高于其他节点。这些节点在mesh网络中可承担更为复杂的任务,扮演不同的角色,表现出'''以下四个节点特征(Features)''': | ||
+ | # '''低功耗 (Low-Power) 特性''',功率受限的节点可能会利用低功耗特性来减少无线电接通时间并节省功耗。同时低功耗节点(LPN)可以与friend节点协同工作。 | ||
+ | # '''Friend 特性''',功率不受限的节点很适合作为friend节点。Friend 节点能够存储发往低功耗节点(LPN)的消息和安全更新;当低功耗节点需要时再将存储的信息传输至低功耗节点。 | ||
+ | # '''中继 (Relay) 特性''',中继节点能够接收和转发消息,通过消息在节点之间的中继,实现更大规模的网络。节点是否能够具备这一特性取决于其电源和计算能力。 | ||
+ | # '''代理 (Proxy) 特性''',代理节点能够实现GATT和蓝牙mesh节点之间的mesh消息发送与接收。承担这一角色的节点需要固定的电源和计算资源。 | ||
+ | '''一些节点的复杂性高于其他节点,由多个称为元素(Element)的独立部分组成。'''每个节点至少拥有一个元素,称为主元素(Primary Element),同时还可能包含其他多个元素。'''元素由定义节点功能和元素条件的实体组成。'''例如,一个灯泡内有一个元素, 并具有两种功能:<syntaxhighlight lang="bash"> | ||
+ | 节点 = 灯泡 | ||
+ | 一个元素 = 主元素 | ||
+ | 节点功能 | ||
+ | - 开/关 | ||
+ | - 亮度 | ||
+ | 元素条件/状态 | ||
+ | - “开”或“关” | ||
+ | - 0 – 10 (亮度等级) | ||
+ | </syntaxhighlight> | ||
+ | [[文件:BleMesh-节点与元素的关系.png|居中|缩略图|600x600像素|节点必须至少有一个元素,也可能包含多个元素]] | ||
+ | 节点中的每个元素都有一个唯一的地址,称为单播地址(unicast address),使每个元素都有址可寻。我们将在后续的解密蓝牙mesh系列文章中进一步解释“寻址”。 | ||
+ | |||
+ | === 模型 (Model) 和状态 (State) === | ||
+ | 无论节点位于制造厂房、酒店、办公楼、还是商业园区的网络中,节点的基本功能都由模型 (Model) 来定义和实施。模型位于元素内,元素必须具有至少一个模型。'''模型能够定义并实施节点的功能和行为,而状态 (State) 能够定义元素的条件'''。 | ||
+ | [[文件:BleMes-元素与模型.png|居中|缩略图|600x600像素|节点、元素、模型以及状态之间的关系]] | ||
+ | 以灯泡为例,该模型的功能是开关和调节亮度。相关的状态分别为“开”/ “关”和0-10:<syntaxhighlight lang="bash"> | ||
+ | 模型 (节点功能) | ||
+ | 1. 开/关 | ||
+ | 状态 -> “开”或“关” | ||
+ | 2. 亮度 (0-10) | ||
+ | 状态 -> 0-10 | ||
+ | </syntaxhighlight>蓝牙mesh支持复合状态,即由两个或多个值组成的状态。变色灯就是这样的一个例子,色调可以不受颜色饱和度或亮度的局限而改变。 | ||
+ | |||
+ | '''“绑定状态” (Bound State) 这一术语的定义源自一种状态的变化导致另一状态变化的情况。'''级别状态和开/关状态通常就相互绑定。如果级别从0变为1,则“开/关”的状态也从“关”变为“开”。 | ||
+ | |||
+ | 每个模型都有唯一的标识符。蓝牙技术联盟采用16位的模型,而供应商采用32位(其中包含蓝牙技术联盟指定的16位公司标识符以及16位供应商指定的模型标识符)。'''这确保了每个模型的地址都独一无二并且能确定被寻址到。''' | ||
+ | |||
+ | '''蓝牙mesh网络可借助消息,通过客户端 - 服务器架构进行通信。'''服务器的功能是暴露元素的状态。最简单的状态之一是二进制开关,其中状态为“开”或“关”。简单的服务器模型是通用开/关服务器模型 (Generic On/Off Server Model) ,其中包含表示开关开启或关闭的状态。 | ||
+ | |||
+ | 客户端可对状态进行访问,请求、更改或使用服务器的状态。举例来说,一个简单的客户端模型就是通用开/关客户端模型(Generic On/Off Client Model)(二进制开关)。通用开/关客户端模型通过发送消息来控制通用开/关服务器模型。例如,客户端可利用这一机制开启或关闭指示灯。 | ||
+ | |||
+ | '''这种客户端 - 服务器架构产生了三种类型的模型:''' | ||
+ | # 服务器模型 (Server Model) | ||
+ | #* 由至少一个或多个状态跨越一个或多个元素的状态组成 | ||
+ | #* 定义模型能够发送/接收的消息,并根据这些消息定义元素的行为 | ||
+ | #* 实例: | ||
+ | #** 🔶开/关切换——客户端发送打开或关闭的消息 | ||
+ | #** 🔶 传感器——可以暴露传感器的状态(可能为温度值或传感器测量的“满”、“待充”或“空”的结果) | ||
+ | #** 🔶 功率级别——可以暴露电源状态(等级1-10) | ||
+ | # 客户端模型(Client Model) | ||
+ | #* 定义客户端为请求、更改或使用服务器相应状态所使用的消息。 | ||
+ | #* 实例: | ||
+ | #** 🔶 开/关切换——客户端发送打开或关闭的消息 | ||
+ | #** 🔶 电源级别——定义电源状态的消息(0-10) | ||
+ | # 控制模型 (Control Model) | ||
+ | #* 控制模型具有多种功能,同时可能包含一个或多个: | ||
+ | #** 🔶 客户端模型 (Server Model) | ||
+ | #** 🔶 服务器模型 (Client Model) | ||
+ | #** 🔶 控制逻辑(规则和行为)用于协调与其相连模型之间的交互。 | ||
+ | #* 实例:控制模型可用在支持机器周围循环的液体冷却剂水泵上。 | ||
+ | #** 🔶 应用场景——温度传感器会记录机器的温度。如果机器超过设定的温度,冷却泵则会被打开。 | ||
+ | #** 🔶 冷却泵的控制模块 (Control Module) | ||
+ | #*** ▷ 与温度传感器相连的客户端(用于接受温度值) | ||
+ | #*** ▷ 连接到开/关切换的服务器(用于打开或关闭水泵) | ||
+ | #*** ▷ 控制逻辑(规则和行为)— 负责定义如果温度传感器超过设定值,则打开水泵。 | ||
+ | '''模型的定义能让您在mesh网络中对节点及其功能进行配置。'''模型定义以及其他模型的概念将会在后续文章中进一步详细介绍。 | ||
+ | |||
+ | '''蓝牙mesh网络凭借行业认可、全球互通性、成熟且可信赖的生态系统来创建工业级设备网络。'''现在您已经初步了解蓝牙mesh背后的一些基本概念,下一章节将介绍有关蓝牙mesh网络基础知识的概述,包括寻址、发布/订阅、消息、列表、以及如何结合这些知识共同创建蓝牙mesh网络。 | ||
+ | |||
+ | === 地址(Address) === | ||
+ | '''地址有四种类型,其中的三类用于消息的传送:单播(unicast)、虚拟(virtual)和群组(group)地址。第四种被称为未分配(unassigned)地址。'''地址长度为16位,并按下述定义进行编码。 | ||
+ | {| class="wikitable" | ||
+ | !取值 | ||
+ | !地址类型 | ||
+ | |- | ||
+ | |0b0000000000000000 | ||
+ | |Unassigned Address | ||
+ | |- | ||
+ | |0b0xxxxxxxxxxxxxxx(excluding 0b0000000000000000) | ||
+ | |Unicast Address | ||
+ | |- | ||
+ | |0b10xxxxxxxxxxxxxx | ||
+ | |Virtual Group | ||
+ | |- | ||
+ | |0b11xxxxxxxxxxxxxx | ||
+ | |Group Address | ||
+ | |} | ||
+ | |||
+ | ==== 未分配地址(Unassigned Address) ==== | ||
+ | 未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,'''它们不会用于消息的传送。''' | ||
+ | |||
+ | ==== 单播地址(Unicast Address) ==== | ||
+ | 在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。'''发送到单播地址的消息只能由一个元素进行处理。''' | ||
+ | |||
+ | ==== 虚拟地址(Virtual Address) ==== | ||
+ | '''虚拟地址是与特定的UUID标签相关联的一组元素''';这些地址可能会被发布或订阅。UUID标签是与多个来自一个或多个节点的元素相关联的128位值。 | ||
+ | |||
+ | 对于虚拟地址,15和14位分别设置为1和0;13 – 0位被设置为散列值(hash value)(提供16384个散列值)。散列(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表示了接入消息的有效源地址和目标地址。 | ||
+ | {| class="wikitable" | ||
+ | !地址类型 | ||
+ | !有效源地址 | ||
+ | !接入消息的有效目的地址 | ||
+ | |- | ||
+ | |Unassigned Address | ||
+ | |No | ||
+ | |No | ||
+ | |- | ||
+ | |Unicast Address | ||
+ | |Yes | ||
+ | |Yes | ||
+ | |- | ||
+ | |Virtual Group | ||
+ | |No | ||
+ | |Yes | ||
+ | |- | ||
+ | |Group Address | ||
+ | |No | ||
+ | |Yes | ||
+ | |} | ||
+ | 蓝牙mesh实体发布各种节点的状态时,无论其与发送数据的节点位置距离远近,整个蓝牙mesh网络中的系统均可订阅该数据。'''这就实现了网络一端的设备可通过低功耗无线消息与设施中的其他的管理者进行对话,而不受距离限制。''' | ||
+ | |||
+ | === 结束语 === | ||
+ | '''蓝牙mesh网络凭借行业认可、全球互通性、成熟且可信赖的生态系统来创建工业级设备网络。'''现在对蓝牙mesh的基本概念已有进一步的了解,接下来就能够更深入地了解拓扑的复杂性。在后续的解密蓝牙mesh系列文章中,我们将探讨蓝牙mesh的安全(security)、启动配置(provisioning)、代理节点(proxy node)等 | ||
+ | |||
+ | == 第四章节:Mesh网络“友谊”篇 == | ||
+ | 随着蓝牙mesh网络的推出,开发者可能很想知道蓝牙mesh网络是如何为低功耗节点设计的,蓝牙mesh网络采取了多种优化功耗的措施,特别包括一项称为'''“friendship” (友谊)''' 的特性。 | ||
+ | |||
+ | === 概述 === | ||
+ | '''蓝牙mesh网络中“friendship”(友谊)特性的应用可能非常多样化。'''一些如照明功能的产品会与主电源(国家电网)相连接,那么相较于照明本身的功耗,蓝牙mesh模块的功耗就可忽略不计。但其他产品,如智能传感器或智能锁,就会在供电方式上功耗受限,这意味着它们需要通过小型电池或能量采集技术来供电。这些产品最有可能利用到蓝牙mesh网络的友谊概念。 | ||
+ | |||
+ | 我们知道'''节点(Node)是已经启动配置(Provision)并成为mesh网络中一员的设备。'''节点具有与其产品类型相关的功能,但也可具有与网络本身操作相关的功能并在其中扮演特定角色。而这取决于其所支持的mesh网络特性。所有节点都能够在网络中发送并接收mesh消息,此外还可以选择性地支持一个或多个其他网络特性,如下所列: | ||
+ | * '''中继(Relay)特性:'''通过广播承载层接收并重新发送mesh消息、以构建更大规模网络的能力。 | ||
+ | |||
+ | * '''代理(Proxy)特性:'''在GATT和广播承载层之间接收并重新发送mesh消息的能力。 | ||
+ | |||
+ | * '''低功耗(Low-Power)特性:'''能够以明显较低的接收端占空比在mesh网络中运行。通过将无线电接收器启用时间最小化可实现节点功耗的降低,只有在绝对必要时才启动接收器。低功耗节点(LPN)通过与好友(friend)节点建立友谊(friendship)关系来实现这一点。 | ||
+ | |||
+ | * '''好友(Friend)特性:'''通过存储发往LPN的消息,仅在LPN明确发出请求时才进行转发来帮助LPN运行的能力。 | ||
+ | 要了解'''“友谊”是如何帮助LPN降低功耗的''',我们可以先从传感器开始:'''传感器是一个很好的例子,它可以利用“友谊”,并被用作LPN。'''它们通常将绝大部分时间用于传输数据,且很少需要接收数据。传感器可能只有在温度超出一系列预设的限制时才会发送温度读数,而这种情况每天可能只会发生两次。正是这种不频繁的数据传输才使得此类设备的能耗使用维持在较低水平。 | ||
+ | |||
+ | 但如果需要根据季节将这些温度限制修改为不同的值,同时需要通过向传感器发送配置消息来实现这些限制的修改呢?传感器若想直接接收此类消息,就需要开启无线电进行收听。大多数时间它什么也接收不到,却在消耗能量。 | ||
+ | |||
+ | 因此,'''与好友节点的合作能够使低功耗节点(LPN)规划对无线电的使用,以适当或更低的频率接收消息而无需一直保持收听'''。低功耗节点会对好友节点进行轮询(Poll),查看是否有新消息(好友节点只会间或地对新消息进行存储)。功耗就是通过上述步骤得到节省的。 | ||
+ | |||
+ | === 好友(Friend)和低功耗节点(LPN) === | ||
+ | 低功耗节点(LPN)必须与支持“好友”特性的另一节点建立“友谊”(friend)关系,以减少其接收器占空比(Duty Cycle)并节约能耗。图1来自蓝牙mesh配置文件规格,主要描绘了低功耗节点和好友节点之间的关系,具体如下: | ||
+ | [[文件:BleMesh-蓝牙Mesh拓扑结构.png|居中|缩略图|750x750像素|mesh网络的拓扑结构示例]] | ||
+ | 好友节点P与低功耗节点 I、J和K为“友谊”关系。好友节点O与低功耗节点 L和M为“friendship”关系。因此,寻址到节点I、J或 K的消息将被好友节点P存储并转发。寻址至节点L或M的消息将被好友节点 O存储和转发。好友节点的转发仅在低功耗节点轮询好友节点以获得等待传送的消息时才会发生。 | ||
+ | |||
+ | === 友谊(Friendship)参数 === | ||
+ | '''低功耗节点需要找到好友节点,与其建立“友谊”关系。所涉及的流程称为“友谊建立”。'''我们稍后会探讨此流程。在此之前,先介绍一些有关对LPN行为进行管理的关键参数,这些参数被设定于友谊建立过程中。 | ||
+ | |||
+ | '''1.''' ReceiveDelay是从LPN向好友节点发送请求,到其开始收听响应中间经过的时间。这让好友节点有时间做好响应的准备,并将响应发回。 | ||
+ | |||
+ | '''2.''' ReceiveWindow 是LPN用于收听响应的时间。图2描述了涉及ReceiveDelay和ReceiveWindow的时序。 | ||
+ | [[文件:BleMesh-ReceiveDelay和ReceiveWindow时序.png|居中|缩略图|750x750像素|ReceiveDelay和ReceiveWindow时序]] | ||
+ | '''3.''' PollTimeout设定了LPN发送给其好友节点的两个连续请求之间可能经过的最长时间。如果在PollTimeout计时器到时之前,好友节点未能收到LPN的请求,则友谊关系将被终止。 | ||
+ | [[文件:BleMesh-PollTimeout时序.png|居中|缩略图|750x750像素|BleMesh-PollTimeout时序]] | ||
+ | |||
+ | === “友谊”建立 === | ||
+ | 如果两个人想建立友谊,可能对视一眼就已足够! | ||
+ | |||
+ | 但对于蓝牙mesh网络中“友谊”的建立,还需要经过更多的步骤。 | ||
+ | # '''LPN发布一个“好友请求”(Friend Request)消息。'''该消息不会被中继,因此只有处于直接无线电范围内的好友节点才能处理该消息。不具有“好友”特性的节点会将消息丢弃。“好友请求” 消息包括LPN的ReceiveDelay、ReceiveWindow和PollTimeout参数。 | ||
+ | # 附近的好友节点若支持“好友请求”消息中特定的要求,'''将准备一个“Friend Offer”消息,并将其发送回LPN。'''该消息包括各种参数,包括支持的ReceiveWindow大小、可用的消息队列大小、可用的订阅列表(Subscription List)大小、以及由好友节点测量的RSSI值。 | ||
+ | # '''LPN接收到“Friend Offer”消息时,通过应用一种实施专用的算法来选择合适的好友节点'''。该算法可能会考虑到各种各样的情况。某些设备可能会优先考虑ReceiveWindow大小,以尽可能减少功耗;而有些设备则可能会更加关注RSSI值,以确保能够与好友节点保持高质量的链路。所采用的精确算法由产品开发者决定。 | ||
+ | # 选择好友节点之后,'''LPN将向好友节点发送一个“Friend Poll”轮询消息。''' | ||
+ | # 从LPN收到“好友轮询”(Friend Poll)消息后,'''好友节点会回复一个“Friend Update”更新消息''',完成“好友” 建立流程并提供安全参数。'''此时“友谊”得以建立。''' | ||
+ | [[文件:BleMesh-友谊的建立.png|居中|缩略图|750x750像素|友谊的建立]] | ||
+ | |||
+ | === 友谊(Friendship)消息传送 === | ||
+ | '''友谊建立之后,好友节点将LPN的所有消息存储在“好友队列”(Friend Queue)中''',这些消息就是我们所说的“ 被存储的消息 ”。下方的图4描绘的就是好友节点和关联LPN之间的消息交换。 | ||
+ | * 当好友节点收到一个寻址到该节点的LPN的消息时,'''好友节点会缓冲此消息,将其存储在称为“好友队列”的区域中。'''在图4中,我们可以看到,好友节点为LPN存储了消息1和2。 | ||
+ | |||
+ | * '''LPN会周期性地启用其收发器(transceiver),并向好友节点发送 “好友轮询” 消息''',询问是否存储有任何为其缓冲的消息。 | ||
+ | * 好友节点会先将一个被存储的消息发回至LPN作为对“好友轮询”(Friend Poll)的响应。 | ||
+ | |||
+ | * 在每次接收到来自好友节点的消息之后,LPN会将继续发送“好友轮询”消息,'''直到收到一条“MD(MD =更多数据)”字段设置为0的“好友更新”消息为止。'''这意味着已经没有为LPN缓冲的更多消息了。此时,LPN停止对好友节点的轮询。 | ||
+ | [[文件:BleMesh-友谊节点与LPN节点消息传递.png|居中|缩略图|750x750像素|友谊节点与低功耗节点的消息传递]] | ||
+ | |||
+ | === 安全性 === | ||
+ | 蓝牙mesh中,安全性保障无处不在,“友谊”也如此,它采用两种特殊的安全证书: | ||
+ | * '''主安全资料(Master Security Material):'''由网络密钥(NetKey)派生,可被同一网络中的其他节点使用。使用主安全资料加密的消息可被同一网络中的任何节点解码。 | ||
+ | |||
+ | * '''好友安全资料(Friend Security Material):'''由网络密钥(NetKey)、以及由低功耗节点(LPN)和好友节点生成的额外计数器号码派生而来。使用好友安全资料加密的消息只能由处理该消息的好友节点和LPN解码。 | ||
+ | '''LPN和好友节点使用的两种安全资料是怎样的呢?'''总结如下: | ||
+ | # '''使用好友安全材料加密的相应友谊消息:''' | ||
+ | #* 好友轮询(Friend Poll) | ||
+ | #* 好友更新(Friend Update) | ||
+ | #* 好友订阅列表(Friend Subscription List)添加/删除/确认好友节点发送至LPN的“被存储的消息” | ||
+ | # '''使用主安全资料加密的相应友谊消息:''' | ||
+ | #* 好友清除(Friend Clear) | ||
+ | #* 好友清除确认(Friend Clear Confirm) | ||
+ | 从LPN发送至好友节点的消息将根据应用设置,通过主安全资料或好友安全资料进行加密。 | ||
+ | |||
+ | === '''“友谊”终止''' === | ||
+ | “友谊”可在某些情况下终止: | ||
+ | * 如果在PollTimeout计时结束之前,好友节点未收到“ 好友轮询”、“好友订阅列表添加”或“好友订阅列表删除”消息,则友谊终止。 | ||
+ | |||
+ | * LPN可以通过将“好友清除”消息发送给好友节点,以启动友谊终止程序,“友谊”就会被好友节点终止。 | ||
+ | |||
+ | === 如何选择 === | ||
+ | 开发者在选择实施友谊节点和LPN低功耗节点时,应考虑遵循以下指南: | ||
+ | * '''RAM容量:'''可用的RAM容量直接影响一个 好友节点可支持LPN的数量、及其可为相关LPN缓冲多少个消息。 | ||
+ | |||
+ | * '''LPN:'''所选MCU和模块的通用功耗性能对于LPN很关键。 此外,从休眠模式到运行模式的唤醒/预热时间会影响LPN的响应速度和延迟。 | ||
+ | |||
+ | == 第五章节 设备管理 == | ||
+ | 蓝牙mesh网络好比是一个VIP俱乐部。如果您是这个俱乐部的会员,就可以随意进入,享受与会员类别相对应的设施和服务。如果您不是会员,便无论如何也过不了门卫这一关。 | ||
+ | |||
+ | '''蓝牙mesh设备有可能是某一特定蓝牙mesh网络的成员,也有可能不是。'''如果它是成员,则有权与同为该网络成员的其他设备进行通信(至少以一种基本的方式)。如果它不是成员,那么该设备'''传输的所有内容都将被网络中的其他设备忽略。''' | ||
+ | [[文件:BleMesh-蓝牙mesh设备管理.png|居中|缩略图|750x750像素|蓝牙mesh网络中的设备管理]] | ||
+ | |||
+ | 其实可以理解为蓝牙mesh设备也拥有不同的会员类型,例如可以使用某些特定的俱乐部服务设施(如健身房、高尔夫球场等),但不是全部。它只能与网络中的某些设备进行充分的交互。'''而对其进行管理的就是“应用”(application)这一概念。'''例如,蓝牙mesh照明开关可以在网络中打开或关闭蓝牙mesh照明灯,因为所有这些设备都是照明应用的一部分。而由于供暖系统并非照明应用的一部分,因此照明开关就无法打开供暖系统。 | ||
+ | |||
+ | 设备要想成为蓝牙mesh网络的成员,则必须经过一个称为“启动配置(provisioning)”的安全流程,将设备添加到网络中。 | ||
+ | |||
+ | === 安全性 === | ||
+ | '''安全性是蓝牙mesh网络的核心''',我们将在本系列的后续文章中详细介绍这一主题。将设备添加到蓝牙mesh网络、或从中移除设备的过程都将严格遵循安全性要求。 | ||
+ | |||
+ | 蓝牙mesh网络使用一套包含各类安全密钥的系统,从整体上保护网络,同时保护网络内的各个应用并将其彼此分离。拥有正确的安全密钥,设备才能成为网络成员并有权参与特定应用。'''网络中的所有节点(node)都拥有一个名为“网络密钥”或“NetKey”的密钥。'''只有设备拥有了这个密钥,才能成为该网络的成员,即成为其中的节点之一。 | ||
+ | |||
+ | === 命名法 === | ||
+ | 在解密蓝牙mesh系列之前的文章中(第一篇、第二篇、第三篇、第四篇、第五篇),我们介绍了“设备”(Device)和“节点”(Node)这两个正式的技术术语: '''作为mesh网络成员的设备称为“节点”,而不构成节点的设备就称为“设备”。'''本文将用英文首字母大写“D”的“设备(Device)”一词来代指非mesh网络成员的设备,用全部字母小写的“设备(device)”来代指一般的日常电子设备。 | ||
+ | |||
+ | === 启动配置设备(Provisioner) === | ||
+ | '''启动配置的流程会将普通的“设备(Device)”变身为“节点(Node)”,使其正式成为蓝牙mesh网络的成员。'''这一流程通常需要通过一个应用程序来实现,该程序一般由产品制造商所提供,可在智能手机或平板电脑上使用,但也可以采用其他形式,例如桌面或Web应用程序。 | ||
+ | |||
+ | '''运行启动配置应用程序的设备称为“启动配置设备(Provisioner)”''',由于它的作用至关重要,因此在物理上必须要保证它的安全性。 | ||
+ | |||
+ | === 启动配置协议(Provisioning Protocol) === | ||
+ | 在启动配置期间,启动配置设备会采用称为“启动配置协议”的蓝牙mesh协议,与将要被启动配置的设备进行通信。'''启动配置设备可通过PB-ADV或PB-GATT承载层'''[i]'''两者中的任何一个使用启动配置协议''',确保在较早版本的智能手机上亦可实施启动配置设备的应用程序,只要它们支持低功耗蓝牙(Bluetooth Low Energy)和GATT。 | ||
+ | |||
+ | === 向网络中添加新设备 === | ||
+ | 将设备添加至网络的过程中,'''最重要的一点是要为其提供网络所有其他节点拥有的网络密钥。'''当然,这一过程本身必须是安全的,这样恶意设备才无法窃取添加新设备时进行的通信,也无法窃取NetKey。 | ||
+ | |||
+ | 当购买了新的设备(Device)并需要将其添加至当前蓝牙mesh网络时,用户将使用启动配置设备( Provisioner),同时参考这一新设备制造商的说明,将其添加至蓝牙mesh网络。这样,新设备(Device)就变身为节点(Node),成为蓝牙mesh网络的成员。 | ||
+ | |||
+ | 该流程涉及几个步骤,见下方流程图: | ||
+ | [[文件:BleMesh-启动配置流程.png|居中|缩略图|750x750像素|启动配置流程图]] | ||
+ | |||
+ | ==== Beacon广播 ==== | ||
+ | 蓝牙mesh网络规格中介绍了新的GAP广播类型,包括 <<Mesh Beacon>> 广播类型[ii]。 | ||
+ | |||
+ | '''设备( Device)可采用<<Mesh Beacon>> 广播类型来发出广播,声明自己是未经启动配置的设备,可被启动配置。'''用户可能需要根据制造商的说明,按照一定的流程,例如键入一组按钮,或将某一按钮长按一段时间等,以此方式启动新设备的广播。 | ||
+ | |||
+ | '''用户还需要在启动配置设备中启动“添加设备到网络”的流程,以便从Beacon设备(Device)接收广播数据包。'''需要记住的一点是,启动配置设备可能是智能手机或平板电脑应用,因此在实际操作中会涉及到智能手机解锁、应用程序启动、也许还需要登录应用程序(为了进一步确保安全性),并通过其用户界面启动Beacon设备(Devices)搜寻。这样,启动配置设备就会意识到新设备(Device)的存在和准备就绪状态,可进入后续的启动配置流程。 | ||
+ | |||
+ | ==== 邀请(Invitation) ==== | ||
+ | 接下来,'''启动配置设备将以启动配置邀请PDU(Provisioning Invite PDU)的形式向要进行启动配置设备发送邀请,这是启动配置协议的一部分。'''Beacon设备会在启动配置功能PDU中回应有关自身的信息。 | ||
+ | |||
+ | 启动配置功能PDU可提供一系列信息,例如其所拥有的元素数量、所支持的启动配置相关算法等。它还能指示设备(Device)拥有的输入输出功能类型,这些信息将用于认证(Authentication)步骤。 | ||
+ | |||
+ | ==== 交换公共密钥(Public Key) ==== | ||
+ | '''包括启动配置设备在内的所有蓝牙mesh设备都支持FIPS P-256椭圆曲线算法,因此必须拥有公共密钥。'''可通过基于该算法的非对称加密来创建安全通道,以完成剩余的启动配置流程。为此,启动配置设备会与将被启动配置的设备(Device)交换公共密钥。'''需注意的是,将被启动配置的设备(Device)可以通过带外方式(Out of Band),例如QR码,来提供公共密钥。'''本系列的后续文章将重点讨论mesh安全性,包括启动配置的安全性。 | ||
+ | |||
+ | ==== 认证(Authentication) ==== | ||
+ | 启动配置设备基于对新设备(Device)功能的了解,向其发送消息,指示其输出单一或多位数值,对其所支持的多种用户操作(例如按下按钮)作出响应。值的形式会因设备差异而有所不同。一台设备可能会在LED面板上显示一个三位的数值,另一台设备则可能是红色LED灯闪烁几次,闪烁的次数就是输出的验证值。启动配置设备的用户将观察到设备(Device)输出的值,并将值输入启动配置设备的用户界面。 | ||
+ | |||
+ | 然后,'''设备(Device)和启动配置设备交换密码散列''',这些数据来源包括设备(Device)输出的随机值,'''允许它们完成对彼此的验证'''。 | ||
+ | |||
+ | ==== 启动配置数据的分配 ==== | ||
+ | '''认证成功完成之后,会通过两台设备的私有密钥(Private Key)和交换的对等公共密钥生成会话密钥(Session Key)。'''随后,会话密钥即可用于保护完成启动配置流程所需数据的后续分发,包括网络密钥(NetKey)和设备的唯一地址,即单播地址(Unicast Address)。 | ||
+ | |||
+ | 启动配置完成后,启动配置设备就会拥有网络的NetKey,这是一个称为“IV索引(IV Index)”的蓝牙mesh安全性参数,且拥有一个由启动配置设备分配的单播地址[iii]。'''至此,新设备就正式成为了节点,即成为蓝牙mesh网络中的一员。''' | ||
+ | |||
+ | === 向网络中添加新设备 === | ||
+ | 有时会需要从蓝牙mesh网络中移除节点。'''设备可能已经损坏并需要更换,或者可能需要将它移到另一蓝牙mesh网络''',如公司位于其他城市的另一个办公室。'''同样,设备可能已经被出售''',新的设备所有者可能会采用上述启动配置流程,将设备添加至自己的蓝牙mesh网络。 | ||
+ | [[文件:BleMesh-硬件损坏.jpg|居中|缩略图|750x750像素|设备有时会损坏]] | ||
+ | |||
+ | 如果设备故障无法修复,你可能只会想简单粗暴将它丢进垃圾桶。如果把某个设备卖给别人,同样你可能只会简单地想到收款,而忽略故障设备的问题。然而,这种做法并不明智。 | ||
+ | |||
+ | 节点包含通过启动配置流程提供的安全密钥。请记住,设备必须拥有主网络密钥(NetKey),通过这一点才能确定它是网络的成员、并有权访问网络。'''当您丢弃设备或将其出售时,如果还将蓝牙mesh网络的相关密钥留在其中,就可能导致网络遭受垃圾桶攻击。'''因此,这里所定义和描述的移除节点的安全程序,能够避免网络被攻击。 | ||
+ | |||
+ | '''从网络中移除节点涉及两个步骤:''' | ||
+ | # 首先,使用启动配置设备应用,将想要移除的节点添加至“黑名单”。 | ||
+ | # 其次,启动一项称为'''密钥刷新程序(Key Refresh Procedure)'''的流程。 | ||
+ | |||
+ | === 黑名单 === | ||
+ | 使用启动配置设备,用户必须将想要移除的节点添加至黑名单。黑名单的目的很简单,就是当启动密钥刷新程序时,确保新的安全密钥不会被发放至黑名单中的节点。 | ||
+ | |||
+ | === 密钥刷新程序 === | ||
+ | '''通过密钥刷新程序,除了黑名单中的节点,网络中的所有节点都会被发放新的网络密钥、应用密钥、以及所有相关衍生数据。'''也就是说,构成网络和应用安全性基础的整套安全密钥都会被替换。 | ||
+ | |||
+ | 用户可使用启动配置设备启动密钥刷新,启动配置设备会创建新密钥,并通过配置消息向mesh网络中的所有节点发送新密钥,但黑名单中的成员除外。 | ||
+ | |||
+ | 低功耗节点(Low Power Node)将从好友节点处接收到新密钥,因此它们可能需要经过相当长的一段时间才会接收到新密钥,随后整个网络将全部更换密钥。 | ||
+ | |||
+ | '''由于所有节点不会在同一时间接收到新密钥,因此密钥刷新程序定义了一个称为“第二阶段”的过渡周期,在此期间新旧密钥均可使用。'''具体来说,传输过程中会使用新密钥,但支持消息接收的节点会同时使用新旧密钥。 | ||
+ | |||
+ | 第二阶段完成之后,启动配置设备会通知所有节点废除它们的旧密钥。至此,黑名单之外的每个节点都收到了新密钥。 | ||
+ | |||
+ | 此时,从网络中移除的节点、以及包含旧网络密钥(NetKey)和旧应用密钥(AppKey)的节点将不再是网络中的成员,因此也无法构成任何威胁。 | ||
+ | |||
+ | === 结论 === | ||
+ | '''安全性是蓝牙mesh网络技术设计的核心。'''这在网络管理场景中的一些最基本的层面已有充分体现:向蓝牙mesh网络中添加或移除设备。 | ||
+ | |||
+ | == 第六章节 Mesh设备的兼容 == | ||
+ | 蓝牙mesh获得如此大的关注,很大一个原因是可以与智能设备的互通。本章节介绍mesh如何实现这一功能。 | ||
+ | |||
+ | === 低功耗蓝牙 === | ||
+ | 低功耗蓝牙(Bluetooth Low Energy)是一项相当成功的无线技术。如今已经很难找到不支持低功耗蓝牙的智能手机或平板电脑了。可以说它是可穿戴技术兴起的关键因素。'''在医疗设备、智能家居设备、传感器等很多设备中,低功耗蓝牙的身影随处可见'''。 | ||
+ | |||
+ | 目前有数十亿支持低功耗蓝牙的设备已投入使用。那么,'''这些设备都能成为蓝牙mesh网络的一员吗?'''答案是肯定的。 | ||
+ | |||
+ | '''低功耗蓝牙设备只要具有正确的低功耗蓝牙功能和一些附加软件,就能加入蓝牙mesh网络中'''。以智能手机为例,可能只需要一个可以与蓝牙mesh网络对话的普通应用程序(App)就足够了。换句话说,这是任何开发者都能编写的应用程序。 | ||
+ | |||
+ | === 承载层(bearer layer) === | ||
+ | 要了解非mesh低功耗蓝牙设备如何成为蓝牙mesh网络的一员,我们需要回顾一下蓝牙mesh协议栈,见第二章节。[[文件:BleMesh-蓝牙Mesh协议栈.png|居中|缩略图|750x750像素|蓝牙mesh网络协议栈]]'''蓝牙mesh网络采用低功耗蓝牙作为其射频通信协议栈'''。而具体如何使用,则是蓝牙mesh网络协议栈最底层的承载层需要负责的工作。 | ||
+ | |||
+ | 目前定义了两个承载层:'''广播承载层 (advertising bearer)和GATT承载层 (GATT bearer)'''。蓝牙mesh网络设备默认使用的是广播承载层,它负责在低功耗蓝牙广播数据包内收发蓝牙mesh数据包。 | ||
+ | |||
+ | 具有低功耗蓝牙协议栈、能够进行广播和扫描的设备具有基本的、必备的低功耗特性,因此能够支持广播承载层、乃至完整的蓝牙mesh网络协议栈。 | ||
+ | |||
+ | '''既不支持也无法升级使用广播承载层的设备,则必须使用GATT承载层。'''使用GATT承载层时需要将蓝牙mesh协议数据单元(PDU)封装在代理协议(Proxy Protocol)中,我们将在下文中对此进行详细介绍。 | ||
+ | |||
+ | === 节点与特性 === | ||
+ | '''成为蓝牙mesh网络中一员的设备被称为节点(Node)'''。很多种产品类型都能够成为节点:照明灯、灯具开关、温控器、窗锁、占用传感器等。然而,无论产品类型如何,节点都可能提供某些超出其产品本身功能的特定蓝牙mesh网络服务。 | ||
+ | |||
+ | 蓝牙mesh规格定义了'''节点可能拥有的特性'''。具有这些特性中的一个或多个,即表示节点可以在网络中扮演相应的特殊角色。定义的特性包括: | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !设备类型 | ||
+ | !说明 | ||
+ | |- | ||
+ | |'''中继(Relay)''' | ||
+ | |中继节点可通过广播承载层,接收并重新发送蓝牙mesh消息。 | ||
+ | 中继特性能让蓝牙mesh消息在设备之间实现多次跳跃,传送距离可超过两台设备之间直接进行无线电传输的范围,从而覆盖整个网络。 | ||
+ | |- | ||
+ | |'''好友(Friend)''' | ||
+ | |好友节点能够存储发往相关低功耗节点的消息,随后再进行转发。 | ||
+ | |- | ||
+ | |'''低功耗节点 (LPN)''' | ||
+ | |低功耗节点功率受限,可借助好友节点的支持,在蓝牙mesh网络中有效地运作,借此大幅降低空占比。 | ||
+ | |- | ||
+ | |'''代理(Proxy)''' | ||
+ | |代理节点可通过承载层(广播承载层或GATT承载层)接受信息,并通过另一个广播承载层或GATT承载层重新发送消息。 | ||
+ | |} | ||
+ | |||
+ | === 代理节点(Proxy Node) === | ||
+ | 非mesh低功耗蓝牙设备成为蓝牙mesh网络成员的过程中,代理节点是关键。'''代理节点的根本目的是执行承载层转换。它能够实现从广播承载层到GATT承载层的转换,反之亦然。'''因此,不支持广播承载层的设备可通过GATT连接来收发各类蓝牙mesh消息。 | ||
+ | [[文件:BleMesh-代理节点的作用.png|居中|缩略图|750x750像素|代理节点的作用]] | ||
+ | |||
+ | 节点可通过在特性字段中设置代理特性位(proxy feature bit),来表示自身可用作代理节点。特性字段是所有节点都具有的成分数据状态的一部分。 | ||
+ | |||
+ | === 蓝牙mesh代理服务 === | ||
+ | 代理节点(Proxy Node)可实施称为mesh代理服务的GATT服务,即本文中的“代理服务器(Proxy Server)”。'''mesh代理服务包含两个GATT特性:mesh代理数据输入和mesh代理数据输出'''。代理客户端(Proxy Client) 使用“GATT Write Without Response”子程序,将代理协议(见下图)PDU写入mesh代理数据输入特性,并从GATT通知中的mesh代理数据输出特性接收代理协议PDU。这就是互联GATT设备通过代理节点在蓝牙mesh网络中进行数据交换的机制。 | ||
+ | [[文件:BleMesh-代理服务器与代理客户端.png|居中|缩略图|595x595像素|代理服务器与代理客户端]] | ||
+ | |||
+ | === 发现代理节点 === | ||
+ | 低功耗蓝牙设备使用GAP广播来帮助其他设备发现自己。蓝牙mesh代理节点使用完全相同的技术,即通过“GAP可连接型广播(connectable advertising)数据包”,对自身的可用性、可作为代理节点的角色、及其身份进行广播。 | ||
+ | |||
+ | '''GAP广播数据包中包含各类字段,称为广播类型(AD Type)'''。核心规格附录中对广播类型进行了定义。代理节点会在广播数据包中包含以下字段: | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+表 1 – mesh代理广播 | ||
+ | !'''广播类型''' | ||
+ | !'''注释''' | ||
+ | |- | ||
+ | |标识 | ||
+ | |表示通用可被发现模式(General Discoverable Mode) | ||
+ | |- | ||
+ | |完整的16位服务UUID列表 | ||
+ | 或 | ||
+ | |||
+ | 不完整的16位服务UUID列表 | ||
+ | |包括mesh代理服务的UUID | ||
+ | |- | ||
+ | |服务数据 | ||
+ | |包含与mesh代理服务相关的数据,可识别该代理是在为哪个网络或节点所提供服务 | ||
+ | |} | ||
+ | 服务数据广播类型的内容还需经过进一步检查。 | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !'''服务数据字段''' | ||
+ | !'''注释''' | ||
+ | |- | ||
+ | |识别类型 | ||
+ | |此字段中的值能够正确解释“识别参数”字段的内容。 | ||
+ | |||
+ | 0x00:网络ID(Network ID)类型 | ||
+ | |||
+ | 0x01:节点标识(Node Identity)类型 | ||
+ | |- | ||
+ | |识别参数 | ||
+ | |可以是网络ID或节点标识,具体取决于识别类型 | ||
+ | |} | ||
+ | '''网络ID是从网络密钥'''(NetKey – 参照《解密蓝牙mesh系列 | 第六篇》)'''派生而来的唯一公共标识符'''。节点标识由代理服务器节点的单播地址和网络标识符的组合派生而来,例如启用该标识的子网的网络ID。 | ||
+ | |||
+ | 如果代理服务器是多个子网的成员,则它将对包含每个子网的网络ID广播数据包进行交替操作,每次处理一个广播数据包。 | ||
+ | |||
+ | '''节点标识广播的主要用途是将启动配置设备(Provisioner)快速连接至刚刚完成启动配置的节点,从而完成新节点的配置。''' | ||
+ | |||
+ | === 代理协议 === | ||
+ | '''代理客户端和代理服务器使用代理协议进行通信,并向对方发送代理PDU。'''这些PDU就像是存放各类蓝牙mesh PDU的容器。 | ||
+ | |||
+ | 蓝牙mesh接入消息使用核心蓝牙mesh协议栈,因此消息包含在网络PDU内。网络PDU可被封装在代理PDU中。 | ||
+ | |||
+ | 蓝牙mesh配置文件规格中定义了各种Beacon,包括未经启动配置的设备Beacon、以及安全网络Beacon。可通过代理协议将蓝牙mesh Beacon纳入网络。 | ||
+ | |||
+ | '''启动配置过程涉及其自身协议,且启动配置PDU也可在代理PDU内进行交换'''。 | ||
+ | |||
+ | 最后,代理客户端和代理服务器可以交换特殊的代理配置消息,这些消息也可被封装于代理PDU中。 | ||
+ | |||
+ | 大多数类型的mesh数据可使用代理协议进行交换,因此可通过连接至代理节点的GATT客户端进行收发。 | ||
+ | |||
+ | 不同设备代理PDU的大小各异,PDU的大小是根据低功耗蓝牙属性协议(ATT)的最大传输单元(MTU)进行动态设置的,这是通过GATT连接来传输代理PDU的基础。此外,代理协议可以将完整的蓝牙mesh消息封装在代理PDU或多段消息的各个段中,借此来容纳较长的蓝牙mesh消息。 | ||
+ | |||
+ | 需要注意的一点是,'''任何蓝牙mesh节点(而非只有代理节点)都可以实施代理协议,从而支持基于GATT连接的直接交互。'''这在启动配置(provisioning)场景中非常有用。 | ||
+ | |||
+ | 关于代理协议的更多信息,包括代理PDU的格式,可参考蓝牙mesh配置文件规格: <nowiki>https://www.bluetooth.com/specifications/mesh-specifications</nowiki> 【这里待上传pdf文档】 | ||
+ | |||
+ | === 代理过滤器和代理配置 === | ||
+ | 代理客户端可通过对代理服务器所应用的过滤器进行配置,对接收到的网络流量进行精确的控制。'''过滤器采用白名单和黑名单的形式,同时这些名单会指定各自的目标地址列表。'''列表中的地址可能是其所支持的地址类型的任意组合,即单播、群组或虚拟地址。如果消息的目标地址未包含在白名单过滤器中,则消息会被代理服务器的代理过滤器(Proxy Filter)滤掉。同样,如果消息的目的地包含在黑名单过滤器中,也会被滤过。 | ||
+ | |||
+ | 代理配置(Proxy Configuration)消息在代理客户端和代理服务器之间进行交换,并实现代理过滤器的配置。 | ||
+ | |||
+ | === 使用低功耗蓝牙智能手机或平板电脑启动配置 === | ||
+ | '''通常使用智能手机或平板电脑执行启动配置流程,以将新设备添加至蓝牙mesh网络'''。大多数此类设备不会实施完整的蓝牙mesh网络协议栈,而且与蓝牙mesh网络进行的所有交互(包括启动配置)都很可能会使用代理协议。如前所述,启动配置PDU可被封装于代理PDU中,因此可通过代理服务器节点、利用GATT连接进行交换。蓝牙mesh配置文件规格中将采用代理协议的启动配置协议称为PB-GATT。 | ||
+ | |||
+ | === 借助代理节点使用代理协议时需要注意什么? === | ||
+ | '''智能手机等设备要想通过代理节点、借助代理协议与蓝牙mesh网络通信,则必须扫描并连接至代理节点'''。换句话说,它必须支持GAP中央设备的角色。 | ||
+ | |||
+ | 此外,'''必须首先对智能手机进行启动配置'''。如果未经启动配置,任何设备都无法与蓝牙mesh网络中的节点进行交互。 | ||
+ | |||
+ | === 结论 === | ||
+ | 通过GATT、代理协议和蓝牙mesh代理节点对当前市场上的低功耗蓝牙设备提供支持,这绝对值得上新闻头条了!它为人们手中已有的海量设备打开了通往蓝牙mesh网络世界的大门。 | ||
+ | |||
+ | == 第七章节 安全性概览 == | ||
+ | 无论是mesh还是其他网络技术,安全性永远是最重要的特性。 | ||
+ | |||
+ | === 为何安全性如此关键? === | ||
+ | 安全性可谓是物联网(IoT)最受关注的问题之一。从农业到医院、从智能家居到商业智能建筑、从发电站到交通管理系统,物联网系统和技术将触及我们生活的方方面面。'''物联网系统如果存在安全漏洞,就可能会导致灾难性的后果'''。 | ||
+ | |||
+ | 蓝牙mesh网络的安全性从设计之初就是重中之重。'''本章节将着重分析主要的安全特性和现已被解决的安全问题'''。本系列的后续文章也将持续详细地介绍蓝牙mesh网络安全性的各个方面。 | ||
+ | |||
+ | === 蓝牙mesh网络强制使能安全性 === | ||
+ | 低功耗蓝牙(Bluetooth Low Energy)GATT设备可实施蓝牙核心规格中定义的一系列安全措施。产品设计人员有责任决定采取哪些安全措施,也可以决定不采用任何既有的安全特性。换句话说,'''低功耗蓝牙GATT的安全性配置是非强制性的'''。如果我们谈论的是单一设备的安全性及其与另一台设备的连接,只要产品设计师正确地进行风险评估,那么他的决定就是合理的。'''然而,蓝牙mesh网络中的安全性涉及的不仅是单一设备或对等设备之间的连接安全性;它关注的是整个设备网络的安全性,以及网络中各组设备的安全性。''' | ||
+ | |||
+ | 因此, '''蓝牙mesh网络中强制性使用安全性'''。 | ||
+ | |||
+ | === 蓝牙mesh网络安全性的基本概念 === | ||
+ | 以下基本的安全性说明适用于所有蓝牙mesh网络: | ||
+ | {| class="wikitable" | ||
+ | !项目 | ||
+ | !详情 | ||
+ | |- | ||
+ | |加密与认证 | ||
+ | |所有mesh消息都经过加密和认证。 | ||
+ | |- | ||
+ | |安全分级考量 | ||
+ | |网络安全性、应用安全性和设备安全性彼此独立。详见下方的“安全分级考量”。 | ||
+ | |- | ||
+ | |区域隔离 | ||
+ | |蓝牙mesh网络可分为若干子网,每个子网密钥不同,独立于其他子网,各自都是安全的。 | ||
+ | |- | ||
+ | |密钥刷新 | ||
+ | |通过密钥刷新过程,可以在蓝牙mesh网络的整个生命周期内更改安全密钥。 | ||
+ | |- | ||
+ | |消息模糊化 | ||
+ | |消息模糊化的作用是让外界难以跟踪网络内所发送的消息,进而提供了一种隐私保护机制,难以让外界跟踪节点(Node)的网络活动。 | ||
+ | |- | ||
+ | |中继攻击防护 | ||
+ | |蓝牙mesh安全性可保护网络免受中继攻击。 | ||
+ | |- | ||
+ | |垃圾桶攻击防护 | ||
+ | |节点可从网络中安全地移除,此方式也能防止垃圾桶攻击(Trash Can Attack)。 | ||
+ | |- | ||
+ | |安全设备启动配置 | ||
+ | |设备添加到蓝牙mesh网络以成为节点的过程是一个安全的过程。 | ||
+ | |} | ||
+ | |||
+ | === 安全分级考量与安全密钥 === | ||
+ | '''蓝牙mesh安全性的核心是三类安全密钥'''。这些密钥为mesh网络的不同方面提供了安全性,并实现了蓝牙mesh网络安全性中的关键性能,即“'''安全分级考量'''”。 | ||
+ | |||
+ | 以可用作中继(Relay)节点的mesh照明灯为例,它能够作为中继,处理与楼宇中蓝牙mesh门窗安全系统相关的消息。照明灯完全不涉及对这些消息内容细节的访问和处理,但却会将消息中继至其他节点。 | ||
+ | |||
+ | 为处理这种潜在的利益冲突,'''蓝牙mesh采用称为“应用密钥(AppKey) ”的安全密钥来保护应用层消息''',它不同于用于保护特定应用(如照明、物理安全、温控等)相关数据安全的密钥。 | ||
+ | |||
+ | 蓝牙mesh网络中的所有节点都拥有一个或多个网络密钥(NetKey),每个网络密钥对应一个子网,它也可能是主要子网。'''节点必须拥有网络密钥,才能成为网络中的成员。网络加密密钥(Encryption Key)和隐私密钥(Privacy Key)直接源于网络密钥'''。 | ||
+ | |||
+ | 拥有NetKey让节点能够对网络层的数据进行解密和验证,以便执行诸如中继等网络功能。但应用程序数据不可被解密。 | ||
+ | |||
+ | 每个节点还拥有一个唯一的安全密钥,称为设备密钥(DevKey),用于节点的启动配置(Provisioning)和配置流程。 | ||
+ | |||
+ | === 区域隔离 === | ||
+ | 节点拥有了主要NetKey ,就意味着它具备了蓝牙mesh网络成员资格和访问权限。但也可以将网络划分成不同的子网,每个子网都有自己的子网密钥。这意味着'''只有拥有指定子网密钥的设备才能与该子网中的其他成员设备进行通信。也可以临时创建并分配子网密钥''',例如,酒店中位于不同客房的节点的隔离。 | ||
+ | |||
+ | === 节点移除、密钥刷新与垃圾桶攻击 === | ||
+ | 如上所述,节点包含各种蓝牙mesh安全密钥。如果一个节点发生故障并需要处理,或者如果所有者决定将节点出售给其他人,那么'''重要的是确保该设备及其所包含的密钥不会被盗用,避免向节点原本所在的网络发动攻击'''。 | ||
+ | |||
+ | 从网络中删除节点的程序现已有明确定义。'''通过启动配置设备(Provisioner)应用程序,可将节点添加至黑名单,然后启动密钥刷新程序(Key Refresh Procedure)'''。 | ||
+ | |||
+ | 密钥刷新程序会向网络中除黑名单成员以外的所有节点发放新的网络密钥、应用密钥、以及所有相关的派生数据。也就是说,'''构成网络和应用程序安全性基础的整套安全密钥将被替换'''。 | ||
+ | |||
+ | 因此,已从网络中移除的、包含原有NetKey 和AppKey的节点将不再是网络成员,换句话说,上述这些不被授信的节点将从网络当中剔除出去,因此也无法再构成威胁。 | ||
+ | |||
+ | === 隐私 === | ||
+ | 由NetKey导出的隐私密钥(Private Key)用于对网络PDU (Payload Data Unit) 的报头值进行模糊化,例如源地址(source address)。'''模糊化可以确保无法通过随机的被动窃听来跟踪节点及其使用者,也使得基于流量分析的攻击难以实施'''。 | ||
+ | |||
+ | === 中继攻击 === | ||
+ | 在网络安全方面,'''中继攻击是窃听者拦截并捕获一个或多个消息、稍后重新进行传输的一种技术,目的是欺骗接收者,执行未经被攻击设备授权的任务'''。常见的例子就是汽车的无钥匙进入系统被攻击者所击破,攻击者就能拦截汽车车主和汽车之间的认证序列,然后对这些消息进行中继,以进入汽车并将其偷走。 | ||
+ | |||
+ | '''蓝牙mesh可保护网络免受中继攻击。这种保护是基于分别称为序列号(SEQ, Sequence Number)和IV索引(IV Index)的两个网络PDU字段'''。每次发布消息时,元素会增加SEQ值。节点从元素接收消息,如果元素包含的SEQ值小于或等于上一个有效消息中的SEQ值,则节点会将消息丢弃,因为这则消息可能与中继攻击有关。IV索引是一个单独的字段,需与SEQ一同纳入考量。来自给定元素的消息中的IV索引值必须始终等于或大于该元素的上一个有效消息。 | ||
+ | |||
+ | === 加密工具箱 === | ||
+ | 蓝牙mesh网络的大多数安全特性都有赖于业内标准的加密算法和程序,这在本系列的其他安全性相关文章中也会提及,本文还是着重解释最重要的内容。 | ||
+ | |||
+ | '''蓝牙mesh协议栈中采用的两项关键的安全功能是AES-CMAC和AES-CCM'''。这些是基本的加密和认证功能,所有用于密钥生成的其他功能都是基于上述两者。 | ||
+ | |||
+ | ==== '''AES-CMAC''' ==== | ||
+ | 基于密码的消息认证码(CMAC)是一种算法,能够生成固定长度的128位消息认证值,并将其用于任何变量长度输入。使用AES-CMAC算法生成消息认证码MAC的公式为: | ||
+ | |||
+ | '''MAC=AES-CMAC<sub>k</sub>(m)''' | ||
+ | |||
+ | AES-CMAC具有出色的错误检测能力。涉及验证校验和或者使用错误检测代码的其他技术只能检测数据的意外修改。'''AES-CMAC旨在检测有意的、未经授权的数据修改,以及意外修改'''。如果您有意向了解更多关于此功能的信息,请参考RFC4493 中的详细定义:<nowiki>https://tools.ietf.org/html/rfc4493</nowiki> | ||
+ | |||
+ | 向 AES-CMAC输入: | ||
+ | * '''''k'' – 128位的密钥''' | ||
+ | * '''''m'' – 将被认证的可变长度数据''' | ||
+ | |||
+ | ==== AES-CCM ==== | ||
+ | '''AES-CCM是一种通用的、认证的加密算法,使用时需要加密块密码'''。在蓝牙mesh规格中,AES-CCM在所有情况下都能被用作基本的加密和认证功能。其使用公式如下: | ||
+ | |||
+ | '''密文,MIC=AES-CCM<sub>k</sub>(n,m,a)''' | ||
+ | |||
+ | 向AES-CCM输入四项内容: | ||
+ | * '''''k'' – 一个128位的密钥''' | ||
+ | * '''''n'' – 一个104位的随机数''' | ||
+ | * '''''m'' – 将被加密和认证的可变长度数据''' | ||
+ | * '''''a'' – 将被认证、但不加密的可变长度数据,也被称为“附加数据(Additional Data)”,这一输入参数长度可以为0字节。''' | ||
+ | 从 AES-CCM有两项输出: | ||
+ | * '''''密文'' - 加密后的可变长度数据''' | ||
+ | * '''''MIC'' – m和a的消息完整性检查值''' | ||
+ | 下图显示了可能来自蓝牙mesh网络层(network layer)或上层传输层(upper transport layer) 的'''纯文本有效载荷(Payload)''',由具有'''输入加密密钥(Key)'''、'''随机数(Nonce)'''和'''纯文本有效载荷的AES-CCM'''进行处理。其输出为'''加密的有效载荷(Encrypted Payload)''' 和'''MIC'''。 | ||
+ | [[文件:BleMesh-Aes-ccm.png|居中|缩略图|462x462像素|用于数据包有效负载加密和认证的AES-CCM ]] | ||
+ | |||
+ | === SALT生成 === | ||
+ | 蓝牙mesh安全性定义了SALT 生成函数s1,它采用AES-CMAC功能。如上所述,AES-CMAC具有两个输入参数:k和m。当用于SALT生成时,只有输入参数m发生变化。 K一直被设置为一个128位的值,即0x0000 0000 0000 0000 0000 0000 0000 0000,它在蓝牙mesh规格中被称为ZERO。 | ||
+ | [[文件:BleMesh-Salt生成函数.png|居中|缩略图|463x463像素|SALT生成函数]] | ||
+ | 向 SALT生成函数输入: | ||
+ | * '''''m'' – 一个长度非零的八位字节数组或ASCII编码字符串''' | ||
+ | |||
+ | 其输出为一个128位的MAC值,s1公式 如下: | ||
+ | |||
+ | '''s1(m)=AES-CMAC<sub>zero</sub>(m)''' | ||
+ | |||
+ | === 其它安全性函数 === | ||
+ | 在蓝牙mesh网络规格第3.8.2章节的“安全工具箱(Security Toolbox)”部分中,可以找到对其他安全函数的定义,例如各种关键性的派生函数。所有这些都是基于AES-CMAC和SALT生成函数s1(SALT生成函数也是基于AES-CMAC)。 | ||
+ | |||
+ | (<nowiki>https://www.bluetooth.com/specifications/mesh-specifications)</nowiki> | ||
+ | |||
+ | === 重中之重安全 === | ||
+ | 2017年5月,臭名昭著的勒索软件WannaCry向全球各地的电脑发起了攻击,并窃取了用户数据进行勒索。来自150个国家和地区的数百万台计算机遭受影响,勒索软件要求用户通过比特币这一加密电子货币的形式支付赎金。如果没有稳健的、基于标准的安全系统设计,物联网(IoT)可能也会发生类似情况。可以想象,如果没有完善的安全防护,今后物联网设备的用户也会迫不得已支付“赎金”让“黑客”打开自家的家门。 | ||
+ | |||
+ | '''安全性是蓝牙mesh网络设计的核心,而且这种安全性是强制性的''',网络中的每个数据包都会经过加密和认证。蓝牙mesh网络的安全性能够保护整个mesh网络免受各类威胁和问题的困扰,包括: | ||
+ | * '''中继攻击(Replay attack)''':可通过正确使用序列号来保护网络不受中继攻击。 | ||
+ | * '''中间人攻击(Man-in-the-middle attack)''':采用非对称加密技术来进行抵御,例如通过椭圆曲线Diffie-Hellman(ECDH)来有效防范中间人攻击。 | ||
+ | * '''垃圾桶攻击(Trash Can attack)''':这种攻击利用的是废弃设备,必要时可通过刷新安全密钥来防止攻击发生。 | ||
+ | 安全性是蓝牙技术的首要问题,我们将在解密蓝牙mesh系列中持续探讨这一话题。读完本章节,对于蓝牙mesh网络主要的安全特性以及一些基本的加密技术,您应该已经有了较为深入的了解,请继续阅读下章节内容。 | ||
+ | |||
+ | == 第八章节 启动配置 == | ||
+ | '''启动配置(Provisioning)是向蓝牙mesh网络(如灯泡)添加新的未经启动配置设备的过程。'''该过程由启动配置设备(Provisioner) 进行管理。启动配置设备和未经启动配置设备遵循蓝牙mesh规格中定义的固定过程。'''启动配置设备向未经启动配置设备提供使其成为蓝牙mesh节点的启动配置数据(provisioning data)。''' | ||
+ | |||
+ | 启动配置设备通常是运行启动配置应用程序的智能手机或其它移动计算设备。尽管每个网络只需要一台启动配置设备来执行启动配置,但可用的启动配置设备可以有多台。 | ||
+ | |||
+ | === 启动配置协议 === | ||
+ | 蓝牙mesh规格中定义了启动配置协议,该协议定义了启动配置流程中用于在启动配置设备和新的未经启动配置设备之间进行通信的标准流程以及PDU。图1描绘了完整蓝牙mesh协议栈之外的启动配置协议栈。 | ||
+ | [[文件:BleMesh-启动配置1.png|居中|缩略图|750x750像素|mesh系统架构与启动配置协议栈]] | ||
+ | 从下到上的组件如下: | ||
+ | |||
+ | '''一、启动配置承载层(Provisioning Bearer)''' | ||
+ | |||
+ | 启动配置承载层实现了启动配置PDU在启动配置设备和未经启动配置设备之间的传输。定义的'''两个启动配置承载层包括''': | ||
+ | * '''PB-ADV:'''指通过蓝牙广播信道进行设备启动配置的启动配置承载层。PB-ADV承载层用于发送通用启动配置 (Generic Provisioning) PDU。支持PB-ADV的设备应尽可能执行占空比接近100%的被动扫描,以避免遗漏任何发送来的通用启动配置PDU。 | ||
+ | * '''PB-GATT:'''指使用来自代理协议的蓝牙mesh代理(proxy)PDU来进行设备启动配置的启动配置承载层。“代理协议能使节点通过面向连接的低功耗蓝牙(Bluetooth Low Energy)承载层来收发网络PDU、mesh Beacon、代理配置消息和启动配置PDU。PB-GATT在GATT操作中包含了启动配置PDU,涉及GATT启动配置服务,同时能在启动配置设备不支持PB-ADV时供其使用。 | ||
+ | 二、'''启动配置协议''' | ||
+ | |||
+ | 定义对于启动配置PDU、行为和安全性的要求。了解启动配置协议将有助于您根据应用需求选择合适的验证方法。 | ||
+ | |||
+ | === 启动配置程序 === | ||
+ | 启动配置协议定义了'''10种启动配置PDU''': | ||
+ | # 启动配置邀请 (Provisioning Invite) | ||
+ | # 启动配置能力 (Provisioning Capabilities) | ||
+ | # 启动配置状态 (Provisioning State) | ||
+ | # 启动配置公钥 (Provisioning Public Key) | ||
+ | # 启动配置输入完成 (Provisioning Input Complete) | ||
+ | # 启动配置确认 (Provisioning Confirmation) | ||
+ | # 启动配置随机 (Provisioning Random) | ||
+ | # 启动配置数据 (Provisioning Data) | ||
+ | # 启动配置完成 (Provisioning Complete) | ||
+ | # 启动配置失败 (Provisioning Failed) | ||
+ | 开发者若想了解有关这些PDU的详细信息,请参考'''蓝牙mesh规格的5.4.1节'''(详见:<nowiki>https://www.bluetooth.com/specifications/mesh-specifications</nowiki> )。 | ||
+ | |||
+ | 完整的启动配置过程必须在更高的层面完成两项重要任务: | ||
+ | # '''验证未经启动配置的设备。'''在蓝牙mesh网络中,一个小空间中可能存在几台、几十台或数百台设备。执行认证是为了确保与启动配置设备进行交互的设备就是用户想要启动配置的设备。 | ||
+ | # '''与未经启动配置的设备建立安全链接,并与之共享相应的信息。'''在流程的最后,原本未经启动配置的设备将成为蓝牙mesh网络中的节点。 | ||
+ | |||
+ | === 启动配置流程包括五个阶段 === | ||
+ | # 发送Beacon信号 | ||
+ | # 邀请 | ||
+ | # 交换公共密钥 | ||
+ | # 认证 | ||
+ | # 启动配置数据分发 | ||
+ | 这里将介绍前三个阶段。我们将在“蓝牙mesh网络启动配置二”中介绍最后两个阶段。 | ||
+ | |||
+ | ==== 发送Beacon信号 ==== | ||
+ | '''Beacon是低功耗蓝牙的传统应用场景'''。想象一下,一个GAP外设(如智能手表或活动跟踪器)希望与GAP中央设备(如智能手机或平板电脑)连接。 GAP外设切换到广播状态并开始发送其广播数据包。GAP中央设备扫描广播数据包以发现其它设备并接收相关基本信息。'''蓝牙mesh启动配置使用的也是相同的广播机制'''。 | ||
+ | |||
+ | '''如果未经启动配置的设备支持PB-ADV承载层''',则其作为未经启动配置设备Beacon进行广播。这涉及指定的数据包格式,且未经启动配置设备通过此方式来使自身被启动配置设备 (Provisioner) 发现。 | ||
+ | |||
+ | '''当未经启动配置设备使用PB-GATT承载层时''',一项称为“mesh启动配置服务”的GATT服务会支持整个启动配置程序,同时支持与启动配置设备的交互。在发送Beacon信号阶段,未经启动配置设备会发送包括mesh启动配置服务UUID的广播数据包,它会被启动配置设备通过标准的低功耗蓝牙扫描程序发现。 | ||
+ | |||
+ | ==== 邀请 ==== | ||
+ | 在发送Beacon信号之后,启动配置设备和未经启动配置设备会建立PB-ADV或PB-GATT启动配置承载层(provisioning bearer)。然后,启动配置设备发送一个启动配置邀请 PDU,设备通过启动配置功能PDU对其作出响应。 | ||
+ | |||
+ | 启动配置邀请PDU包括'''Attention Duration'''字段,其指示了未经启动配置设备的主要元素应采用某种视觉指示方式,并在多长的时间内吸引用户的注意力。 | ||
+ | |||
+ | '''启动配置功能PDU'''包括: | ||
+ | * 设备支持的元素数量; | ||
+ | * 支持的一组安全算法; | ||
+ | * 使用带外(OOB)技术实现的公共密钥可用性; | ||
+ | * 该设备向用户输出值的能力。 | ||
+ | * 该设备允许用户输入值的能力。 | ||
+ | [[文件:BleMesh-启动配置邀请.png|居中|缩略图|750x750像素|启动配置邀请]] | ||
+ | 上图流程图让人联想到低功耗蓝牙中的配对过程,这在此前的文章《蓝牙配对 - 第一篇:配对特性交换(Pairing Feature Exchange)》中有所介绍。 低功耗蓝牙配对采用的配对特性交换类似于蓝牙mesh启动配置程序中的启动配置邀请阶段。'''在启动配置邀请阶段,目的是向启动配置设备(Provisioner) 提供有关未经启动配置设备功能的信息。'''有了这些信息,启动配置设备就能决定下一步该如何进行。 | ||
+ | |||
+ | ==== 交换公共密钥 ==== | ||
+ | 信息加密涉及两项基本技术:'''对称加密'''(也称为密钥加密)和'''非对称加密'''(也称为公钥加密)。 | ||
+ | |||
+ | '''对称加密采用相同的密钥进行加密和解密。'''只要发送设备和接收设备都知道密钥,就能够解密所有使用此密钥加密的信息。然而,很难安全地通过链路交换密钥并防止其落入坏人之手。 | ||
+ | |||
+ | '''非对称加密使用两个相关的密钥(即一个密钥对)来解决上述问题:公钥和私钥。'''公钥免费提供给任何可能想向您发送消息的人。私钥则为保密,只有你自己知道。使用公钥加密的任何消息(文本、二进制文件或对称密钥)只能通过应用相同的算法、且仅能使用与之匹配的私钥进行解密。这意味着您不必对通过链接传递公钥的过程有任何担忧,因为它们仅用于加密而非解密。然而,非对称加密比对称加密慢一些,且需要更高的处理能力来进行消息内容的加密和解密。 | ||
+ | |||
+ | 在蓝牙mesh用例中,大多数设备基于嵌入式芯片组或模块,因此无法使用计算成本昂贵的非对称加密技术来对每个消息进行加密/解密。对称加密更适合于不具备非对称加密所需处理能力的设备,但如何安全地交换并使用密钥仍然是一大问题。蓝牙mesh采用了非对称和对称加密结合的方式来解决这一问题。 | ||
+ | * '''非对称加密''':椭圆曲线Diffie-Hellman(ECDH)是一种匿名密钥协商协议,允许具有椭圆曲线公私密钥对的双方在非安全信道上建立共享保密信息。ECDH在蓝牙mesh启动配置中的目的是在启动配置设备和未经启动配置设备之间创建安全链路。它使用公钥和私钥来分发对称性密钥,两台设备随后可将其用于后续消息的加密和解密。 | ||
+ | * '''对称加密''':在蓝牙mesh网络中传输的每个消息都使用AES-128密码加密。 AES-128算法是常用的对称加密/解密引擎,常用于嵌入式平台。 | ||
+ | '''在交换公钥阶段,有两种交换ECDH公钥的可能方式。'''它们可以通过蓝牙链路、或OOB隧道进行交换。在启动配置邀请阶段,未经启动配置的设备已经报告了是否支持通过OOB隧道发送自身公钥。如果是,则启动配置设备可继续使用它,并通过发送启动配置开始PDU来通知未经启动配置的设备。 | ||
+ | |||
+ | '''如果未经启动配置设备的公钥可通过OOB隧道获得''',则临时公钥从启动配置设备发送到设备,并采用合适的OOB技术(例如二维码),从未经启动配置的设备中读取静态公钥,如图所示。 | ||
+ | [[文件:BleMesh-公钥交换-无公共秘钥.png|居中|缩略图|750x750像素|未经启动配置设备的公钥未知时的公钥交换]] | ||
+ | '''否则''',双方的公钥都会经由图4中所示的蓝牙链路进行交换。 | ||
+ | [[文件:BleMesh-秘钥交换.png|居中|缩略图|750x750像素|未经启动配置设备采用OOB方式进行的公钥交换]] | ||
+ | 在该等式中,P-256即FIPS 186-3中定义的FIPS-P256曲线。 | ||
+ | |||
+ | ==== 认证 ==== | ||
+ | 在此步骤中,启动配置设备使用所选的验证方法,对未经启动配置设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):'''输出OOB(Output OOB)'''、'''输入OOB(Input OOB)'''、以及'''静态OOB(Static OOB)'''或'''无OOB(No OOB)'''。 | ||
+ | |||
+ | ===== 输出带外(Output OOB) ===== | ||
+ | 若选择的是输出带外(Output OOB)验证方法,'''则未经启动配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字'''。例如,如果未经启动配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有LCD屏幕,则可以将随机数显示为多位数值。启动配置设备(Provisioner)的用户需要输入观察到的数字,来验证未经启动配置的设备。'''输出带外验证方法的工作流程如图1所示'''。 | ||
+ | |||
+ | (图片:通过输出OOB进行验证) | ||
+ | |||
+ | 输入随机数后,启动配置设备(Provisioner)生成并检查确认值。'''无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的''',请继续往下看。 | ||
+ | |||
+ | ===== 输入带外(Input OOB) ===== | ||
+ | 输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,'''但设备的角色相反'''。启动配置设备(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经启动配置的设备。'''以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数'''。 | ||
+ | |||
+ | 与输出带外验证(Output OOB)相比,'''输入带外(Input OOB)方法需要发送一个附加的启动配置协议PDU'''。在完成认证操作之后,未经启动配置的设备向启动配置设备发送一个启动配置输入完成PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。 | ||
+ | |||
+ | (图片:通过输入OOB进行验证) | ||
+ | |||
+ | ===== 静态带外(Static OOB) 或无带外(No OOB) ===== | ||
+ | '''在输入带外或输出带外都不可用的情况下''',启动配置设备(Provisioner)和未经启动配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:'''采用静态OOB信息;或静态OOB信息不可用,直接以数值0代替'''。在此情况下,启动配置设备和未经启动配置的设备各自生成一个随机数,然后进行检查确认值操作。 | ||
+ | |||
+ | ===== 检查确认值(Check Confirmation Value) ===== | ||
+ | '''无论采用何种验证方法,都会进行确认值生成和检查'''。根据蓝牙mesh规格,启动配置设备(Provisioner) 和未经启动配置设备应分别计算确认值。这两个值被称为'''ConfirmationProvisioner'''和'''ConfirmationDevice'''。这两个值的计算都使用一系列相同的函数,不同之处仅在于所使用的随机数输入。 | ||
+ | |||
+ | 蓝牙mesh规格中有两页关于计算过程的内容说明。'''确认值生成函数需要8个参数,参数值来自启动配置(Provisioning)过程中的后续步骤'''。可参考规格的5.4.2.4认证和5.4.1启动配置PDU部分,了解更多详细信息。(详见:<nowiki>https://www.bluetooth.com/specifications/mesh-specifications</nowiki> ) | ||
+ | |||
+ | 表1列出了用于确认值生成及其来源的参数。 | ||
+ | |||
+ | (表格) | ||
+ | |||
+ | 让我们来看看用于确认值生成的算法。'''图3是一个流程图,其中包括了几轮AES-CMAC和SALT生成'''[1]。该流程图对于ConfirmationProvisioner和ConfirmationDevice值均适用。 | ||
+ | * '''如果由启动配置设备(Provisioner)执行输入''',则从一个名为RandomProvisioner的值开始(下图中以蓝色表示),并生成ConfirmationProvisioner值。 | ||
+ | |||
+ | * '''如果由未经启动配置设备执行输入''',则从一个名为RandomDevice的值开始(下图中以绿色表示),并生成ConfirmationDevice值。 | ||
+ | (图片:确认值生成图) | ||
+ | |||
+ | ===== 确认值检查(Confirmation Value Check) ===== | ||
+ | 当确认值生成之后,两台设备就会进行交换,并且都会检查接收值的完整性。图4表示确认值检查的过程。 | ||
+ | |||
+ | 确认过程的开始就是启动配置设备(Provisioner)将其随机数RandomProvisioner发送到未经启动配置的设备。未经启动配置设备使用它来重新计算确认值,并与之前接收的确认值进行比较,进行验证。 | ||
+ | |||
+ | (图片:确认值检查) | ||
+ | * '''如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner不匹配''',则启动配置(Provisioning)过程将被中止。 | ||
+ | * '''如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner匹配''',则未经启动配置设备将其RandomDevice值发送给启动配置设备。 | ||
+ | 然后,启动配置设备(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。 | ||
+ | * '''如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice不匹配,'''则启动配置(Provisioning)流程将被中止。 | ||
+ | * '''如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice匹配''',则表示验证成功。后续只要启动配置设备(Provisioner)和未经启动配置设备完成启动配置流程的第五步:启动配置数据分发,则未经启动配置设备就能成为蓝牙mesh网络中的节点(node)。 | ||
+ | |||
+ | ==== 启动配置数据分发 ==== | ||
+ | 认证步骤完成之后,就可以确保在启动配置设备(Provisioner)和未经启动配置设备之间建立的承载层的安全,然后就进入启动配置(Provisioning)过程中最重要的一步:'''导出并分发启动配置数据(provisioning data)'''。启动配置设备(Provisioner) 负责生成启动配置数据,启动配置数据由多个数据项组成,包括一个称为网络密钥 (NetKey) 的安全密钥。'''表2列出了启动配置数据字段'''。 | ||
+ | |||
+ | (表格) | ||
+ | |||
+ | '''为安全地进行启动配置数据分发,启动配置设备(Provisioner)采用AES-CCM''' [2],'''借助共享的会话密钥(SessionKey)对启动配置数据(provisioning data)进行加密,启动配置设备和未经启动配置设备都会进行计算'''。 AES-CCM需要三个输入参数:'''会话密钥'''、'''会话随机数'''和'''纯文本'''。纯文本参数值包含需要被加密的启动配置数据。设备密钥(DevKey)、会话密钥(SessionKey)和会话随机数(SessionNonce)的值通过图5所示的过程导出。 | ||
+ | |||
+ | (图片: DevKey / SessionKey / SessionNonce生成过程) | ||
+ | |||
+ | 从图5可以看出: | ||
+ | |||
+ | * 如果将prsk(绿色)的输入值代入k1函数中,则会生成SessionKey。这是用于启动配置数据加密的关键。 | ||
+ | * 如果将prsn(黄色)的输入值代入k1函数中,将生成SessionNonce。这是用于启动配置数据加密的随机值。 | ||
+ | * 如果将prdk(蓝色)的输入值代入k1函数,则将生成DevKey。 | ||
+ | '''启动配置设备(Provisioner)和未经启动配置设备都需要生成会话密钥(SessionKey)和会话随机数(SessionNonce)'''。当SessionKey和SessionNonce值准备就绪时,启动配置设备将对包含导出启动配置数据的启动配置数据PDU (Provisioning Date PDU) 进行加密,并将其发送至未经启动配置的设备。此处,相同的SessionKey和SessionNonce值也可用来对接收到的数据进行解密。 | ||
+ | |||
+ | '''至此,启动配置流程完成'''。两台对等设备都已知晓新的设备密钥(DevKey)和全网的网络密钥(NetKey),这就'''意味着我们的新设备已成为蓝牙mesh网络中的节点(node)和成员'''。 | ||
+ | |||
+ | === 结束语 === | ||
+ | '''启动配置过程是蓝牙mesh安全的基础''',让网络设备之间能够可靠安全地进行通信。如果您想了解有关蓝牙mesh的更多信息,请下载蓝牙mesh规格,蓝牙mesh创新产品开发所需的一切都将尽在掌握。 | ||
+ | [[分类:BLE]] | ||
+ | [[分类:技术手册]] |
2019年12月2日 (一) 09:42的最新版本
蓝牙技术是享誉全球的品牌之一,也是全世界应用最为普遍的无线通信技术之一。从2000年到现在,蓝牙技术已经广泛应用于数十亿台设备。就2016年而言,制造商的蓝牙设备出货量更是超过30亿台。
蓝牙的创新步伐从未停止。自面世以来,每一次改进都系统严谨,紧跟市场需求,一直支持和鼓励创新。
蓝牙技术令人惊叹的故事还在继续着,蓝牙mesh网络翻开了最新篇章,150家蓝牙技术联盟会员公司都参与了mesh的创建。
目录
1 第一章节:Mesh介绍
这是系列文章中的第一篇,将向您介绍蓝牙mesh网络。我们从两篇概述开始, 后续篇章中将更详细地探讨技术的各个方面。
1.1 风格 OR 特性
对蓝牙技术感兴趣的朋友一定有这样的习惯:定期查看蓝牙技术联盟采用的新版本。
通常,新版本为蓝牙提供附加特性,或者以某种方式改进现有功能。不管怎么说,蓝牙全新的“风格”已经面世;一款风格出众的蓝牙技术变体,将以完全不同的方式利用无线电,并针对一系列广泛的用例设计和应用进行了优化。
蓝牙基础速率/ 增强资料速率(BR / EDR)是蓝牙发布的第一款风格,旨在替代缆线连接,很快就成为无线音频市场的主宰,并推动了新型计算机外设(如无线鼠标和键盘)的发展。
随后登场的是低功耗蓝牙(Bluetooth Low Energy)。它经过优化,极大程度地减少了设备功耗,仅使用硬币大小的电池就能实现无线操作和通信,运行数年不在话下。
低功耗蓝牙现已被广泛采用。如今很难找到不支持低功耗蓝牙的智能手机或平板电脑。健康、运动和健身器材,如运动追踪设备、以及智能手表等可穿戴设备,都有赖于低功耗蓝牙技术。这一款蓝牙风格可谓影响深远。
“那么蓝牙mesh网络是蓝牙的全新风格呢?还是新特性呢?”
其实两者都不是。现在就让我们来深入探讨一下这项惊人的、全新的蓝牙技术,同时了解mesh与蓝牙其他形式之间的关系和自身工作原理。
1.2 三大重要技术
蓝牙BR / EDR和低功耗蓝牙是智能手机等设备上的常用技术,但是它们不会互相依赖对方的服务和功能。针对所有的意图和目的,这两款风格的蓝牙技术都能彼此独立工作。事实上,虽然他们能在同一台设备上很好地共存,但是使用蓝牙BR / EDR的设备与低功耗蓝牙设备之间却无法进行通信。对于它们来说,有彼此相伴固然开心,但彼此之间却没有对话。
相比之下,蓝牙mesh网络使用、并且依赖于低功耗蓝牙。低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈。
“蓝牙mesh并非无线通信技术,而是一种网络技术。”
下图显示了蓝牙BR / EDR、低功耗蓝牙和蓝牙mesh之间的关系。
1.3 关于拓扑
从最基本的层面来讲,蓝牙BR / EDR能够实现一台设备到另一台设备的连接和通信,建立“一对一”的关系,大多数人所熟悉的“配对”(pairing)一词就是这个意思。一些设备能够与其他设备建立多重“一对一”通信关系,并形成一种称为“微微网”(piconet)的hub/spoke拓扑 。
但是低功耗蓝牙设备还能与其他设备形成“一对一”和hub/spoke关系,以无连接方式进行工作,其广播的数据,位于直接无线电传输围内的任何其他设备都可接收。这是“一对多”(1:m)的拓扑,其中m可以是一个非常大的数量!如果接收广播的设备本身不进行数据传输,那么广播设备的无线电频谱就仅仅是针对自己而言的,同时对于能够接收和利用其广播的其他设备数量没有明确的限制。蓝牙Beacon是这项功能的一个绝佳案例。
蓝牙mesh能让我们建立无线设备之间的“多对多”(m:m)关系。此外,设备能够将数据中继到不在初始设备直接无线电覆盖范围内的其他设备。这样,mesh网络就能够跨越非常大的物理区域,并包含大量设备。
1.4 蓝牙Mesh的初衷
对于满足日益普及的各种通信需求,mesh拓扑结构能提供最佳的方式,因此蓝牙mesh网络应运而生,典型的应用包括楼宇自动化和传感器网络等。这些通信需求包括:
- 覆盖面积广
- 直联互通性
- 监测和控制大量设备的能力
- 经优化的、低功耗的
- 有效利用无线电资源,有可扩展性
- 与当前市场上的智能手机、平板电脑和个人电脑产品兼容
- 符合行业标准,具有政府级安全性
虽然还有其他支持mesh拓扑的低功耗无线通信技术,但很多用户反馈显示,这些技术存在约束和限制,而且对于他们正在尝试解决的各种问题和希望创建的产品类型来说,也并非最佳选择。其他类似技术的问题包括低数据传输速率、在mesh上中继数据时的“跳数”限制、通常由无线电信道使用方式引起的可扩展性限制、以及按步骤更改mesh网络中设备组成的过程中出现的困难和延迟。
通常来说,其他mesh技术无法被标准智能手机、平板电脑和PC设备所支持,这是一个主要的限制因素。
创建符合行业标准的、基于低功耗蓝牙的mesh通信技术,就有可能满足他们的要求,同时没有相关的限制和约束。毕竟,互通性和能效是低功耗蓝牙最突出的特性。
2 第二章节 Mesh网络基本概况
在第一章节中,我们介绍了全新的蓝牙mesh网络技术。如果您还未阅读第一章节,建议先从头阅读,然后再进入第二章节。
本章节将介绍蓝牙mesh网络的基本概况,包括大型mesh网络中的消息传输方式、市场设备支持、安全性和mesh协议栈本身,在后续文章中也将继续探索这一技术方方面面的细节。
2.1 以消息为中心的通信
蓝牙mesh网络使用发布/订阅 (publish/subscribe)消息系统。
设备可以将消息发送至特定地址,这些地址的名称和含义与用户能够理解的高级概念相对应,如“花园灯”(Garden Lights)。这被称为“发布”(publishing)。
设备经配置后,可接收由其他设备发送到特定地址的消息。这被称为“订阅” (subscribing) 。
当设备向特定地址发布消息时,订阅该地址的所有其他设备将收到该地址的副本,对其进行处理,并以某种方式作出回应。
想象一下花园里安装的一套户外灯, 每盏灯都已经过配置,以便其订阅“花园灯”消息。现在,想像一个蓝牙mesh电灯开关向“花园灯”地址发送了“开”的消息。没错,花园里的所有灯都会收到“ON”消息,并做出开灯的回应。
就是这么简单!
2.2 消息和设备状态
“状态” (state) 是蓝牙mesh网络中的一个关键概念。蓝牙mesh网络中的每台设备都具有一组独立的状态值,表示设备的某些状态。在花园灯的示例中,每盏灯都有一个状态值,表示设备当前是处于打开或关闭状态。通过发布一类在定义上意味着能够回应“开”或“关”状态值的消息,来改变状态值,蓝牙mesh电灯开关就能对灯泡进行控制。更改状态值会修改设备本身的物理状况,例如打开或关闭设备。
消息、状态、以及这些和其他概念相关的设备行为已被定义在规格中,称为“模型”(modules)。模型由蓝牙mesh设备实施。
2.3 中继
得益于mesh网络,设备可以在非常广阔的区域中安装,同时彼此之间保持通信。想象一下购物中心、机场或办公大楼的占地空间有多广阔。因为存在墙壁和其他物理上的障碍物,楼宇中的设备可能无法与安装在同一楼宇远侧的设备、或临近楼宇中的设备建立直接的无线连接。而蓝牙mesh网络则能够将网络中的某些设备指定为“中继设备”,进而解决这一难题。
中继设备能够转发从其他设备接收到的消息。在转发消息时,它们能够与位于初始消息发布设备无线范围以外的设备进行通信。消息可多次被中继,每一次中继即为一“跳”,最多可进行127跳,足以在一片广阔的物理区域中进行消息传输。
2.4 管理型网络泛洪(Managed Flooding)
蓝牙mesh网络采用一种称为“网络泛洪(flooding)”的方式来发布和中继消息。这意味着消息不会通过某一进程进行路由, 也不会沿着由一系列特定设备构成的特定路径来进行传输。相反,传输范围内的所有设备都会接收消息,负责中继的设备能将消息转发至其传输范围内的所有其他设备。
“网络泛洪”这项技术在使用中往往是利弊参半。在蓝牙mesh网络的设计中,我们对此进行了针对性的优化,相信能够扬长避短。
2.4.1 网络泛洪的优势
网络泛洪的优势在于无需特定设备专门扮演集中式路由器的角色。集中式路由器一旦发生故障,就可能会导致整个网络无法运行。没有特定的路由也可能对网络造成灾难性的影响,但这种情况也可以通过在mesh网络中采用网络泛洪的方法来避免。
网络泛洪的方式也意味着消息一般能够通过多重路径到达其目的地。这就构建了一个相当可靠的网络。
2.4.2 优化mesh网络
蓝牙mesh网络也采取了一系列措施,支持采用网络泛洪的方式,同时优化每台设备、甚至整体网络的能耗。
所有数据包都包含一个称为TTL的字段,它可用于限制消息中继的跳数。由设备间歇性发送的心跳消息中包含的信息,能够让网络了解其拓扑结构、以及传到其他每台设备之间的跳数。这能够让设备将TTL设置为最佳值,从而避免不必要的中继操作。
每台设备都包含消息缓存,以确定自身是否已经中继过该消息。如果是,则会立即丢弃该消息,从而避免上层堆栈进行不必要的处理。
最有趣的是,功率非常受限的设备(例如由小型电池持续供电多年的传感器)可能被指定为“低功耗节点”。低功耗节点能够与一个或多个被指定为 “friends” 的设备协同工作。Friends并非功率受限,它可以作为低功耗节点,存储寻址到这一低功耗节点的消息,并且只有在低功耗节点需要时才传送消息。低功耗节点和“friends”之间的关系理所当然就称为“friendship”。
2.4.3 “Friendship”具体如何运转?
下面我们从节能的角度来进行解读。
低功耗设备通常将大部分时间用于传输数据,例如传感器。每当温度低于或高于指定阈值时,传感器才会发送温度读数,这种情况也许每天只会发生两次。这种不频繁的传输方案本身就使这类设备保持相当低的能耗。
2.4.4 但如果传感器需要不时地接收数据,又该怎么办呢?
例如,可能它需要确保网络中使用的安全密钥始终处于最新状态。或许需要根据季节修改这些温度阈值,采用不同的值。要使传感器直接接收消息,就需要开启无线电,以便数据接收。但大多数时候它什么都接收不到,但能量却会被消耗。
对设备来说,通过与“friends”的合作, 低功耗节点能够以合理的频率使用无线电来接收消息,但重要的是,相较于始终“聆听”所有消息,它能够以更低的频率工作,同时确保发送来的罕见事件也不会被遗漏。
“Friends” 能帮助低功耗节点完成大量工作。它们能够为所服务的低功耗节点存储消息,并在低功耗节点明确要求的情况下向其提供消息,低功耗节点可按照自身的规划进行操作,从而最有效地利用无线电。
2.5 市场上的蓝牙设备支持
蓝牙mesh网络虽然推出不久,但低功耗蓝牙(Bluetooth Low Energy)却面世已久。
那么市场上数十亿台设备呢?智能手机和平板电脑呢?它们能否访问蓝牙mesh网络?
幸运的是,答案是YES!
蓝牙mesh网络会指定一台设备来扮演代理节点(proxy node)的角色。代理节点包含一项标准:低功耗蓝牙GATT服务,具有两个GATT特性,分别是mesh代理数据输入(Mesh Proxy Data In)和mesh代理数据输出(Mesh Proxy Data Out)。诸如智能手机等低功耗蓝牙设备均可使用这些特性,与mesh网络进行数据收发。
这种mesh规格定义了一种代理协议(proxy protocol),同时通过代理节点的两个GATT特性交换的数据中包含代理协议PDU。
欲知代理节点的作用,请持续关注本系列后续文章~
2.6 安全性
安全性是蓝牙mesh网络设计的核心,并且强制使用。
每个数据包都经过加密和认证。通过合理使用序列号能够防止中继攻击。在重要流程中使用不对称加密技术可防止中间人(Man-in-the-middle)攻击。同时针对利用废弃设备的垃圾桶攻击提供保护。必要时还会刷新安全密钥。
“安全分级考量”(Separation of Concerns)是蓝牙mesh网络安全性中体现的重要原则。网络的安全性,以及诸如照明、供暖、或实体建筑安全等个别应用的安全性彼此独立。可使用不同的安全密钥来保护网络层操作,例如中继、或保护特定应用的消息内容。论其结果,举例来说,由于灯泡和照明开关具有相同的应用密钥,因此灯泡能够全面访问照明开关所发送消息中的数据。但是,尽管相同的灯泡能够将来自蓝牙物理访问令牌的消息中继到前门中的锁,却无法阅读那些消息应用层的内容。
本系列的后续文章中也将详细介绍安全性。我们还将密切关注一个称为 “开通配置” (Provisioning)的安全流程,设备可通过这一流程变身为蓝牙mesh网络的一员。此外,我们还将探讨如何从网络中安全地删除设备,以及如何在有需要时刷新安全密钥。
2.7 协议栈
蓝牙mesh网络引入了全新的协议栈。如之前所述,这一协议栈建立在低功耗蓝牙技术之上。下图描绘了协议栈的层级。
该规格是深入了解各层责任的最佳方式。为帮助您更好地了解其工作原理,以下列出了协议栈各层负责的工作:
- 承载层(bearer layer):承载层定义了如何使用底层低功耗堆栈传输PDU。目前定义了两个承载层:广播承载层(Advertising Bearer)和GATT承载层。
- 网络层(network layer):网络层定义了各种消息地址类型和网络消息格式。中继和代理行为通过网络层实施。
- 底层传输层(lower transport layer):在需要之时,底层传输层能够处理PDU的分段和重组。
- 上层传输层(upper transport layer):负责对接入层进出的应用数据进行加密、解密和认证。它还负责称为“传输控制消息”(transport control messages)这一特殊的消息,包括与“friendship”相关的心跳和消息。
- 接入层(access layer):负责应用数据的格式、定义并控制上层传输层中执行的加密和解密过程,并在将数据转发到协议栈之前,验证接收到的数据是否适用于正确的网络和应用。
- 基础模型(foundation models):基础模型层负责实现与mesh网络配置和管理相关的模型。
- 模型(models):模型层与模型等的实施、以及诸如行为、消息、状态等的实施有关。
2.8 蓝牙mesh网络的未来
我们期待蓝牙mesh网络广泛应用于各行各业和各种应用,预计最初会从楼宇自动化、商业照明和传感器网络等应用开始。尤其令人兴奋的是蓝牙mesh网络在商业照明方面的应用。试想一下,有了正确的固件,照明系统能实现的就不仅是无线灯光控制,还能够成为楼宇中各种蓝牙服务的平台,如物资跟踪和定位服务!
3 第三章节:Mesh网络基本概念
无论您想采用智能照明、温控和安全系统让家庭和办公室变得更加智能,还是想提高工业无线传感器网络(IWSN)的效率,蓝牙mesh网络都能为您与环境的交互开启全新的机遇。
蓝牙mesh网络为创建大型设备网络奠定了基础,让成千上万的无线设备彼此之间可靠安全地进行通信。本文将深入探究这一创新网络拓扑背后的基本概念。
蓝牙mesh运行于低功耗蓝牙协议栈的顶部。下方的图1概述了蓝牙mesh协议栈,并定义了每层的功能。
3.1 节点(Node)
想象一下由数千台设备组成的网络,每台设备均通过低功耗蓝牙(LE)无线连接进行通信。蓝牙mesh网络中的这些设备被称为节点 (node) 。每个节点都能发送和接收消息。信息能够在节点之间被中继,从而让消息传输至比无线电波正常传输距离更远的位置。这样的节点网络可以被分布在制造工厂、办公楼、购物中心、商业园区以及更多环境中。
蓝牙mesh节点非常多样化,有助于在mesh网络中实现多重功能。照明器具、机械设备、安防摄像机、烟雾探测器和环境传感器仅仅是节点能实现的几个例子。
3.2 元素(Elements)
一些节点(如传感器)的电池有可能会被耗尽,而其他节点(如照明设备、制造机械和安防摄像机)则会通过主电网来获取电力。一些节点的处理能力会高于其他节点。这些节点在mesh网络中可承担更为复杂的任务,扮演不同的角色,表现出以下四个节点特征(Features):
- 低功耗 (Low-Power) 特性,功率受限的节点可能会利用低功耗特性来减少无线电接通时间并节省功耗。同时低功耗节点(LPN)可以与friend节点协同工作。
- Friend 特性,功率不受限的节点很适合作为friend节点。Friend 节点能够存储发往低功耗节点(LPN)的消息和安全更新;当低功耗节点需要时再将存储的信息传输至低功耗节点。
- 中继 (Relay) 特性,中继节点能够接收和转发消息,通过消息在节点之间的中继,实现更大规模的网络。节点是否能够具备这一特性取决于其电源和计算能力。
- 代理 (Proxy) 特性,代理节点能够实现GATT和蓝牙mesh节点之间的mesh消息发送与接收。承担这一角色的节点需要固定的电源和计算资源。
一些节点的复杂性高于其他节点,由多个称为元素(Element)的独立部分组成。每个节点至少拥有一个元素,称为主元素(Primary Element),同时还可能包含其他多个元素。元素由定义节点功能和元素条件的实体组成。例如,一个灯泡内有一个元素, 并具有两种功能:
节点 = 灯泡
一个元素 = 主元素
节点功能
- 开/关
- 亮度
元素条件/状态
- “开”或“关”
- 0 – 10 (亮度等级)
节点中的每个元素都有一个唯一的地址,称为单播地址(unicast address),使每个元素都有址可寻。我们将在后续的解密蓝牙mesh系列文章中进一步解释“寻址”。
3.3 模型 (Model) 和状态 (State)
无论节点位于制造厂房、酒店、办公楼、还是商业园区的网络中,节点的基本功能都由模型 (Model) 来定义和实施。模型位于元素内,元素必须具有至少一个模型。模型能够定义并实施节点的功能和行为,而状态 (State) 能够定义元素的条件。
以灯泡为例,该模型的功能是开关和调节亮度。相关的状态分别为“开”/ “关”和0-10:
模型 (节点功能)
1. 开/关
状态 -> “开”或“关”
2. 亮度 (0-10)
状态 -> 0-10
蓝牙mesh支持复合状态,即由两个或多个值组成的状态。变色灯就是这样的一个例子,色调可以不受颜色饱和度或亮度的局限而改变。
“绑定状态” (Bound State) 这一术语的定义源自一种状态的变化导致另一状态变化的情况。级别状态和开/关状态通常就相互绑定。如果级别从0变为1,则“开/关”的状态也从“关”变为“开”。
每个模型都有唯一的标识符。蓝牙技术联盟采用16位的模型,而供应商采用32位(其中包含蓝牙技术联盟指定的16位公司标识符以及16位供应商指定的模型标识符)。这确保了每个模型的地址都独一无二并且能确定被寻址到。
蓝牙mesh网络可借助消息,通过客户端 - 服务器架构进行通信。服务器的功能是暴露元素的状态。最简单的状态之一是二进制开关,其中状态为“开”或“关”。简单的服务器模型是通用开/关服务器模型 (Generic On/Off Server Model) ,其中包含表示开关开启或关闭的状态。
客户端可对状态进行访问,请求、更改或使用服务器的状态。举例来说,一个简单的客户端模型就是通用开/关客户端模型(Generic On/Off Client Model)(二进制开关)。通用开/关客户端模型通过发送消息来控制通用开/关服务器模型。例如,客户端可利用这一机制开启或关闭指示灯。
这种客户端 - 服务器架构产生了三种类型的模型:
- 服务器模型 (Server Model)
- 由至少一个或多个状态跨越一个或多个元素的状态组成
- 定义模型能够发送/接收的消息,并根据这些消息定义元素的行为
- 实例:
- 🔶开/关切换——客户端发送打开或关闭的消息
- 🔶 传感器——可以暴露传感器的状态(可能为温度值或传感器测量的“满”、“待充”或“空”的结果)
- 🔶 功率级别——可以暴露电源状态(等级1-10)
- 客户端模型(Client Model)
- 定义客户端为请求、更改或使用服务器相应状态所使用的消息。
- 实例:
- 🔶 开/关切换——客户端发送打开或关闭的消息
- 🔶 电源级别——定义电源状态的消息(0-10)
- 控制模型 (Control Model)
- 控制模型具有多种功能,同时可能包含一个或多个:
- 🔶 客户端模型 (Server Model)
- 🔶 服务器模型 (Client Model)
- 🔶 控制逻辑(规则和行为)用于协调与其相连模型之间的交互。
- 实例:控制模型可用在支持机器周围循环的液体冷却剂水泵上。
- 🔶 应用场景——温度传感器会记录机器的温度。如果机器超过设定的温度,冷却泵则会被打开。
- 🔶 冷却泵的控制模块 (Control Module)
- ▷ 与温度传感器相连的客户端(用于接受温度值)
- ▷ 连接到开/关切换的服务器(用于打开或关闭水泵)
- ▷ 控制逻辑(规则和行为)— 负责定义如果温度传感器超过设定值,则打开水泵。
- 控制模型具有多种功能,同时可能包含一个或多个:
模型的定义能让您在mesh网络中对节点及其功能进行配置。模型定义以及其他模型的概念将会在后续文章中进一步详细介绍。
蓝牙mesh网络凭借行业认可、全球互通性、成熟且可信赖的生态系统来创建工业级设备网络。现在您已经初步了解蓝牙mesh背后的一些基本概念,下一章节将介绍有关蓝牙mesh网络基础知识的概述,包括寻址、发布/订阅、消息、列表、以及如何结合这些知识共同创建蓝牙mesh网络。
3.4 地址(Address)
地址有四种类型,其中的三类用于消息的传送:单播(unicast)、虚拟(virtual)和群组(group)地址。第四种被称为未分配(unassigned)地址。地址长度为16位,并按下述定义进行编码。
取值 | 地址类型 |
---|---|
0b0000000000000000 | Unassigned Address |
0b0xxxxxxxxxxxxxxx(excluding 0b0000000000000000) | Unicast Address |
0b10xxxxxxxxxxxxxx | Virtual Group |
0b11xxxxxxxxxxxxxx | Group Address |
3.4.1 未分配地址(Unassigned Address)
未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,它们不会用于消息的传送。
3.4.2 单播地址(Unicast Address)
在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。发送到单播地址的消息只能由一个元素进行处理。
3.4.3 虚拟地址(Virtual Address)
虚拟地址是与特定的UUID标签相关联的一组元素;这些地址可能会被发布或订阅。UUID标签是与多个来自一个或多个节点的元素相关联的128位值。
对于虚拟地址,15和14位分别设置为1和0;13 – 0位被设置为散列值(hash value)(提供16384个散列值)。散列(hash)来自于Label UUID。使用订阅元素(subscribing element)来检查完整的128位UUID是十分低效的,特别当UUID跨越多个消息段时更为低效。散列值提供了一种更为有效的方式来确定哪些消息被发送至哪些元素。
3.4.4 群组地址(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)进行处理
3.5 消息(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网络的状态消息就是一种未经确认的消息。
3.6 消息安全
所有蓝牙mesh网络消息的安全保障都来自网络密钥(NetKey)和应用密钥(AppKey)对消息的加密和验证。NetKey用于网络层通信。假设蓝牙mesh网络没有子网,则该mesh网络内的所有通信都使用相同的网络密钥。
AppKey用于应用程序的数据。网络中的一些节点具有特定应用,并且根据应用的需要对一些潜在敏感数据的访问进行限制。这些节点具有特定的AppKey,并与特定应用相关联。会使用不同AppKey的领域通常包括安全(楼宇门禁、机房门禁和CEO办公室门禁)、照明(制造厂房、外部楼宇照明和人行道)和HVAC系统。
中继节点(relay node)(如灯泡或墙壁开关)通常具有有效的NetKey,能够在网络内中继敏感性消息。然而,这些节点无法访问各种限制区域(如楼宇控制或HVAC系统)的特定AppKey,,亦无法解密应用程序的数据。
3.7 消息交换
蓝牙mesh网络使用发布/订阅 (publish/subscribe) 模型来进行消息传输。生成消息的节点会发布消息。需要接收消息的节点会订阅它们所需的地址。消息可被发布至单播、群组或虚拟地址。
消息可以作为对其他消息的回复而发送,也可以作为非请求消息(unsolicited messages)被发送。当模型发送回复消息时,使用消息始发处的源地址作为目标地址。发送非请求消息时,模型将使用模型的发布地址作为目标地址。节点中的每个模型都有一个发布地址。
接收消息时,节点内模型(节点中可能存在多个模型)中的每个实例均可通过订阅方式从一个或多个群组或虚拟地址接收消息。
订阅消息的模型使用模型的订阅列表来定义用于接收消息的有效地址。当模型接收到消息时,模型将检查其订阅列表。当订阅列表上的地址设置为模型的元素单播地址或属于该节点的固定群组地址时,则视为一个匹配(match)。图3表示了接入消息的有效源地址和目标地址。
地址类型 | 有效源地址 | 接入消息的有效目的地址 |
---|---|---|
Unassigned Address | No | No |
Unicast Address | Yes | Yes |
Virtual Group | No | Yes |
Group Address | No | Yes |
蓝牙mesh实体发布各种节点的状态时,无论其与发送数据的节点位置距离远近,整个蓝牙mesh网络中的系统均可订阅该数据。这就实现了网络一端的设备可通过低功耗无线消息与设施中的其他的管理者进行对话,而不受距离限制。
3.8 结束语
蓝牙mesh网络凭借行业认可、全球互通性、成熟且可信赖的生态系统来创建工业级设备网络。现在对蓝牙mesh的基本概念已有进一步的了解,接下来就能够更深入地了解拓扑的复杂性。在后续的解密蓝牙mesh系列文章中,我们将探讨蓝牙mesh的安全(security)、启动配置(provisioning)、代理节点(proxy node)等
4 第四章节:Mesh网络“友谊”篇
随着蓝牙mesh网络的推出,开发者可能很想知道蓝牙mesh网络是如何为低功耗节点设计的,蓝牙mesh网络采取了多种优化功耗的措施,特别包括一项称为“friendship” (友谊) 的特性。
4.1 概述
蓝牙mesh网络中“friendship”(友谊)特性的应用可能非常多样化。一些如照明功能的产品会与主电源(国家电网)相连接,那么相较于照明本身的功耗,蓝牙mesh模块的功耗就可忽略不计。但其他产品,如智能传感器或智能锁,就会在供电方式上功耗受限,这意味着它们需要通过小型电池或能量采集技术来供电。这些产品最有可能利用到蓝牙mesh网络的友谊概念。
我们知道节点(Node)是已经启动配置(Provision)并成为mesh网络中一员的设备。节点具有与其产品类型相关的功能,但也可具有与网络本身操作相关的功能并在其中扮演特定角色。而这取决于其所支持的mesh网络特性。所有节点都能够在网络中发送并接收mesh消息,此外还可以选择性地支持一个或多个其他网络特性,如下所列:
- 中继(Relay)特性:通过广播承载层接收并重新发送mesh消息、以构建更大规模网络的能力。
- 代理(Proxy)特性:在GATT和广播承载层之间接收并重新发送mesh消息的能力。
- 低功耗(Low-Power)特性:能够以明显较低的接收端占空比在mesh网络中运行。通过将无线电接收器启用时间最小化可实现节点功耗的降低,只有在绝对必要时才启动接收器。低功耗节点(LPN)通过与好友(friend)节点建立友谊(friendship)关系来实现这一点。
- 好友(Friend)特性:通过存储发往LPN的消息,仅在LPN明确发出请求时才进行转发来帮助LPN运行的能力。
要了解“友谊”是如何帮助LPN降低功耗的,我们可以先从传感器开始:传感器是一个很好的例子,它可以利用“友谊”,并被用作LPN。它们通常将绝大部分时间用于传输数据,且很少需要接收数据。传感器可能只有在温度超出一系列预设的限制时才会发送温度读数,而这种情况每天可能只会发生两次。正是这种不频繁的数据传输才使得此类设备的能耗使用维持在较低水平。
但如果需要根据季节将这些温度限制修改为不同的值,同时需要通过向传感器发送配置消息来实现这些限制的修改呢?传感器若想直接接收此类消息,就需要开启无线电进行收听。大多数时间它什么也接收不到,却在消耗能量。
因此,与好友节点的合作能够使低功耗节点(LPN)规划对无线电的使用,以适当或更低的频率接收消息而无需一直保持收听。低功耗节点会对好友节点进行轮询(Poll),查看是否有新消息(好友节点只会间或地对新消息进行存储)。功耗就是通过上述步骤得到节省的。
4.2 好友(Friend)和低功耗节点(LPN)
低功耗节点(LPN)必须与支持“好友”特性的另一节点建立“友谊”(friend)关系,以减少其接收器占空比(Duty Cycle)并节约能耗。图1来自蓝牙mesh配置文件规格,主要描绘了低功耗节点和好友节点之间的关系,具体如下:
好友节点P与低功耗节点 I、J和K为“友谊”关系。好友节点O与低功耗节点 L和M为“friendship”关系。因此,寻址到节点I、J或 K的消息将被好友节点P存储并转发。寻址至节点L或M的消息将被好友节点 O存储和转发。好友节点的转发仅在低功耗节点轮询好友节点以获得等待传送的消息时才会发生。
4.3 友谊(Friendship)参数
低功耗节点需要找到好友节点,与其建立“友谊”关系。所涉及的流程称为“友谊建立”。我们稍后会探讨此流程。在此之前,先介绍一些有关对LPN行为进行管理的关键参数,这些参数被设定于友谊建立过程中。
1. ReceiveDelay是从LPN向好友节点发送请求,到其开始收听响应中间经过的时间。这让好友节点有时间做好响应的准备,并将响应发回。
2. ReceiveWindow 是LPN用于收听响应的时间。图2描述了涉及ReceiveDelay和ReceiveWindow的时序。
3. PollTimeout设定了LPN发送给其好友节点的两个连续请求之间可能经过的最长时间。如果在PollTimeout计时器到时之前,好友节点未能收到LPN的请求,则友谊关系将被终止。
4.4 “友谊”建立
如果两个人想建立友谊,可能对视一眼就已足够!
但对于蓝牙mesh网络中“友谊”的建立,还需要经过更多的步骤。
- LPN发布一个“好友请求”(Friend Request)消息。该消息不会被中继,因此只有处于直接无线电范围内的好友节点才能处理该消息。不具有“好友”特性的节点会将消息丢弃。“好友请求” 消息包括LPN的ReceiveDelay、ReceiveWindow和PollTimeout参数。
- 附近的好友节点若支持“好友请求”消息中特定的要求,将准备一个“Friend Offer”消息,并将其发送回LPN。该消息包括各种参数,包括支持的ReceiveWindow大小、可用的消息队列大小、可用的订阅列表(Subscription List)大小、以及由好友节点测量的RSSI值。
- LPN接收到“Friend Offer”消息时,通过应用一种实施专用的算法来选择合适的好友节点。该算法可能会考虑到各种各样的情况。某些设备可能会优先考虑ReceiveWindow大小,以尽可能减少功耗;而有些设备则可能会更加关注RSSI值,以确保能够与好友节点保持高质量的链路。所采用的精确算法由产品开发者决定。
- 选择好友节点之后,LPN将向好友节点发送一个“Friend Poll”轮询消息。
- 从LPN收到“好友轮询”(Friend Poll)消息后,好友节点会回复一个“Friend Update”更新消息,完成“好友” 建立流程并提供安全参数。此时“友谊”得以建立。
4.5 友谊(Friendship)消息传送
友谊建立之后,好友节点将LPN的所有消息存储在“好友队列”(Friend Queue)中,这些消息就是我们所说的“ 被存储的消息 ”。下方的图4描绘的就是好友节点和关联LPN之间的消息交换。
- 当好友节点收到一个寻址到该节点的LPN的消息时,好友节点会缓冲此消息,将其存储在称为“好友队列”的区域中。在图4中,我们可以看到,好友节点为LPN存储了消息1和2。
- LPN会周期性地启用其收发器(transceiver),并向好友节点发送 “好友轮询” 消息,询问是否存储有任何为其缓冲的消息。
- 好友节点会先将一个被存储的消息发回至LPN作为对“好友轮询”(Friend Poll)的响应。
- 在每次接收到来自好友节点的消息之后,LPN会将继续发送“好友轮询”消息,直到收到一条“MD(MD =更多数据)”字段设置为0的“好友更新”消息为止。这意味着已经没有为LPN缓冲的更多消息了。此时,LPN停止对好友节点的轮询。
4.6 安全性
蓝牙mesh中,安全性保障无处不在,“友谊”也如此,它采用两种特殊的安全证书:
- 主安全资料(Master Security Material):由网络密钥(NetKey)派生,可被同一网络中的其他节点使用。使用主安全资料加密的消息可被同一网络中的任何节点解码。
- 好友安全资料(Friend Security Material):由网络密钥(NetKey)、以及由低功耗节点(LPN)和好友节点生成的额外计数器号码派生而来。使用好友安全资料加密的消息只能由处理该消息的好友节点和LPN解码。
LPN和好友节点使用的两种安全资料是怎样的呢?总结如下:
- 使用好友安全材料加密的相应友谊消息:
- 好友轮询(Friend Poll)
- 好友更新(Friend Update)
- 好友订阅列表(Friend Subscription List)添加/删除/确认好友节点发送至LPN的“被存储的消息”
- 使用主安全资料加密的相应友谊消息:
- 好友清除(Friend Clear)
- 好友清除确认(Friend Clear Confirm)
从LPN发送至好友节点的消息将根据应用设置,通过主安全资料或好友安全资料进行加密。
4.7 “友谊”终止
“友谊”可在某些情况下终止:
- 如果在PollTimeout计时结束之前,好友节点未收到“ 好友轮询”、“好友订阅列表添加”或“好友订阅列表删除”消息,则友谊终止。
- LPN可以通过将“好友清除”消息发送给好友节点,以启动友谊终止程序,“友谊”就会被好友节点终止。
4.8 如何选择
开发者在选择实施友谊节点和LPN低功耗节点时,应考虑遵循以下指南:
- RAM容量:可用的RAM容量直接影响一个 好友节点可支持LPN的数量、及其可为相关LPN缓冲多少个消息。
- LPN:所选MCU和模块的通用功耗性能对于LPN很关键。 此外,从休眠模式到运行模式的唤醒/预热时间会影响LPN的响应速度和延迟。
5 第五章节 设备管理
蓝牙mesh网络好比是一个VIP俱乐部。如果您是这个俱乐部的会员,就可以随意进入,享受与会员类别相对应的设施和服务。如果您不是会员,便无论如何也过不了门卫这一关。
蓝牙mesh设备有可能是某一特定蓝牙mesh网络的成员,也有可能不是。如果它是成员,则有权与同为该网络成员的其他设备进行通信(至少以一种基本的方式)。如果它不是成员,那么该设备传输的所有内容都将被网络中的其他设备忽略。
其实可以理解为蓝牙mesh设备也拥有不同的会员类型,例如可以使用某些特定的俱乐部服务设施(如健身房、高尔夫球场等),但不是全部。它只能与网络中的某些设备进行充分的交互。而对其进行管理的就是“应用”(application)这一概念。例如,蓝牙mesh照明开关可以在网络中打开或关闭蓝牙mesh照明灯,因为所有这些设备都是照明应用的一部分。而由于供暖系统并非照明应用的一部分,因此照明开关就无法打开供暖系统。
设备要想成为蓝牙mesh网络的成员,则必须经过一个称为“启动配置(provisioning)”的安全流程,将设备添加到网络中。
5.1 安全性
安全性是蓝牙mesh网络的核心,我们将在本系列的后续文章中详细介绍这一主题。将设备添加到蓝牙mesh网络、或从中移除设备的过程都将严格遵循安全性要求。
蓝牙mesh网络使用一套包含各类安全密钥的系统,从整体上保护网络,同时保护网络内的各个应用并将其彼此分离。拥有正确的安全密钥,设备才能成为网络成员并有权参与特定应用。网络中的所有节点(node)都拥有一个名为“网络密钥”或“NetKey”的密钥。只有设备拥有了这个密钥,才能成为该网络的成员,即成为其中的节点之一。
5.2 命名法
在解密蓝牙mesh系列之前的文章中(第一篇、第二篇、第三篇、第四篇、第五篇),我们介绍了“设备”(Device)和“节点”(Node)这两个正式的技术术语: 作为mesh网络成员的设备称为“节点”,而不构成节点的设备就称为“设备”。本文将用英文首字母大写“D”的“设备(Device)”一词来代指非mesh网络成员的设备,用全部字母小写的“设备(device)”来代指一般的日常电子设备。
5.3 启动配置设备(Provisioner)
启动配置的流程会将普通的“设备(Device)”变身为“节点(Node)”,使其正式成为蓝牙mesh网络的成员。这一流程通常需要通过一个应用程序来实现,该程序一般由产品制造商所提供,可在智能手机或平板电脑上使用,但也可以采用其他形式,例如桌面或Web应用程序。
运行启动配置应用程序的设备称为“启动配置设备(Provisioner)”,由于它的作用至关重要,因此在物理上必须要保证它的安全性。
5.4 启动配置协议(Provisioning Protocol)
在启动配置期间,启动配置设备会采用称为“启动配置协议”的蓝牙mesh协议,与将要被启动配置的设备进行通信。启动配置设备可通过PB-ADV或PB-GATT承载层[i]两者中的任何一个使用启动配置协议,确保在较早版本的智能手机上亦可实施启动配置设备的应用程序,只要它们支持低功耗蓝牙(Bluetooth Low Energy)和GATT。
5.5 向网络中添加新设备
将设备添加至网络的过程中,最重要的一点是要为其提供网络所有其他节点拥有的网络密钥。当然,这一过程本身必须是安全的,这样恶意设备才无法窃取添加新设备时进行的通信,也无法窃取NetKey。
当购买了新的设备(Device)并需要将其添加至当前蓝牙mesh网络时,用户将使用启动配置设备( Provisioner),同时参考这一新设备制造商的说明,将其添加至蓝牙mesh网络。这样,新设备(Device)就变身为节点(Node),成为蓝牙mesh网络的成员。
该流程涉及几个步骤,见下方流程图:
5.5.1 Beacon广播
蓝牙mesh网络规格中介绍了新的GAP广播类型,包括 <<Mesh Beacon>> 广播类型[ii]。
设备( Device)可采用<<Mesh Beacon>> 广播类型来发出广播,声明自己是未经启动配置的设备,可被启动配置。用户可能需要根据制造商的说明,按照一定的流程,例如键入一组按钮,或将某一按钮长按一段时间等,以此方式启动新设备的广播。
用户还需要在启动配置设备中启动“添加设备到网络”的流程,以便从Beacon设备(Device)接收广播数据包。需要记住的一点是,启动配置设备可能是智能手机或平板电脑应用,因此在实际操作中会涉及到智能手机解锁、应用程序启动、也许还需要登录应用程序(为了进一步确保安全性),并通过其用户界面启动Beacon设备(Devices)搜寻。这样,启动配置设备就会意识到新设备(Device)的存在和准备就绪状态,可进入后续的启动配置流程。
5.5.2 邀请(Invitation)
接下来,启动配置设备将以启动配置邀请PDU(Provisioning Invite PDU)的形式向要进行启动配置设备发送邀请,这是启动配置协议的一部分。Beacon设备会在启动配置功能PDU中回应有关自身的信息。
启动配置功能PDU可提供一系列信息,例如其所拥有的元素数量、所支持的启动配置相关算法等。它还能指示设备(Device)拥有的输入输出功能类型,这些信息将用于认证(Authentication)步骤。
5.5.3 交换公共密钥(Public Key)
包括启动配置设备在内的所有蓝牙mesh设备都支持FIPS P-256椭圆曲线算法,因此必须拥有公共密钥。可通过基于该算法的非对称加密来创建安全通道,以完成剩余的启动配置流程。为此,启动配置设备会与将被启动配置的设备(Device)交换公共密钥。需注意的是,将被启动配置的设备(Device)可以通过带外方式(Out of Band),例如QR码,来提供公共密钥。本系列的后续文章将重点讨论mesh安全性,包括启动配置的安全性。
5.5.4 认证(Authentication)
启动配置设备基于对新设备(Device)功能的了解,向其发送消息,指示其输出单一或多位数值,对其所支持的多种用户操作(例如按下按钮)作出响应。值的形式会因设备差异而有所不同。一台设备可能会在LED面板上显示一个三位的数值,另一台设备则可能是红色LED灯闪烁几次,闪烁的次数就是输出的验证值。启动配置设备的用户将观察到设备(Device)输出的值,并将值输入启动配置设备的用户界面。
然后,设备(Device)和启动配置设备交换密码散列,这些数据来源包括设备(Device)输出的随机值,允许它们完成对彼此的验证。
5.5.5 启动配置数据的分配
认证成功完成之后,会通过两台设备的私有密钥(Private Key)和交换的对等公共密钥生成会话密钥(Session Key)。随后,会话密钥即可用于保护完成启动配置流程所需数据的后续分发,包括网络密钥(NetKey)和设备的唯一地址,即单播地址(Unicast Address)。
启动配置完成后,启动配置设备就会拥有网络的NetKey,这是一个称为“IV索引(IV Index)”的蓝牙mesh安全性参数,且拥有一个由启动配置设备分配的单播地址[iii]。至此,新设备就正式成为了节点,即成为蓝牙mesh网络中的一员。
5.6 向网络中添加新设备
有时会需要从蓝牙mesh网络中移除节点。设备可能已经损坏并需要更换,或者可能需要将它移到另一蓝牙mesh网络,如公司位于其他城市的另一个办公室。同样,设备可能已经被出售,新的设备所有者可能会采用上述启动配置流程,将设备添加至自己的蓝牙mesh网络。
如果设备故障无法修复,你可能只会想简单粗暴将它丢进垃圾桶。如果把某个设备卖给别人,同样你可能只会简单地想到收款,而忽略故障设备的问题。然而,这种做法并不明智。
节点包含通过启动配置流程提供的安全密钥。请记住,设备必须拥有主网络密钥(NetKey),通过这一点才能确定它是网络的成员、并有权访问网络。当您丢弃设备或将其出售时,如果还将蓝牙mesh网络的相关密钥留在其中,就可能导致网络遭受垃圾桶攻击。因此,这里所定义和描述的移除节点的安全程序,能够避免网络被攻击。
从网络中移除节点涉及两个步骤:
- 首先,使用启动配置设备应用,将想要移除的节点添加至“黑名单”。
- 其次,启动一项称为密钥刷新程序(Key Refresh Procedure)的流程。
5.7 黑名单
使用启动配置设备,用户必须将想要移除的节点添加至黑名单。黑名单的目的很简单,就是当启动密钥刷新程序时,确保新的安全密钥不会被发放至黑名单中的节点。
5.8 密钥刷新程序
通过密钥刷新程序,除了黑名单中的节点,网络中的所有节点都会被发放新的网络密钥、应用密钥、以及所有相关衍生数据。也就是说,构成网络和应用安全性基础的整套安全密钥都会被替换。
用户可使用启动配置设备启动密钥刷新,启动配置设备会创建新密钥,并通过配置消息向mesh网络中的所有节点发送新密钥,但黑名单中的成员除外。
低功耗节点(Low Power Node)将从好友节点处接收到新密钥,因此它们可能需要经过相当长的一段时间才会接收到新密钥,随后整个网络将全部更换密钥。
由于所有节点不会在同一时间接收到新密钥,因此密钥刷新程序定义了一个称为“第二阶段”的过渡周期,在此期间新旧密钥均可使用。具体来说,传输过程中会使用新密钥,但支持消息接收的节点会同时使用新旧密钥。
第二阶段完成之后,启动配置设备会通知所有节点废除它们的旧密钥。至此,黑名单之外的每个节点都收到了新密钥。
此时,从网络中移除的节点、以及包含旧网络密钥(NetKey)和旧应用密钥(AppKey)的节点将不再是网络中的成员,因此也无法构成任何威胁。
5.9 结论
安全性是蓝牙mesh网络技术设计的核心。这在网络管理场景中的一些最基本的层面已有充分体现:向蓝牙mesh网络中添加或移除设备。
6 第六章节 Mesh设备的兼容
蓝牙mesh获得如此大的关注,很大一个原因是可以与智能设备的互通。本章节介绍mesh如何实现这一功能。
6.1 低功耗蓝牙
低功耗蓝牙(Bluetooth Low Energy)是一项相当成功的无线技术。如今已经很难找到不支持低功耗蓝牙的智能手机或平板电脑了。可以说它是可穿戴技术兴起的关键因素。在医疗设备、智能家居设备、传感器等很多设备中,低功耗蓝牙的身影随处可见。
目前有数十亿支持低功耗蓝牙的设备已投入使用。那么,这些设备都能成为蓝牙mesh网络的一员吗?答案是肯定的。
低功耗蓝牙设备只要具有正确的低功耗蓝牙功能和一些附加软件,就能加入蓝牙mesh网络中。以智能手机为例,可能只需要一个可以与蓝牙mesh网络对话的普通应用程序(App)就足够了。换句话说,这是任何开发者都能编写的应用程序。
6.2 承载层(bearer layer)
要了解非mesh低功耗蓝牙设备如何成为蓝牙mesh网络的一员,我们需要回顾一下蓝牙mesh协议栈,见第二章节。
蓝牙mesh网络采用低功耗蓝牙作为其射频通信协议栈。而具体如何使用,则是蓝牙mesh网络协议栈最底层的承载层需要负责的工作。
目前定义了两个承载层:广播承载层 (advertising bearer)和GATT承载层 (GATT bearer)。蓝牙mesh网络设备默认使用的是广播承载层,它负责在低功耗蓝牙广播数据包内收发蓝牙mesh数据包。
具有低功耗蓝牙协议栈、能够进行广播和扫描的设备具有基本的、必备的低功耗特性,因此能够支持广播承载层、乃至完整的蓝牙mesh网络协议栈。
既不支持也无法升级使用广播承载层的设备,则必须使用GATT承载层。使用GATT承载层时需要将蓝牙mesh协议数据单元(PDU)封装在代理协议(Proxy Protocol)中,我们将在下文中对此进行详细介绍。
6.3 节点与特性
成为蓝牙mesh网络中一员的设备被称为节点(Node)。很多种产品类型都能够成为节点:照明灯、灯具开关、温控器、窗锁、占用传感器等。然而,无论产品类型如何,节点都可能提供某些超出其产品本身功能的特定蓝牙mesh网络服务。
蓝牙mesh规格定义了节点可能拥有的特性。具有这些特性中的一个或多个,即表示节点可以在网络中扮演相应的特殊角色。定义的特性包括:
设备类型 | 说明 |
---|---|
中继(Relay) | 中继节点可通过广播承载层,接收并重新发送蓝牙mesh消息。
中继特性能让蓝牙mesh消息在设备之间实现多次跳跃,传送距离可超过两台设备之间直接进行无线电传输的范围,从而覆盖整个网络。 |
好友(Friend) | 好友节点能够存储发往相关低功耗节点的消息,随后再进行转发。 |
低功耗节点 (LPN) | 低功耗节点功率受限,可借助好友节点的支持,在蓝牙mesh网络中有效地运作,借此大幅降低空占比。 |
代理(Proxy) | 代理节点可通过承载层(广播承载层或GATT承载层)接受信息,并通过另一个广播承载层或GATT承载层重新发送消息。 |
6.4 代理节点(Proxy Node)
非mesh低功耗蓝牙设备成为蓝牙mesh网络成员的过程中,代理节点是关键。代理节点的根本目的是执行承载层转换。它能够实现从广播承载层到GATT承载层的转换,反之亦然。因此,不支持广播承载层的设备可通过GATT连接来收发各类蓝牙mesh消息。
节点可通过在特性字段中设置代理特性位(proxy feature bit),来表示自身可用作代理节点。特性字段是所有节点都具有的成分数据状态的一部分。
6.5 蓝牙mesh代理服务
代理节点(Proxy Node)可实施称为mesh代理服务的GATT服务,即本文中的“代理服务器(Proxy Server)”。mesh代理服务包含两个GATT特性:mesh代理数据输入和mesh代理数据输出。代理客户端(Proxy Client) 使用“GATT Write Without Response”子程序,将代理协议(见下图)PDU写入mesh代理数据输入特性,并从GATT通知中的mesh代理数据输出特性接收代理协议PDU。这就是互联GATT设备通过代理节点在蓝牙mesh网络中进行数据交换的机制。
6.6 发现代理节点
低功耗蓝牙设备使用GAP广播来帮助其他设备发现自己。蓝牙mesh代理节点使用完全相同的技术,即通过“GAP可连接型广播(connectable advertising)数据包”,对自身的可用性、可作为代理节点的角色、及其身份进行广播。
GAP广播数据包中包含各类字段,称为广播类型(AD Type)。核心规格附录中对广播类型进行了定义。代理节点会在广播数据包中包含以下字段:
广播类型 | 注释 |
---|---|
标识 | 表示通用可被发现模式(General Discoverable Mode) |
完整的16位服务UUID列表
或 不完整的16位服务UUID列表 |
包括mesh代理服务的UUID |
服务数据 | 包含与mesh代理服务相关的数据,可识别该代理是在为哪个网络或节点所提供服务 |
服务数据广播类型的内容还需经过进一步检查。
服务数据字段 | 注释 |
---|---|
识别类型 | 此字段中的值能够正确解释“识别参数”字段的内容。
0x00:网络ID(Network ID)类型 0x01:节点标识(Node Identity)类型 |
识别参数 | 可以是网络ID或节点标识,具体取决于识别类型 |
网络ID是从网络密钥(NetKey – 参照《解密蓝牙mesh系列 | 第六篇》)派生而来的唯一公共标识符。节点标识由代理服务器节点的单播地址和网络标识符的组合派生而来,例如启用该标识的子网的网络ID。
如果代理服务器是多个子网的成员,则它将对包含每个子网的网络ID广播数据包进行交替操作,每次处理一个广播数据包。
节点标识广播的主要用途是将启动配置设备(Provisioner)快速连接至刚刚完成启动配置的节点,从而完成新节点的配置。
6.7 代理协议
代理客户端和代理服务器使用代理协议进行通信,并向对方发送代理PDU。这些PDU就像是存放各类蓝牙mesh PDU的容器。
蓝牙mesh接入消息使用核心蓝牙mesh协议栈,因此消息包含在网络PDU内。网络PDU可被封装在代理PDU中。
蓝牙mesh配置文件规格中定义了各种Beacon,包括未经启动配置的设备Beacon、以及安全网络Beacon。可通过代理协议将蓝牙mesh Beacon纳入网络。
启动配置过程涉及其自身协议,且启动配置PDU也可在代理PDU内进行交换。
最后,代理客户端和代理服务器可以交换特殊的代理配置消息,这些消息也可被封装于代理PDU中。
大多数类型的mesh数据可使用代理协议进行交换,因此可通过连接至代理节点的GATT客户端进行收发。
不同设备代理PDU的大小各异,PDU的大小是根据低功耗蓝牙属性协议(ATT)的最大传输单元(MTU)进行动态设置的,这是通过GATT连接来传输代理PDU的基础。此外,代理协议可以将完整的蓝牙mesh消息封装在代理PDU或多段消息的各个段中,借此来容纳较长的蓝牙mesh消息。
需要注意的一点是,任何蓝牙mesh节点(而非只有代理节点)都可以实施代理协议,从而支持基于GATT连接的直接交互。这在启动配置(provisioning)场景中非常有用。
关于代理协议的更多信息,包括代理PDU的格式,可参考蓝牙mesh配置文件规格: https://www.bluetooth.com/specifications/mesh-specifications 【这里待上传pdf文档】
6.8 代理过滤器和代理配置
代理客户端可通过对代理服务器所应用的过滤器进行配置,对接收到的网络流量进行精确的控制。过滤器采用白名单和黑名单的形式,同时这些名单会指定各自的目标地址列表。列表中的地址可能是其所支持的地址类型的任意组合,即单播、群组或虚拟地址。如果消息的目标地址未包含在白名单过滤器中,则消息会被代理服务器的代理过滤器(Proxy Filter)滤掉。同样,如果消息的目的地包含在黑名单过滤器中,也会被滤过。
代理配置(Proxy Configuration)消息在代理客户端和代理服务器之间进行交换,并实现代理过滤器的配置。
6.9 使用低功耗蓝牙智能手机或平板电脑启动配置
通常使用智能手机或平板电脑执行启动配置流程,以将新设备添加至蓝牙mesh网络。大多数此类设备不会实施完整的蓝牙mesh网络协议栈,而且与蓝牙mesh网络进行的所有交互(包括启动配置)都很可能会使用代理协议。如前所述,启动配置PDU可被封装于代理PDU中,因此可通过代理服务器节点、利用GATT连接进行交换。蓝牙mesh配置文件规格中将采用代理协议的启动配置协议称为PB-GATT。
6.10 借助代理节点使用代理协议时需要注意什么?
智能手机等设备要想通过代理节点、借助代理协议与蓝牙mesh网络通信,则必须扫描并连接至代理节点。换句话说,它必须支持GAP中央设备的角色。
此外,必须首先对智能手机进行启动配置。如果未经启动配置,任何设备都无法与蓝牙mesh网络中的节点进行交互。
6.11 结论
通过GATT、代理协议和蓝牙mesh代理节点对当前市场上的低功耗蓝牙设备提供支持,这绝对值得上新闻头条了!它为人们手中已有的海量设备打开了通往蓝牙mesh网络世界的大门。
7 第七章节 安全性概览
无论是mesh还是其他网络技术,安全性永远是最重要的特性。
7.1 为何安全性如此关键?
安全性可谓是物联网(IoT)最受关注的问题之一。从农业到医院、从智能家居到商业智能建筑、从发电站到交通管理系统,物联网系统和技术将触及我们生活的方方面面。物联网系统如果存在安全漏洞,就可能会导致灾难性的后果。
蓝牙mesh网络的安全性从设计之初就是重中之重。本章节将着重分析主要的安全特性和现已被解决的安全问题。本系列的后续文章也将持续详细地介绍蓝牙mesh网络安全性的各个方面。
7.2 蓝牙mesh网络强制使能安全性
低功耗蓝牙(Bluetooth Low Energy)GATT设备可实施蓝牙核心规格中定义的一系列安全措施。产品设计人员有责任决定采取哪些安全措施,也可以决定不采用任何既有的安全特性。换句话说,低功耗蓝牙GATT的安全性配置是非强制性的。如果我们谈论的是单一设备的安全性及其与另一台设备的连接,只要产品设计师正确地进行风险评估,那么他的决定就是合理的。然而,蓝牙mesh网络中的安全性涉及的不仅是单一设备或对等设备之间的连接安全性;它关注的是整个设备网络的安全性,以及网络中各组设备的安全性。
因此, 蓝牙mesh网络中强制性使用安全性。
7.3 蓝牙mesh网络安全性的基本概念
以下基本的安全性说明适用于所有蓝牙mesh网络:
项目 | 详情 |
---|---|
加密与认证 | 所有mesh消息都经过加密和认证。 |
安全分级考量 | 网络安全性、应用安全性和设备安全性彼此独立。详见下方的“安全分级考量”。 |
区域隔离 | 蓝牙mesh网络可分为若干子网,每个子网密钥不同,独立于其他子网,各自都是安全的。 |
密钥刷新 | 通过密钥刷新过程,可以在蓝牙mesh网络的整个生命周期内更改安全密钥。 |
消息模糊化 | 消息模糊化的作用是让外界难以跟踪网络内所发送的消息,进而提供了一种隐私保护机制,难以让外界跟踪节点(Node)的网络活动。 |
中继攻击防护 | 蓝牙mesh安全性可保护网络免受中继攻击。 |
垃圾桶攻击防护 | 节点可从网络中安全地移除,此方式也能防止垃圾桶攻击(Trash Can Attack)。 |
安全设备启动配置 | 设备添加到蓝牙mesh网络以成为节点的过程是一个安全的过程。 |
7.4 安全分级考量与安全密钥
蓝牙mesh安全性的核心是三类安全密钥。这些密钥为mesh网络的不同方面提供了安全性,并实现了蓝牙mesh网络安全性中的关键性能,即“安全分级考量”。
以可用作中继(Relay)节点的mesh照明灯为例,它能够作为中继,处理与楼宇中蓝牙mesh门窗安全系统相关的消息。照明灯完全不涉及对这些消息内容细节的访问和处理,但却会将消息中继至其他节点。
为处理这种潜在的利益冲突,蓝牙mesh采用称为“应用密钥(AppKey) ”的安全密钥来保护应用层消息,它不同于用于保护特定应用(如照明、物理安全、温控等)相关数据安全的密钥。
蓝牙mesh网络中的所有节点都拥有一个或多个网络密钥(NetKey),每个网络密钥对应一个子网,它也可能是主要子网。节点必须拥有网络密钥,才能成为网络中的成员。网络加密密钥(Encryption Key)和隐私密钥(Privacy Key)直接源于网络密钥。
拥有NetKey让节点能够对网络层的数据进行解密和验证,以便执行诸如中继等网络功能。但应用程序数据不可被解密。
每个节点还拥有一个唯一的安全密钥,称为设备密钥(DevKey),用于节点的启动配置(Provisioning)和配置流程。
7.5 区域隔离
节点拥有了主要NetKey ,就意味着它具备了蓝牙mesh网络成员资格和访问权限。但也可以将网络划分成不同的子网,每个子网都有自己的子网密钥。这意味着只有拥有指定子网密钥的设备才能与该子网中的其他成员设备进行通信。也可以临时创建并分配子网密钥,例如,酒店中位于不同客房的节点的隔离。
7.6 节点移除、密钥刷新与垃圾桶攻击
如上所述,节点包含各种蓝牙mesh安全密钥。如果一个节点发生故障并需要处理,或者如果所有者决定将节点出售给其他人,那么重要的是确保该设备及其所包含的密钥不会被盗用,避免向节点原本所在的网络发动攻击。
从网络中删除节点的程序现已有明确定义。通过启动配置设备(Provisioner)应用程序,可将节点添加至黑名单,然后启动密钥刷新程序(Key Refresh Procedure)。
密钥刷新程序会向网络中除黑名单成员以外的所有节点发放新的网络密钥、应用密钥、以及所有相关的派生数据。也就是说,构成网络和应用程序安全性基础的整套安全密钥将被替换。
因此,已从网络中移除的、包含原有NetKey 和AppKey的节点将不再是网络成员,换句话说,上述这些不被授信的节点将从网络当中剔除出去,因此也无法再构成威胁。
7.7 隐私
由NetKey导出的隐私密钥(Private Key)用于对网络PDU (Payload Data Unit) 的报头值进行模糊化,例如源地址(source address)。模糊化可以确保无法通过随机的被动窃听来跟踪节点及其使用者,也使得基于流量分析的攻击难以实施。
7.8 中继攻击
在网络安全方面,中继攻击是窃听者拦截并捕获一个或多个消息、稍后重新进行传输的一种技术,目的是欺骗接收者,执行未经被攻击设备授权的任务。常见的例子就是汽车的无钥匙进入系统被攻击者所击破,攻击者就能拦截汽车车主和汽车之间的认证序列,然后对这些消息进行中继,以进入汽车并将其偷走。
蓝牙mesh可保护网络免受中继攻击。这种保护是基于分别称为序列号(SEQ, Sequence Number)和IV索引(IV Index)的两个网络PDU字段。每次发布消息时,元素会增加SEQ值。节点从元素接收消息,如果元素包含的SEQ值小于或等于上一个有效消息中的SEQ值,则节点会将消息丢弃,因为这则消息可能与中继攻击有关。IV索引是一个单独的字段,需与SEQ一同纳入考量。来自给定元素的消息中的IV索引值必须始终等于或大于该元素的上一个有效消息。
7.9 加密工具箱
蓝牙mesh网络的大多数安全特性都有赖于业内标准的加密算法和程序,这在本系列的其他安全性相关文章中也会提及,本文还是着重解释最重要的内容。
蓝牙mesh协议栈中采用的两项关键的安全功能是AES-CMAC和AES-CCM。这些是基本的加密和认证功能,所有用于密钥生成的其他功能都是基于上述两者。
7.9.1 AES-CMAC
基于密码的消息认证码(CMAC)是一种算法,能够生成固定长度的128位消息认证值,并将其用于任何变量长度输入。使用AES-CMAC算法生成消息认证码MAC的公式为:
MAC=AES-CMACk(m)
AES-CMAC具有出色的错误检测能力。涉及验证校验和或者使用错误检测代码的其他技术只能检测数据的意外修改。AES-CMAC旨在检测有意的、未经授权的数据修改,以及意外修改。如果您有意向了解更多关于此功能的信息,请参考RFC4493 中的详细定义:https://tools.ietf.org/html/rfc4493
向 AES-CMAC输入:
- k – 128位的密钥
- m – 将被认证的可变长度数据
7.9.2 AES-CCM
AES-CCM是一种通用的、认证的加密算法,使用时需要加密块密码。在蓝牙mesh规格中,AES-CCM在所有情况下都能被用作基本的加密和认证功能。其使用公式如下:
密文,MIC=AES-CCMk(n,m,a)
向AES-CCM输入四项内容:
- k – 一个128位的密钥
- n – 一个104位的随机数
- m – 将被加密和认证的可变长度数据
- a – 将被认证、但不加密的可变长度数据,也被称为“附加数据(Additional Data)”,这一输入参数长度可以为0字节。
从 AES-CCM有两项输出:
- 密文 - 加密后的可变长度数据
- MIC – m和a的消息完整性检查值
下图显示了可能来自蓝牙mesh网络层(network layer)或上层传输层(upper transport layer) 的纯文本有效载荷(Payload),由具有输入加密密钥(Key)、随机数(Nonce)和纯文本有效载荷的AES-CCM进行处理。其输出为加密的有效载荷(Encrypted Payload) 和MIC。
7.10 SALT生成
蓝牙mesh安全性定义了SALT 生成函数s1,它采用AES-CMAC功能。如上所述,AES-CMAC具有两个输入参数:k和m。当用于SALT生成时,只有输入参数m发生变化。 K一直被设置为一个128位的值,即0x0000 0000 0000 0000 0000 0000 0000 0000,它在蓝牙mesh规格中被称为ZERO。
向 SALT生成函数输入:
- m – 一个长度非零的八位字节数组或ASCII编码字符串
其输出为一个128位的MAC值,s1公式 如下:
s1(m)=AES-CMACzero(m)
7.11 其它安全性函数
在蓝牙mesh网络规格第3.8.2章节的“安全工具箱(Security Toolbox)”部分中,可以找到对其他安全函数的定义,例如各种关键性的派生函数。所有这些都是基于AES-CMAC和SALT生成函数s1(SALT生成函数也是基于AES-CMAC)。
(https://www.bluetooth.com/specifications/mesh-specifications)
7.12 重中之重安全
2017年5月,臭名昭著的勒索软件WannaCry向全球各地的电脑发起了攻击,并窃取了用户数据进行勒索。来自150个国家和地区的数百万台计算机遭受影响,勒索软件要求用户通过比特币这一加密电子货币的形式支付赎金。如果没有稳健的、基于标准的安全系统设计,物联网(IoT)可能也会发生类似情况。可以想象,如果没有完善的安全防护,今后物联网设备的用户也会迫不得已支付“赎金”让“黑客”打开自家的家门。
安全性是蓝牙mesh网络设计的核心,而且这种安全性是强制性的,网络中的每个数据包都会经过加密和认证。蓝牙mesh网络的安全性能够保护整个mesh网络免受各类威胁和问题的困扰,包括:
- 中继攻击(Replay attack):可通过正确使用序列号来保护网络不受中继攻击。
- 中间人攻击(Man-in-the-middle attack):采用非对称加密技术来进行抵御,例如通过椭圆曲线Diffie-Hellman(ECDH)来有效防范中间人攻击。
- 垃圾桶攻击(Trash Can attack):这种攻击利用的是废弃设备,必要时可通过刷新安全密钥来防止攻击发生。
安全性是蓝牙技术的首要问题,我们将在解密蓝牙mesh系列中持续探讨这一话题。读完本章节,对于蓝牙mesh网络主要的安全特性以及一些基本的加密技术,您应该已经有了较为深入的了解,请继续阅读下章节内容。
8 第八章节 启动配置
启动配置(Provisioning)是向蓝牙mesh网络(如灯泡)添加新的未经启动配置设备的过程。该过程由启动配置设备(Provisioner) 进行管理。启动配置设备和未经启动配置设备遵循蓝牙mesh规格中定义的固定过程。启动配置设备向未经启动配置设备提供使其成为蓝牙mesh节点的启动配置数据(provisioning data)。
启动配置设备通常是运行启动配置应用程序的智能手机或其它移动计算设备。尽管每个网络只需要一台启动配置设备来执行启动配置,但可用的启动配置设备可以有多台。
8.1 启动配置协议
蓝牙mesh规格中定义了启动配置协议,该协议定义了启动配置流程中用于在启动配置设备和新的未经启动配置设备之间进行通信的标准流程以及PDU。图1描绘了完整蓝牙mesh协议栈之外的启动配置协议栈。
从下到上的组件如下:
一、启动配置承载层(Provisioning Bearer)
启动配置承载层实现了启动配置PDU在启动配置设备和未经启动配置设备之间的传输。定义的两个启动配置承载层包括:
- PB-ADV:指通过蓝牙广播信道进行设备启动配置的启动配置承载层。PB-ADV承载层用于发送通用启动配置 (Generic Provisioning) PDU。支持PB-ADV的设备应尽可能执行占空比接近100%的被动扫描,以避免遗漏任何发送来的通用启动配置PDU。
- PB-GATT:指使用来自代理协议的蓝牙mesh代理(proxy)PDU来进行设备启动配置的启动配置承载层。“代理协议能使节点通过面向连接的低功耗蓝牙(Bluetooth Low Energy)承载层来收发网络PDU、mesh Beacon、代理配置消息和启动配置PDU。PB-GATT在GATT操作中包含了启动配置PDU,涉及GATT启动配置服务,同时能在启动配置设备不支持PB-ADV时供其使用。
二、启动配置协议
定义对于启动配置PDU、行为和安全性的要求。了解启动配置协议将有助于您根据应用需求选择合适的验证方法。
8.2 启动配置程序
启动配置协议定义了10种启动配置PDU:
- 启动配置邀请 (Provisioning Invite)
- 启动配置能力 (Provisioning Capabilities)
- 启动配置状态 (Provisioning State)
- 启动配置公钥 (Provisioning Public Key)
- 启动配置输入完成 (Provisioning Input Complete)
- 启动配置确认 (Provisioning Confirmation)
- 启动配置随机 (Provisioning Random)
- 启动配置数据 (Provisioning Data)
- 启动配置完成 (Provisioning Complete)
- 启动配置失败 (Provisioning Failed)
开发者若想了解有关这些PDU的详细信息,请参考蓝牙mesh规格的5.4.1节(详见:https://www.bluetooth.com/specifications/mesh-specifications )。
完整的启动配置过程必须在更高的层面完成两项重要任务:
- 验证未经启动配置的设备。在蓝牙mesh网络中,一个小空间中可能存在几台、几十台或数百台设备。执行认证是为了确保与启动配置设备进行交互的设备就是用户想要启动配置的设备。
- 与未经启动配置的设备建立安全链接,并与之共享相应的信息。在流程的最后,原本未经启动配置的设备将成为蓝牙mesh网络中的节点。
8.3 启动配置流程包括五个阶段
- 发送Beacon信号
- 邀请
- 交换公共密钥
- 认证
- 启动配置数据分发
这里将介绍前三个阶段。我们将在“蓝牙mesh网络启动配置二”中介绍最后两个阶段。
8.3.1 发送Beacon信号
Beacon是低功耗蓝牙的传统应用场景。想象一下,一个GAP外设(如智能手表或活动跟踪器)希望与GAP中央设备(如智能手机或平板电脑)连接。 GAP外设切换到广播状态并开始发送其广播数据包。GAP中央设备扫描广播数据包以发现其它设备并接收相关基本信息。蓝牙mesh启动配置使用的也是相同的广播机制。
如果未经启动配置的设备支持PB-ADV承载层,则其作为未经启动配置设备Beacon进行广播。这涉及指定的数据包格式,且未经启动配置设备通过此方式来使自身被启动配置设备 (Provisioner) 发现。
当未经启动配置设备使用PB-GATT承载层时,一项称为“mesh启动配置服务”的GATT服务会支持整个启动配置程序,同时支持与启动配置设备的交互。在发送Beacon信号阶段,未经启动配置设备会发送包括mesh启动配置服务UUID的广播数据包,它会被启动配置设备通过标准的低功耗蓝牙扫描程序发现。
8.3.2 邀请
在发送Beacon信号之后,启动配置设备和未经启动配置设备会建立PB-ADV或PB-GATT启动配置承载层(provisioning bearer)。然后,启动配置设备发送一个启动配置邀请 PDU,设备通过启动配置功能PDU对其作出响应。
启动配置邀请PDU包括Attention Duration字段,其指示了未经启动配置设备的主要元素应采用某种视觉指示方式,并在多长的时间内吸引用户的注意力。
启动配置功能PDU包括:
- 设备支持的元素数量;
- 支持的一组安全算法;
- 使用带外(OOB)技术实现的公共密钥可用性;
- 该设备向用户输出值的能力。
- 该设备允许用户输入值的能力。
上图流程图让人联想到低功耗蓝牙中的配对过程,这在此前的文章《蓝牙配对 - 第一篇:配对特性交换(Pairing Feature Exchange)》中有所介绍。 低功耗蓝牙配对采用的配对特性交换类似于蓝牙mesh启动配置程序中的启动配置邀请阶段。在启动配置邀请阶段,目的是向启动配置设备(Provisioner) 提供有关未经启动配置设备功能的信息。有了这些信息,启动配置设备就能决定下一步该如何进行。
8.3.3 交换公共密钥
信息加密涉及两项基本技术:对称加密(也称为密钥加密)和非对称加密(也称为公钥加密)。
对称加密采用相同的密钥进行加密和解密。只要发送设备和接收设备都知道密钥,就能够解密所有使用此密钥加密的信息。然而,很难安全地通过链路交换密钥并防止其落入坏人之手。
非对称加密使用两个相关的密钥(即一个密钥对)来解决上述问题:公钥和私钥。公钥免费提供给任何可能想向您发送消息的人。私钥则为保密,只有你自己知道。使用公钥加密的任何消息(文本、二进制文件或对称密钥)只能通过应用相同的算法、且仅能使用与之匹配的私钥进行解密。这意味着您不必对通过链接传递公钥的过程有任何担忧,因为它们仅用于加密而非解密。然而,非对称加密比对称加密慢一些,且需要更高的处理能力来进行消息内容的加密和解密。
在蓝牙mesh用例中,大多数设备基于嵌入式芯片组或模块,因此无法使用计算成本昂贵的非对称加密技术来对每个消息进行加密/解密。对称加密更适合于不具备非对称加密所需处理能力的设备,但如何安全地交换并使用密钥仍然是一大问题。蓝牙mesh采用了非对称和对称加密结合的方式来解决这一问题。
- 非对称加密:椭圆曲线Diffie-Hellman(ECDH)是一种匿名密钥协商协议,允许具有椭圆曲线公私密钥对的双方在非安全信道上建立共享保密信息。ECDH在蓝牙mesh启动配置中的目的是在启动配置设备和未经启动配置设备之间创建安全链路。它使用公钥和私钥来分发对称性密钥,两台设备随后可将其用于后续消息的加密和解密。
- 对称加密:在蓝牙mesh网络中传输的每个消息都使用AES-128密码加密。 AES-128算法是常用的对称加密/解密引擎,常用于嵌入式平台。
在交换公钥阶段,有两种交换ECDH公钥的可能方式。它们可以通过蓝牙链路、或OOB隧道进行交换。在启动配置邀请阶段,未经启动配置的设备已经报告了是否支持通过OOB隧道发送自身公钥。如果是,则启动配置设备可继续使用它,并通过发送启动配置开始PDU来通知未经启动配置的设备。
如果未经启动配置设备的公钥可通过OOB隧道获得,则临时公钥从启动配置设备发送到设备,并采用合适的OOB技术(例如二维码),从未经启动配置的设备中读取静态公钥,如图所示。
否则,双方的公钥都会经由图4中所示的蓝牙链路进行交换。
在该等式中,P-256即FIPS 186-3中定义的FIPS-P256曲线。
8.3.4 认证
在此步骤中,启动配置设备使用所选的验证方法,对未经启动配置设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):输出OOB(Output OOB)、输入OOB(Input OOB)、以及静态OOB(Static OOB)或无OOB(No OOB)。
8.3.4.1 输出带外(Output OOB)
若选择的是输出带外(Output OOB)验证方法,则未经启动配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字。例如,如果未经启动配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有LCD屏幕,则可以将随机数显示为多位数值。启动配置设备(Provisioner)的用户需要输入观察到的数字,来验证未经启动配置的设备。输出带外验证方法的工作流程如图1所示。
(图片:通过输出OOB进行验证)
输入随机数后,启动配置设备(Provisioner)生成并检查确认值。无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的,请继续往下看。
8.3.4.2 输入带外(Input OOB)
输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,但设备的角色相反。启动配置设备(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经启动配置的设备。以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数。
与输出带外验证(Output OOB)相比,输入带外(Input OOB)方法需要发送一个附加的启动配置协议PDU。在完成认证操作之后,未经启动配置的设备向启动配置设备发送一个启动配置输入完成PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。
(图片:通过输入OOB进行验证)
8.3.4.3 静态带外(Static OOB) 或无带外(No OOB)
在输入带外或输出带外都不可用的情况下,启动配置设备(Provisioner)和未经启动配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:采用静态OOB信息;或静态OOB信息不可用,直接以数值0代替。在此情况下,启动配置设备和未经启动配置的设备各自生成一个随机数,然后进行检查确认值操作。
8.3.4.4 检查确认值(Check Confirmation Value)
无论采用何种验证方法,都会进行确认值生成和检查。根据蓝牙mesh规格,启动配置设备(Provisioner) 和未经启动配置设备应分别计算确认值。这两个值被称为ConfirmationProvisioner和ConfirmationDevice。这两个值的计算都使用一系列相同的函数,不同之处仅在于所使用的随机数输入。
蓝牙mesh规格中有两页关于计算过程的内容说明。确认值生成函数需要8个参数,参数值来自启动配置(Provisioning)过程中的后续步骤。可参考规格的5.4.2.4认证和5.4.1启动配置PDU部分,了解更多详细信息。(详见:https://www.bluetooth.com/specifications/mesh-specifications )
表1列出了用于确认值生成及其来源的参数。
(表格)
让我们来看看用于确认值生成的算法。图3是一个流程图,其中包括了几轮AES-CMAC和SALT生成[1]。该流程图对于ConfirmationProvisioner和ConfirmationDevice值均适用。
- 如果由启动配置设备(Provisioner)执行输入,则从一个名为RandomProvisioner的值开始(下图中以蓝色表示),并生成ConfirmationProvisioner值。
- 如果由未经启动配置设备执行输入,则从一个名为RandomDevice的值开始(下图中以绿色表示),并生成ConfirmationDevice值。
(图片:确认值生成图)
8.3.4.5 确认值检查(Confirmation Value Check)
当确认值生成之后,两台设备就会进行交换,并且都会检查接收值的完整性。图4表示确认值检查的过程。
确认过程的开始就是启动配置设备(Provisioner)将其随机数RandomProvisioner发送到未经启动配置的设备。未经启动配置设备使用它来重新计算确认值,并与之前接收的确认值进行比较,进行验证。
(图片:确认值检查)
- 如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner不匹配,则启动配置(Provisioning)过程将被中止。
- 如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner匹配,则未经启动配置设备将其RandomDevice值发送给启动配置设备。
然后,启动配置设备(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。
- 如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice不匹配,则启动配置(Provisioning)流程将被中止。
- 如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice匹配,则表示验证成功。后续只要启动配置设备(Provisioner)和未经启动配置设备完成启动配置流程的第五步:启动配置数据分发,则未经启动配置设备就能成为蓝牙mesh网络中的节点(node)。
8.3.5 启动配置数据分发
认证步骤完成之后,就可以确保在启动配置设备(Provisioner)和未经启动配置设备之间建立的承载层的安全,然后就进入启动配置(Provisioning)过程中最重要的一步:导出并分发启动配置数据(provisioning data)。启动配置设备(Provisioner) 负责生成启动配置数据,启动配置数据由多个数据项组成,包括一个称为网络密钥 (NetKey) 的安全密钥。表2列出了启动配置数据字段。
(表格)
为安全地进行启动配置数据分发,启动配置设备(Provisioner)采用AES-CCM [2],借助共享的会话密钥(SessionKey)对启动配置数据(provisioning data)进行加密,启动配置设备和未经启动配置设备都会进行计算。 AES-CCM需要三个输入参数:会话密钥、会话随机数和纯文本。纯文本参数值包含需要被加密的启动配置数据。设备密钥(DevKey)、会话密钥(SessionKey)和会话随机数(SessionNonce)的值通过图5所示的过程导出。
(图片: DevKey / SessionKey / SessionNonce生成过程)
从图5可以看出:
- 如果将prsk(绿色)的输入值代入k1函数中,则会生成SessionKey。这是用于启动配置数据加密的关键。
- 如果将prsn(黄色)的输入值代入k1函数中,将生成SessionNonce。这是用于启动配置数据加密的随机值。
- 如果将prdk(蓝色)的输入值代入k1函数,则将生成DevKey。
启动配置设备(Provisioner)和未经启动配置设备都需要生成会话密钥(SessionKey)和会话随机数(SessionNonce)。当SessionKey和SessionNonce值准备就绪时,启动配置设备将对包含导出启动配置数据的启动配置数据PDU (Provisioning Date PDU) 进行加密,并将其发送至未经启动配置的设备。此处,相同的SessionKey和SessionNonce值也可用来对接收到的数据进行解密。
至此,启动配置流程完成。两台对等设备都已知晓新的设备密钥(DevKey)和全网的网络密钥(NetKey),这就意味着我们的新设备已成为蓝牙mesh网络中的节点(node)和成员。
8.4 结束语
启动配置过程是蓝牙mesh安全的基础,让网络设备之间能够可靠安全地进行通信。如果您想了解有关蓝牙mesh的更多信息,请下载蓝牙mesh规格,蓝牙mesh创新产品开发所需的一切都将尽在掌握。