2. 蓝牙Mesh协议栈解析

说实话,刚接触蓝牙Mesh的时候,我被这五个概念绕晕过。节点、元素、模型、状态、消息——每个词都认识,但放在一起就不知道谁是谁了。后来做项目踩了坑才明白,这五个概念就是Mesh网络的“五根柱子”。搞懂它们,你就能看懂任何Mesh协议栈的代码。

我个人习惯把这五个概念分成两组:硬件抽象层(节点、元素)和软件抽象层(模型、状态、消息)。咱们一个一个来。

蓝牙Mesh五核心概念关系图 节点 (Node) 物理设备(已入网) 元素 (Element) 节点内的功能单元 模型 (Model) 定义行为与通信 状态 (State) 设备的当前数据 消息 (Message) 节点间的通信载体 💡 一句话总结 节点包含元素 元素包含模型 模型操作状态 消息传递状态

2.1 节点(Node)—— 入网才是自己人

节点,说白了就是已经加入Mesh网络的设备。一个灯泡、一个开关、一个传感器,只要它成功配网(Provisioning),就成了网络里的一个节点。

没入网的设备叫什么?叫未配网设备(Unprovisioned Device)。它就是个“孤儿”,谁都不认识它,它也不认识谁。

关键点:节点是Mesh网络的最小参与单位。每个节点有且只有一个单播地址,网络靠这个地址找到它。

我在项目中遇到过一个问题:一个灯控节点配网后死活收不到开关发来的命令。查了半天,发现是配网时分配的地址跟另一个节点冲突了。嗯,地址管理这事儿,后面专门讲。

2.2 元素(Element)—— 节点里的“分身”

一个节点可以有多个元素。元素是什么?你可以把它理解成节点内部的功能单元。

举个例子:一个双路开关面板,左边控制客厅灯,右边控制走廊灯。这个面板是一个节点,但它内部有两个元素——每个元素对应一个独立的控制通道。

节点 元素数量 说明
单路灯泡 1 一个元素,控制亮灭
双路开关面板 2 两个元素,分别控制两路
温湿度传感器 2 一个元素上报温度,一个上报湿度

避坑指南:每个元素必须有一个唯一的单播地址。节点地址 = 第一个元素的地址,后续元素地址依次递增。我曾经在配置多元素节点时忘了递增地址,结果两个元素共用一个地址,通信全乱套了。

2.3 模型(Model)—— 定义“能干什么”

模型是蓝牙Mesh里最核心的概念。它定义了元素的行为——这个元素能干什么、能响应什么消息、能发出什么消息。

模型分三种:

  • 服务器模型(Server Model):维护状态,响应客户端请求。比如灯的“通用开关服务器模型”,它知道灯是开还是关。
  • 客户端模型(Client Model):发送请求,读取或修改服务器状态。比如开关的“通用开关客户端模型”,它发命令让灯亮或灭。
  • 控制模型(Control Model):既当服务器又当客户端,常见于复杂设备。

你想想看,一个灯泡节点里至少有一个元素,这个元素里至少有一个“通用开关服务器模型”。模型才是真正干活的。

我个人的经验:刚开始写Mesh应用时,别急着自定义模型。先用SIG定义好的标准模型(Generic OnOff、Light Lightness等),等跑通了再考虑扩展。标准模型兼容性好,省心。

2.4 状态(State)—— 设备当前“是什么”

状态就是模型维护的数据。灯的开关状态(开/关)、灯的亮度值(0x0000~0xFFFF)、色温值——这些都是状态。

状态有几种类型:

  • 布尔状态:开或关,0或1
  • 数值状态:亮度、温度、湿度等连续值
  • 复合状态:多个值组合在一起,比如灯的“亮度+色温”

状态还有个重要特性——绑定(Binding)。什么意思?一个状态变了,另一个状态自动跟着变。比如你把灯的亮度调到0,它的开关状态自动变成“关”。这就是状态绑定。

注意:状态绑定是逻辑上的,不是物理上的。我在一个项目中把“亮度状态”和“开关状态”做了绑定,但忘了处理边界条件——亮度调到0时触发关灯没问题,但再调亮度时灯不会自动开。这种细节很容易漏。

2.5 消息(Message)—— 节点间的“对话”

消息是节点之间通信的载体。一个节点通过消息告诉另一个节点:“嘿,把你的状态改一下”或者“嘿,告诉我你现在什么状态”。

消息分两大类:

消息类型 方向 例子
GET(请求) 客户端 → 服务器 “你现在是开还是关?”
SET(设置) 客户端 → 服务器 “给我关掉!”
STATUS(状态回复) 服务器 → 客户端 “我现在是关的”

消息还有个关键属性——是否需要应答。需要应答的消息叫可靠消息,不需要的叫不可靠消息。开关灯这种操作通常用不可靠消息(丢了就丢了,再按一次),但固件升级这种关键操作必须用可靠消息。

实战建议:消息的TTL(生存时间)要合理设置。TTL太大,消息在网络里乱窜浪费带宽;TTL太小,消息传不到目标节点。我一般从TTL=5开始调,根据实际网络规模微调。

2.6 五者关系:一张图说清楚

咱们用个实际场景串一遍:

  1. 节点:一个智能灯泡,已经入网。
  2. 元素:这个灯泡只有一个元素(主元素)。
  3. 模型:元素里有一个“通用开关服务器模型”。
  4. 状态:模型维护一个“开关状态”,当前值是0(关)。
  5. 消息:开关面板发来一条SET消息,把状态改成1(开)。灯泡收到消息,更新状态,灯亮了。

你看,这五个概念环环相扣。节点是躯壳,元素是器官,模型是功能,状态是数据,消息是语言。缺一个,Mesh网络就跑不起来。

一句话总结:节点包含元素,元素包含模型,模型操作状态,消息传递状态变化。记住这个链条,后面所有章节都绕不开它。