Mesh网络节点角色详解:Friend、Low Power、Proxy、Relay

蓝牙Mesh网络里,节点不是千篇一律的。每个节点可以扮演不同角色,就像团队里有人负责转发消息,有人负责省电,有人负责给Wi-Fi设备搭桥。我刚开始接触Mesh时,觉得这四个角色挺绕的,后来在几个项目里反复折腾,才算真正摸透了它们的脾气。

今天咱们就把Friend节点、Low Power节点、Proxy节点、Relay节点这四位主角,一个一个拆开来看。

核心要点:一个蓝牙Mesh节点可以同时支持多个角色。比如,一个节点可以既是Relay又是Friend。但Low Power节点通常只做LPN,不会同时做Relay——省电嘛,你懂的。

蓝牙Mesh节点角色关系图 蓝牙Mesh节点角色关系图 蓝牙Mesh网络 Relay 节点 消息中继转发 Proxy 节点 协议桥接转换 Friend 节点 缓存消息给LPN Low Power 节点 周期性休眠省电 好友关系 间歇唤醒 💡 说明: 一个节点可同时支持多个角色(如Relay+Friend),但Low Power节点通常只与一个Friend节点配对。

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干三件事:

  1. 缓存消息:LPN睡觉期间,所有发给LPN的消息,Friend先存着。
  2. 响应请求:LPN醒来后,Friend把缓存的消息一次性发给它。
  3. 过滤无关消息:只缓存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——那跟开派对一样热闹,但网络效率会很低。