任何一个出厂的mesh设备是一个未配网设备(Unprovisioned Device),需要使用配网者(Provisioner)对未配网设备进行配网,使其成为mesh网络中的一个节点。要使未配网设备成为一个节点,需要配网者为其分配一个NetKey(表示该设备属于哪一个子网),一个IV Index(表示该设备是有效的),一个Unicast Address(作为该节点的唯一标识)。配网的流程其实就是配网者如何安全有效不冲突地将这些数据下发给未配网设备。
1. 配网数据格式
配网有两种方式,一种是通过ADV广播的方式进行配网(PB-ADV),另一种是通过GATT连接的方式进行配网(PB-GATT)。
1.1. Unprovisioned Beacon
任意一个未配网设备上电后都会无限制地发送未配网Beacon(Unprovisioned Beacon),表明他期待配网者让他加入网络。未配网Beacon的数据格式如下:

| Field | Size(octets) | Description |
|---|---|---|
| Length | 1 | 表示后面数据的长度 |
| AD Type | 1 | Mesh Beacon类型 |
| Beacon Type | 1 | 0x00,表示当前Beacon类型为未配网Beacon |
| Device UUID | 16 | 设备唯一标识符 |
| OOB Information | 2 | 该设备支持的带外通信方式 |
| URI Hash | 4 | URI的前4位,作为带外信息的Public Key,此域为可选项 |
未配网设备除了发送Unprovisioned Beacon外,还会广播一个单独的不可连接广播包,里面包含了Uniform Resource Identifier(URI),配网者可以使用这个URI值作为公钥与设备通信。Beacon中的URI hash字段表示应该使用哪个URI值,其中:
U R I _ H a s h = s 1 ( U R I _ D a t a ) [ 0 − 3 ] URI\_Hash =s1(URI\_Data)[0-3] URI_Hash=s1(URI_Data)[0−3]
OOB Info域一共16个bit位,每个位代表的含义如下:
| Bit | Description |
|---|---|
| 0 | Other |
| 1 | Electronic/URI |
| 2 | 2D machine-readable code |
| 3 | Bar code |
| 4 | Near Field Communication(NFC) |
| 5 | Number |
| 6 | String |
| 7 | RFU |
| 8 | RFU |
| 9 | RFU |
| 10 | RFU |
| 11 | On box |
| 12 | Inside box |
| 13 | On piece of paper |
| 14 | Inside manual |
| 15 | On device |
1.2. PB-GATT
手机端通过GATT连接的方式进行配网,数据通过proxy协议交互,Proxy PDU格式的Message Type设置为0x03,表示之后的Data域为Provisioning PDUs。
1.3. PB-ADV
通过ADV的方式进行配网,数据格式如下:

| Field | Size(octets) | Description |
|---|---|---|
| Length | 1 | 表示后面数据的长度 |
| AD Type | 1 | PB-ADV类型 |
| Link ID | 4 | 链路的标识符 |
| Transaction Number | 1 | 事务的标识符 |
| Generic Provisioning PDU | 1-24 | 配网PDU |
可以看到ADV配网PDU的最大长度仍为31字节。
每一条独立的配网PDU具有不同的Transaction Number,但是分段消息的不同分段具有相同的Transaction Number。
配网者发送的Provisioning PDU中的Transaction Number范围为0x00-0x7F。0x7F的下一个TN为0x00。
未配网设备发送的Provisioning PDU中的Transaction Number范围为0x80-0xFF。0xFF的下一个TN为0x80。
在PB-ADV中最后一个字段为Generic Provisioning PDU,其详细的数据格式如下:

| Field | Size(octets) | Description |
|---|---|---|
| Generic Provisioning Control | 1-17 | 配网数据控制域 |
| Generic Provisioning Payload | 0-64 | 配网数据载荷 |
可以看出实际的Generic Provisioning PDU会大于24字节,因此这里会有分段的行为。
Generic Provisioning PDU共有四种形式:
① Transaction Start
表示开始传输分段消息,其数据格式如下:

| Field | Size(bits) | Description |
|---|---|---|
| SegN | 6 | 最后一个分段的分段号 |
| GPCF | 2 | 0b00,表示这条消息为Transaction Start消息 |
| TotalLength | 16 | Provisioning PDU的大小 |
| FCS | 8 | Frame Check Sequence |
| Data | ≥ 8 \geq8 ≥8 | Provisioning PDU的第一个分段 |
② Transaction Acknowledgment
用于响应Provisioning PDU消息,其数据格式如下:

Padding=0b000000,GPCF=0b01,Data域为空。
③ Transaction Continuation
表示传输分段消息附加段,其数据格式如下:

| Field | Size(bits) | Description |
|---|---|---|
| SegmentIndex | 6 | 当前分段的分段号 |
| GPCF | 2 | 0b10,表示这条消息为Transaction Continuation消息 |
| Data | ≥ 8 \geq8 ≥8 | Provisioning PDU的分段载荷 |
④ Transaction Bearer Control
用于管理承载层的会话,即建立配网者与未配网设备的通道,其数据格式如下:

| Field | Size(bits) | Description |
|---|---|---|
| BearerOpcode | 6 | 控制消息的操作码 0x00:Link Open 0x01:Link ACK 0x02:Link Close 0x03-0x3F:RFU |
| GPCF | 2 | 0b11,表示这条消息为Transaction Bearer Control消息 |
| Parameters | variable | Control消息的参数 |
Control消息有以下三种:
A. Link Open
配网者发起,要求与未配网设备建立一个链接,设备收到后需要响应一个Link Ack消息,一个设备只能同时处理一个Link(??),因此在Link存在期间,无视Link Open消息。其数据格式如下:

Device UUID为配网者选择的设备的UUID。
B. Link ACK
未配网设备收到配网者的Link Open消息后,响应的消息。数据格式如下:

C. Link Close
配网者和未配网设备都可发起,该消息至少发送三次,不需要ack。用于告知对端链路关闭,当前配网流程结束及配网的结果。
其数据格式如下:

参数域为关闭原因,其具体含义如下:
| Reason Value | Reason | Notes |
|---|---|---|
| 0x00 | Success | 配网成功 |
| 0x01 | Timeout | 配网超时 |
| 0x02 | Fail | Control配网失败 |
| 0x03-0xFF | Unrecognized | 未定义的原因 |
1.4. Provisioning PDUs
PB-ADV通过Transaction Start/Acknowledgment/Continuation/Bearer Control来进行链路的建立和分段数据的发送,同样的功能PB-GATT使用Proxy协议来实现。两种方法的最终目的是为了传输Provisioning PDUs,来进行配网数据的交换。
Provisioning PDUs的消息格式如下:

| Field | Size(bits) | Description |
|---|---|---|
| Padding | 2 | 0b00 |
| Type | 6 | Provisioning PDUs的类型 0x00:Provisioning Invite 0x01:Provisioning Capabilities 0x02:Provisioning Start 0x03:Provisioning Public Key 0x04:Provisioning Input Complete 0x05:Provisioning Confirmation 0x06:Provisioning Random 0x07:Provisioning Data 0x08:Provisioning Complete 0x09:Provisioning Failed 0x0A-0xFF:RFU |
| Parameters | variable | Provisioning PDUs的消息参数 |
配网PDU根据功能不同分为以下几种类型。
① Provisioning Invite
配网者发起,表明配网程序开始。

本文详细解析了蓝牙Mesh网络中未配网设备如何通过配网者进行配网的过程,包括配网数据格式、链路建立流程以及配网流程的四个阶段。深入探讨了ProvisioningPDUs消息类型及其参数,OOB授权机制,以及配网数据的加密传输。
最低0.47元/天 解锁文章
3954

被折叠的 条评论
为什么被折叠?



