作者:冬瓜 | 来源:互联网 | 2023-10-10 12:17
1.Mesh简介BlutoothLowEnergyMesh是基于低功耗蓝牙技术(BLE)的网状网络解决方案。目前使用的是泛洪网状网络(flooding-basedmeshnetwo
1.Mesh简介
Blutooth Low Energy Mesh 是基于低功耗蓝牙技术(BLE)的网状网络解决方案。目前使用的是泛洪网状网络(flooding-based mesh network)。
BLE的通信信道有adversing信道(37、38、39)和data信道(0-37).详细见下图。
Mesh主要工作在advertising信道上,通过scan和advertising进行接受和发送。而data信道主要为了兼容不支持advertising设备,可以通过LE link方式进行通信。通俗一点说就是mesh的网络通信通过广播和扫描来进行收发。广播发送,扫描接受。因为Mesh是网状网络结构,所以中间节点在收到信息后进行判断,如果不是自己需要的则进行转发,从而可以使信息快速、大面积的向外传播。这就是泛洪。而通过广播来进行数据收发,所以Mesh节点使用的通信信道就是广播信道。而有一些不支持广播通信的设备,就需要使用数据信道,通过Proxy(代理)节点,接入到mesh网络中。
1.1Device UUID
每个设备出厂时被分配一个唯一的16字节UUID,称作Device UUID,用于唯一标识一个Mesh设备,不用依赖蓝牙地址来标识设备。在建立pb-adv link时,需要Device UUID字段来标识device。然后,当mesh device获取mesh地址后,即可用mesh address来唯一标识device。
1.2Mesh地址
除了建立le link,mesh通信并不依赖蓝牙地址,即节点的蓝牙地址可以一样,或者随机变化。mesh定义了一套长度为2字节的mesh地址,分为unassigned address、unicast address、virtual address和group address,地址范围如下图。
mesh地址并不是出厂时设置的,而是由用户自己统一管理和分配的。用户在配置设备入网时,通过provisioning流程给设备分配地址。provisioner需要确保给每个设备分配的地址是不重复的。mesh设备可能不止一个mesh地址,设备内每个element会被分配一个地址,且地址是连续的。多地址被设计用于区分mesh设备上重复的功能模块model。
1.3应用模型
BLE是master连接slave的一对一通信,而mesh网络是多对多通信。因而,mesh网络存在一个天然特性,就是节点之间并不知道其他节点的存在。此时,需要一个第三方,通常是Provisioner,来扮演月老的角色,将节点之间联系起来。例如一个通用的开关,出厂后不知道自己要控制哪盏或者哪些灯,需要provisioner通过configuration配置开关发布publish消息(设置目的地址为单播、组播、广播地址)。如果是组播,则需同事配置相应的灯泡订阅subscribe消息(设置分组,即增加组播地址到订阅表)。然后,开关就可以控制这一盏灯、一组灯或者所有灯。
Mesh将典型应用场景的操作进行了标准化,每个Mesh设备上的应用是以model为单位进行组织的。model定义了一个model id、一套opcode和一组状态,规定发送和接收哪些消息,分别操作哪些状态。Model和BLE的GATT service是类似的,都用于定义一个特定的应用场景。
为了支持多个相同的model,定义了element的概念,每个element会单独分配一个element address,且地址是连续的。第一个element(primary element)的element address是在provisioning过程中分配的node address,其他element的地址顺序往后排。例如一个Mesh设备上有两盏完全一样的且可以独立控制的灯,开关设备去控制这个灯设备,需要区分控制哪盏灯。让这两盏灯对应的两个medel分开放在两个element中,这样每盏灯分别有一个mesh address,就可以通过mesh address将两盏灯区分开来了,进行单独控制。当然,两盏灯的model也可以订阅同一个组地址,实现同时控制。这样即能独立控制,也能同时控制。
设备上element、model组成情况通过composition data page 0表达,provisioner可以通过获取设备的composition data page 0来辨识设备支持的应用。
1.4安全性
mesh中有很多保护网路安全和隐私的设计,能够抵挡被动监听、中间人攻击、重放攻击、垃圾桶攻击和暴力破解等常见的攻击、
mesh网络中所有mesh消息都会被加密和校验,防止被窃听和篡改。mesh网络中密钥分两层:Netkey和Appkey,每层最多可以有4096个密钥,通过12Bit的Index标识。AppKey必须绑定有且只能一个NetKey。应用层发送消息会依次经过AppKey和NetKey两层加密和校验,接受信息会依次经过NetKey和AppKey两层解密和校验。采用两层密钥,是为了防止relay节点窃听货篡改消息。例如节点A通过节点B转发给节点C发数据,A/B/C有相同的NetKey,A/C有相同的AppKey,而B没有该AppKey。那么A和C间的应用层通信对B来说是保密的,B只是使用NetKey在网络层帮忙转发,因为没有AppKey而不能进行窃听或者篡改应用层消息。
NetKey支持多个密钥,多密钥可以用来划分网络范围,实现设备间的隔离。Key index为0的是主网络密钥,其余的都是普通的其他子网络密钥。只有主网络中的节点才能参与IV Updata Procedure,并将IV更新信息传递到其他子网中。也就是说,只有主网络节点才能更新IV index网络参数,其他子网的节点只能被动的接收IV index更新。这样不平等的网络密钥设计的目的是约束子网络节点的数据发送频次,防止子网络节点滥用IV index更新而耗尽IV index,从而导致网络安全问题。通常大部分节点在主网络中,部分节点同时处于主网络和某个子网络,少量节点只处于某个子网络,此时这些少量节点只能在子网络内进行局部通信,从而限定这些少量节点的通信范围,例如酒店顾客只能控制自己房间内的灯。
Device上的NetKey和AppKey是provisioner通过provision和configuration分发和管理的。provisioner是网络管理员,他管理着所有的key,即管理网络中各个device各自可以使用哪些key,而device间只有共享相同的密钥才能相互通信,例如灯和灯的开关使用相同的密钥。provision过程会分发mesh address和有且只有一个NetKey,后续通过configuration来管理,例如通过configuration增加NetKey和AppKey。
Provision过程还会随机生成一个特殊的AppKey,称作DevKey。DevKey只有provisioner和device两者知道,不和任何其他device共享,保证了provisioner可以单独和某一个device进行秘密的一对一通信。configuration配置被限制只能使用DevKey,只有provisioner才知道device的DevKey,所有只有provisioner才可以配置device。例如,开关只能控制灯泡亮灭,而不能去配置灯泡的分组。
1.5 Provisioning
device出厂默认是没有地址和密钥的,需要通过provisioning过程从provisioner获取。device被provisioning后,就称作node。provisioning过程类似于Bt pairing中的secure connection,采用ecdh算法进行密钥协商和发布,通过authenticaion data进行身份鉴权,能够防止窃听、暴力破解和中间人攻击。
privisioning流程可以工作在advertising信道和data信道两种信道上,分别对应pb-adv和pb-gatt两种传输层。device是被强制要求支持pb-adv的,如果同时支持pb-gatt,被provisioning时可以任选一个。
1.6 Configuration
网络参数的管理是在model层实现的,称作configuration models。可以配置的网络参数有很多,例如NeyKey和AppKey增加、删除、修改等,model的密钥绑定、消息发布、消息订阅等,节点应用结构Composition data page 0的获取,节点的默认ttl、支持的deature、网络重传次数等。
网络参数的配置被限定为只能使用DevKey,也就是说只有provisioner才能配置节点的网络参数。
1.7 Proxy(代理)
mesh主要工作在advertising 信道上,为了兼容一些不能灵活自有的advertising的设备,mesh定义了proxy特性。基于BLE GATT profile,定义了proxy service,让这些设备利用BLE link的方式连接到支持proxy的节点上,从而接入Mesh网络。