4、Mesh网络基础配置:Provisioner与Node角色、UUID与网络密钥、配置广播与扫描、节点入网流程

好,咱们进入正题。这一章讲的是Mesh网络的基础配置,说白了就是怎么把一个个孤立的蓝牙设备,组织成一个能互相通信的网络。我刚开始接触Mesh的时候,觉得这东西挺玄乎,后来亲手配了几次才明白——核心就四个东西:角色、身份、密钥、流程。

4.1 两种核心角色:Provisioner 与 Node

Mesh网络里,设备分两种状态:还没入网的叫 未配网设备,入了网的就叫 节点。但这里有个特殊角色——Provisioner,它是整个网络的“管理员”。

角色 职责 典型设备
Provisioner 分配网络密钥、配置节点参数、管理网络 手机App、网关、专用配置工具
未配网设备 广播自身信息,等待被配置 灯、传感器、开关(出厂状态)
节点 已入网,可收发Mesh消息 同上(已配置状态)

我个人习惯把Provisioner想象成“人事部”——它负责给新员工(设备)办入职、发工牌(网络密钥)、分配工位(地址)。没有它,设备再多也是一盘散沙。

小提示: 一个Mesh网络里可以有多个Provisioner,但通常只有一个主Provisioner。我在项目中遇到过两个Provisioner同时抢着配同一个设备的情况,结果网络乱套了。建议初期只用一个。

4.2 UUID:设备的“身份证”

每个蓝牙设备都有一个唯一的 UUID(通用唯一标识符)。在Mesh里,这个UUID是设备入网前的身份凭证。Provisioner就是通过扫描到的UUID,来识别哪个设备是它要配的。

UUID通常是128位的,长这样:

// 示例:一个标准的16字节UUID
0x12345678-9ABC-DEF0-1234-56789ABCDEF0

你想想看,如果现场有100个灯,每个灯的UUID都印在盒子上,你拿手机一扫就知道哪个灯是哪个。但实际项目中,很多厂商会把UUID写死,或者用芯片的MAC地址来生成。嗯,这里要注意——UUID不能重复,否则Provisioner会认错设备。

避坑指南: 我曾经遇到过一批模组,UUID全是一样的,因为厂商在固件里写死了同一个值。结果一配网,所有设备都响应同一个UUID,Provisioner直接懵了。所以,量产前一定要检查UUID的唯一性。

4.3 网络密钥:Mesh的“通行证”

Mesh网络的安全性,靠的是三层密钥体系。最核心的就是 网络密钥(NetKey)。所有节点必须持有同一个NetKey,才能在同一网络里通信。

密钥类型 作用范围 说明
网络密钥(NetKey) 整个网络 所有节点共享,用于加密网络层数据
应用密钥(AppKey) 特定应用 比如灯的控制指令用一套Key,传感器数据用另一套
设备密钥(DevKey) 单个设备 仅Provisioner和该设备之间使用,配网完成后可丢弃

NetKey由Provisioner生成,在配网过程中分发给新设备。说白了,它就是Mesh网络的“Wi-Fi密码”——知道密码才能连进来。

重点: 如果NetKey泄露,整个网络都不安全。所以生产环境中,建议定期更换NetKey,或者使用安全芯片存储密钥。

4.4 配置广播与扫描:设备怎么“喊话”

未配网的设备,会通过蓝牙广播发送 未配网信标(Unprovisioned Device Beacon)。这个广播包里包含了设备的UUID和一些配网信息。Provisioner则负责扫描这些广播。

广播包的格式大致如下:

// 未配网设备广播包结构
- Beacon Type: 0x00 (未配网设备)
- Device UUID: 16字节
- OOB Information: 2字节(指示是否有带外认证信息)
- URI Hash: 可选(用于URI配网)

我建议你在调试时,用抓包工具(比如nRF Sniffer)看看这些广播。你会发现,设备每隔几百毫秒就喊一次:“我在这里!我的UUID是xxx!快来配我!”

Provisioner扫描到广播后,会发起配网请求。这里有个细节——扫描窗口和扫描间隔会影响发现速度。窗口太短,可能漏掉广播;太长,又费电。

参数 推荐值 说明
扫描窗口 30ms 每次扫描持续的时间
扫描间隔 100ms 两次扫描开始之间的间隔
广播间隔 200ms 设备发送广播的间隔
经验之谈: 如果设备入网慢,先检查广播间隔和扫描间隔是否匹配。我曾经调了一整天,最后发现是广播间隔设成了1秒,扫描窗口只有10ms,两者完美错过。

4.5 节点入网流程:从“陌生人”到“自己人”

整个入网流程,我习惯分成五步。下面这张图可以帮你快速理解:

节点入网流程 1. 广播信标 设备发送UUID 2. 邀请入网 Provisioner发起 3. 交换公钥 ECDH密钥协商 4. 认证 OOB/无OOB 5. 分发密钥 NetKey + AppKey + 地址 入网完成 ✓ 说明: 认证方式有四种:无OOB(无认证)、静态OOB(输入PIN码)、动态OOB(扫码/按键)、输出OOB(显示数字)。

具体每一步做什么,我拆开来说:

  1. 广播信标: 未配网设备周期性广播,告诉周围“我来了”。
  2. 邀请入网: Provisioner收到广播后,发送配网邀请,设备回复自己的配网能力(支持多少种认证方式、算法等)。
  3. 交换公钥: 双方通过ECDH算法交换公钥,建立安全通道。这一步是为了后续的密钥分发不被窃听。
  4. 认证: 根据设备能力,选择认证方式。比如输入PIN码、扫码、或者直接无认证(开发阶段常用)。
  5. 分发密钥: Provisioner把NetKey、AppKey、以及节点的单播地址发给设备。设备保存后,正式成为节点。
注意: 第4步认证如果失败,整个配网流程就会终止。我曾经在测试时,因为PIN码输错三次,设备直接拒绝再次配网,必须重启才能恢复。所以,认证逻辑一定要做好重试和超时处理。

好了,这一章的内容就是这些。配网流程看起来步骤多,但实际跑起来也就一两秒的事。关键是理解每个环节的作用,这样出了问题才知道从哪查起。