初试 MeshCore 离网通信的第一印象
原文由 Michael Lynch 于 发布,订阅该博客
当我妻子看到我在摆弄新买的加密电台时,她问我是用来干什么的。
我说:“想象一下,我在手机上打一行字发给你,你的手机上马上就能收到!瞬间就到!”
她不为所动。
“就算因为停电电话线路断了……甚至社会崩溃了,它也能用。”她依然毫无反应。

“就算咱俩不在彼此的电台信号范围内,也能通过邻居们的电台组成的网状网络来中转消息。别担心!电台会对消息做端到端加密,谁也偷看不了我们在说什么。”说到这儿,她已经走出了房间。
我妻子有很多优点,但说实话,“对加密离网通信的热情”从来不在其中。
当然,我当时向妻子极力推销的技术就是 MeshCore。

太长不看——我的结论是什么?
如果想直接看结论,请查看总结部分。
什么是 MeshCore?
MeshCore 是一款运行在廉价远距离(LoRa)电台上的软件。LoRa 电台的传输距离可达数英里,具体取决于路径是否通畅。与业余电台不同,在美国使用 LoRa 频段发射无需执照,任何人买一台 LoRa 电台就能开始聊天。
MeshCore 不只是用无线电发消息。名字里的“mesh(网状)”指的是 MeshCore 用户会组成一个网状网络。如果 Alice 想给朋友 Charlie 发消息,但 Charlie 超出了她的电台范围,她就可以把消息经由附近的另一位 MeshCore 用户 Bob 中转,由 Bob 转发给 Charlie。

如果 Alice 能联系到 Bob 但联系不到 Charlie,她就可以让 Bob 的 MeshCore 电台把消息转发给 Charlie。
我对离网通信的设想
我算不上末日生存狂,但会为一些现实的灾难场景做准备,比如长时间停电、食物短缺和干旱。
听说 MeshCore 时,我觉得可以给附近的朋友每人发几台设备,这样紧急情况下就能互相联系。如果发现彼此超出了电台范围,或许还能说服几个邻居也加入进来。我们就能组建一个能扛住停电和电话中断的消息网络。
为什么不用 Meshtastic?
MeshCore 是对由 Meshtastic 这项技术所普及的理念的一种更新实现。
我最初是从Tyler Cipriani 2022 年的一篇博客文章中了解到 Meshtastic 的。当时觉得这个想法挺酷,但 Tyler 的结论是,那时的 Meshtastic bug 太多、太难用,还不适合大众普及。
我对 MeshCore 或 Meshtastic 并没有特别的偏好,毕竟两者我都没用过。我在 Mastodon 上关注的一些人对 MeshCore 很兴奋,所以我想试试看。大部分兼容 MeshCore 的设备也兼容 Meshtastic,试完一个再试另一个也很方便。
我对 Meshtastic 和 MeshCore 的区别了解有限,但据我所知,MeshCore 的关键区别在于节省带宽。据说当大量用户聚集在附近时,Meshtastic 会遇到扩展性问题。Meshtastic 协议比 MeshCore 更“话痨”,我看到有人抱怨 Meshtastic 的冗余通信会挤占无线信道、干扰消息送达。MeshCore 则试图通过减少网络闲聊来解决这个问题。
我不是玩电台的人
我得先说明,我不是玩电台的人。
LoRa 社区里似乎有很多人是无线电爱好者,有玩业余电台或其他无线电广播的经验。
我是个懂技术的软件开发者,但对无线电通信一窍不通。如果我对无线电传输的理解有误,原因就在这里。
Heltec v3:体验 MeshCore 最便宜的入门之选
MeshCore 固件可以在几十种设备上运行,但官网特别推荐了其中三款。最便宜的是 Heltec v3,我买了两块,单价 27 美元。

27 美元的 Heltec v3 是我能找到的最便宜的兼容 MeshCore 的设备。
我通过 USB-C 接口把 Heltec v3 连到电脑上,然后用MeshCore 网页刷写工具刷入了最新固件。我选择设备为“Heltec v3”、模式为“Companion Bluetooth”、版本为“v1.9.0”。因为是全新安装,我勾选了“Erase device”。

接着,我用MeshCore 网页应用通过蓝牙把 Heltec 和手机配对。
在 MeshCore 网页应用里摸索
好,手机已经和 MeshCore 设备配对上了,然后呢?

应用在新用户引导方面几乎没有提供什么帮助。
我试着点开“Map”看看附近有没有其他 MeshCore 用户。

结果打开的是一张新西兰的地图。我住在美国,这有点出乎意料。就算在地图上到处翻找,也看不到任何 MeshCore 活动,完全不知道这地图是干什么用的。
这张新西兰地图提醒了我,不同国家使用的 LoRa 无线电频率不同,既然应用默认定位在新西兰,很可能广播频率也默认成了新西兰的标准。
我打开设置,看到“Radio Settings”几个输入框,本以为点开会有下拉菜单,结果却要我手动输入数字。随后我注意到一个不起眼的“Choose Preset”按钮,里面列出了由“suggested by the community”标注的不同国家的预设。我完全看不懂这些是什么意思,但哪轮得到我去质疑社区呢?于是我选了“USA/Canada (Recommended)”。
我还注意到设置里可以改设备名称,这倒挺有用:

看起来附近没有其他 MeshCore 用户,这也在意料之中。这也是我买第二块 Heltec 的原因。

我用一部旧手机和第二块 Heltec v3 重复了整个流程,但它们却互相看不到对方。最后才发现,是我忘了把第二台设备也配置成美国频段。这也再次让我觉得,MeshCore 应用本该更重视新用户的引导。
好了,它们终于能互相发现了!两台设备都可以在公共频道发消息了。

我的设备终于可以通过公共频道互相喊话了。
琢磨私信功能
如果用 MeshCore 和朋友聊天,我可不想把对话全广播到公共频道,于是该试试私信了。
我以为能在公共频道里点开某个联系人直接发私信,结果不行。点名字毫无反应。倒是有一个“Participants”视图,但里面唯一的选项是屏蔽,而不是发私信。

这设计有点奇怪。既然有人在公共频道发言了,为什么我就不能直接跟他私聊?
我最后才搞明白,得先“Advert”。里面有三个选项:“Zero Hop”“Flood Routed”和“To Clipboard”。我完全不知道它们是什么意思,不过“flood”听起来有点粗鲁,“Zero Hop”则显得优雅些,于是我选了“Zero Hop”。
太好了!设备 2 现在能看到设备 1 了。来用设备 2 跟设备 1 打个招呼吧。

哎呀,出什么问题了?难道设备 2 也得做一次“Advert”?
好吧,我照做了,瞧!私信终于通了。

这用户体验真让人沮丧。既然两端都得先通告,那为什么 MeshCore 还允许我在握手只完成一半时就发消息?
我猜“Advert”就是对外公布我设备的公钥,但我不明白为什么这非得是个要提前手动操作的步骤。为什么 MeshCore 不能在我发公共消息或尝试私信时自动帮我完成呢?
不管怎样,公共频道和私信我都能自言自语了。继续!
再入手几台 MeshCore 设备
Heltec v3 开发板用来试水 MeshCore 不错,但在真实场景里不太实用。它需要独立供电,还得配手机配对。我想用 USB-C 对 USB-C 线直接用手机给它供电,结果板子根本启动不了。在真正的紧急情况下,这样的故障点太多了。
MeshCore 官网还推荐了另外两款兼容设备,于是我都下单了:Seeed SenseCAP T-1000e(40 美元)和 Lilygo T-Deck+(100 美元)。

我买了 Seeed SenseCAP T-1000e(左)和 Lilygo T-Deck+(右)继续折腾 MeshCore。
测试 SenseCAP T-1000e
相比 Heltec v3,T-1000e 显然前进了一大步。它是一体机,自带电池和天线,感觉更简单、更可靠。而且轻巧得很,扔进背包里几乎感觉不到它的存在。

比起 Heltec v3 裸露的电路板,T-1000e 感觉更像一款面向用户的成品。
烦人的是,T-1000e 用的是专用 USB 线,我没法用手头普通的 USB 线给它充电或刷机:

Seeed T-1000e 充电和刷机都要用专用 USB 线。
给 Heltec 刷机时我用了网页刷写工具,这次我想直接从源码给 T-1000e 刷机:
git clone https://github.com/meshcore-dev/MeshCore.git
# Latest firmware version at the time I tested.
FIRMWARE_VERSION='companion-v1.9.0'
git checkout $FIRMWARE_VERSION
我用 Nix,仓库里正好有个 default.nix,用 direnv 就自动装好了依赖。然后我用下面的命令给 T-1000e 刷入固件:
# Specify the device settings, from variants/t1000-e/platformio.ini.
DEVICE_SETTINGS='t1000e_companion_radio_ble'
pio run \
--environment $DEVICE_SETTINGS \
--target upload \
--upload-port /dev/ttyACM0
接下来,我把 T-1000e 和手机配对,用起来跟 Heltec 基本一样。唯一的区别是 T-1000e 没有屏幕,所以蓝牙配对密码默认就是 123456。这岂不是意味着任何在蓝牙范围内的人都能轻易劫持我的 T-1000e、偷看我所有的消息?
而且这玩意儿似乎没法关机,对于一个会对外广播的设备来说这可不太好。厂商给用户的建议竟然是:拔掉线放几天,等电池耗光就行。
更新:MeshCore 贡献者 Frieder Schrempf 刚刚在提交 07e7e2d 中修复了这个问题,该提交已包含在 v.1.11.0 版 MeshCore 固件中。现在长按 T-1000e 顶部的按钮就能关机了。
测试 Lilygo T-Deck
接下来该测试 Lilygo T-Deck 了。
这是我从一开始就最期待的 MeshCore 部分。
如果给不懂技术的朋友一台 T-1000e 这样的设备,紧急情况下太多环节可能出岔子。“哎,你没装 MeshCore 应用?哎,你手机配对不上?哎,你手机没电了?”
T-Deck 看起来就像 2000 年代的黑莓手机。因为是一体机,不用配对手机、不用下载应用,用起来似乎极其简单。我本想多买几台分给朋友。就算社会崩溃、城市陷入混乱,我们还能像 2005 年那样,用这些末日黑客黑莓互相聊天。
这可不是黑莓
刚一开机,我的黑莓美梦就碎了。这根本不是什么黑莓。

提醒一下,这才是 2003 年的黑莓长这样:

2003 年的黑莓智能手机
还没说到 T-Deck 的软件体验,光是硬件就又大又笨重。22 年前就能做出来的硬件水准,如今反而做不到了?

一上手,T-Deck 就让人头疼。你得靠按压设备中央那个单薄的小滚轮来操作界面,但它极不灵敏,一半的滚动操作都被它无视了。
好消息是,它有触摸屏。但触摸屏也会漏掉一半的点击:
要“点击”界面元素有三种方式:按轨迹球、按“Enter”键、或者点屏幕。某个控件到底认哪一种?你只能三种都试一遍才知道!
题外话:如何让 Lilygo T-Deck+ 进入 DFU 刷机模式
我连怎么给 T-Deck+ 重新刷机的说明都好不容易才找到。找到一个很长的 Jeff Geerling 视频,他在里面抱怨找刷机教程花了多久……结果他自己也没讲到底是怎么刷的!
对我有效的方法是:
- 断开 T-Deck 的 USB-C 连接。
- 关闭 T-Deck 电源。
- 通过 USB-C 接口把 T-Deck 连到电脑。
- 按住中央的滚轮。
- 开机。
让人困惑的是,设备没有任何进入 DFU 模式的提示。或许屏幕不亮就算是一种提示吧。在我的系统上,还能通过 dmesg 日志看到已连接。
用 T-Deck 发消息
搞明白怎么操作 T-Deck 后,我试着发消息,体验依然让人摸不着头脑。比如,猜猜我现在在这个界面是什么:

这个界面是干什么的?
如果你猜这是“在公共频道聊天”,那你比我会猜多了,因为在我看来这界面什么都不像。就算显示了聊天消息,也只是勉强像个聊天界面:

哦,原来这是个聊天界面。
我还遇到了很多其他让人困惑的交互细节,但一一细说太繁琐了。
对我而言,可悲的结论是,这不是一台能在紧急情况下托付的设备。交互里有太多坑和死胡同,足以让人栽跟头、没法跟我取得联系。
实地测试 MeshCore
虽然 T-Deck 让我大失所望,但我仍希望换个设备继续用 MeshCore。
我需要看看这些设备在真实世界里的表现,而不是在桌上相隔几厘米时的情况。
T-1000e 到 Heltec,1 英里距离
首先,我把 T-1000e 带到约一英里外的一个朋友家,尝试给放在家里书房的 Heltec 发消息。传输失败了,两台设备在那个距离上似乎完全看不到对方。
好吧,倒也情有可原。我住在郊区住宅区,我家和朋友家之间隔着许多房子、树木和汽车。
T-1000e 到 Heltec,相隔几个街区
下一次我坐车离家时,随身带上了 T-1000e,尝试给办公室里的 Heltec v3 发消息。
离家一个街区:消息发送成功。
三个街区外:依然正常。
五个街区外:失败。
之后直到当天晚些时候回到家,我都没能再连上家里的设备。
T-Deck 到 T-1000e,相隔几个街区
也许问题出在 Heltec 上?我一直把 Heltec 留在家里,但我看到有人说 Heltec v3 的天线特别弱。
我又试了一次,这次把 T-1000e 留在家里,带上 T-Deck 出门。
在大约五个街区外,我还能成功给家里的 T-1000e 发消息,但再远就不行了。
我需要中继器吗?
MeshCore 生态里还有一部分我没提到,那就是中继器。

SenseCAP Solar P1-Pro,一款太阳能供电的 MeshCore 中继器
MeshCore 中继器就像 WiFi 放大器。它们接收 MeshCore 消息并重新广播,从而扩大覆盖范围。
正是中继器构成了 MeshCore 中的“mesh(网状)”。中继器之间互相转发,把你的消息传得更远。
市面上有一些技术上很酷的中继器。它们靠太阳能供电、内置电池,可以独立运行,没太阳也能撑好几天。
问题在于,我不知道中继器到底能带来多大改善。带强力天线的中继器确实能把消息广播得很远,但这能解决我的问题吗?如果我的 T-Deck 在六个街区外都发不到 T-1000e,又怎么能发到中继器呢?
到这时,我对 MeshCore 的热情已经消退了不少,在不清楚能带来多大提升的情况下,我不想再花 100 美元往房子上装一个广播设备。
查看 MeshCore 源码
MeshCore 的固件是开源的,所以我去看了看源码,想看看能不能改善一下 T-Deck 的用户体验。
看源码时的第一个意外是,居然没有任何自动化测试。我写了些简单的单元测试,但 MeshCore 团队至今无人回应,已经过去快两个月了。
粗略翻了一下,代码库感觉有点乱,但还没到离谱的程度。它是用 C++ 写的,大多数类的对外接口都很大,有 20 多个非私有函数和字段,不过这在很多嵌入式项目里也常见。
另一个代码异味是,我的单元测试调用了 toHex 函数,它负责把原始字节编码成十六进制字符串。
// Create a test input.
uint8_t input[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
char output[HEX_BUFFER_SIZE(input)];
// Call the function we're testing.
Utils::toHex(output, input, sizeof(input));
// Verify that toHex encoded our bytes correctly.
EXPECT_STREQ("0123456789ABCDEF", output);
MeshCore 的 toHex 实现却依赖了两个加密库的头文件,尽管这个函数跟加密毫无关系。如果他们为每个组件都写单元测试,本可以避免这种不必要的耦合。
我另一个有点吹毛求疵的抱怨是,代码没有统一的风格规范。有人提议启用仓库里已有的 .clang-format 文件,但维护者直接关闭了这个 issue,并留言说:“Just make sure your own IDE isn’t making unnecessary changes when you do a commit.”
为什么?都 2025 年了,为什么我还得去操心大括号该放哪儿才能符合本地风格?直接配个格式化工具,让我就不用再为这些琐碎的风格问题费心了。
等等,MeshCore 不是开源的?
我最初深挖 MeshCore 源码是想搞懂 T-Deck 的界面,但根本找不到相关代码。MeshCore 安卓应用和网页应用的源码也同样找不到。
然后我才意识到:这些全是闭源的。所有官方的 MeshCore 客户端实现都是闭源且专有的。

阅读MeshCore FAQ 后,我才意识到关键组件是闭源的。
什么!?他们不是宣传这是开源的吗!怎么能这样骗我?
然后我回到 MeshCore 官网才发现,他们从头到尾就没提过“开源”二字。

看来所谓他们宣传 MeshCore 是开源的那部分,是我自己臆想出来的。
这东西看起来就该是开源的,所以我理所当然地以为它是。但发现关键部分竟然是专有软件时,我感到非常失望。
没有开源客户端,MeshCore 对我来说就行不通。
更新(2026-01-13):现在已有一个非官方的开源客户端。
我不是开源原教旨主义者,也认为软件闭源没什么问题,但离网通信的核心就在于去中心化和技术自由,所以我无法接受一个闭源方案。
MeshCore 生态中的确有一部分是开源且采用宽松许可的,但关键的 T-Deck 固件、网页应用和移动应用全都是闭源专有的。我刷到 Heltec v3 和 T-1000e 上的固件是开源的,但我用来操作电台的手机和安卓应用(客户端)却是闭源专有的。就我所见,除了开发用的 CLI之外,没有任何开源的 MeshCore 客户端。
| 产品 | 是否开源? | 是否免费使用? |
|---|---|---|
| MeshCore radio firmware | 是 | 是 |
| MeshCore protocol | 是 | 是 |
| Web-based MeshCore firmware flasher | 是 | 是 |
| Official Android / iOS MeshCore apps | 否 | 是,但部分功能需付费 |
| Official MeshCore web app | 否 | 是,但部分功能需付费 |
| T-Deck MeshCore firmware | 否 | 是,但部分功能需付费 |
总结
最后的想法
我依然喜欢 MeshCore 的理念,但在紧急情况下用它来通信,目前还不实用。软件太难用,而且我始终无法把消息发到五个街区(约 0.3 英里)以外。
我愿意以后再回来看 MeshCore,但在那之前,我在等开源客户端和可用性的改进。
我喜欢 MeshCore 的地方
- 不依赖大公司的基础设施就能发文本消息,这本身就酷极了。
- 这个概念正中我喜欢做灾难准备的那部分大脑的下怀。
- MeshCore 能在各种廉价设备上运行,其中很多也兼容 Meshtastic。
- 它背后有一个活跃而热情的社区。
我不喜欢 MeshCore 的地方
随机一篇博客







评论
登录后参与讨论