前言

蓝牙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%占空比来扫描广播信道,也就是扫描窗口时间=扫描间隔

esphome 蓝牙mesh 蓝牙 蓝牙mesh_数据


esphome 蓝牙mesh 蓝牙 蓝牙mesh_数据_02

节点与设备
  • 未配网设备(Unprovisioned Device):尚未加入Mesh网络的设备叫做未配网设备
  • 配网(Provisioning):未配网的设备成为节点的过程
  • 配网器(Provisioner):对未配网设备进行配网从而成为网络节点
  • 节点(Node):加入到Mesh网络之后的设备,成为蓝牙Mesh网络的一份子
网络和子网

一个蓝牙mesh网络中有4种资源被整个网络共享,分为节点的网络地址(Network Address)、网络密钥(Network Key)、应用密钥(Application Key)和 IV Index。在这个基础上,可以划分出多个子网络(Subnet)

esphome 蓝牙mesh 蓝牙 蓝牙mesh_蓝牙mesh基本概念_03

元素和地址
  • 节点由元素(Element)组成,节点至少包含一个主元素,每个元素都有自己的地址,例如一个两插孔的插座节点,每个插孔就是一个元素
  • esphome 蓝牙mesh 蓝牙 蓝牙mesh_蓝牙mesh基础_04

  • Mesh网络节点地址分成4类。占用两个字节
  • 单播地址:分配给节点中的元素地址,地址范围0x0001~0x7FFF,
  • 未分配地址:即无效地址,固定为0x0000,地址的初始值,常用于屏蔽一个设备
  • 组播地址:用于表示一个或多个节点的多个元素,地址范围0xC000~0xFFFF,其中包含256个固定组播地址
  • 虚拟地址:用于表示一个或多个节点的多个元素,每一个虚拟地址逻辑上对应一个128-bit的Label UUID,通过对该Label UUID作哈希运算得出虚拟地址的低14位数值,虚拟地址的范围为0x8000~0xBFFF
模型

模型(Model)定义了节点基本功能的最小单位模型,包含实现这个功能所必需的状态和操作状态的消息及其他一些行为,如台灯设备的开关 灯光亮度调节模型包含了三个部分

esphome 蓝牙mesh 蓝牙 蓝牙mesh_蓝牙mesh基本概念_05

  • 状态:表明节点中元素处某一个特定状态,即台灯中包含开关和亮度的状态值
  • 消息: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标识

esphome 蓝牙mesh 蓝牙 蓝牙mesh_蓝牙mesh基本概念_06

发布和订阅

节点可以向单播地址、组播地址、虚拟地址发布(publish)消息,其他节点也可以通过订阅(subscribe)这些地址来获得这些消息;如客厅中的灯具可以订阅客厅的组播地址

esphome 蓝牙mesh 蓝牙 蓝牙mesh_esphome 蓝牙mesh_07

网络安全

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):帮助低功耗功能节点缓存消息,便于低功耗节点唤醒后向其查询消息,支持朋友功能的节点称为朋友节点

esphome 蓝牙mesh 蓝牙 蓝牙mesh_蓝牙mesh基本概念_08

上图中,BLE设备(手机)T通过代理节点S进行GATT Bearer转换Adv Bearer进行网络通信;低功耗节点L、M、I、J、K分别通过朋友节点O、P来进行消息缓存

蓝牙MESH系统分层架构

esphome 蓝牙mesh 蓝牙 蓝牙mesh_esphome 蓝牙mesh_09

蓝牙协议栈属于层级结构

  • 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网络的配置