赞
踩
在蓝牙mesh中,发送消息称为发布(publish)。将某个节点配置成可以接收的特定消息的过程称为订阅(subscribe),即如果某个节点可以接收某条消息,那么这个节点“订阅”了这条消息。
消息都是发往组地址或者虚拟地址的,而且这些地址都具有可读性,具有现实意义,例如代表某一个房间。所以使用起来既方便又直观。
在图中,我们可以看到Switch1可以发布消息到厨房组地址(组地址可以代表某个房间)。Light1、Light2和Light3节点都订阅了厨房地址,因此可以接收和处理发往该地址的消息。也就是说,Light1、Light2和Light3可以被Switch1控制。
同理,Switch2可以发布消息到客厅组地址,而只有Light3订阅了该地址,所以Switch2只能控制Light3。从图中可以看到一个节点可以订阅多组地址,如Light3节点同时订阅了厨房和客厅两个组地址。蓝牙mesh功能非常强大而且灵活,还可以看到多个开关可以向一个组地址发布消息,如Switch5、Switch6都可以向花园组地址发布消息。
使用组地址和虚拟地址来发布和订阅消息有许多好处。当我们移除、替换和添加节点时,不需要重新配置其他节点。想象一下你要在家装一个灯有多麻烦你就知道这种方式有多方便了。例如有新设备需要加入到客厅网络中,只需要经过“开通配置”过程并订阅相应的客厅组地址就可以了,其他节点并不会受到影响。Switch2依然可以向客厅组地址发布消息,不过现在它可以控制3号灯和新加入的灯了。
从一个状态转变为另一个状态的过程叫做状态转换,转变的过程可能是瞬时的,也可能是需要经过一段时间,这段时间叫做转换时间。状态转变可能会对节点应用层的行为产生影响。
状态之间也可能存在某种关系,一种状态改变会导致另一种状态也改变,这种关系称为状态绑定(state binding)。一个状态可以与其他多个状态绑定。
例如,通过一个调光器控制一盏灯。这盏灯有两种状态,即通用开关状态和通用等级状态,他们之间相互绑定。减少灯的亮度等级,直到亮度等级为0,这将导致通用开关由开变关。
想象一下,某天晚上,你想要将卧室的温度调到20摄氏度,将卧室吊灯调到合适的亮度,再将桌上的台灯调成令人舒适的暖色调等等。也许你会想到这需要一个一个手动配置,那你就out啦!我们可以在应用程序上保存这些配置,在需要的时候调用他们。这些保存的配置称为“情景”(scene)。我们可以通过16位情景序号来识别特定的情景,在每个mesh网路中,情景序号都是各不相同的。
利用情景可以让许多节点同时到达某种既定状态,省去了单独配置每个节点的麻烦。
开通配置是指将某台设备加入到mesh网络中,从而变成一个节点的过程。它涉及几个阶段,期间会生成许多安全密钥,这一过程对安全性要求比较高。
开通配置通常通过手机或者平板电脑上的应用程序完成的,此时,手机或者平板电脑通常被称为启动配置设备(Provisioner)。
开通配置的过程涉及5个步骤:
第1步,发送Beacon信号
为了支持蓝牙mesh的不同特性,包括但不限于“开通配置”,我们引入新的GAP广播类型,包括《Mesh Beacon》广播类型。未开通配置的设备需要发出《Mesh Beacon》广播数据包,声明自己是未开通配置的设备,可以被启动配置。用户可能需要按照一定的方式,如键入一组按钮,或长按某个按键一段时间,从而启动新设备的广播。
第2步, 邀请
在这一步骤中,启动配置设备(手机等)向需要加入mesh网络的设备发送邀请,实际上发送的就是“开通配置邀请的PDU”,一种特定格式的数据包。此时需要开通配置的设备会返回一定的数据包,即“开通配置能力PDU”告知自身情况。
第3步,交换公共密钥
启动配置设备(如手机)和需要开通配置的设备交换公钥。公钥可以是固定的,也可以是暂时生成的。公钥的交换可以通过蓝牙传输,也可以使用带外数据(OOB)交换的方式。例如使用NFC或者二维码进行数据交换,这样数据传输的安全性更高。
第4步,认证
在认证的过程中,新设备会根据自身输出能力按照某种方式输出一个或多个随机数(这一点与蓝牙配对方式类似)。例如新设备可以闪几下LED灯(闪烁的次数代表输出的验证值),或者有屏幕的话可以直接输出数字。用户在启动配置设备上输入相应数字,整个认证的过程就全部完成了。
第5步,启动配置数据分发
认账完成之后,会利用两台设备的私钥和交换的对等密钥生成一个会话密钥(Session Key)。之后利用会话密钥来加密后续的数据分发,完成剩余的开通配置过程,包括网络密钥(NetKey)和设备唯一地址,即单播地址(Unicast Address)的分配。
开通配置过程完成后,新设备将会拥有网络的NetKey,这是一个称为“IV索引(IV Index)”的mesh安全参数,且拥有一个由启动配置设备(如手机)分配的单播地址。至此,这台新设备就正式成为节点了。
支持中继特性的节点称为中继节点,它可以重发接收到的消息。通过中继技术,消息可以进行多次“跳跃(hop)”,这样就可以将消息传输到整个mesh网络。
mesh网络PDU中有一个字段称为TTL(Time To Live)。TTL利用一个整数值来限制每条消息可以在网络中跳跃(被中继)的次数。例如TTL等于3时,表示消息最多被中继3次。TTL等于0则表示消息不能被中继,只能进行单次传输。节点每隔一段时间发送一次TTL,这样可以了解网络拓扑结构,充分利用mesh网络,避免不必要的消息中继,从而节省功耗。
有些节点可能采用电池供电,所以需要尽可能地降低功耗。这种类型的设备可能主要关心发送消息。但也需要偶尔接收消息。
例如,有一个采用纽扣电池供电的温度传感器,当温度超出既定阈值上限或者下限时,传感器每隔一分钟发送一次温度值,如果温度不超出阈值,则不发送消息。如果不考虑功耗问题的话,这些行为都很容易实现。
用户可能会向传感器发送消息,设置新的阈值,这种行为比较少见,因为用户不可能有事没事经常地设置阈值,用户可能会在季节改变或者新加设备时设置阈值。但是传感器的阈值必须是能够改变的。接收消息的频率对接收器占空比和功耗有影响。100% 占空比能够确保传感器不丢失任何一条温度阈值配置消息,但是功耗是非常大的。低占空比可以节省功耗,但是也可能丢失某条配置消息。
为了解决这一难题,蓝牙mesh引入了友节点(friend node)及友谊(friendship)的概念。
在上面的例子中,温度传感器可以设计成低功耗节点(Low Power Nodes)。传感器的配置数据中,会设置特定的标志,标记这是一个低功耗节点。
低功耗节点会同另一个节点配合工作,这个节点对功耗没什么特别的要求(可能接入市电,有固定的电源),这个节点称为友节点。友节点保存发往对应低功耗节点的消息。低功耗节点会对友节点进行轮询(Poll),查看是否有新消息。低功耗节点轮询的频率非常低,这样就可以降低功耗,同时降低丢失配置消息的可能,当低功耗节点对友节点进行轮询时,保存在友节点的消息就会一个接一个地发到低功耗节点。在发出的数据包中有一个MD(more data)标志,用来指明友节点是否还有消息需要发送。
低功耗节点与友节点的关系称为“友谊(friendship)”。正是这种友谊关系,才使得功耗受限节点能够在蓝牙mesh网络中正常接收消息,在正常工作的同时保持较低功耗。
在我们的生活中有大量的BLE设备,例如智能手机或者平板电脑。到现在为止,已经上市的蓝牙设备都还没有集成蓝牙mesh网络协议栈,它们只能使用BLE协议栈以及传统蓝牙协议栈。所以它们只能通过通用属性规范(Generic Attribute Profile GATT)与其他设备进行信息交互。
代理节点能够实现GATT和蓝牙mesh节点之间的信息交互。我们定义了代理协议用于面向连接的承载层,如GATT。GATT设备(没有集成蓝牙mesh协议栈)可以通过代理节点读写代理协议PDU。总之,代理节点可以允许没有集成蓝牙mesh协议栈的BLE设备与mesh网络中的任何节点进行通信。
配置服务器模型(Configuration Server Model)定义了许多状态,我们可以使用配置客户端模型(Configuration Client Model)访问这些状态。配置状态与节点可以产生的行为和能力有关,与具体的应用或者设备类型无关。例如,我们可以利用“配置服务器状态”来指明某个节点是代理节点、中继节点还是其他节点。节点订阅的地址保存在订阅列表中。网络和子网密钥以及应用密钥都保存在配置块中。
配置客户端模型和配置服务器模型可以对相应的配置服务器模型的状态进行操作,这些操作包括GET、SET及STATUS,它们是通过相应的配置消息完成的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。