1. Mesh网络基础回顾:节点、中继、好友、代理特性,以及消息发布/订阅模型
各位好,我是老周。做蓝牙协议栈十几年了,Mesh这块从2017年规范刚出来就开始啃。今天咱们先不急着排查故障,把地基打牢。Mesh网络和传统蓝牙最大的区别在哪?说白了,它不再是「一对一」的短连接,而是一个「多对多」的网状网络。你想想看,一个灯泡坏了,整个灯控系统不能瘫痪吧?Mesh就是干这个的。
1.1 节点(Node)——网络的最小单元
节点是Mesh网络里最基础的设备。一个灯、一个开关、一个传感器,只要加入了Mesh网络,都叫节点。每个节点都有一个唯一的单播地址,就像门牌号。
节点分两种:
- 未配网设备:刚出厂的灯泡,还没加入任何网络,处于「待配网」状态。
- 已配网节点:通过Provisioning流程拿到了网络密钥,正式成为网络成员。
1.2 中继(Relay)——消息的搬运工
中继功能是Mesh网络的灵魂。没有中继,消息就只能直连,那和传统蓝牙有什么区别?
中继节点做的事情很简单:收到一条消息,检查是不是发给自己的。如果不是,就转发出去。但这里有个关键——TTL(生存时间)。
| TTL值 | 含义 | 典型场景 |
|---|---|---|
| 0 | 不转发 | 仅本地处理 |
| 1 | 只转发一次 | 邻居节点通信 |
| 7(默认) | 最多转发7跳 | 一般家庭/办公 |
| 127(最大) | 几乎全网广播 | 大型部署 |
1.3 好友(Friend)——低功耗设备的守护者
低功耗节点(LPN)不能一直监听网络,否则电池撑不住。这时候就需要好友节点来帮忙。
好友节点会替LPN缓存消息。LPN醒来后,问好友:「有我的消息吗?」好友把缓存的消息发给它,然后LPN继续睡。
好友关系有几个要点:
- 一个好友可以服务多个LPN(最多支持多少?规范没硬性限制,但实际受内存限制)
- 一个LPN只能有一个好友
- 好友关系需要定期维持(Friend Poll)
1.4 代理(Proxy)——让手机也能玩Mesh
手机没有Mesh协议栈,怎么控制Mesh网络?靠代理节点。
代理节点在Mesh网络和手机之间搭了一座桥。手机通过GATT连接代理节点,发送Mesh消息。代理节点把消息转成Mesh广播包,发到网络里。反过来也一样。
代理协议(Proxy Protocol)定义了四种PDU类型:
- Network PDU:网络层数据包
- Mesh Beacon:信标,用于发现网络
- Proxy Configuration:代理配置
- Provisioning PDU:配网数据
嗯,这里要注意:代理节点不能是低功耗节点。它得一直在线,否则手机连不上。
1.5 发布/订阅模型——消息怎么找到对的人
Mesh网络里,消息不是直接发给某个具体设备的。它用的是发布/订阅模型。
每个节点可以订阅一个或多个组地址。当某个节点发布消息到组地址时,所有订阅了这个组地址的节点都能收到。
举个例子:
- 开关A发布消息到组地址0xC001
- 灯泡B、C、D都订阅了0xC001
- 按下开关A,三个灯泡一起亮
发布/订阅模型的好处是解耦。开关不需要知道灯泡的地址,灯泡也不需要知道开关在哪。加一个新灯泡,只要订阅同一个组地址就行。
| 地址类型 | 范围 | 用途 |
|---|---|---|
| 未分配地址 | 0x0000 | 未配网设备 |
| 单播地址 | 0x0001 - 0x7FFF | 唯一标识节点 |
| 虚拟地址 | 0x8000 - 0xBFFF | 基于UUID的组 |
| 组地址 | 0xC000 - 0xFFFF | 固定组/动态组 |
1.6 核心关系图
下面这张图把上面讲的几个角色和它们之间的关系串起来了。你看一眼就能明白Mesh网络是怎么工作的。
1.7 小结
这一章我们把Mesh网络的五个核心角色和消息模型过了一遍。你记住一句话就行:节点是基础,中继是骨架,好友是省电方案,代理是手机入口,发布/订阅是消息路由的灵魂。
后面排查连接断开问题时,你会反复用到这些概念。比如设备掉线了,先看它是普通节点还是LPN?如果是LPN,好友节点还在不在?消息发不出去,先查发布/订阅配置对不对?这些基础打牢了,排查起来才有方向。