前言
蓝牙Mesh配网就是通过配网器配置未配网设备,将未配网设备加入网络中,使其成为蓝牙mesh网络的节点;配网数据中包括分发网络密钥(network key)、元素单播地址(unicast address)和IV Index
为了提高配网效率,厂家会增加私有协议来完成快速配网的功能;如有异议,欢迎留言指正
配网协议
配网分层架构
配网承载
承载层是用来在配网器和未配网设备之间传输配网PDU的,蓝牙Mesh规范定义了两种承载:
- PB-ADV:通过蓝牙BLE广播信道(不可连接且不能扫描的非定向广播),用于传输通用配网PDU,MTU(最大传输单元)是24字节。一个支持PB-ADV的设备需要开启BLE扫描(100%的执行占空比)获取配网PDU
字段 | 字节长度 | 描述 |
Length | 1 | AD类型和PDU的长度 |
AD Type | 1 | AD类型(PB-ADV) |
Contents | 可变 | PB-ADV PDU |
PB-ADV的PDU数据格式
字段 | 字节长度 | 描述 |
Link ID | 4 | 当前承载层建立的连接ID(标识两个设备之间的连接) |
Transaction Number | 1 | 每个PDU的唯一标识符(分包与重传) |
Generic Provisioning PDU | 1-24 | 通用配网PDU |
- PB-GATT:PB-GATT是另一种配置承载,通过代理PDU来配网(手机平板通过代理协议配网)
配网协议
配网PDUs用来在配网器和未配网设备之间进行通信的基本单元
字段 | 长度(bits) | 描述 |
Padding | 2 | 0b00,其他值被禁止 |
Type | 6 | 配网PDU的类型值 |
Parameters | 可变 | 消息参数 |
蓝牙Mesh定义了10种配网PDU,所有PDU都可以在整个配网流程中使用
Type | Name | Description |
0x00 | Provisioning Invite | 邀请设备加入mesh网络 |
0x01 | Provisioning Capabilities | 设备配置能力 |
0x02 | Provisioning Start | 启动配置,配网器选择配置方法 |
0x03 | Provisioning Public Key | 配置公钥 |
0x04 | Provisioning Input Complete | 配置输入完成 |
0x05 | Provisioning Confirmation | 配置确认 |
0x06 | Provisioning Random Contains | 包含配网器和设备的随机数 |
0x07 | Provisioning Data | 配置数据,包括主元素的指定单播地址、网络密钥、网络密钥索引、标志和IV索引 |
0x08 | Provisioning Complete | 配置完成 |
0x09 | Provisioning Failed | 配置失败 |
配网流程
配网流程分为5个阶段:
- 信标(Beconing)阶段
- 邀请(Invitation)阶段
- 交换公钥(Exchange Public Keys)阶段
- 身份认证(Authentication)阶段
- 分发配网数据(Distribution Of Provisioning Data)阶段
信标阶段
信标主要是为了配网器发现周边未配网的设备
- 支持PB-ADV bearer的设备,会广播未配网的设备信标,信标中会带有设备的UUID,每个设备的UUID均不相同
- 支持PB-GATT bearer的设备,也会广播带有配网服务UUID的广播报文
两种配网都支持的话,设备会间隔广播两个类型;(如下图中无OOB信息认证)
邀请阶段
在信标阶段结束后,配网器和未配网设备通过PB-ADV或PB-GATT承载建立连接,进入邀请阶段
配网能力消息由设备发给配网器,表示设备支持的能力,包括加密算法、公钥类型、静态OOB类型、最大输出OOB大小、是否支持OOB输出行为、最大输入OOB大小、是否支持OOB输入行为
交换公钥阶段
交换公钥阶段,可以使用两种算法交换设备的ECDH公共密钥:明文交换和通过OOB隧道进行交换
在蓝牙mesh规范中,先采用非对称密钥方式计算出对称加密密钥,在网络中消息传输通过对称密钥进行加解密
- 无OOB机制
- 使用OOB公钥交互方式
身份认证阶段
身份认证阶段是配网器和设备的互相认证过程,通过使用ECDH密钥以及OOB消息对随机数RandomValue加密计算得到ConfirmationValue,双方对比换算得到的ConfirmationValue和接收到的ConfirmationValue来完成认证;
根据配网器和设备的输入输出能力,定义了三种方式
- 输出式OOB认证
- 输入式OOB认证
- 静态OOB认证
- 无OOB认证
输出式OOB认证
输出式OOB认证方式通过未配网设备产生一个随机数,通过显式的方式(LCD屏幕、LED灯光闪烁等)让使用者获取到并输入到配网器来完成OOB的认证
输入式OOB认证
输入式OOB认证是通过配网器生成一个随机数,同样由用户将随机数输入未配网器。与输出式OOB认证对比,输入式OOB认证时,未配网器在随机数输入后需要发送一个输入完成的报文,来通知配网器
静态OOB认证和无OOB认证
当配网器和未配网设备的输入输出受限的情况下,此时可以使用静态OOB或无OOB认证;静态OOB的话双方会预存静态的OOB信息,无OOB认证使用数值0来代替,但可能存在中间人攻击
分发配网数据
身份认证完成之后,会进入分发配网数据阶段,配网器会负责生成分发配置数据,包括如网络密钥(Network Key)、密钥索引、单播地址、IV索引等;分发的数据会通过ECDH密钥派生的会话密钥,然后使用AES-CCM算法进行加解密
配置数据格式
Field | Size(byte) | Note |
Network Key | 16 | 网络密钥 |
Key Index | 2 | 网络密钥索引 |
Flags | 1 | 标识 |
IV Index | 4 | 当前IV索引 |
Unicast Address | 2 | 主元素单播地址 |
分配数据流程
总结
设备配网是蓝牙mesh安全的基石,分发的密钥需要多方数据换算验证,这意味着后续节点能在网络中安全的通信,更多详细请参考蓝牙mesh协议规范