19、蓝牙Mesh网络入门

蓝牙Mesh,说实话,是蓝牙技术里一个分水岭。传统蓝牙是一对一聊天,BLE广播是一对多喊话,但Mesh呢?它是让成千上万个设备组成一张网,彼此转发消息。我最早接触Mesh是在一个智能楼宇项目里,客户要求500个灯控节点,每个灯都能被手机控制,还要能联动。用传统BLE?想都别想。Mesh就是为这种场景生的。

这一章,我会带你从拓扑结构、通信模型、配置流程,一直聊到Android端怎么用现成的Mesh库。嗯,内容不少,但都是干货。

19.1 Mesh网络拓扑:节点、中继、代理

Mesh网络里,每个设备都叫节点(Node)。但节点不是平等的,它们有不同角色。我习惯把角色分成三类:

  • 中继节点(Relay):收到消息后转发出去。这是Mesh能“跳”的关键。没有中继,消息就只能直连,那跟普通BLE没区别。
  • 代理节点(Proxy):专门跟不支持Mesh的普通BLE设备通信。比如你的手机,它没有完整的Mesh协议栈,但通过Proxy节点,手机就能用标准GATT连接来收发Mesh消息。
  • 低功耗节点(Low Power):平时睡觉,偶尔醒来收消息。适合电池供电的设备,比如温湿度传感器。

你想想看,一个Mesh网络里,中继节点越多,覆盖范围越大,但功耗也越高。我在项目中遇到过客户要求所有节点都当中继,结果电池设备两天就没电了。嗯,这里要注意:只有供电稳定的设备才适合做中继

核心概念:Mesh网络不是星型,也不是树型,它是多对多的网状结构。每个节点都可以跟邻居通信,消息通过中继一跳一跳传遍全网。

蓝牙Mesh网络拓扑示意图 节点A 节点B 中继C 节点D 代理E 低功耗F 节点G 普通节点 中继节点 代理节点 低功耗节点

19.2 发布/订阅模型

Mesh通信不靠设备地址,靠的是主题(Topic)。每个节点可以订阅一个或多个主题,也可以向某个主题发布消息。这跟MQTT的思路很像,但实现上完全不同。

举个例子:你有一个开关节点,它发布消息到主题“/lights/room1”。所有订阅了这个主题的灯节点,都会收到这条消息,然后执行开或关。你想想看,这样设计的好处是什么?解耦。开关不需要知道灯在哪里,灯也不需要知道开关是谁。我加一个新灯,只要订阅同一个主题就行,不用改任何代码。

我的经验:在大型Mesh网络里,主题命名一定要规范。我曾经在一个项目里看到有人用“topic1”、“topic2”这种名字,后来设备多了根本分不清谁是谁。建议用类似“/building/floor/room/device”的层级结构。

发布/订阅模型还有一个好处:消息可以一对多。一个开关控制十盏灯,只需要发一条消息。这在传统点对点通信里,你得发十次。

19.3 配置流程(Provisioning)

一个新设备要加入Mesh网络,必须经过配置(Provisioning)流程。说白了,就是给它发一张“身份证”,告诉它网络密钥、分配地址、设置角色。

配置流程分三步:

  1. 邀请(Invitation):配置者(Provisioner)发现未配置的设备,发起邀请。设备回应自己的能力,比如支持多少种绑定方式。
  2. 交换公钥(Exchange Public Keys):双方交换公钥,建立安全通道。这一步用的是ECDH密钥交换,确保后续通信加密。
  3. 分配密钥和地址(Distribution):配置者把网络密钥、应用密钥、单播地址发给设备。设备保存这些信息,正式成为网络节点。

注意:配置过程必须在物理上靠近设备,因为通常需要用户按键确认或扫描二维码。这是为了防止恶意设备混入网络。我见过有人试图远程配置,结果安全校验一直过不了——嗯,这是设计上故意限制的。

配置完成后,设备就拥有了网络密钥(NetKey)应用密钥(AppKey)。NetKey用于网络层加密,AppKey用于应用层加密。两层加密,安全系数很高。

19.4 Android Mesh库:Telink与阿里IoT

在Android上开发Mesh应用,你不需要从零实现协议栈。目前主流有两个库:Telink Mesh SDK阿里IoT Mesh SDK。我两个都用过,说说我的感受。

Telink Mesh SDK

Telink的SDK比较成熟,文档也全。它基于Sig Mesh标准,支持Provisioning、配置、收发消息等全套流程。我个人习惯用它做原型验证,因为上手快。

一个简单的初始化示例:

// 初始化Mesh网络
MeshManager meshManager = MeshManager.getInstance();
meshManager.init(context, new MeshConfig.Builder()
    .setNetworkName("MyMesh")
    .setNetKey("0123456789ABCDEF")
    .setAppKey("FEDCBA9876543210")
    .build());

// 扫描未配置设备
meshManager.startScanUnprovisionedDevices(new ScanCallback() {
    @Override
    public void onDeviceFound(UnprovisionedDevice device) {
        Log.d("Mesh", "发现设备: " + device.getUuid());
        // 开始配置
        meshManager.provisionDevice(device, new ProvisionCallback() { ... });
    }
});

阿里IoT Mesh SDK

阿里的SDK更偏向云端联动。它内置了阿里云IoT平台的对接能力,适合需要远程控制、数据上云的场景。如果你做的是智能家居,而且后端用阿里云,那这个库很合适。

不过要注意,阿里SDK对Sig Mesh标准的支持不是100%完整,有些私有扩展。如果你要跟其他品牌的Mesh设备互通,建议先用Telink的库做兼容性测试。

特性 Telink Mesh SDK 阿里IoT Mesh SDK
协议标准 完整Sig Mesh Sig Mesh + 阿里扩展
云端集成 阿里云IoT
配置流程 完整Provisioning 完整Provisioning
文档质量 较好 一般
社区活跃度 中等

我的建议:如果你做的是纯本地Mesh网络,选Telink。如果你需要远程控制和云平台,选阿里。但不管选哪个,一定要先做小规模验证。我曾经在一个项目里直接上100个节点,结果发现某个库的Provisioning有内存泄漏,排查了两天才找到原因。

好了,这一章的内容就到这里。Mesh网络入门其实不难,关键是理解拓扑、模型和配置流程这三个核心。至于库的选择,看你的业务场景。嗯,希望这些经验对你有帮助。


公众号:蓝海资料掘金营,微信deep3321