我对 MeshCore 离网消息传递的初体验
当妻子看到我在摆弄新买的加密电台时,她问我是用来做什么的。
“想象一下,”我说,“如果我能在手机上输入一条消息发给你,消息会立刻出现在你的手机上!”
她不为所动。
“就算因为停电……甚至社会崩溃导致电话线路中断,它也能用。”依然毫无反应。

“如果我们不在彼此的无线电覆盖范围内,我们可以通过邻居们的电台组成的网状网络来中转消息。别担心!电台会对我们的消息进行端到端加密,所以没人能偷看我们说了什么。”说到这儿,她已经离开了房间。
我的妻子有很多优点,但说实话,“对加密离网消息传递的热情”从来都不是其中之一。
当然,我向妻子极力推销的技术就是 MeshCore。

太长不看——我的看法是什么?
如果你想直接看结论,请查看总结。
什么是 MeshCore?
MeshCore 是运行在廉价远距离(LoRa)电台上的软件。根据路径是否畅通,LoRa 电台的传输距离可达数英里。与业余无线电不同,在美国你无需执照即可在 LoRa 频段上广播,所以任何人都可以买一台 LoRa 电台开始聊天。
MeshCore 不仅仅是通过无线电发送消息。名字中的“mesh(网状)”是因为 MeshCore 用户会组成一个网状网络。如果爱丽丝想给朋友查理发消息,但查理超出了她电台的覆盖范围,她可以通过附近的另一位 MeshCore 用户鲍勃来中转消息,鲍勃会把消息转发给查理。

如果爱丽丝在鲍勃的无线电范围内,但不在查理的范围内,她可以让鲍勃的 MeshCore 电台把消息转发给查理。
我对离网通信的设想
我算不上是末日准备者,但我会为一些现实的灾难场景做准备,比如长时间停电、食物短缺和干旱。
当我听说 MeshCore 时,我觉得给附近的朋友们一些设备会很不错,这样我们在紧急情况下就能保持联系。如果发现我们彼此不在无线电范围内,也许我还可以说服几个邻居也加入进来。我们可以组建一个能抵御停电和电话中断的消息网络。
为什么不用 Meshtastic?
MeshCore 是一种名为 Meshtastic 的技术所普及的理念的更新实现。
我第一次听说 Meshtastic 是通过 Tyler Cipriani(泰勒·奇普里亚尼)2022 年的博文。我觉得这个想法听起来很酷,但泰勒·奇普里亚尼的结论是,当时的 Meshtastic 还存在太多 bug,难以被主流采用。
我对 MeshCore 或 Meshtastic 都没有特别的偏好,因为我两者都没试过。我在 Mastodon 上关注的一些人对 MeshCore 很兴奋,所以我想来试试。大多数兼容 MeshCore 的设备也兼容 Meshtastic,所以我可以先尝试一个,之后再试另一个。
我对 Meshtastic 和 MeshCore 之间的区别只有有限的了解,但据我所知,MeshCore 的关键区别在于节省带宽。显然,当许多用户彼此靠近时,Meshtastic 会遇到扩展性问题。Meshtastic 协议比 MeshCore 更“话痨”,所以我看到有人抱怨 Meshtastic 的闲聊信息挤占了无线电信道,干扰了消息传递。MeshCore 试图通过尽量减少网络闲聊来解决这个问题。
我不是玩无线电的人
在这一点上我得说明一下,我不是玩无线电的人。
LoRa 社区里的许多人似乎都是无线电爱好者,有使用业余无线电或其他类型无线电广播的经验。
我是一个懂技术的软件开发者,但对无线电通信一窍不通。如果我对无线电传输的理解有误,就是这个原因。
Heltec v3:体验 MeshCore 最便宜的入门方式
MeshCore 固件可以在几十种设备上运行,但官网特别推荐了三种设备。最便宜的是 Heltec v3。我买了两块,每块 27 美元。

Heltec v3 售价 27 美元,是我能找到的最便宜的兼容 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”按钮,里面列出了由“社区建议”的不同国家的预设。我完全不知道它们是什么意思,但既然是社区推荐的,我还有什么好质疑的呢?我选择了“USA/Canada (Recommended)”。
我还注意到设置里可以更改设备名称,这似乎很有用:

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

我用一部旧手机和第二块 Heltec v3 重复了这个过程,但它们彼此看不到对方。我最终才意识到,我忘了把第二台设备配置为美国频率。这也是我希望 MeshCore 应用能更重视初始引导的另一个原因。
好了,它们终于能看到对方了!它们都可以在公共频道上发布消息。

我的设备终于可以通过公共频道互相通话了。
摸索私信功能
如果我通过 MeshCore 和朋友交流,我不想把整个对话都广播到公共频道上,所以是时候测试一下私信了。
我本以为可以在公共频道中查看某个联系人并给他发私信,但我做不到。点击他们的名字没有任何反应。有一个“Participants”视图,但唯一的选项是屏蔽,而不是发送私信。

这似乎是个奇怪的设计选择。如果一个 MeshCore 用户在公共频道上发了言,为什么我不能和他私聊?
我最终发现我必须“Advert”。有三个选项:“Zero Hop”、“Flood Routed”和“To Clipboard”。我不知道它们是什么意思,但我觉得“flood”听起来有点粗鲁,而“Zero Hop”听起来很优雅,所以我选了“Zero Hop”。
太好了!设备 2 现在能看到设备 1 了。让我们从设备 2 向设备 1 打个招呼。

哎呀,出什么问题了?也许我也需要从设备 2 “Advert”一下?
好吧,我照做了,成功了!现在消息可以收发了。

这用户体验很让人沮丧。如果双方都必须 advert,为什么 MeshCore 会允许我在握手只完成一半的情况下发送消息?
我猜“Advert”是我在公布设备的公钥,但我不明白为什么这必须是一个需要提前手动完成的步骤。为什么 MeshCore 不能在我发布到公共频道或尝试给某人发私信时自动完成这一步呢?
总之,我可以在公共频道和私信中和自己对话了。继续前进!
订购更多 MeshCore 设备
Heltec v3 板子是体验 MeshCore 的好方法,但在真实场景中并不实用。它们需要独立的电源,还得配手机。我想用 USB-C 转 USB-C 的线直接用手机给它供电,但 Heltec 板子无法从我的手机上启动。在真正的紧急情况下,故障点太多了。
MeshCore 网站还推荐了另外两款兼容 MeshCore 的设备,所以我都订了:Seeed SenseCAP T-1000e(40 美元)和 Lilygo T-Deck+(100 美元)。

我买了 Seeed SenseCAP T-1000e(左)和 Lilygo T-Deck+(右)来继续测试 MeshCore。
测试 SenseCAP T-1000e
T-1000e 比 Heltec v3 有了明显改进。它是一体化的,自带电池和天线,感觉更简单、更可靠。它还很轻,扔进背包里都感觉不到它的存在。

与 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 中修复了这个问题,该修复已包含在 v1.11.0 版 MeshCore 固件中。现在你可以通过长按 T-1000e 顶部的按钮来关闭设备。
测试 Lilygo T-Deck
现在轮到测试 Lilygo T-Deck 了。
这部分是我从一开始就对 MeshCore 最期待的。
如果我把像 T-1000e 这样的设备交给不懂技术的朋友,在真正的紧急情况下会有太多可能出错的地方。“哦,你没装 MeshCore 应用?哦,你的手机配对遇到问题了?哦,你手机没电了?”
T-Deck 看起来像一部 2000 年代的 Blackberry。它似乎非常简单易用,因为它是一体机:无需与手机配对或下载应用。我想多买几台,分发给朋友们。如果社会崩溃、城市陷入混乱,我们仍然可以在末日黑客 Blackberry 上聊天,就像回到了 2005 年。
这不是 Blackberry
一打开 T-Deck,我的美梦就破灭了。这根本不是 Blackberry。

提醒一下,这才是 2003 年的 Blackberry 的样子:

2003 年的 Blackberry 智能手机
还没说到 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 后,我尝试发消息,体验依然令人困惑。例如,猜猜我现在在哪个界面:

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

哦,原来是个聊天界面。
我还遇到了很多其他令人困惑的 UX 问题,但在这里一一赘述太繁琐了。
对我而言,可悲的结论是,这不是一款我在紧急情况下可以依赖的设备。UX 中有太多陷阱和死胡同,会让人绊倒,导致无法与我取得联系。
在实地测试 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”的部分。中继器会将消息发送给其他中继器,从而让你的 MeshCore 消息传输得更远。
有一些技术上很酷的中继器。它们由太阳能供电,内置电池,因此可以独立运行,在没有阳光的情况下也能坚持几天。
问题在于,我不知道中继器能带来多大的改善。一个天线很强的中继器可以很好地广播消息,但这能解决我的问题吗?如果我的 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,并给出了这样的指导:“只要确保你自己的 IDE 在提交时没有做不必要的修改就行。”
为什么?为什么在 2025 年我还得去思考该把花括号放在哪里才能符合本地风格?直接配置一个格式化工具,让我不用再为这些琐碎的风格问题操心不好吗。
等等,MeshCore 不是开源的吗?
我最初深入研究 MeshCore 源码是为了理解 T-Deck 的界面,但我找不到任何相关代码。我也找不到 MeshCore 安卓或网页应用的源码。
然后我才意识到:它们全都是闭源的。所有官方的 MeshCore 客户端实现都是闭源和专有的。

阅读 MeshCore FAQ 后,我才意识到关键组件是闭源的。
什么!?!他们一直宣传这是开源的!他们怎么能骗我?
然后我回到 MeshCore 网站,发现他们从未在任何地方说过“开源”。

一定是我幻想了他们宣传 MeshCore 是开源的那部分。
它就像是一个开源项目,以至于我以为它就是。但当我发现 MeshCore 的关键部分是专有的时,我感到非常失望。
没有开源客户端,MeshCore 对我来说就行不通。
更新(2026-01-13):现在已经有了一个非官方的开源客户端。
我不是开源原教旨主义者,我认为软件是专有的是可以的,但离网通信的全部意义就在于去中心化和技术自由,所以我无法接受一个闭源的解决方案。
MeshCore 生态系统的某些部分确实是开源的,并且采用了宽松的许可,但关键在于 T-Deck 固件、网页应用和移动应用全都是闭源和专有的。我刷到 Heltec v3 和 T-1000e 上的固件是开源的,但我用来使用这些电台的移动和安卓应用(客户端)是闭源和专有的。据我所知,除了开发用 CLI之外,没有任何开源的 MeshCore 客户端。
| 产品 | 是否开源? | 是否免费使用? |
|---|---|---|
| MeshCore 电台固件 | 是 | 是 |
| MeshCore 协议 | 是 | 是 |
| 基于网页的 MeshCore 固件刷机工具 | 是 | 是 |
| 官方 Android / iOS MeshCore 应用 | 否 | 是,但部分功能需付费 |
| 官方 MeshCore 网页应用 | 否 | 是,但部分功能需付费 |
| T-Deck MeshCore 固件 | 否 | 是,但部分功能需付费 |
总结
最后的想法
我依然热爱 MeshCore 的理念,但在紧急情况下它还不具备实用性。软件太难用了,而且我一直无法将消息发送到五个街区(约 0.3 英里)以外。
我愿意重新考虑 MeshCore,但我在等待开源客户端和可用性的改进。
我喜欢 MeshCore 的地方
- 无需依赖大公司的基础设施就能发送短信,这非常酷。
- 这个概念满足了我大脑中喜欢灾难准备的那部分。
- MeshCore 可以在各种低成本设备上运行,其中许多设备也适用于 Meshtastic。
- 围绕它有一个活跃、热情的社区。
我不喜欢 MeshCore 的地方
- 所有官方 MeshCore 客户端都是闭源和专有的。
- 更新(2026-01-13):现在已经有了一个非官方的开源客户端
- 用户体验太脆弱,我无法在紧急情况下依赖它,尤其是当我试图与 MeshCore 新手交流时。
- 大多数硬件都假定你会通过蓝牙将其与手机配对,这引入了更多的故障点和复杂性。
- 唯一官方的独立设备是 T-Deck+,但我发现它令人困惑且用起来很沮丧。
- 没有书面的入门指南。
随机一篇博客






