3、配网流程详解:配网者(Provisioner)与未配网设备交互、配网协议(PB-ADV/PB-GATT)、配网安全(OOB认证、加密密钥生成)

好,咱们今天来聊聊蓝牙Mesh里最核心的一个环节——配网。

说白了,配网就是把一个“啥也不会”的灯泡、传感器,变成Mesh网络里一个“有身份”的节点。这个过程,就像给一个新员工办入职手续:先找到他,验证身份,分配工号,再告诉他公司的规矩。

我个人习惯把配网分成三大块:谁来找设备(配网者与未配网设备)、怎么传数据(PB-ADV和PB-GATT)、怎么保证安全(OOB和密钥)。咱们一个一个聊。

3.1 配网者(Provisioner)与未配网设备

配网者,就是Mesh网络里的“管理员”。它可以是手机App、网关,甚至是一个专门的调试工具。未配网设备,就是刚出厂的灯泡、开关,它们处于“待配网”状态,不断广播自己的存在。

配网者要做的事,我总结为三步:

  • 发现设备:监听未配网设备的广播(Beacon)。
  • 建立连接:通过PB-ADV或PB-GATT协议,建立安全通道。
  • 分配身份:给设备分配一个唯一的“单播地址”,并下发网络密钥。

嗯,这里要注意:一个配网者可以配多个设备,但一次只能配一个。就像办入职,一次只能跟一个人谈话。

关键点:未配网设备在配网前,只做两件事——广播自己的UUID,以及等待配网者的连接。配网者则负责扫描、筛选、发起配网流程。

3.2 配网协议:PB-ADV vs PB-GATT

配网协议,说白了就是“怎么把配网数据包传过去”。蓝牙Mesh定义了两种方式:

特性 PB-ADV(基于广播) PB-GATT(基于连接)
传输方式 使用BLE广播信道(37/38/39) 使用BLE GATT连接(数据信道)
适用场景 纯Mesh设备(无手机交互) 手机App配网、调试工具
速度 较慢(广播包小,需重传) 较快(连接稳定,吞吐量大)
兼容性 所有Mesh设备都支持 需要设备支持GATT(通常都有)

我在项目中遇到过一个问题:用PB-ADV配网时,如果周围蓝牙设备太多,广播包容易冲突,导致配网失败。后来我建议客户改用PB-GATT,问题就解决了。你想想看,广播信道就那么三个,大家都在喊,肯定听不清。

3.2.1 PB-ADV 的工作流程

PB-ADV使用一种叫“分段传输”的机制。配网数据被切成小块,每个小块放在一个广播包里。接收方收到后,再拼回去。

举个例子,配网过程中要传输一个公钥(64字节),广播包一次只能放20多字节,那就得拆成3-4个包。每个包都有序号,接收方按序号重组。

我的经验:PB-ADV的广播间隔建议设为20-30ms。太快了容易丢包,太慢了配网时间太长。我曾经调过50ms的间隔,配一个灯要10秒,客户直接投诉。

3.2.2 PB-GATT 的工作流程

PB-GATT就简单多了。配网者先扫描到未配网设备,然后发起GATT连接。连接建立后,通过一个特定的GATT Service(Mesh Provisioning Service)来交换数据。

这个Service里有两个Characteristic:一个用于发送数据(TX),一个用于接收数据(RX)。配网者往TX里写数据,设备从RX里读数据。一来一回,完成配网。

// 伪代码示例:PB-GATT 配网流程
1. 配网者扫描到未配网设备(UUID: 0x1234)
2. 发起GATT连接
3. 发现 Mesh Provisioning Service (UUID: 0x1827)
4. 使能 TX Characteristic 的 Notification
5. 配网者写入配网数据到 TX
6. 设备通过 RX 回复
7. 重复步骤5-6,直到配网完成
8. 断开GATT连接

注意:PB-GATT虽然快,但有个坑——连接超时。如果配网过程中手机突然走远了,或者信号不好,连接会断开,配网就失败了。我曾经在展会现场遇到过,演示到一半配网断了,场面一度很尴尬。

3.3 配网安全:OOB认证与加密密钥生成

配网安全,说白了就是“怎么证明你是你,以及怎么保证数据不被偷看”。蓝牙Mesh用了两招:OOB认证和密钥协商。

3.3.1 OOB认证(带外认证)

OOB,全称Out-of-Band,意思是“通过其他渠道交换信息”。比如,设备上印了一个二维码,配网时扫一下,就能拿到一个“密钥”。这个密钥用来验证设备身份。

OOB有三种常见形式:

  • 静态OOB:设备出厂时固定一个密钥,印在标签上。简单,但不灵活。
  • 动态OOB:设备每次配网时生成一个随机密钥,显示在屏幕上。安全,但需要屏幕。
  • 无OOB:不验证身份,直接配网。方便,但容易被攻击。

我个人建议:能上OOB就上OOB。哪怕只是扫个二维码,也比裸奔强。我在一个智能家居项目里,客户为了省成本,用了无OOB。结果测试时,隔壁工位的同事用手机App就把我们实验室的灯全配上了……嗯,后来还是乖乖加了二维码。

3.3.2 加密密钥生成

配网过程中,配网者和设备会协商出一堆密钥。这些密钥用来保护后续的通信。流程如下:

  1. 交换公钥:双方各自生成一个椭圆曲线密钥对(ECDH),交换公钥。
  2. 计算共享密钥:用ECDH算法,双方各自算出同一个“共享密钥”。
  3. 生成会话密钥:用共享密钥加上一些随机数,派生出“会话密钥”(Session Key)。
  4. 加密传输:后续所有配网数据,都用会话密钥加密。

核心公式
共享密钥 = ECDH(私钥A, 公钥B) = ECDH(私钥B, 公钥A)
会话密钥 = KDF(共享密钥, 随机数A, 随机数B)

配网完成后,设备会得到三个关键密钥:

  • 网络密钥(NetKey):用于整个Mesh网络的加密。
  • 应用密钥(AppKey):用于具体应用数据的加密(比如开关灯指令)。
  • 设备密钥(DevKey):用于配网者与设备之间的点对点通信。

避坑指南:我曾经在配网时发现,设备配完后无法加入网络。查了半天,原来是网络密钥的索引(NetKey Index)没对上。配网者下发了NetKey,但设备不知道这个NetKey对应哪个索引。后来我在代码里加了个校验,确保索引和密钥一起下发,问题就解决了。

3.4 配网流程总结

好了,咱们把整个配网流程串起来:

  1. 发现阶段:未配网设备广播Beacon,配网者扫描到它。
  2. 邀请阶段:配网者发送邀请,设备回复自己的能力(支持什么OOB、算法等)。
  3. 交换公钥阶段:双方交换ECDH公钥,计算共享密钥。
  4. 认证阶段:通过OOB验证设备身份(比如输入PIN码或扫描二维码)。
  5. 分发密钥阶段:配网者下发NetKey、AppKey、DevKey,以及设备的单播地址。
  6. 完成阶段:设备保存密钥,退出配网模式,加入Mesh网络。

整个过程,快的话3-5秒就能完成。慢的话(比如OOB需要人工输入),可能要十几秒。我个人习惯在配网时加个进度条,让用户知道“正在配网,别急”。

最后提醒:配网过程中,不要断电!不要断开连接!否则设备可能进入“半配网”状态,既不是未配网,也不是已配网。这时候只能恢复出厂设置,重新来过。我吃过这个亏,所以现在代码里都会加一个“配网超时回滚”机制。

好,配网流程就讲到这里。下一章咱们聊聊“节点配置与模型绑定”,看看配完网之后,设备怎么真正开始干活。