1. 蓝牙Mesh基础回顾:节点、元素、模型、状态、地址、发布/订阅机制

做蓝牙Mesh开发,说白了就是跟一群设备打交道。你得先搞清楚这群设备长什么样、怎么说话、听谁的命令。这一章咱们把最核心的几个概念捋一遍。我刚开始接触Mesh时,也被这些术语绕得头晕,后来发现只要抓住几个关键点,整个体系就清晰了。

1.1 节点(Node)—— 网络里的“人”

一个支持蓝牙Mesh的设备,加入网络后就叫节点。没加入网络的设备叫“未配网设备”,它啥也干不了。

节点分四种角色,我习惯用一张表来记:

角色 功能 实际例子
中继节点 转发消息,扩大覆盖范围 智能灯泡、插座
低功耗节点 大部分时间休眠,省电 门磁、温湿度传感器
朋友节点 帮低功耗节点缓存消息 常供电的网关或灯
代理节点 让手机通过GATT连接Mesh 手机App配网时的桥梁
我的经验:一个节点可以同时扮演多个角色。比如一个智能灯,既能当中继,又能当朋友节点。但低功耗节点不能当中继,否则就失去了省电的意义。

1.2 元素(Element)—— 节点里的“器官”

每个节点至少有一个元素。元素是节点内部最小的功能单元。你可以把节点想象成一个人,元素就是人的手、脚、眼睛。

举个例子:一个双路开关面板,控制两路灯光。这个节点就有两个元素——元素0控制灯1,元素1控制灯2。每个元素都有自己的地址,这样才能单独控制。

关键规则:

  • 元素编号从0开始
  • 主元素(元素0)负责配网和配置
  • 每个元素可以独立拥有模型和状态

1.3 模型(Model)—— 元素会“做什么”

模型定义了元素的行为。说白了,模型就是一组“能收什么消息、能发什么消息、能执行什么操作”的集合。

模型分三类:

  • 服务器模型:维护状态,响应请求。比如“通用开关服务器模型”维护一个开关状态(开/关)。
  • 客户端模型:发送请求,读取或修改服务器状态。比如手机App里的开关按钮。
  • 控制模型:既是客户端又是服务器,常见于复杂设备。

我记得第一次做项目时,把模型和状态搞混了。后来想明白:模型是“能力”,状态是“数据”。模型定义了你能做什么,状态记录了你当前的值。

1.4 状态(State)—— 设备当前的“记忆”

状态就是设备当前的值。比如灯的亮度、色温、开关状态。每个状态都有一个唯一的状态ID。

状态之间可以绑定。比如你调节亮度时,开关状态自动变成“开”。这种绑定关系叫状态绑定,是Mesh协议里很实用的特性。

避坑指南:我曾经在项目中没处理好状态同步,导致两个灯的状态不一致。后来发现是状态绑定的回调没写对。记住:状态变化一定要触发绑定更新,否则设备会“精神分裂”。

1.5 地址(Address)—— 消息该发给谁

Mesh网络里有三种地址:

地址类型 范围 用途
单播地址 0x0001 ~ 0x7FFF 唯一标识一个元素
组播地址 0xC000 ~ 0xFFFF 一组设备同时接收
虚拟地址 基于UUID生成 特定场景的灵活分组

你想想看,如果没有地址,消息就像在广场上喊话,所有人都得听。有了地址,你就能精准地跟某个人或某一群人说话。

1.6 发布/订阅机制 —— 消息怎么传

这是Mesh最核心的通信方式。我习惯用“报纸订阅”来理解:

  • 发布:节点把消息发到一个地址(相当于报社印报纸)
  • 订阅:节点监听某个地址的消息(相当于你订了报纸)

一个节点可以发布到多个地址,也可以订阅多个地址。这种机制的好处是:发送者不需要知道谁在收,接收者不需要知道谁在发。解耦得干干净净。

实际配置示例:

// 配置灯节点发布到组地址0xC001
Config_Model_Publication_Set(
    element_addr = 0x0001,
    model_id = 0x1000,  // 通用开关服务器模型
    publish_addr = 0xC001,
    publish_period = 0  // 不周期发布,仅事件触发
);

// 配置开关节点订阅组地址0xC001
Config_Model_Subscription_Add(
    element_addr = 0x0002,
    model_id = 0x1001,  // 通用开关客户端模型
    sub_addr = 0xC001
);

这样,开关一按,消息就通过组地址0xC001发给所有订阅了这个地址的灯。不需要知道灯的具体单播地址。

知识体系总览

下面这张图把本章的核心概念串起来了。我画图时习惯把节点放在中间,因为它是一切的基础。

蓝牙Mesh核心概念关系图 节点 (Node) 元素 (Element) 模型 (Model) 状态 (State) 地址 (Address) 发布/订阅 核心关系 节点包含元素 → 元素拥有模型 → 模型操作状态 地址和发布/订阅决定消息如何传递

嗯,到这里,蓝牙Mesh的六个基础概念就讲完了。你会发现它们环环相扣:节点是物理设备,元素是功能单元,模型定义能力,状态记录数据,地址定位目标,发布/订阅搞定通信。把这六个概念吃透,后面的实战内容就好办了。