前言
蓝牙SIG联盟在2017年发布了蓝牙Mesh1.0的协议规格,基于低功耗广播包来实现的多对多的通信技术,Mesh协议建立在BLE的物理层和链路层上,所以也可以和BLE的蓝牙进行通信
本章主要介绍蓝牙Mesh的基本概念和协议中的层级结构,也是参考网上的资料,如有异议,欢迎留言指正
基本概念
广播和洪泛
蓝牙Mesh技术是基于BLE的广播报文来实现的,是一种洪泛的消息传输机制,Mesh网络的节点间通过3个广播信道进行通信。当蓝牙Mesh网络中的节点收到消息后会转发这条消息,大大增加了网络的覆盖范围;但也会引起网络消息泛滥从而造成通信延迟,蓝牙Mesh采用了消息缓存队列和TTL的优化方案来避免消息的无限制转发
- 消息缓存 Message cache:设备都会缓存收到消息的关键信息,以确定是否已经转发过此消息,如果是就忽略此消息。Message cache至少需要能缓存两条消息
- Time to Live(TTL): 每个消息都会包含一个Time to Live(TTL)的值,来限制中继的次数,最大可以中继126次。消息每转发一次TTL的值就减1,TTL值为1就不再转发
广播链路
Mesh节点在网络内发送数据不会像普通BLE广播需要等一个固定的广播间隔,而是延迟一小段随机时间后发送,所以为了数据不丢失,节点会启用100%占空比来扫描广播信道,也就是扫描窗口时间=扫描间隔
节点与设备
- 未配网设备(Unprovisioned Device):尚未加入Mesh网络的设备叫做未配网设备
- 配网(Provisioning):未配网的设备成为节点的过程
- 配网器(Provisioner):对未配网设备进行配网从而成为网络节点
- 节点(Node):加入到Mesh网络之后的设备,成为蓝牙Mesh网络的一份子
网络和子网
一个蓝牙mesh网络中有4种资源被整个网络共享,分为节点的网络地址(Network Address)、网络密钥(Network Key)、应用密钥(Application Key)和 IV Index。在这个基础上,可以划分出多个子网络(Subnet)
元素和地址
- 节点由元素(Element)组成,节点至少包含一个主元素,每个元素都有自己的地址,例如一个两插孔的插座节点,每个插孔就是一个元素
- Mesh网络节点地址分成4类。占用两个字节
- 单播地址:分配给节点中的元素地址,地址范围0x0001~0x7FFF,
- 未分配地址:即无效地址,固定为0x0000,地址的初始值,常用于屏蔽一个设备
- 组播地址:用于表示一个或多个节点的多个元素,地址范围0xC000~0xFFFF,其中包含256个固定组播地址
- 虚拟地址:用于表示一个或多个节点的多个元素,每一个虚拟地址逻辑上对应一个128-bit的Label UUID,通过对该Label UUID作哈希运算得出虚拟地址的低14位数值,虚拟地址的范围为0x8000~0xBFFF
模型
模型(Model)定义了节点基本功能的最小单位模型,包含实现这个功能所必需的状态和操作状态的消息及其他一些行为,如台灯设备的开关 灯光亮度调节模型包含了三个部分
- 状态:表明节点中元素处某一个特定状态,即台灯中包含开关和亮度的状态值
- 消息:SET/GET/STATUS三种类型,分别用来设置请求发送状态值
- 行为:定义了模型在接收到消息后所作的动作行为, 比如开关模型定义的行为就是在收到了SET的消息后,On/Off的状态就要变为SET消息里给定的值,如果收到了GET消息那么就把On/Off的状态通过STATUS消息传给询问方.
在蓝牙mesh模型里,消息通信基于客户端-服务器的架构,对外提供状态访问接口的叫做服务器(Server),而访问服务器状态的叫做客户端,模型分为三种
- 服务器模型:服务器模型包含了一个或多个元素上的一种或多种状态,比如灯泡上包含有通用开关服务器模型(Generic OfOff Server)和灯泡亮度服务器模型(Light Lightneww Server)
- 客户端模型:客户端模型定义了一系列的消息,用于客户端去请求、设置服务端的状态,比如开关中含有通用开关客户端模型(Generic OnOff Client)以及灯亮度客户端模型(Light Lightness Client),客户端模型不含有状态
- 控制模型:控制模型可以包含一个或多个客户端模型,用来和其他节点的服务端模型通信;也可以包含一个或多个服务端模型,用于响应其他节点客户端模型发来的消息
蓝牙技术联盟定义的模型被称为标准模型(SIG Adopted Model),16bit标识,目前SIG定义好的模型包括Generic、Sensors、Time and Scenes、Lighting;由厂商定义的模型称为厂商模型(Vendor Model),32bit标识
发布和订阅
节点可以向单播地址、组播地址、虚拟地址发布(publish)消息,其他节点也可以通过订阅(subscribe)这些地址来获得这些消息;如客厅中的灯具可以订阅客厅的组播地址
网络安全
mesh对传输的数据进行分层次加密,网络层(Network Layer)数据通过网络密钥(Network Key)加密;应用密钥(App Key)用于加密接入层(Access Layer)数据;配置模型(Configuration Model)的数据则采用设备密钥(Device Key)进行加密
- 蓝牙mesh的安全是强制性的
- 设备加网的过程是采用了256 bit椭圆曲线加密和带外数据认证的方式
- 所有mesh的消息都经过128 bit AES-CCM加密和认证
- 加密和认证在网络层和应用层都得以实现
- 重发攻击被消息里包含强制更新序列号的方式所阻止
- 在mesh网络中通过刷新密钥来防止垃圾桶攻击
网络拓扑
Mesh网络中有4种功能节点,每个Mesh设备可以有选择的支持,分别为
- 中继功能(Relay):那些使能了此特性的节点可以通过Advertising Bearer接收并转发消息给mesh网络其他设备,它只转发不在消息缓存和TTL的值大于1的消息,转发前会把TTL的值减1。支持中继功能的节点称为中继节点
- 代理功能(Proxy):为了兼容不支持蓝牙Mesh的BLE设备(比如手机),能够采用BLE GATT Bearer的方式和BLE设备通信,实现mesh广播数据包和GATT通信数据包的转换,支持代理功能的节点称为代理节点
- 低功耗功能(Low Power):主要是应用在低功耗设备上,减少设备工作时间,大部分时间处于休眠状态,需要配合朋友节点,支持低功耗功能的节点称为低功耗节点
- 朋友功能(Friend):帮助低功耗功能节点缓存消息,便于低功耗节点唤醒后向其查询消息,支持朋友功能的节点称为朋友节点
上图中,BLE设备(手机)T通过代理节点S进行GATT Bearer转换Adv Bearer进行网络通信;低功耗节点L、M、I、J、K分别通过朋友节点O、P来进行消息缓存
蓝牙MESH系统分层架构
蓝牙协议栈属于层级结构
- BLE层: 蓝牙mesh建立在BLE物理层和链路层之上,采用Advertising和Connection两种数据传输方式
- 承载层(Bearer Layer) :把BLE层的数据抽象并供上层使用, 目前定义了两种承载,广播承载和GATT承载, 分别对应BLE的Advertising和Connection方式
- 网络层(Network Layer) :定义了PDU的格式,负责基于地址的消息传输,实现对承载层的消息报文进行加解密和认证行为
- 底层传输层(Lower Transport Layer):负责将数据分段和重组,保证数据的完整
- 上层传输层(Upper Transport Layer): 负责应用层信息数据的加密,解密和认证;它还定义了节点间传输控制信息,包括了朋友特性的应用实现
- 接入层(Access Layer):定义应用数据的格式,定义并控制应用数据在上层传输层的加密解密的过程;它确保从下层接收到的数据是正确的并传输到更高层的应用(指定到Model)
- 基础模型层(Foundation Model Layer):定义了配置和管理Mesh网络所需的访问层的状态、消息、 模型等, 实现mesh网络的配置