Mesh网络节点角色详解:Friend、Low Power、Proxy、Relay
蓝牙Mesh网络里,节点不是千篇一律的。每个节点可以扮演不同角色,就像团队里有人负责转发消息,有人负责省电,有人负责给Wi-Fi设备搭桥。我刚开始接触Mesh时,觉得这四个角色挺绕的,后来在几个项目里反复折腾,才算真正摸透了它们的脾气。
今天咱们就把Friend节点、Low Power节点、Proxy节点、Relay节点这四位主角,一个一个拆开来看。
核心要点:一个蓝牙Mesh节点可以同时支持多个角色。比如,一个节点可以既是Relay又是Friend。但Low Power节点通常只做LPN,不会同时做Relay——省电嘛,你懂的。
1. Relay节点:Mesh网络的“传声筒”
Relay节点是Mesh网络里最基础的转发单元。它的工作很简单:收到一条消息,看看是不是发给自己的,如果不是,就按TTL(生存时间)规则再广播出去。
说白了,没有Relay节点,Mesh网络就没办法覆盖大范围。每个Relay节点就像接力赛里的一棒,把消息一站一站传下去。
我的经验:在智能照明项目里,我习惯把吸顶灯都配置成Relay节点。因为它们常年通电,位置又高,转发信号覆盖范围特别好。但电池供电的传感器,我从来不让它做Relay——太费电了。
Relay节点有几个关键参数需要配置:
| 参数 | 说明 | 建议值 |
|---|---|---|
| TTL初始值 | 消息最多能跳几次 | 室内网络:5~7;大型项目:10~15 |
| Relay重传次数 | 每条消息重复发送几次 | 默认2次,干扰大的环境可设3次 |
| Relay重传间隔 | 两次重传之间的等待时间 | 10~50毫秒,视网络规模而定 |
嗯,这里要注意:TTL设太大,消息会在网络里到处乱窜,造成广播风暴。我见过一个项目,有人把TTL设成127,结果整个网络直接瘫痪。后来我养成了习惯,TTL从5开始试,够用就行。
2. Low Power节点:电池供电设备的“省电秘籍”
Low Power节点(LPN)是专门为电池供电设备设计的。它的核心思路就一个:大部分时间睡觉,醒来快速收发消息,然后继续睡。
LPN不会一直监听网络。它和某个Friend节点建立“好友关系”,平时呼呼大睡。Friend节点帮它缓存所有消息。等LPN睡醒了,一次性从Friend那里把消息取走。
我曾经踩过的坑:有一次做智能门锁项目,LPN的扫描窗口设得太短,只有10毫秒。结果门锁经常收不到开锁指令,用户站在门口干着急。后来我把扫描窗口调到30毫秒,轮询间隔设成2秒,问题才解决。记住:省电和省心,你得找个平衡点。
LPN的关键参数:
- 轮询超时时间(PollTimeout):LPN最长能睡多久才必须醒来一次。范围1秒~96小时,电池供电设备通常设5~30秒。
- 扫描窗口(ScanWindow):每次醒来监听多长时间。窗口越大,越容易收到消息,但也越费电。
- 好友订阅列表:LPN告诉Friend节点,自己对哪些消息感兴趣。不感兴趣的消息,Friend直接扔掉,不用缓存。
3. Friend节点:LPN的“私人秘书”
Friend节点和LPN是成对出现的。Friend节点帮LPN干三件事:
- 缓存消息:LPN睡觉期间,所有发给LPN的消息,Friend先存着。
- 响应请求:LPN醒来后,Friend把缓存的消息一次性发给它。
- 过滤无关消息:只缓存LPN订阅的消息,其他的直接忽略。
一个Friend节点可以同时服务多个LPN。但反过来,一个LPN只能绑定一个Friend节点。为什么?你想想看,如果LPN同时找两个秘书,它醒来时该先问谁?消息可能重复,也可能漏掉。
实际项目中的配置建议:Friend节点必须是一直在线的设备,比如智能插座、网关、吸顶灯。我一般建议一个Friend节点最多带5~8个LPN。带太多的话,缓存队列容易爆,消息延迟也会变大。
Friend节点需要配置的参数:
| 参数 | 作用 | 典型值 |
|---|---|---|
| 好友缓存大小 | 最多能缓存多少条消息 | 64~256条 |
| 好友接收窗口 | LPN醒来后,Friend等待多久 | 10~50毫秒 |
| 最大好友数量 | 最多能服务几个LPN | 3~10个 |
4. Proxy节点:Mesh世界与外部协议的“翻译官”
Proxy节点是Mesh网络和外部设备之间的桥梁。最常见的场景是:手机App通过蓝牙4.0(GATT协议)连接Proxy节点,然后Proxy节点把手机的命令转成Mesh的ADV广播包,发给Mesh网络。
说白了,没有Proxy节点,你的手机就没办法直接控制Mesh设备。因为手机的标准蓝牙协议栈不支持Mesh的ADV广播通信。
我个人习惯:在网关产品里,我通常把Proxy和Relay功能同时打开。这样网关既能接收手机App的命令,又能帮Mesh网络转发消息。一举两得。
Proxy节点支持两种协议模式:
- GATT承载层:通过蓝牙4.0/5.0的GATT服务传输Mesh协议数据。手机App用这个。
- ADV承载层:通过蓝牙广播包传输Mesh数据。Mesh节点之间用这个。
Proxy节点内部维护一个“白名单”,只允许授权的GATT客户端连接。这个安全机制很重要——不然谁都能连上你的Proxy节点,往Mesh网络里发恶意消息。
5. 四个角色的对比总结
最后,我用一张表把这四个角色放在一起对比。你在做项目选型时,直接对照这张表就行。
| 角色 | 核心功能 | 供电要求 | 典型设备 | 是否必须 |
|---|---|---|---|---|
| Relay | 消息中继转发 | 必须持续供电 | 吸顶灯、插座、网关 | 网络覆盖需要时必选 |
| Low Power | 周期性休眠省电 | 电池供电 | 传感器、门锁、开关 | 电池设备必选 |
| Friend | 为LPN缓存消息 | 必须持续供电 | 网关、吸顶灯、插座 | 有LPN时必选 |
| Proxy | GATT/ADV协议桥接 | 必须持续供电 | 网关、手机配网设备 | 需要手机控制时必选 |
嗯,这四个角色讲完了。你可能会问:一个设备能不能同时做Friend和Proxy?当然可以。我做过一个网关产品,Relay、Friend、Proxy三个角色全开,跑得很稳。但要注意内存和CPU开销——角色越多,资源消耗越大。
实际项目中,我建议你先画一张网络拓扑图,标清楚哪些设备是电池供电的,哪些是持续供电的。然后根据这张图,给每个设备分配角色。别一上来就把所有设备都设成Relay——那跟开派对一样热闹,但网络效率会很低。