相关文档
蓝牙 mesh 协议:Specifications – Bluetooth® Technology Website
概念解释
Mesh组网
蓝牙 Mesh 是基于 BLE 4.0 协议基础上实现的组网协议,并在蓝牙的 37/38/39 广播信道上进行通信,设备不间断保持在广播信道上进行扫描监听以及转发,从而实现设备间的组网通信。
受限于4.2版本协议蓝牙广播的数据长度Mesh最底层的数据包长度很短,但是 Mesh transport 层支持对上层的长数据进行分包,但是分包会增加发包的耗时。
Mesh协议栈组成
(1) Model layer:标准化典型用户场景的操作,这些操作通过Bluetooth Mesh Model specification协议来定义。
(2) Foundation Model layer:定义了用于配置和管理mesh网络的状态、消息以及model。
(3) Access layer: 定义了高层应用如何访问upper transport layer。该层定义了应用数据包的格式。同时,高层应用数据的加解密功能定义在这一层完成。
(4) Upper transport layer:对应用数据进行加解密以及鉴权。
(5) Lower transport layer: 主要对upper transport layer的数据包进行分段和重组。
(6) Network layer: 网络层是MESH网络的关键层。这一层主要负责将传输层的数据包传输给一个或者多个其它节点。数据包是否被拒绝、或者被在本节点做进一步处理、或者数据包将会被前传给其它节点是网络层的核心功能。同时,网络层还对本层消息进行加解密和鉴权。
(7) Bearer layer:定义了网络层数据包如何在节点之间传递。当前协议版本定义了两种承载,一种是广播承载,另一种是GATT承载。
(8) Bluetooth low energy core specification:这一层是在MESH协议发布之前所定义的BLEcore specification
洪泛式网络
蓝牙 Mesh 属于一种低速率的洪泛式组网技术,网络内的节点如果具备转发能力在收到同一个网络的消息后,如果消息为可转发的消息则会将消息继续广播出去,以此达到一条 Mesh 数据能在整个Mesh网络内快速的传递。
洪泛式的组网有它的优势也有劣势,优势在于节点能够快速响应、到达成功率高、网络健壮性好等。劣势在于容易产生网络风暴,多条消息并发时网络内碰撞大,消息的到达率与响应速度就会下降。
TTL
TTL 指的是一条广播包可被转发次数,在每条的 mesh 广播包中都会存在,占用 7bit。对于 TTL 的值有以下解释:
• 0 = has not been relayed and will not be relayed
• 1 = may have been relayed, but will not be relayed
• 2 to 126 = may have been relayed and can be relayed
• 127 = has not been relayed and can be relayed
节点间通信为广播通信没有特定的路径,relay 节点收到的广播包只要 TTL 值不为 0 这条广播包就可以被继续转发,同时将广播包中的 TTL 减一。
SEQ
SEQ 全称 sequence num,每包的序列号。mesh 的每一包里都有一个长度为 3 个字节的序列号。对于同一个设备在发送 mesh 数据时,这个序列号必须是累加的。
同时每个 mesh 设备内部都有一张 SEQ 缓存表,用来缓存接收到的mesh数据包的源地址(src_addr)和其最新的 SEQ,这张表只存放在 RAM(掉电丢失)中。在每收到一个 mesh 数据包时都要去表里去查询,收到的SEQ是否大于缓存表同一个源地址的 SEQ,如果小于等于则认为次数据包为重传包或者不合法数据包,同时丢弃此数据包。
Mesh密钥
Mesh Profile 规范定义了两种类型的密钥:应用程序密钥(AppKey)和网络密钥(NetKey)。
NetKeys 用于网络层的通信加密,只有 NetKey 保持一致设备所发出的数据才可以被同一个Mesh网络内的节点进行传输。
AppKeys 用于上层传输层的通信加密,只有AppKey保持一致,节点间通信发送的数据才可以被解密成应用数据。这两种类型的密钥在 mesh 节点之间是统一的,只有两个密钥保持一致才能进行通信。一个网络中,则可以有多个Appkey。
除了上述两种密钥外还有一种设备密钥(DevKey),它是每个节点唯一的特殊应用程序密钥,即一机一密,只有节点和配网者知道,用于配网者来配置节点通信加密。
Mesh角色
Mesh Provisioner:配网者节点,例如:涂鸦智能 APP(手机)、蓝牙网关;
Relay node:转发节点,Mesh 网络中的长供电节点,可以转发网络内的消息;
Proxy node:代理节点,可以被手机 GATT 连接的节点,手机通过连接代理节点来发送或者接收 mesh 网络的数据来控制整个网络的节点;
LPN node:低功耗节点,会定期的休眠与唤醒,来降低自身的功耗;
Friend node:配合 LPN node 工作的朋友节点,当 LPN 节点休眠时,替其缓存数据,LPN 节点唤醒时再将数据发给它。
目前 Tuya 的设备默认都具备 relay、proxy 能力,目前 LPN 与 Friend 特性未使用。
Mesh地址
单播地址:每个 element 都有一个单播地址,地址范围 0x0001-0x7FFF,一个设备可能有多个 element;
虚拟地址:Label UUID是128bit的,一个或多个elements可以订阅该UUID,达到接收消息的目的,对该UUID做hash,即为虚拟地址;
组播地址:包括群组地址和广播地址;
配网
Mesh Spec 规定的标准配网为 mesh 的 Provision 过程,实际设备从未配网到可以正常通信分为两个步骤:
Mesh Provision阶段
配网节点通过扫描到未配网的 mesh 节点设备,然后通过连接(PB-GATT)或者广播(PB-ADV)与设备通信并发起配网,配网过程会先通过ECDH 协商生成 Public key,然后基于 Public key 将Mesh网络的密钥 Network key 下发给设备,同时协商生成设备密钥 Device key,到此设备 Provision 阶段完成。
Config Model 配置阶段
接下来还需要通过 Network key 与 Device key 的加密将应用密钥 App key 下发给设备,同时对设备的 Model 绑定对应的应用密钥以及更新 Mesh 设备的 Network transmit 参数,到此设备的完成配网完成。后续所有的业务都可以通过这三个密钥加密完成。
配网者中有两种承载方式(详细可参考 Mesh Profile 1.0.1 中 5.2 章节):
PB-ADV
配网者通过广播直接与未配网的 mesh 节点通信进行配网过程。此种方式一般适用于网关类配网者,此类配网者可以保持一致或者周期性 scan 空中的广播数据以及发送广播数据来做到与网络内节点通信。
PB-GATT
配网者通过 GATT 连接的方式与未配网的 mesh 节点进行连接后通过连接通道进行配网。一般应用于手机 App 此类的配网者。手机 App 一般无法保持长时间的 scan 能力,所以无法直接接收Mesh网络的消息,所以需要通过 GATT 连接未配网的设备进行通信。
Mesh数据包
我们目前常用的 mesh 控制数据包类型为 Access message。
Access message 分为 unseq acc / seq acc;
unseq acc 即 不分包 access 数据,最大长度为15,减去 MIC(4) 最大可以 11Byte。11Byte 里包括 opcode,即在用 vendor model 发送数据时,opcode 长度为3,即 data 最大为 8.
seq acc 即分包 access 数据,单包最大长度为12,即总长度为 12\*n,n为分包数。12\*n 中包括 MIC 4Byte),即用户数据为 12\*n-4,再减掉 opcode 长度才为实际的用户数据长度 即: 12\*n - 4 - opcode_len。如果对于使用 vendor model 则分包数为 n = (data_len + 7)/12,对 n 取整。
在使用数据包很短的控制命令时,命令的成功率与到达的一致性都很优秀,例如:开关命令、照明的调光命名、传感器的数据上报等。所以建议数据命令长度较长的控制方式时建议不要选择 Mesh 方案,否则不仅无法发挥其优势而且有可能会出现数据延迟与丢包等问题。
Sig mesh网络防重放安全机制
seq:
sequence num,每包的序列号。Mesh 的每一包里都有一个长度为3个字节的序列号。对于同一个设备在发送mesh 数据是,这个序列号是累加的。
每个mesh设备内部都有一张 seq cache 表,用来缓存接收到的 mesh 数据包的原地址 src_addr 和最新的 seq。这张表只存放在 ram(掉电丢失) 中。在每收到一个 mesh 数据包时都要去表里去查询,对于同一个 src_addr,收到的 seq 是否大于缓存的 seq,如果小于等于则不做任何处理。
iv index:
iv index 是一个网络内的属性,针对于同一个网络所有设备的 iv index 保持一致。Iv index 的意义在于,seq 只有三个字节,对于 mesh 网络通信,早晚有用完的那一天,如果 seq 用完了没有其他机制的话这个设备就无法与其他设备通信了。所以,iv index 的更新就是来解决 seq 的问题。
当网络内任意一个设备的 seq 用完了之后,就可以发起 iv index 的更新,在 iv index 更新之后,设备的 seq 重置从 0 开始重新累加。
iv index 更新过程分为 normal 状态和 active 状态。因为一个网络内有大量的设备,更新是需要一定时间的。因为技术性很强,此处不多过多解释,感兴趣的可以参考 mesh spec。
mesh网络结构
相关问题:
为什么手机只能用GATT方式?
答:因为mesh节点是需要持续保持scan的,这要求射频必须持续工作,而手机系统应用众多,如果长时间保持蓝牙的scan是无法保证的,所以这时如果用BLE连接的方式与其中一个节点建立连接,则将会减少手机占用的资源。
Proxy节点:
答:Proxy节点就是与手机进行直连的节点,这个节点具备mesh节点的所有特性,同时与手机进行GATT连接通信,以此可以替手机转发命令到mesh网络的节点,也可以接收其他节点到发给手机的广播然后转发给手机。
一个mesh网络中可以多个手机同时控制吗?
答:根据前面问题的回答可以知道,手机必须要直连一个节点控制mesh网络。每个节点只能被一个手机连接。所以需要 支持proxy节点数量 >= 同时连接手机的数量。当然,如果有网关的话,手机数量是没有限制的。