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网络不是星型,也不是树型,它是多对多的网状结构。每个节点都可以跟邻居通信,消息通过中继一跳一跳传遍全网。
19.2 发布/订阅模型
Mesh通信不靠设备地址,靠的是主题(Topic)。每个节点可以订阅一个或多个主题,也可以向某个主题发布消息。这跟MQTT的思路很像,但实现上完全不同。
举个例子:你有一个开关节点,它发布消息到主题“/lights/room1”。所有订阅了这个主题的灯节点,都会收到这条消息,然后执行开或关。你想想看,这样设计的好处是什么?解耦。开关不需要知道灯在哪里,灯也不需要知道开关是谁。我加一个新灯,只要订阅同一个主题就行,不用改任何代码。
我的经验:在大型Mesh网络里,主题命名一定要规范。我曾经在一个项目里看到有人用“topic1”、“topic2”这种名字,后来设备多了根本分不清谁是谁。建议用类似“/building/floor/room/device”的层级结构。
发布/订阅模型还有一个好处:消息可以一对多。一个开关控制十盏灯,只需要发一条消息。这在传统点对点通信里,你得发十次。
19.3 配置流程(Provisioning)
一个新设备要加入Mesh网络,必须经过配置(Provisioning)流程。说白了,就是给它发一张“身份证”,告诉它网络密钥、分配地址、设置角色。
配置流程分三步:
- 邀请(Invitation):配置者(Provisioner)发现未配置的设备,发起邀请。设备回应自己的能力,比如支持多少种绑定方式。
- 交换公钥(Exchange Public Keys):双方交换公钥,建立安全通道。这一步用的是ECDH密钥交换,确保后续通信加密。
- 分配密钥和地址(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