一文看懂蓝牙Mesh技术
蓝牙从2000年推出以来即积极追求成长,初衷只是希望取代有线技术,但旋即成为无线音讯与电脑周边产品的重要标准,例如无线滑鼠和键盘。
2010年,低功耗蓝牙的诞生让蓝牙技术又向前迈进一大步。其影响力既深且广,应用范围涵盖智能型手机和平板、医疗和健身、智能家庭,以及穿戴式装置市场。以Mesh网络拓扑建立的无线通讯系统,已证实能够有效提供大范围的涵盖率,不仅能延伸涵盖范围,而且相当稳定可靠。然而,在此之前这类网络都是建构在特殊技术之上,无法与大多数消费者的电脑、智能型手机与周边配件相容,亦不适用于企业端。
此次蓝牙Mesh技术规格的制定是120家蓝牙技术联盟企业会员共同努力的成果,远远超越了一般正常的规模,也因此才能满足全球对于蓝牙网状网络产业标准的要求。对蓝牙技术而言,Mesh规格的制定,象征着型态的转变,而其影响层面之庞大,也让它成为一项典范转移。本文章共分上下篇,上篇叙述蓝牙Mesh应用与特点,下篇则描述蓝牙Mesh技术与设计架构。
蓝牙Mesh实现智能建筑
想像一下,在一个天还未亮的冬日清晨,您开车去上班,经过公司保全系统之后,系统自动分配一个车位给您(图1)。车位上方的编号自动亮起,引导您轻松将车停好。接着,车位分配系统立即将这个车位标记为已占用。
图1 蓝牙Mesh网状网络涵盖整个办公室和停车场。
走进大楼,人员感应器侦测到您的存在,立即透过您的穿戴式装置辨认您的身分。您走进电梯,搭到二楼,然后走出电梯。一如往常,您又是第一个进办公室。当电梯门开启,从电梯口到您办公室及厨房的沿路,灯光自动亮起,咖啡是您公司不可或缺的要素,为了节能,其他区域依然保持在黑暗中。
您走进办公室,身后的门自动关上。天花板及您桌上的台灯都已经为您开启,并且调整在您觉得最舒适的亮度。您注意到室内的温度似乎比整个办公室稍微温暖一点,这正好是您个人最爱的温度。您一坐下,您的电脑就自动将您登入。
您的一天就此顺利展开,大楼自动回应了您的需求,甚至贴心地配合您的喜好。所有系统都很有效率地运作,而这一切是如何办到的?
几个月前,公司安装了一套蓝牙Mesh网状网络,一开始先安装的是Mesh照明系统;后来人员感应器、环境感应器、无线暖气空调及停车管理系统也陆续加入Mesh网络当中。公司因此省下了不少的电费和暖气费,而且工作环境也变得更有人性,大幅提升了个人的工作效率。不仅如此,维护成本也因而降低,因为公司再也不必为了增加新的照明开关而大费周章地布线,既省下昂贵的成本,又不会干扰正常营运。
与此同时,大楼管理团队也能透过各种资料来了解整个大楼及各项服务的状况,同时掌握人们的使用情况,然后再利用这些资料将系统调整至最佳状况。
蓝牙Mesh网状网络让您轻松、经济地掌握整栋建筑的各项服务,并透过无线方式来操控并设定自动化行为。回想起来,您还真不知道以前没有这套先进系统时是怎么过活的。
蓝牙Mesh技术基本概念
要了解蓝牙Mesh网状网络拓扑,首先要先对一些蓝牙以外的最新科技名词和概念有所认识。本章节将介绍一些最基本的名词和概念。
「网状网络」与「点对点」
大多数的低功耗蓝牙装置都是经由简单的「点对点」网络拓扑来和其他装置通讯(一对一通讯),在蓝牙的核心规格当中,这样的网络称为「Piconet」微微网。
想像一支智能型手机和一台心率监视器之间建立了点对点连线,并将资料传输到手机上。蓝牙有一项不错的特性就是装置可以建立多个连线,因此这支智能型手机还可和另一个活动纪录器建立点对点连线。尽管这支智能型手机可以同时和两个外部装置直接通讯,但外部装置彼此之间却无法直接通讯。
反观网状网络则是一种「多对多」的网络拓扑(图2),网状网络中的每个装置都能与其他任一装置通讯,这一点会在后续的文章当中详细说明。装置之间通讯的方式是透过讯息,而且每一装置都可以转发讯息,因此从两端的通讯距离可以超越个别节点无线射频功率所及的范围。
图2 采用讯息转发架构的多对多网络拓扑。
装置与节点
网状网络中的每一个装置就是一个节点,而尚未加入的装置则称为「未启动配置装置」(Unprovisioned Device)。因此,一个未启动配置装置转变成网络节点的过程就叫做「启动配置」(Provisioning)。想像一个情境,使用者新买了一个支援蓝牙Mesh技术的灯具带回家安装,而为了将它加入蓝牙Mesh网络,必须先启动配置灯具以便能够透过现有的蓝牙照明开关或调光器来操作。
启动配置是一个安全的程序,经过此一程序,未启动配置的装置会获得一连串的加密金钥,并且向「启动配置器」(Provisioner)装置(通常是平板或智能型手机)注册,其中一把金钥是「网络金钥」,简称NetKey。
Mesh网络中的所有节点至少都会有一把网络金钥,也正因为拥有此一金钥,装置才可算是该网络的成员,并称为一个节点。不过,节点在能发挥作用之前,还要满足几项条件;首先最基本的就是透过一个安全的配置程序取得一把网络金钥。
元素
有些节点会有多个组成单元,每一个单元都能够独立被操控。在蓝牙Mesh技术的术语中,这些组成单元叫做「元素」(Element)。图3显示一个LED灯具,当它加入蓝牙Mesh网状网络时,会变成一个拥有三个元素的单一节点,每一元素则分别对应至不同的LED灯。
图3 包含三个「元素」的照明节点。
讯息
当一节点须要查询其他节点的状态,或者操控其他节点时,就要传送某种类型的讯息;若节点需要向其他节点通报自己的状态,也是藉由发送讯息通报。
网状网络中的所有通讯都是透过「讯息」来达成,蓝牙Mesh技术已定义了许多讯息类型,每一类都有自己独特的代码(Opcode)。
讯息主要分成两大类:「须确认」(Acknowledged)和「不须确认」(Unacknowledged)两种。须确认讯息的接收端节点必须做出回应,回应有两项目的:第一,确认讯息已收到;第二,将接收端的资料传回发送端。
须确认讯息的发送端若未收到预期的回应,可重新发送讯息,因此须确认讯息必须具备等幂(Idempotent)特质。换句话说,当某个节点收到多次相同的须确认讯息,效果和收到一次是一样的,不须确认讯息则不须回应。
位址
讯息的传递必须从某一位址到另一位址,蓝牙Mesh技术定义了三种位址。单点传播(Unicast)位址用来对应单一元素定址,在配置程序中,单点传播位址会被指派至装置。
群组位址是一种群播(Multicast)位址,可用来对应一个或多个元素定址。群组位址可由蓝牙技术联盟定义或动态指派,前者就是所谓的「SIG固定群组位址」(SIG Fixed Group Addresses)。目前共定义了四个SIG固定群组位址,包括All-proxies、All-friends、All-relays及All-nodes。本文后续会对代理(Proxy)、好友(Friend)和转发(Relay)等名词的意义做进一步解释。
动态群组位址的用意是要让使用者透过一个组态设定程式,建立并对应一栋建筑的实体组态。
例如,建筑中的每一个房间都有对应的群组位址,虚拟位址则用来对应一个或多个元素定址的位址,并可涵盖多个节点。其格式是一个128位元的通用唯一识别码(UUID),可对应任何元素,就如同标签的作用。
发布/订阅
「发布」就是传送讯息的动作,而设定让节点从特定位址接收某些讯息的动作,就是「订阅」。一般来说,讯息会发送至群组位址或虚拟位址。群组和虚拟位址的名称,通常会让使用者一看就知道用意,因此在使用上既方便又直觉。
如图4,我们看到「开关1」节点会发布讯息到「厨房」群组位址。「灯泡1」、「灯泡2」、「灯泡3」这三个节点,则订阅了「厨房」这个位址, 因此会接收及处理发布至该位址的讯息。换句话说,「灯泡1」、「灯泡2」和「灯泡3」即可透过「开关1」来操控。
图4 发布/订阅情境示意图
「开关2」会发布讯息到「餐厅」这个位址。而图中只有「灯泡3」订阅了该位址的讯息,因此「开关2」只能控制此一灯泡。请特别留意,此范例也示范了节点可订阅不只一个位址的讯息,这样的设计既强大又弹性。
同样地,请特别留意「开关5」和「开关6」两个节点皆可发布讯息至「花园」这个位址。采用群组和虚拟位址并搭配「发布/订阅」的通讯机制的另一绝佳优点,就是当网络中移除、更换或新增节点时,不须重新设定其他节点。
想像一下,如果餐厅需要新增安装一盏灯会需要哪些流程。首先,新的装置必须经过配置程序加入网络,并且设定订阅「餐厅」的位址讯息;而其他的节点完全不会因改变而受到影响。「开关2」就像之前一样,依然将讯息发布至「餐厅」,但现在「灯泡3」,以及新的灯泡都会做出回应。
状态与属性
元素可以有多种状态,在蓝牙Mesh技术当中,这样的概念是透过状态值来表示。「状态」为一元素当中某种类型的数值(请参阅文后的「伺服器」模型章节)。除了数值以外,状态还有一些对应的行为,且无法重复应用在其他情境。
例如一颗简单的灯泡,其状态不是「开」就是「关」。蓝牙Mesh技术定义了一个叫做「通用开关」(Generic OnOff) 的状态。灯泡即含有这样的状态,因此,数值「On」对应的就是灯泡开启的状态,或者让灯泡点亮。
反观一个数值为「Off」的Generic OnOff状态,对应的就是灯泡关闭的状态,或者让灯泡熄灭。
稍后我们会再谈到Generic通用定义的重要性。属性与状态一样,都含有关于某元素的数值,这方面两者类似,但在其他方面却截然不同。对于熟悉低功耗蓝牙的读者可能会联想到特性(Characteristic),这是一种没有对应行为定义的资料类型,因此可应用至各种不同情境,属性提供解读某个特性的情境。
为了示范情境对于属性的重要性及使用方式,本文举「Temperature 8」为例,这是一个8位元的温度状态类型,并且有一些对应的属性,包括当前室内周遭温度(Present Indoor Ambient Temperature)与当前室外周遭温度(Present Outdoor Ambient Temperature)。
这两个属性可让感应器发布感应器读值,供接收讯息的装置可以根据温度的情境,更正确地解读温度数值。属性主要分成两大类:制造商(Manufacturer)属性是一种唯读属性,系统管理员(Admin)属性则是读写两用属性。
讯息/状态/属性
讯息是用来触发Mesh网络装置运作的机制。形式上,讯息类型代表着一种针对个别或一群状态数值的操作。所有讯息都可归为三大类型,各自反映蓝牙Mesh技术所支援的操作类型,这三大类分别为,读取(GET)、设定(SET)和状态(STATUS)。
读取讯息用以取得一个或多个节点的状态数值。状态讯息则是用来回应读取讯息,内含对应状态的数值。设定讯息用来改变某状态的数值。须确认的设定讯息最后会产生一个状态讯息,以回应设定讯息;不须确认的设定讯息则不须回应。状态讯息则用来回应读取讯息、须确认的设定讯息,或者单独使用无关的其他讯息,例如某个元素上的计时器所触发的状态讯息。
讯息所参照到的个别状态,必须从讯息的代码导出其意义;属性则不然,在通用属性相关讯息当中,它是直接以一个16位元属性识别码(ID)来表示。
状态转换
从某一状态变成另一个状态就叫做「状态转换」。状态转换可以是瞬间的,或者持续一段时间才完成,这段时间就叫做「转换时间」。状态的转换很可能会对节点在应用层的行为产生影响。
状态绑定
状态之间彼此可能会存在着某种关系,因此改变一个状态,可能会连带影响另一个状态。这样的关系就是「状态绑定」(State Binding)。一个状态可以跟其他多个状态绑定。例如某个透过调光器控制的灯泡有两个状态:通用开关通用高低(Generic Level),彼此互相关联。假使将亮度调整至通用高低的数值「零」(也就是全暗状态),就会使得通用开关的状态从「On」转换至「Off」。
模型
模型则将前面所介绍的概念都集合起来,用来定义一个元素在网状网络当中的部分或所有功能,模型基本上分成三种。
第一种是「伺服器」模型,此模型定义了一些状态、状态转换、状态绑定,以及包含此模型的元素可能发送或接收的讯息。此外,伺服器模型也定义了讯息、状态、状态转换对应的行为。
第二种是「用户端」模型,此模型未定义任状态,但定义了其可能发送或接收的讯息,以便「读取」、「设定」状态或接收其对应伺服器模型中所定义的「状态」讯息。第三种是「控制」模型,此模型同时结合了「伺服器」模型(可与其他用户端模型通讯)以及「用户端」模型(可与伺服器模型通讯)。
当然,也可以透过延伸其他模型来建立模型,未延伸过的模型称为根模型(Root Model)。模型一旦定义就永远不能改变,换句话说,不能透过新增或移除行为来改变模型,要满足新的需求,唯一正确且允许的方式就是延伸既有的模型。
Generic通用定义
有许多不同类型的装置,其基本上都有一些意义相同的状态。最简单的就是「开」和「关」两种状态,例如灯泡、风扇、插座,全部都可切换成「开」或「关」。
因此,蓝牙Mesh模型规格定义了一系列可重复使用且通用的状态,例如通用开关和通用高低。同样地,也定义了一系列作用于通用状态的通用讯息,例如:通用开关读取「Generic OnOff Get」和通用高低设定「Generic Level Set」。
通用状态和通用讯息基本上用于通用模型,例如:通用伺服器模型「Generic OnOff Server」和通用用户端模型「Generic Level Client」(图5)。这些通用定义可以让许多类型的装置不须自行建立模型就能轻松支援蓝牙Mesh技术,也可以藉由延伸其他模型来建立模型,因此,当有新型的装置须要支援时,就延伸通用模型来快速建立模型。
图5 Generic模型
场景
所谓「场景」(Scene)是指一组状态,可在接收到某种类型的讯息,或者在指定的时间内套用成当下的状态。场景是以一个在网状Mesh中独一无二的16位元场景编号(Scene Number)表示。
有了场景,就能统一地将一群节点设定成先前储存且互相搭配的状态。想像一下当夜晚来临,您可能希望家中的客厅温度维持在摄氏20度左右,并将天花板上的六颗LED灯泡维持在特定亮度,房间角落桌上的台灯设定成舒适温暖的黄色。当将各装置都手动设定成想要的状态,就能透过一个设定应用程式将这些状态储存成场景,等未来有需要时即可发送一个场景Mesh讯息,或者在排定的时间,自动将这组设定调出来套用。
启动配置
「启动配置」是让装置加入网状网络成为其中一个节点的程序,过程包含了好几个阶段,并且会产生好几把安全金钥,而启动配置本身也是一个安全的程序。启动配置需要透过装置(如平板)上的应用程式来完成,此时装置的角色是引导整个启动配置程序的进行,因此称为「启动配置器」(Provisioner)。
启动配置程序共有五个步骤,以下分别详细说明:
-
发出讯号
为了支援各种不同的蓝牙Mesh功能,包括但不限于配置程序,蓝牙在规格中导入了一些新的GAP广播类型,其中之一就是「Mesh Beacon」广播类型。
一个未配置的装置需在广播封包(Advertising Packet)当中使用「Mesh Beacon」广播类型,以让网络知道它的存在。使用者可能需要让新的装置启动并进入此状态来发送广播封包,例如同时按下某几个按钮,或者按住某个按钮一段时间。
-
邀请
当进入此步骤时,启动配置器会发送一个邀请给配置中的装置,也就是「Provisioning Invite PDU」。接着,在前一步骤当中发出讯号的装置要透过一个「Provisioning Capabilities PDU」来回应一些有关于自己的资讯。
-
交换公开金钥
接下来,启动配置器及启动配置中的装置要互相交换公开金钥,此金钥可以是永久或临时的,交换方式可以是直接交换或透过频外(OOB)方式。
-
认证
在认证步骤中,启动配置中的装置需根据自身的能力,透过某种方式发送一个随机的个位数或多位数号码给使用者。例如,启动装置可以让某个LED闪几下。此时,使用者要在启动配置器上输入装置所发送的号码,两个装置之间会利用此随机号码进行一连串的加密资料交换,借此认证对方的装置。
-
发送启动配置资料
当认证成功之后,双方装置都会利用自己的私密金钥加上对方提供的公开金钥,来产生一个连线阶段金钥(Session Key)。这个连线阶段金钥将用来保护后续配置程序所需发送的资料,如前面提过的NetKey网络金钥。
当启动配置程序完成后,已启动配置的装置就会拥有网状网络的网络金钥、一个称为「IV Index」的Mesh安全性参数,以及一个启动配置器配发的单点传送位址(Unicast Address),至此,装置就正式成为一个节点。
选择性功能
所有节点都能发送及接收网状网络讯息,但节点还可能有一些选择性的特殊功能。目前有四种选择性功能:转发(Relay)、代理(Proxy)、好友(Friend)以及低功耗(Low Power);一个节点可以自行决定是否支援,或支援多个选择性功能,此外,任何选择性功能都可以随时启用或停用。
转发(Relay)节点
凡是支援「转发」功能的节点即可称为转发节点,这类节点可将其收到的讯息再传送出去。透过转发的机制,讯息就能穿越整个网状网络,沿途经过多次转跳(Hop)。
Mesh网络的协议资料单元(PDU)当中包含了一个栏位叫做TTL(Time To Live)存活时间。这是一个整数值,用来限制讯息在网络中的转跳次数。比方说,如果将TTL设成「3」,那讯息在途中最多能转发三次。
假使将它设为「0」,那讯息就无法转发,必须直接传送至目的地。Mesh网络中的节点只要稍微了解拓扑的组态,以及网络上有那些成员,就能利用TTL栏位来提升网状网络的使用效率。
低功耗(Low Power)节点与好友(Friend)节点
某些类型的节点供电能力有限,因此必须尽可能节省电力。此外,这类装置可能绝大部分时间都在传送讯息,但偶尔还是需要接收一些讯息。
以温度感应器为例,它很可能透过一颗小小的钮扣型电池来供电。当温度超过或低于某个预先设定的上、下门槛值时,就会每分钟传送一次温度计读值。假使温度维持在上、下门槛值之间,那它就不会发出讯息。这样的运作方式不难达成,而且不须消耗太多电力。
但问题是,使用者有时必须传送讯息给感应器来设定新的门槛值。这种情况虽不多,但感应器必须能够支援。然而,接收讯息的需求会增加装置的负荷,进而消耗电力,如果装置随时处于待命状态,就可不漏接任何温度门槛的设定讯息,但却将因此消耗大量电力;若装置处于低度待命状态,固然可以节省电力,但却可能让感应器漏接一些设定讯息。
要解决这样的困境,答案就在「好友」节点以及「友谊」的概念,以前述温度感应器为例,我们可将感应器设定成「低功耗节点」(LPN),这一点可透过在感应器的设定资料中加入一个功能旗标来达成。
LPN需要另一个节点的配合才能运作,一个没有供电能力限制的节点(例如随时连接着插座的节点),此节点就是所谓的「好友」节点。好友节点负责帮忙储存发送给LPN的讯息,而LPN再透过轮巡(Poll)的方式向好友节点查询是否有「等待接收的讯息」。
只要LPN向好友节点轮巡的频率不要太高,就能兼顾省电与适时接收讯息的需求。每当LPN向好友节点轮巡的时候,好友节点就会将其储存的所有讯息,逐一传送给LPN,并且透过一个MD(More Data)旗标来让LPN知道好友节点还有更多的讯息待传。
LPN与好友节点之间的关系称为「友谊」(Friendship)。对于电力相当有限却又必须接收讯息的节点来说,友谊的概念非常重要,如此才能让它在蓝牙Mesh网状网络当中持续保持运作,却又能够发挥能源效率。
代理(Proxy)节点
全世界支援低功耗蓝牙的装置数量非常庞大,大多数的智能型手机及平板即是一例。
然而,当蓝牙Mesh网络正式获得采纳时,市场上的蓝牙装置并不具备蓝牙Mesh技术。不过它们却能支援低功耗蓝牙,因此可透过GATT(Generic Attribute Profile)通用属性设定档与其他装置连接并互动。
「代理」(Pxoxy)节点的作用即在此,这类节点会提供一个GATT介面让低功耗蓝牙装置与Mesh网络互动。蓝牙定义了一套「Proxy Protocol」的通讯协定,以供连线导向的载体(Bearer)装置(如GATT)使用;GATT装置会从Proxy节点以GATT特性(Characteristic)读取和写入Proxy Protocol PDU ,Proxy节点会将这些PDU转换成Mesh PDU,反之亦然(图6)。
图6 智能型手机经由Mesh代理节点进行通讯,P=代理功能开启。
简而言之,Proxy节点可让不具备蓝牙Mesh技术的低功耗蓝牙装置能与Mesh网状网络中的节点互动。
节点组态
每个节点皆支援一套标准的组态状态,会在组态伺服器模型(Configuration Server Model)当中执行,并且透过组态用户端模型(Configuration Client Model)来存取。组态状态资料关乎到节点在Mesh网状网络内的能力和行为,但与个别应用或装置类型的行为无关。
举例来说,一个节点所支援的功能,不论是否为代理节点、转发节点等,都是透过组态伺服器状态来标示。一个节点所订阅的位址,会储存在Subscription List订阅清单当中,网络和子网络金钥会标示节点所属的网络,并列在组态区块(Configuration Block)当中,节点所持有的应用金钥亦然。蓝牙Mesh网络定义一系列的组态讯息,以供组态用户端模型和组态伺服器模型,能够在组态伺服器模型的状态下执行读取、设定和状态等操作。
蓝牙Mesh网状网络架构解析
本节将深入介绍蓝牙Mesh网状网络的架构及其各个层次与负责的作用。此外也将说明Mesh架构(图1)与低功耗蓝牙核心架构之间的关系。
在Mesh网状网络架构的最底层称为「低功耗蓝牙」。然而,事实上这并不单纯只是Mesh架构的其中一层,而是指整个低功耗蓝牙技术,如此一来才能提供基础的无线通讯能力,让在这之上的Mesh架构能够运作。
显然地,蓝牙Mesh系统必须要有低功耗蓝牙技术存在的状况下才能运作。接下来我们将从最底层开始,逐一说明Mesh架构的每一层。
载体层
Mesh网络的讯息需要一套通讯系统负责传送和接收。这就是「载体层」(Bearer Layer)的作用,该层定义通讯系统该如何处理Mesh PDU。目前蓝牙Mesh技术只定义两个载体,分别为广播载体(Advertising Bearer)与GATT载体(GATT Bearer)。
广播载体会利用低功耗蓝牙的GAP广播与扫描功能来发送和接收Mesh PDU。GATT载体则可让不支援广播载体的装置,经由前述的「Proxy Protocol」通讯协定与Mesh网状网络内支援广播载体的节点间接通讯。
Proxy Protocol是封装在GATT运作中,藉由特别定义的GATT特性来达成。Mesh网络的代理节点会执行GATT特性并支援GATT载体与广播载体,因此能在两种载体之间转换并转发讯息。
网络层
「网络层」(Network Layer)定义了各种讯息位址类型以及网络讯息格式,让载体层可以传送传输层PDU。该层可支援多个载体,每一载体各有多个网络介面,包括可让同一节点内的多个元素彼此沟通的本地端介面。
网络层会判断讯息该经由哪一网络介面输出。来自载体层的讯息会经过一个输入过滤条器(Input Filter),以决定是否要将讯息传送至网络层作进一步处理。同样地,输出讯息也会经过一个输出过滤器(Output Filter)来决定是否该抛弃讯息或者传送至载体层。至于转发(Relay)和代理(Proxy)的功能则是可以经由网络层来执行。
下层传输层
「下层传输层」(Lower Transport Layer)会从上层传输层接收PDU,之后将PDU传送到另一装置的下层传输层;必要时,该层也会进行PDU的切割与重组。当PDU较长而无法塞入单一Transport PDU时,下层传输层就会加以切割,将该PDU分成多个Transport PDU。接收端装置的下层传输层,则会将这些分割过的PDU重组成单一的上层传输层PDU,并且往上一层传送。
上层传输层
「上层传输层」(Upper Transport Layer)负责将来自存取层以及要传给存取层的应用资料进行加密、解密与认证。此外,该层也负责处理讯息的传输与控制,讯息由各节点的上层传输层内部产生,并彼此互相传递,包括「友谊」(Friendship)和「心跳」(Heartbeat)相关的讯息。
存取层
「存取层」(Access Layer)负责定义各种应用该如何存取上层传输层,包括:
.定义应用资料格式。
.定义及控制上层传输层所负责执行的加密、解密流程。
.确认从上层传输层所收到的资料是否送到正确网络,才将资料往上一层传。
基础模型层
「基础模型层」(Foundation Models Layer)负责执行与Mesh网状网络组态及管理相关的模型。
模型层
「模型层」(Models Layer)负责依照模型的规格定义,执行模型以及相关的行为、讯息、状态、状态绑定等等。
Mesh网状网络安全采强制规定
低功耗蓝牙提供了多种安全机制让设定档的设计者选择,如不同的配对方式,或每一特性对应的个别安全要求等等。但事实上,安全性完全是一项选择性功能,因此也可以造出完全没有任何安全防护或限制的开放式装置。
装置设计者或制造商必须自行分析其面临的威胁,然后决定其产品的安全性需求与解决方案(图2)。然而,对于蓝牙Mesh网状网络来说,安全性是强制的。不论是网络本身,或是个别应用和装置,全都有安全机制保护,而且无法透过任何方式加以关闭或削弱。
Mesh网状网络安全基本原则
蓝牙Mesh网状网络具备以下基本安全原则:
.所有Mesh讯息皆经过加密和认证。
.网络安全、应用安全与装置安全,各自独立分开。
.安全金钥在Mesh网状网络中的生命周期可透过「金钥更新」(Key Refresh)程序来变更。
.讯息标头编码让网络内传递的讯息难以被追踪,提供了私密性机制让节点无法被追踪。
.蓝牙Mesh的安全机制可防范网络遭到回放攻击(Replay Attack)。
.装置新增至Mesh网络以成为节点的程序具安全性。
.节点可安全地从网络移除,并且可防范垃圾桶(Trashcan)攻击。
依不同安全考量进行隔离
蓝牙Mesh安全机制的核心是由三种金钥所构成的。这些金钥分别保护着Mesh网状网络的不同部分,将不同的安全考量分离。
为了解这样的设计并体会其重要性,我们来看一个可作为转发节点的Mesh灯泡案例。当灯泡扮演转发的角色时,它可能会经手Mesh网络上一些有关大楼门禁系统的讯息。然而,一个灯泡不该有权限读取并处理这类讯息的内容,但却必须将讯息转发给其他节点。
为解决这样的冲突,蓝牙Mesh技术采用了不同的安全金钥,分别保护讯息在网络层的传输与应用(如照明、保全、暖气等等)相关的资料。
所有Mesh网络当中的节点都有一把网络金钥(NetKey)。事实上,正是因为持有共同的金钥,节点才能成为该网络的成员。这把网络金钥还可衍生出网络加密金钥,以及一把私密金钥。
节点持有的网络金钥,最高仅能解开并验证到网络层的通讯,因此节点能够转发讯息,但无法解开应用相关资料。网络或许还会进一步分隔成多个子网络(Subnet),而且每个子网络都有专属的网络金钥,唯有子网络内的成员才拥有。网络金钥可以用来隔离实体空间,例如饭店内的每一间客房。
要解开特定应用相关的资料,节点必须拥有对应的应用金钥(AppKey)。在Mesh网络的所有节点之中,可能存在着许多不同的应用金钥,但通常每个应用金钥只会被少数的节点所持有,即为能够参与该项应用的节点类型。举例而言,灯泡和照明开关,会拥有照明应用的应用金钥,但是却不会拥有暖气系统的应用金钥;后者通常是温度控制开关、散热器控制阀等节点才有。
上层传输层会使用应用金钥来加密及验证讯息,而后才将讯息传给存取层,多把应用金钥会对应到一把网络金钥。
这样的关系称之为「金钥绑定」,代表着一些特定的应用必须持有应用金钥,而且只能在某个特定网络上运作,但是一个网络却能容纳多个互相独立而安全的应用。
最后一把金钥是装置金钥(DevKey),为一种特别的应用金钥。每个节点都有独一无二的装置金钥,且唯有启动配置器装置才知道。装置金钥用于启动配置程序之中,负责保障启动配置器与节点之间的通讯安全。
移除节点/启动金钥提升安全性
如前所述,节点持有多种Mesh的安全金钥。假设节点发生故障而必须拆除,或者持有者决定将它卖给他人,很重要的一件事就是要确保该装置不被拿来攻击其原本所属的网络。
为此,蓝牙Mesh技术定义了一套移除网络节点的程序。使用者可利用启动配置器的应用程式,而将某个节点列入黑名单,并启动「金钥更新」的程序。
金钥更新程序会使得网络上的所有节点(除了黑名单中的节点之外)收到新的网络金钥、应用金钥以及所有相关的衍生资料。换句话说,负责保障网络和应用安全的整套安全金钥全部都会换掉。如此一来,移除节点所持有的网络金钥和应用金钥都变得无效,该节点将不再是网络的成员,因此就不会构成威胁。
私密性
从网络金钥衍生而来的私密金钥,是用来编码网络PDU的标头(Header)资料,例如来源位址。编码可确保窃听者无法轻易追踪装置及装置使用者的行踪。此外,也让一些根据流量分析的攻击难以达成。这项技巧的安全程度也确实符合其用途。
回放攻击
在网络安全的领域中,「回放攻击」(Replay Attack)是指窃听者从网络上拦截、撷取到一个或多个讯息,并将该讯息重新传送一次,目的是希望欺骗接收端执行一些攻击端装置没有权限执行的动作。常见的例子是汽车免钥匙系统,骇客藉由撷取车主与车辆之间的认证程序讯息,并对免钥匙系统回放这些讯息,就能打开车门,将车偷走。
蓝牙Mesh网状网络便内建了防范回放攻击的机制。基本上是利用两个网络PDU栏位:Sequence Number(SEQ)和IV Index。
元素在每次发布讯息时,就会将SEQ数值加一。当节点收到来自某个元素的讯息时,其SEQ值若小于或等于上一个有效讯息的SEQ,那么该讯息将被抛弃,因为这很可能就是来自回放攻击。
至于IV Index则是另一个栏位,用来搭配SEQ。来自同一元素的讯息,其内含的IV Index必定等于或大于来自该元素上一个有效讯息的数值。
蓝牙Mesh技术采管理式网络泛洪机制
Wi-Fi网络是围绕着一个中央节点(也就是路由器)来运作,所有网络流量都会经过此处,万一路由器故障,整个网络就跟着停摆。
反观蓝牙Mesh网络采用的是「管理式网络泛洪机制」的讯息传送技巧。所有讯息一旦由节点发布之后,就会广播到网络上,而非透过路由方式传送至一个或多个特定节点。
所有在无线射频可达范围内的节点都会收到讯息,并可转发所收到的讯息(如果有设定的话)。所谓转发,就是将收到的讯息再广播一次,以让距离原发送节点较远的节点能够接收到讯息。
除此之外,蓝牙技术采用管理式网络泛洪的另一个重要意义就是,讯息可经由网络内的多重路径到达目的地。如此可形成一个非常稳定可靠的网络,而这也是为何当初蓝牙Mesh网状网络的设计会选择采用洪水式的传递方法,而非采用路由的方式。
管理式网络泛洪机制特点
蓝牙Mesh网状网络善用了洪水式方法的优点,并且加以优化,因此能够兼具稳定性以及效率,同时也反映了「管理式网络泛洪机制」所代表的涵意。这些方法包括:
心跳
节点会定时发出「心跳」讯息,每一次的心跳讯息,都是告知网络内的其他节点,自己仍然在正常运作。此外,心跳讯息亦含有一些资料可让收到的节点判断发送端与自己距离,即是要经过几次转跳才会到达,这项情报就能够有效用在TTL栏位。
TTL
TTL(Time To Live)存活时间是所有蓝牙Mesh PDU都拥有的栏位。此一栏位用来控制讯息转发过程中转跳的最大次数。藉由TTL的设定,节点就能够掌控讯息的转发,并且达到节能的效果,以避免讯息不会无意义地转发太多次。心跳讯息可以让节点判断每次发布讯息时TTL的最大设定值。
讯息快取(Message Cache)
所有节点都必须执行讯息快取。包含节点最近收到的所有讯息,当节点收到一个讯息时,即可比对快取内是否有相同的讯息。若有,即代表该讯息已经接受并处理过,可以立即抛弃。
好友节点
蓝牙Mesh网状网络中重要的最佳化机制为「好友」节点与「低功耗」节点的组合。如上所述,好友节点可提供讯息储存功能,并且将讯息转传给相关的低功耗节点。如此一来,低功耗节点就能发挥优异的能源效率。消息的内部传递当一节点接收到讯息时,会将讯息从架构最底下的低功耗蓝牙,一层一层往上传(从载体层到网络层)。接着,网络层会进行各项检查来决定是否将讯息传给上一层,或者直接抛弃。
消息的内部传递
当一节点接收到讯息时,会将讯息从架构最底下的低功耗蓝牙,一层一层往上传(从载体层到网络层)。接着,网络层会进行各项检查来决定是否将讯息传给上一层,或者直接抛弃。
此外,PDU当中有一个网络识别码(Network ID)栏位,可用来快速判断讯息使用的网络金钥。如果接收端的网络层无法辨识该网络金钥,就代表接收端装置不属于该网络的成员,而会将PDU抛弃。此外,还有一个网络讯息完整性检查(MIC) 栏位。节点会辨识PDU网络识别码对应的网络金钥,如果检查失败,讯息便会直接被抛弃。在发送端节点讯号范围内的所有节点都会收到发出的讯息,与收到装置不相干的讯息则会迅速被抛弃,例如来自不同的网络或子网络的讯息。
同样的原则在上层传输层也一样适用。不过,该层检查的是讯息的应用金钥,也就是PDU当中的应用识别码(AID)栏位。如果收到的节点无法辨识PDU中的应用识别码,上层传输层就会将PDU直接抛弃。此外,若是传输讯息的完整性检查(TransMIC)失败,讯息也会被抛弃。
相信经过本文的介绍,读者应该已经对蓝牙Mesh技术以及其功能、概念与名词有了一些基本的认识。虽然蓝牙技术与我们所认识的有点不同,但却是一种能让装置透过全新拓扑彼此通讯的蓝牙技术;最重要的是,这项技术也让广泛应用的低功耗蓝牙无线技术能够开拓全新的领域与产业。
- 半导体行业观察
- 摩尔芯闻