分享

为物联网不断前行的蓝牙Mesh

 扫地僧一一 2018-02-02

作者:王一鸣

来源:物联江湖(iot521)

物联网智库 整理发布

转载请注明来源和出处

-------   【导读】   ------

从本质上来讲,蓝牙Mesh技术并非无线通信技术,而是一种网络(组网)的技术,用于构建“多对多通信连接”的网络。


从本质上来讲,蓝牙Mesh技术并非无线通信技术,而是一种网络(组网)的技术,用于构建“多对多通信连接”的网络。


纵观蓝牙技术的发展旅程,SIG不断地追求着无线连接的性能:传输速率(EDR-Enhanced Data Rate、AMP)、低功耗(Sniff Subrating、BLE)、网络接入(6LoWPAN、Mesh)和安全配对(SSP),以满足各种应用对近距离通信的需求。


原本,SIG主要是聚焦于“以人为中心的边缘网络”进行技术创新,而如今,蓝牙适用的范围已经逐渐拓展到所有物联网边缘场景:“蓝牙增强速率技术(BR / EDR)”的应用从无线耳机发展到鼠标键盘;“蓝牙低功耗技术”应用于手表、手环,发掘了可穿戴市场;而“蓝牙Mesh组网技术”则瞄准了整个(边缘域)物联网市场,包括消费领域和工业领域。


从最新的组网构架(Mesh组网)中,让我们逐渐地看清了蓝牙技术联盟对物联网通信的预想,以及对边缘网络的理解。


一、为物联网不断前行的蓝牙Mesh


为了开发和应用的方便,蓝牙技术联盟在蓝牙Mesh中加入了“情景(Scene)”这一概念,可以将网络中的一部分节点、元素、状态、操作行为“捆绑”在一起,形成“物”的联动机制,使得应用的内涵丰富多姿,且易于开发和理解。


通过携带特殊的16位情景序号,一个触发节点可以通过发布一个消息,就实现一组节点设备改变各自运行状态,形成物与物内在关联的场景。开发人员可以利用丰富的情景预设,向用户交付最佳的应用体验。


在安全方面,蓝牙技术联盟从应用到网络,设计、部署了多层次的防护措施。


1.在蓝牙Mesh技术中,引入各类秘钥:Netkey、AppKey、DevKey,以对应用、网络、节点进行全面的认证。并且,网络中的启动配置设备(配网节点-Provisioner:负责其它所有节点入网的认证和密钥分配)可以配置黑名单,并控制全网更改秘钥(秘钥刷新程序),将嫌疑节点踢出蓝牙Mesh网络;


2.通过NetKey派生的隐私Key,可以模糊化蓝牙网络PDU报头,以防止定向的窃听和追踪;


3.通过在网络PDU中引入序列号(Sequence Number)和IV索引(IV Index),避免“重放攻击”,欺骗节点作出未授权的处理和响应。


纵观蓝牙Mesh技术,它转变了传统蓝牙以“人”为中心的网络特性(集中化网络),而转向“多点对多点”的网络架构,以满足“物”的连接需求为协议开发的宗旨。


在局部空间中,从应用到网络连接,设计了一整套基础网络构建的规范和标准,简化开发和运营的难度。它兼容低功耗蓝牙技术,满足电池驱动设备低频低量的连接需求。


它采取强制执行的安全策略:入网必须认证、连接必须加密,以及具有秘钥动态更新、关键字节等其它安全措施。其技术的开放性,为物联网应用生态的构建提供了基础。


从蓝牙Mesh技术中也能看到,它并没有关于互联网连接、服务的设计。在实际应用开发中,该部分主要由应用的开发者自己来完成。此外,泛洪的信息传播模式(“管理型网络泛洪”),虽然采用了一些优化措施(TTL等),但对网络的扩展扩容有较大影响,还需要进一步地设计优化方案。


在物联网的边缘,越来越多的网络技术开始考虑“物”的连接需求,Mesh组网、多点对多点、低功耗连接、非对等网络等理念,不断嵌入到局部空间的网络设计当中,边缘网络作为物联网技术的先行者,将成为物联网生态建立的基石和保证。


二、蓝牙Mesh网络架构


蓝牙Mesh通过网状网的组网结构,可以实现室内的大范围网络覆盖。节点(Node)组成了蓝牙Mesh的主干网络,在Node之间使用了低功耗蓝牙的技术进行对连,而具有不同能力特性的节点在网络中承担了不同的角色。


承担网络角色,需要节点之间遵守蓝牙Mesh的语法(通信规则、数据格式)进行对话,通过协商组成网络并向应用提供网络路由服务。


节点间的网络协商过程,是通过“消息携带组网信息”,从“源地址向目的地址传递”,并形成“网络信息的交互”而构成的。


1. 网络地址


蓝牙Mesh网络中,统一的地址长度为16位,分四种类型:单播地址(unicast address)、组播地址(group address)、虚拟地址(virtual address)、未分配地址(unassigned)。


(1)单播地址(Unicast Address)


单播地址在蓝牙Mesh网络中具有唯一性,可以标识出节点内的一个元素,节点在接入网络的时候被分配获得。一个mesh网络可以有32767个单播地址。


(2)组播地址(group address)


组播地址即是多播地址,标识一个或多个元素。SIG预定义了四类组播:“All-proxies”, “All-friends”,“All-relays” 和 “All-nodes”。开发者也可以将多个元素自定义到一个多播地址,便于应用的统一控制和管理。


(3)虚拟地址(Virtual Address)


虚拟地址可以赋给一个或多个元素,且可以由多个节点共有。虚拟地址类似于标签,可以在设备出厂前就配置,标签可以使得节点容易在网络被识别和应用。例如,可以表示某个厂商生产的某一个特定型号的摄像头。


(4)未分配地址(unassigned)


16位全零的地址,表示元素还没有配置地址。



2.消息(Message)


蓝牙mesh网络通过消息承载数据信息进行通信。一个节点可以通过消息来询问其它节点的状态,也可以将自己状态消息发送给别的节点。在蓝牙mesh技术规范中,定义了很多种类型的消息。


在蓝牙mesh网络中,无论节点间相距多远,所有节点均可以订阅某一节点发布的状态数据。


(1)消息的应用类型:


消息有两种应用类型:控制消息(Control Message)和接入消息(Access Message)


控制消息(Control Message),是与蓝牙mesh网络操作有关的消息,例如Low Power Node和Friend Node之间的连接请求消息。


接入消息(Access Message),该类消息会携带节点中的模型和状态值,用来实现节点之间对模型状态的查询和控制。应用层通过接入消息中的操作码(opcode) 和参数,来识别并执行设备的相关操作。


接入消息有两种交互类型:有应答(acknowledged)消息和无应答(unacknowledged)消息。


有应答消息:表示该消息需要“提问-应答”式的交互,消息发送方需要接收方的响应。响应消息携带相关的状态信息,以向发送方表示某种操作执行成功,并反馈操作执行后的状态值。如果没有响应,发送方可以重复发送该消息。


无应答消息:发送方向接收方发送消息,但不需要回复。


(2)消息的操作类型


消息中包含三种消息的操作类型:GET、SET、STATUS。三种操作类型对应三种信息操作的方式:


GET:发送节点使用GET消息,向一个或多个节点请求元素模块中的状态值。


SET:发送节点使用SET消息,向一个或多个节点设置或改变某些状态值。


STATUS:该消息是应答消息,是对GET消息或SET消息的响应。STATUS消息中会携带当前的状态值,返回给GET/SET消息的发送节点。


3.节点模式


根据节点在实际应用中承担的不同角色,将其分成三类模式:服务器模式(Server Model)、客户端模式(Client Model)、控制模式(Control Model)。


(1)服务器模式(Server Model)


“服务器”,可以理解为“处理器”和“执行器”,其对两部分内容进行了定义:


数据的定义:定义了元素模型中的状态属性(格式、类型)和相关消息。状态属性包括状态(state)、状态转换(state transitions), 状态绑定(state bindings)等等。


行为的定义:定义了各类实体操作(Behaviors),以及这些操作和状态参数的对应关系。例如,当蓝牙电灯就收到一个“开关状态为‘On’”的消息时,它就给灯泡通电发光。


(2)客户端模式(Client Model)


“客户端”可以理解为“操作端”或“触发器”,它没有状态信息,但定义了消息的格式和收发方式,用于获取“服务器”提供的应用服务:发送信息、查询状态、控制开关、调节级别等等。“客户端”就像是电视机的遥控机,由人来操作并切换电视频道。


(3)控制模式(Control Model)


控制模式兼具了服务器模式和客户端模式,并且还定义了各模式之间数据交互的处理逻辑(规则和行为),即称为“控制器逻辑(Controller logic)”。


4.Publish/Subscribe 发布和订阅


在实际应用中,节点发送应用消息的行为称为“发布”。消息的发布方向是组地址或者虚拟地址。在应用设计中,组地址或者虚拟地址通常代表一个空间区域或同一类设备,易于用户和应用系统统一辨识和使用。


“订阅”就是某个节点被配置成可以接受某个特定消息。换一种说法,节点“订阅”了某消息,就意味着它可以读取该消息的内容。


生成消息的节点(客户端)“发布”消息,使用消息的节点(服务器)“订阅”消息。


发布和订阅关系举例:



在由电灯和开关组成的蓝牙Mesh网络应用中:


(1)开关1可以发布消息到厨房组地址

(2)电灯1号、2号、3号订阅了厨房组地址的消息

(3)开关2可以发布消息到客厅组地址

(4)电灯3号订阅了客厅组地址的消息


当开关1发布消息(其模型中携带“开灯”的状态)至蓝牙Mesh网络时,因为存在订阅关系,所以电灯1号、2号、3号接收到开关1的消息,会执行其中表达的指令---将灯(1号、2号、3号)点亮。


当开关2发布消息(其模型中携带“关灯”的状态)至蓝牙Mesh网络时,因为存在订阅关系,所以电灯3号接收到开关2的消息,会执行其中表达的指令---将灯熄灭。其他电灯(1、2)虽然也会收到2的消息,但因为它们订阅的消息地址并不包括客厅组地址,所以2的消息会被丢弃。


消息的发布/订阅模式的使用,结合组地址和虚拟地址的配置,可以方便地在蓝牙网络中移除或添加节点,其它在网节点无需做任何配置。


5.节点间的连接类型


各类节点之间形成各种类型的联接,主要有4种:


(1)非中继连接:普通节点之间的连接,两节点之间可以收发数据,但是节点在收到信息后不会转发。


(2)亲友连接(也翻译为“友谊”连接):低功耗节点和亲友节点间的连接,在建立亲友关系后,低功耗节点会定期向亲友节点发送消息,询问是否有自己的消息。亲友节点如果有暂存的低功耗节点的消息,它会将该消息送还给低功耗节点。


(3)中继连接:包括普通节点与中继、代理、亲友节点的连接,中继、代理、亲友节点的相互连接。在该类链接上,会传递普通的蓝牙Mesh广播消息。


(4)GATT连接:没有蓝牙Mesh组网能力的蓝牙设备(具备GATT接口),需要通过代理节点帮其转换连接模式转发信息,这些节点和代理节点之间的连接就是GATT连接。


6.消息转发处理的机制


在蓝牙Mesh中,当一个节点收到一个消息时,它会根据自身的节点角色(模式),与相邻节点间的连接状态、以及收到消息中的网络参数,来决定是否丢弃、缓存、处理,还是转发该消息。


在消息中,影响转发的参数主要有:NID(网络ID,从网络密钥-NetKey 派生而来的唯一公共标识符)、TTL(Time To Live,消息转发最大允许“跳跃-Hop”次数)、SRC(Source Address,源地址)和DST(Destination Address,目的地址)。


接受消息后,转发节点(中继、代理、亲友节点)在转发消息前有两部分的处理工作:消息健康检测、消息转发判定。


(1)健康检测:


在收到消息后,节点先判断该消息的发送源是否是一个已注册节点(以NID作为判定条件),再对消息的数据包做完整性效验(MIC),并对数据包中的源地址、目的地址进行有效性判断,最后确认是存在重复收包的情况,即检查转发缓存(转发队列)中是否已经有该数据包。如果以上步骤中有一项未通过,则该消息会被节点丢弃,如果通过了,则进入下一个转发判定的环节。


(2)转发判定:


如果消息中的目的地址是本节点,则消息会被传递到应用层,不再转发。如果目的地址非本节点,则根据自己的节点角色和数据包中的TTL值来确定是否转发。非转发类节点会将数据丢弃,转发类节点则会检查TTL值是否大等于2,如果满足条件则转发,否则也将数据丢弃。


(3)以图例进行举例:




亲友节点L、M分别和低功耗节点X、Y建立了亲友连接关系


P为中继节点


Q为非中继节点D的代理节点,它本身也是中继节点。


A、 低功耗节点X发消息至普通节点A



a) 低功耗节点X在入网时,和亲友节点L建立了“友谊连接”。他在发送消息中将TTL标识设置为“3”,然后发给L,L则会对该消息进行广播,广播前将TTL设置为“2”。


b) 非中继节点B和中继节点P离L很近,它们都能收到L的消息。在收到消息后,B发现消息中的目的地址不是它,而它又不是中继节点,故它会将该消息丢弃。


c) 中继节点P收到L的消息后,先完成健康检测(确认数据包信息无异常),再进行转发判断:发现目的地址不是它,并且TTL值等于2,于是它将TTL改成“1”后广播了该消息。


d) 中继节点Q在作转发判断时,发现该消息的TTL等于1,且该消息的目的地址并不是它,于是就将该消息丢弃。非中继节点B收到P发来的消息,它会采取和步骤2一样的处理方式将数据丢弃。


e) 非中继节点A收到P转来的消息,发现该消息的目的地址是它自己,于是消息在经过通过传输层、接入层的预处理后,被A送到其应用层(模型层)。


B、 非转发节点(不支持蓝牙Mesh)D发消息至低功耗节点Y



f) 无Mesh协议栈的蓝牙节点D在入网时,和中继节点S建立了“代理连接”,S作为D在Mesh网络中的代理节点。他将消息中的TTL标识设置为“3”,并发送给S。


g) S作为中继节点,将信息(TTL=2)广播出去,节点M和P都收到了该信息。


h) 中继节点P继续广播该消息(TTL=1),节点A、B、L收到后确认消息的目的地址不是自己,且TTL=1,则就将消息丢弃。


i) 亲友节点M收到该消息,发现消息的目的地址是低功耗节点Y,于是将该消息放进缓存。当Y向M发送“轮询(Poll)”消息,查问是否有它的消息时,M会将缓存的消息传给Y。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多