智能家居 ·

蓝牙 Mesh 网关的芯片怎么选:泰凌、芯科还是 Nordic?

对比泰凌 mesh_gw、Nordic Zephyr 和芯科 NCP/BGAPI 三种蓝牙 Mesh 网关方案:网关固件、串口协议、节点容量和成本,以及我们为什么选择网关用芯科、设备用泰凌。

上一篇定下了两件事:设备和网关之间走 SIG Mesh;网关这边,Mesh 协议栈放在一颗单独的蓝牙模组里,Linux 主程序通过串口指挥它。

接下来的问题就很具体了:这颗蓝牙芯片选谁?

我们前后比较了三家:泰凌(Telink)、芯科(Silicon Labs)和 Nordic。中间还推翻过一次,最后网关用芯科,设备继续用泰凌。这篇把比较的过程和理由摊开讲。

先说清楚:网关上的这颗芯片要干什么

网关里的蓝牙模组不是普通的 Mesh 节点,它要扮演几个角色:

  • 配网者:给新设备配网、分配地址、下发和绑定密钥;
  • 控制端:发送开关、调光、调色命令,接收设备上报的状态;
  • 常电节点:顺带做中继,帮远处的设备转发消息;
  • 协处理器:通过串口听 Linux 主机的指令,把收到的消息原样上报。

所以选芯片,比的不只是芯片本身,更重要的是厂商有没有现成的「网关固件」,以及主机和模组之间的串口协议好不好用。这一层决定了网关程序要写多少代码,以后出问题有没有人能查。

泰凌:成本最低,固件现成,但协议是私有的

泰凌在国内灯控和开关市场用得最多,我们的设备原本就是泰凌的芯片。它的 SIG Mesh SDK 开源在 GitHub 上,里面直接带着一份编好的网关固件 mesh_gw。

mesh_gw 的结构大概是这样:

层 内容 能不能改
蓝牙底层、Mesh 协议栈 加密、网络层、传输层 闭源,只给库文件
网关应用层 串口命令处理、配网流程、状态上报 开源,可以改
和主机的接口 UART(新芯片 TL321X 只支持串口) 泰凌私有协议

优点很明显:

  • 芯片便宜,量产单价几块钱人民币;
  • 网关固件现成,烧进去就能用,还有 Windows 调试工具;
  • 和设备同一家,设备上用了泰凌自己的扩展模型,网关也能直接认。

问题出在串口协议上。它是泰凌自己定义的,文档很少,很多细节只能读 SDK 源码才能弄明白。比如命令名叫 HCI_CMD_GATEWAY_...,看起来像蓝牙标准的 HCI,其实完全不是,帧格式也不一样:主机发过去的帧没有长度头,靠串口空闲来切分;模组发回来的帧又带长度头。

还有一个容量问题:mesh_gw 默认最多只能存 200 个节点,开启远程配网时只有 110 个。原因是节点信息只放在 Flash 的一个扇区里。家用够了,但商业场景要改 SDK 的存储布局。

我们最开始的原型就是按泰凌这套协议写的,还写了一个软件模拟的模组来测试。能跑,但每加一个功能都要回去翻源码,心里不踏实。

Nordic:工具和文档最好,但网关固件要自己写

Nordic 的 nRF52840、nRF5340 在蓝牙开发圈口碑很好,文档、抓包工具、手机调试 App 都是行业里最好的一档。nRF52840 Dongle 只要十美元左右,插电脑 USB 就能开发。

但 Nordic 有一个关键的短板:新一代 nRF Connect SDK 里没有官方的「串口网关固件」。早年的 nRF5 SDK for Mesh 有一个,已经停止维护了。所以网关这边有三种做法:

做法 模组上跑什么 主机做什么 评价
自己写网关固件 Zephyr 的 Mesh 配网者和客户端模型,加一层自定义串口协议 只做翻译 架构最干净,但要自己写一两千行 C
模组只当蓝牙控制器 Zephyr 自带的标准 HCI 固件 Linux 上跑 BlueZ 的 Mesh 守护进程,或者自己实现协议栈 固件现成,但 Windows 上开发不了
Zephyr Mesh Shell 自带的命令行 发文本命令 只适合调试

容量上,Zephyr 的协议栈允许配置到 4096 个节点,按内存估算实际能做到一两千个。但默认配置只有 8 个节点,防重放列表只有 10 条,不改的话第 11 个设备的消息就会出问题。这是用 Zephyr 做网关很容易踩的坑。

Nordic 适合两种情况:网关的 Mesh 部分想完全自己掌控,或者单个网关要管几百个以上的设备。我们这两条都不太符合,而且模组价格明显更贵,就没有选它。

芯科:串口协议有正式文档,这是决定性的

芯科(Silicon Labs)的思路和泰凌一样,也是「模组跑协议栈、主机发指令」,官方叫 NCP(网络协处理器)模式。区别在于这套串口协议,也就是 BGAPI,是一套有正式文档的接口:

  • 每条命令、响应、事件都有文档,C 和 Python 都有官方主机端库;
  • 覆盖的功能几乎就是完整的 Mesh API:配网、配置、各种标准模型、密钥更新、固件升级;
  • SDK 里有现成的主机端配网示例(官方应用笔记 AN1371),我们的 Rust 实现照着它的流程写就行;
  • 调试工具 NCP Commander 有图形界面,不写代码就能配网、开灯,相当于泰凌的调试工具。

BGAPI 的帧格式很简单:4 字节头,加最多 255 字节的数据。

[hdr0][len_lo][class][cmd][payload 0–255 字节]
hdr0:bit7 区分命令/事件,bit6–3 是设备类型,bit2–0 是长度高 3 位

要注意一点:BGAPI 在串口上没有校验和,完全靠长度切帧,所以必须打开 RTS/CTS 硬件流控,防止丢字节。选主控芯片时,要确认它的串口支持流控。

价格方面,芯科网关这一档用的 EFR32BG24,官网 1000 片标价大约 2.7~3.7 美元,比泰凌贵。按每台网关算,多十几块钱人民币。

三家放在一起

泰凌 Nordic 芯科
网关固件 现成(mesh_gw) 要自己写,或用标准 HCI 现成(NCP 示例)
串口协议 私有,文档少 自己定义,或标准 HCI BGAPI,有正式文档和主机端库
调试工具 有 最好 好
默认节点容量 200(远程配网 110) 8,需调大,最多 4096 由 NCP 固件配置决定
芯片成本 最低 较高 中等
国内供应链 最成熟 一般 较好

我们的选择:网关用芯科,设备用泰凌

最后的组合是:

  • 网关:芯科 BG24 系列模组,跑 NCP 固件;
  • 设备:继续用泰凌,跑泰凌的 SIG Mesh SDK。

网关一台只用一颗模组,贵十几块钱,换来的是有文档的串口协议、完整的 Mesh API 和官方示例,以后维护起来省心得多。设备不一样,开关和灯的出货量大,每颗贵一点乘上去就是一大笔钱,泰凌的成本和国内方案商资源更合适。

两家芯片能放在一个网络里,靠的就是上一篇讲的 SIG 标准模型。只要设备只用 Generic OnOff、Light Lightness、CTL 这类标准模型,网关是谁家的都没关系。如果设备用了泰凌自己的扩展模型,就要换成标准模型,或者在网关上把对应的厂商模型也实现一遍。

换掉泰凌协议之后,网关程序里只有串口协议那一层要重写,Matter、设备表和翻译层都不用动。这也印证了第一篇里分层设计的好处。

还没验证的事

这些结论目前还是纸面上的,开发板到了之后要先确认三件事:

  1. 芯科网关和泰凌设备实际能不能互通。先不写代码,用芯科的 NCP Commander 给一块烧了泰凌灯固件的开发板配网、开灯。
  2. 主控的串口能不能开硬件流控,跑长时间压力测试,看会不会丢帧。
  3. 单个网关能稳定带多少设备,NCP 固件里的节点数、防重放列表这些参数要按实际需求调好。

验证结果会单独写一篇。

最后

选网关的蓝牙芯片,很容易只盯着芯片价格和参数。真正影响开发和维护的,往往是那份看不见的串口协议:有没有文档、能不能调试、出了问题能不能查到原因。

如果你也在给蓝牙 Mesh 网关选芯片,或者正在对接芯科 BGAPI、泰凌 mesh_gw,欢迎来聊:linktr.ee/weiyii

微信扫码阅读与分享

本文链接二维码

扫码打开,再从微信右上角分享。