My First Impressions of MeshCore Off-Grid Messaging

Michael Lynch

我对 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(杰夫·吉尔林)视频,他在视频中抱怨花了很长时间才找到重刷说明……然后他却从未解释自己是怎么做的!

对我有效的方法是:

  1. 断开 T-Deck 的 USB-C 连接。
  2. 关闭 T-Deck 电源。
  3. 通过 USB-C 端口将 T-Deck 连接到电脑。
  4. 按住中央的滚轮。
  5. 打开设备电源。

令人困惑的是,设备没有任何进入 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 客户端都是闭源和专有的。
  • 用户体验太脆弱,我无法在紧急情况下依赖它,尤其是当我试图与 MeshCore 新手交流时。
  • 大多数硬件都假定你会通过蓝牙将其与手机配对,这引入了更多的故障点和复杂性。
  • 唯一官方的独立设备是 T-Deck+,但我发现它令人困惑且用起来很沮丧。
  • 没有书面的入门指南。
    • 有一个 FAQ,但它只是杂乱无章的细节,缺乏条理。
    • 有一个不错的非官方入门视频,但我更喜欢文字文档。

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译