4、节点与元素:节点配置、元素地址、单播地址与组播地址的分配机制

好,咱们继续往下走。上一章我们把 Mesh 网络的整体骨架搭起来了,你知道了节点、中继、朋友这些角色。但有个问题我一直被问到:一个灯泡和一个插座,在 Mesh 网络里到底是怎么被“找到”的?

说白了,就是地址怎么分配。我刚开始接触蓝牙 Mesh 时,也被这堆地址概念绕晕过。什么单播、组播、虚拟地址,还有元素地址……嗯,今天咱们就把这层窗户纸捅破。

4.1 节点与元素:一个设备里藏着多个“小设备”

先看一个实际场景。你买了一个智能灯带控制器,它能控制三段灯带:左段、中段、右段。在 Mesh 网络里,这个控制器是一个节点。但三段灯带需要独立控制,对吧?

这时候,Mesh 协议引入了元素的概念。一个节点可以包含多个元素,每个元素相当于一个独立的控制端点。我个人习惯把元素理解为“设备里的子设备”。

核心规则:每个节点至少包含 1 个元素(主元素),最多支持 255 个元素。每个元素拥有独立的地址。

举个例子:

  • 单路开关面板:1 个节点,1 个元素(就一个按键)
  • 四路开关面板:1 个节点,4 个元素(每个按键独立)
  • 三色灯:1 个节点,3 个元素(R、G、B 各一个)

我在项目中遇到过有人把四路开关做成 4 个节点,结果配网时手机上一口气冒出 4 个设备,用户直接懵了。其实一个节点四个元素就搞定,界面清爽多了。

4.2 元素地址与单播地址:每个元素的“身份证”

每个元素在配网时,会被分配一个单播地址。这个地址是唯一的,就像身份证号。单播地址的范围是 0x0001 到 0x7FFF,一共 32767 个可用地址。

分配规则很简单:

  1. 节点入网时,Provisioner(配网器)给它分配一段连续的地址空间。
  2. 节点的主元素地址 = 起始地址。
  3. 后续元素的地址依次 +1。

举个例子:

节点 元素数量 起始地址 元素地址
三色灯 3 0x0100 0x0100 (主), 0x0101, 0x0102
四路开关 4 0x0103 0x0103, 0x0104, 0x0105, 0x0106
温控器 2 0x0107 0x0107, 0x0108

避坑指南:我曾经在开发时,配网器分配地址没做空闲检测,结果两个节点拿到了重叠的地址段。调试了整整两天,最后发现是地址池管理代码里有个 off-by-one 错误。记住:地址分配必须保证连续且不重叠。

4.3 组播地址:一对多的“广播群”

单播地址是点对点,但很多时候我们需要群控。比如“一键关所有灯”、“回家模式打开客厅所有设备”。这时候就要用组播地址。

组播地址的范围是 0xC000 到 0xFFFF,其中:

  • 0xC000 - 0xFEFF:用户可自定义的组播地址(约 16000 个)
  • 0xFF00 - 0xFFFF:系统保留的“所有节点”地址(比如 0xFFFF 表示所有节点)

组播地址的分配机制,说白了就是订阅-发布模型:

  1. 节点上的元素可以订阅一个或多个组播地址。
  2. 当有人向这个组播地址发消息时,所有订阅了该地址的元素都会收到。
  3. 一个元素可以同时订阅多个组播地址,一个组播地址也可以被多个元素订阅。

你想想看,这就像群。你拉了一个“客厅灯群”,群号是 0xC001。所有客厅灯都加进这个群。你发一条消息到群里,所有灯都响应。这就是组播。

4.4 地址分配的整体流程

我把整个流程画了张图,你一看就明白:

地址分配流程 Provisioner(配网器) 分配连续地址段(如 0x0100-0x0102) 节点接收地址段 元素依次分配地址(主元素+1, +2...) 元素订阅组播地址(可选) 注意 地址段必须连续 不能跨节点重叠 0x0000 保留不可用

4.5 地址类型对比

我把三种地址放在一起对比,方便你理解:

地址类型 范围 用途 谁分配 典型场景
单播地址 0x0001 - 0x7FFF 唯一标识一个元素 Provisioner 点对点控制(调单个灯)
组播地址 0xC000 - 0xFFFF 一对多群发 用户/应用层 群控(一键关所有灯)
虚拟地址 基于 UUID 生成 特定场景的模糊寻址 应用层 高级场景(如按房间分组)

重要提醒:单播地址 0x0000 是未分配地址,任何未配网的元素都用这个地址。如果你在调试时看到消息源地址是 0x0000,说明设备还没配网成功。

4.6 实际项目中的地址规划建议

最后,分享一点我在实际项目中的经验。地址规划做得好,后期维护少烦恼。

我的建议是:

  • 按功能分区:比如 0x0100-0x01FF 给照明,0x0200-0x02FF 给传感器,0x0300-0x03FF 给开关面板。这样看地址就知道是什么设备。
  • 预留扩展空间:每个功能区留 20% 的空闲地址,防止后期加设备时地址不够用。
  • 组播地址统一管理:建议做个表格,记录每个组播地址对应的群组。比如 0xC001 = 客厅灯,0xC002 = 卧室灯。别随手乱写,否则半年后你自己都忘了。

嗯,地址这块就讲到这里。你只要记住:节点是物理设备,元素是功能单元,单播是身份证,组播是群。这个类比能帮你应付 90% 的场景。