Mesh 网络核心概念:从节点到消息,把抽象变具体

说实话,刚接触蓝牙 Mesh 的时候,我也被那一堆术语搞得头大。节点、元素、模型、状态……每个词都认识,凑在一起就不知道在说什么了。

后来我做了几个项目,踩了不少坑,才慢慢理清楚。今天我就用最直白的方式,把这些概念串起来讲给你听。

一句话总结:Mesh 网络里,节点是设备,元素是设备上的功能单元,模型定义了行为,状态是数据,消息是通信载体,发布/订阅是通信方式。

蓝牙 Mesh 核心概念关系图 蓝牙 Mesh 核心概念关系图 节点(Node) 元素(Element) 模型(Model) 状态(State) 元素(Element) 模型(Model) 状态(State) 消息(Message) 发布 / 订阅(Publish / Subscribe)

节点(Node)—— 网络里的每一个设备

节点就是 Mesh 网络中的每一个设备。一个灯泡、一个开关、一个传感器,只要加入了 Mesh 网络,就是一个节点。

每个节点都有一个唯一的 单播地址,就像门牌号。我习惯把节点想象成「一栋楼」,楼里可以有很多房间,每个房间就是元素。

我的经验:选型时一定要看节点支持的并发消息数。有些低端模组一次只能处理 2-3 条消息,在密集场景下很容易丢包。我踩过这个坑,后来全换了。

元素(Element)—— 节点里的功能单元

一个节点可以包含多个元素。每个元素都有自己的地址,也能独立收发消息。

举个例子:一个双路开关面板,里面有两个继电器。每个继电器就是一个元素。你控制左路,消息只发给左路对应的元素,右路不受影响。

节点类型 元素数量 说明
单色灯泡 1 一个元素,控制亮灭
双路开关 2 两个元素,分别控制两路
RGB 灯带 4 三个颜色通道 + 一个亮度,共 4 个元素

注意:每个节点至少有一个元素,也就是主元素。主元素的地址就是节点地址。其他元素的地址依次递增。

模型(Model)—— 定义设备能做什么

模型定义了元素的行为。说白了,模型就是「这个元素能干什么」的说明书。

蓝牙 Mesh 标准定义了很多模型,比如:

  • Generic OnOff Server:控制开关,比如灯泡的亮灭
  • Generic Level Server:控制亮度、温度等连续值
  • Light Lightness Server:专门控制灯光亮度
  • Sensor Server:上报传感器数据

每个元素可以包含多个模型。比如一个灯泡,既有 OnOff 模型,又有 Level 模型,还能有 Lightness 模型。

关键点:模型分为 Server 模型(提供服务)和 Client 模型(发起请求)。开关是 Client,灯泡是 Server。一个设备可以同时拥有 Client 和 Server 模型。

状态(State)—— 设备当前的数据

状态就是模型当前的值。比如灯泡的亮灭状态(On/Off)、当前亮度(0-65535)、色温值等。

状态可以是一个布尔值、一个整数,也可以是一个复杂结构体。每个模型都有一组关联的状态。

我记得有一次联调,对方说灯不亮。我查了半天,发现是状态同步出了问题——开关发了 On 消息,但灯泡的状态没更新。后来加了状态绑定才解决。

避坑指南:状态绑定(State Binding)是个好东西。比如你把亮度状态和开关状态绑定,关灯时亮度自动归零,开灯时恢复。省了很多逻辑。

消息(Message)—— 网络里的通信单元

消息就是节点之间传递的数据包。Mesh 网络里的一切通信,都是通过消息完成的。

消息有几种类型:

  • GET:请求读取状态
  • SET:请求设置状态
  • STATUS:回复当前状态

比如开关发一条 Generic OnOff Set (1),灯泡收到后把状态改成 On,再回复一条 Generic OnOff Status (1) 确认。

// 消息格式示例(简化)
opcode: 0x8201          // Generic OnOff Set
parameters: 0x01        // 1 = On, 0 = Off

注意:消息有长度限制。单条消息最多 11 字节(不含网络层头部)。如果你要传大量数据,得拆包或者用分段传输。

发布/订阅(Publish/Subscribe)—— 消息怎么传

这是 Mesh 网络最核心的通信机制。说白了,就是「谁发消息,谁收消息」的规则。

发布(Publish):节点把消息发到一个组地址或虚拟地址。

订阅(Subscribe):节点监听某个地址,收到消息就处理。

举个例子:

  • 开关订阅了组地址 0xC001
  • 灯泡也订阅了组地址 0xC001
  • 开关按一下,发布一条 On 消息到 0xC001
  • 灯泡收到,执行开灯

一个节点可以订阅多个地址,也可以发布到多个地址。这种机制让 Mesh 网络非常灵活——你可以把 100 个灯分到 10 个组,每个组独立控制。

地址类型 范围 用途
单播地址 0x0001 - 0x7FFF 点对点通信,发给特定节点
组地址 0xC000 - 0xFFFF 一对多通信,发给一组设备
虚拟地址 基于 UUID 生成 灵活分组,常用于大规模部署

我的建议:发布/订阅配置一定要在量产前固化。我见过有人把配置写在 App 里,结果用户手机丢了,整个网络都控制不了。最好在模组出厂时就烧好默认的发布/订阅关系。

把这些概念串起来

现在回头看,其实很简单:

  1. 节点是物理设备,比如一个灯泡
  2. 灯泡里有 元素,比如主元素控制亮灭
  3. 元素里有 模型,比如 OnOff Server 模型
  4. 模型维护 状态,比如当前是 On 还是 Off
  5. 节点之间通过 消息 通信
  6. 消息通过 发布/订阅 机制路由到正确的接收方

你想想看,这就像邮局系统:节点是邮局,元素是窗口,模型是窗口能办什么业务,状态是当前业务数据,消息是信件,发布/订阅就是寄信地址和收件人名单。

最后说一句:这些概念是 Mesh 网络的基石。后面讲配置、讲安全、讲性能优化,全都离不开它们。花点时间理解透,后面会省很多事。