我對 MeshCore 離線傳訊的第一印象
當我老婆看到我在把玩新買的加密無線電時,她問我這是做什麼用的。
「想像一下,」我說,「如果我能在手機上打一則訊息傳給你,訊息就會立刻出現在你的手機上!」
她不為所動。
「而且就算因為停電……或是社會崩潰導致電話線路中斷,也還是能用喔。」還是一點反應都沒有。

「如果我們不在彼此的無線電收發範圍內,也能透過鄰居們的無線電所組成的 mesh network(網狀網路)來轉送訊息。而且別擔心!無線電會對我們的訊息做端對端加密,所以沒有人能偷看我們在說什麼。」話還沒說完,她已經離開房間了。
我老婆有很多值得稱道的優點,但老實說,「對加密離線傳訊的熱情」從來就不在其中。
我當時向老婆推銷的技術,當然就是 MeshCore。

tl;dr —— 我的感想是什麼?
如果你想直接看結論,請查看摘要。
什麼是 MeshCore?
MeshCore 是運行在價格低廉的長距離(LoRa)無線電上的軟體。LoRa 無線電的傳輸距離可達數英里,視路徑是否暢通而定。與業餘無線電不同,在美國透過 LoRa 頻率廣播不需要執照,所以任何人只要拿起一台 LoRa 無線電就能開始聊天。
MeshCore 不只是透過無線電傳送訊息。名稱中的「mesh」是因為 MeshCore 使用者會組成一個 mesh network。舉例來說,如果 Alice 想傳訊息給朋友 Charlie,但 Charlie 超出了她無線電的收發範圍,她可以透過在同一區域的另一位 MeshCore 使用者 Bob 來轉送訊息,再由 Bob 將訊息轉發給 Charlie。

如果 Alice 在 Bob 的無線電範圍內,但不在 Charlie 的範圍內,她可以讓 Bob 的 MeshCore 無線電幫她把訊息轉發給 Charlie。
我對離線通訊的夢想
我並不算是末日生存狂,但我確實會為一些現實的災難情境做準備,例如長時間停電、糧食短缺和乾旱。
當我聽說 MeshCore 時,我覺得如果能給附近的朋友一些裝置,以便在緊急情況下互相聯繫,會很不錯。如果後來發現我們彼此超出了無線電的收發範圍,或許還可以說服幾位鄰居也加入。我們就能組成一個能抵禦停電和電話斷訊的傳訊網路。
為什麼不用 Meshtastic?
MeshCore 是一個較新的實作,其概念是由一項名為Meshtastic 的技術所普及的。
我第一次聽說 Meshtastic 是透過Tyler Cipriani(泰勒·奇普里亞尼)2022 年的部落格文章。我當時覺得這個點子聽起來很酷,但奇普里亞尼的結論是,當時 Meshtastic 還有太多錯誤且難以讓一般大眾採用。
我對 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 web flasher 來刷入最新韌體。我選擇「Heltec v3」作為裝置、「Companion Bluetooth」作為模式、「v1.9.0」作為版本。因為是全新安裝,我點選了「Erase device」。

接著,我使用MeshCore web app 透過藍牙將 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 網站還推薦了另外兩款相容裝置,所以我也一起訂了: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 並讀取我所有的訊息?
而且 T-1000e 似乎無法關機,這對一個廣播裝置來說並不理想。製造商建議使用者直接放著不充電好幾天,直到電池耗盡為止。
更新:MeshCore 貢獻者 Frieder Schrempf(弗里德·施倫普夫) 剛在 commit 07e7e2d 中修復了這個問題,此修正在 v1.11.0 版 MeshCore 韌體中已包含。現在只要長按 T-1000e 頂部的按鈕就能關機了。
測試 Lilygo T-Deck
接下來輪到測試 Lilygo T-Deck 了。
這是我從一開始就對 MeshCore 最期待的部分。
如果我把像 T-1000e 這樣的裝置交給不懂技術的朋友,在真正的緊急情況下會有太多可能出錯的地方。「喔,你沒裝 MeshCore 應用程式?喔,你跟手機配對遇到問題?喔,你手機沒電了?」
T-Deck 看起來就像 2000 年代的 Blackberry。它似乎非常簡單易用,因為它是一台一體成型的裝置:不需要與手機配對,也不需下載應用程式。我想多買幾台分給朋友們。如果社會崩潰、城市陷入混亂,我們還是能像在 2005 年那樣,用我們的末日駭客版 Blackberry 互相聊天。
這不是 Blackberry
一打開 T-Deck,我的美夢就破滅了。這根本就不是 Blackberry。

提醒一下,這才是 2003 年的 Blackberry 長這樣:

2003 年的 Blackberry 智慧型手機
先不談 T-Deck 的軟體體驗,光是硬體本身就又大又笨重。我們竟然無法重現 22 年前就已量產的硬體產品品質?

一開始,T-Deck 就很難用。你透過裝置中央一顆搖搖晃晃的拇指滾輪來操作介面,但它很不靈敏,有一半的捲動操作都會被忽略。
好消息是:它有觸控螢幕。但觸控螢幕也有一半的點擊沒反應:
要「點選」介面元素有三種方式。你可以點擊軌跡球、按下「Enter」鍵,或是輕觸螢幕。某個介面元素究竟需要哪一種操作?你只能三種都試試看才會知道!
附註:將 Lilygo T-Deck+ 進入 DFU mode 以便刷寫韌體
我連要怎麼重新刷寫 T-Deck+ 的說明都很难找到。我找到一部冗長的 Jeff Geerling(傑夫·吉爾林)影片,他在影片中抱怨花了很久才找到重新刷寫的說明……結果他完全沒解釋自己是怎麼做的!
對我有效的做法如下:
- 將 T-Deck 從 USB-C 拔除。
- 關閉 T-Deck 電源。
- 透過 USB-C 連接埠將 T-Deck 連接到電腦。
- 按住中央的拇指滾輪。
- 開啟裝置電源。
令人困惑的是,裝置進入 DFU mode 並沒有任何提示。我猜螢幕沒有載入就算是一種提示吧。在我的系統上,我也會在 dmesg 日誌中看到連線紀錄。
用 T-Deck 傳訊
搞懂怎麼操作 T-Deck 後,我試著傳訊息,體驗依然令人困惑。例如,猜猜看我現在是在哪個畫面:

這個畫面是做什麼用的?
如果你猜「在公開頻道聊天」,那你比我厲害多了,因為這個畫面對我來說根本看不出是什麼。即使它顯示了聊天訊息,也只勉強看得出來是個聊天介面:

喔,原來是聊天介面。
我還遇到很多其他令人困惑的 UX 案例,但要在這裡一一細數實在太冗長了。
對我來說,悲劇性的結論是,這不是一台我在緊急情況下會依賴的裝置。UX 中有太多陷阱和死路,會讓人卡關而無法與我聯繫。
實地測試 MeshCore
雖然 T-Deck 讓我心碎,但我仍希望能用另一種裝置來使用 MeshCore。
我需要看看這些裝置在真實世界中的表現,而不是在書桌上彼此相距幾英吋時的情況。
T-1000e 對 Heltec:一英里外的測試
首先,我把 T-1000e 帶到約一英里外朋友家,嘗試向留在家中辦公室的 Heltec 傳訊。傳輸失敗了,兩台裝置在這個距離下似乎完全看不到對方。
好吧,也算合理。我住在郊區住宅區,房子、樹木和車輛把我家和朋友家之間隔開了。
T-1000e 對 Heltec:相距幾個街區的測試
下一次我坐車離家時,帶上了 T-1000e,嘗試向辦公室裡的 Heltec v3 傳訊。
相距一個街區:訊息成功傳送。
相距三個街區:依然正常。
相距五個街區:失敗。
然後直到當天稍晚回到家之前,我都再也無法連上家中的裝置。
T-Deck 對 T-1000e:相距幾個街區的測試
也許問題出在 Heltec 上?我一直把 Heltec 留在家裡,但我也讀到 Heltec v3 的天線特別弱。
我又試了一次,這次把 T-1000e 留在家裡,帶著 T-Deck 出門。
我可以在大約五個街區外成功向 T-1000e 傳訊,但超過這個距離就都失敗了。
我需要 repeater(中繼器)嗎?
MeshCore 生態系中我還沒提到的另一部分就是 repeater。

SenseCAP Solar P1-Pro,一款太陽能供電的 MeshCore repeater
MeshCore repeater 就像 WiFi 訊號延伸器。它們會接收 MeshCore 訊息並重新廣播,以擴大傳輸範圍。
正是 repeater 創造了 MeshCore 中的「mesh」。repeater 會將訊息傳送給其他 repeater,並將你的 MeshCore 訊息帶到更遠的地方。
市面上有一些技術上很酷的 repeater。它們由太陽能供電並內建電池,因此可以獨立運作,即使幾天沒有日照也能撐下去。
問題是,我不知道 repeater 到底能帶來多少差別。配備強力天線的 repeater 確實能很好地廣播訊息,但這能解決我的問題嗎?如果我的 T-Deck 在六個街區外都無法傳訊給 T-1000e,它要怎麼連上 repeater 呢?
到了這個時候,我對 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 實作卻依賴兩個crypto 函式庫的標頭檔,即使這個函式與密碼學完全無關。這種不必要的耦合,正是 MeshCore 如果為每個元件撰寫單元測試就能避免的。
我另一個小小的抱怨是,程式碼沒有一致的風格規範。有人提議使用已經放在儲存庫中的 .clang-format 檔案,但維護者關閉了這個議題,並給出指引:「Just make sure your own IDE isn’t making unnecessary changes when you do a commit.」
為什麼?為什麼到了 2025 年,我還得去思考該把大括號放在哪裡才能符合當地的風格?只要設定好格式化工具,我就不用再為這種瑣碎的風格問題煩惱了。
等等,MeshCore 不是開源的?
我一開始深入研究 MeshCore 原始碼,是想了解 T-Deck 的使用者介面,但我完全找不到相關的程式碼。我也找不到 MeshCore Android 或網頁應用程式的原始碼。
然後我才意識到:這些全都是封閉原始碼。所有官方的 MeshCore 用戶端實作都是封閉原始碼且為專有軟體。

閱讀MeshCore FAQ 後,我才意識到關鍵元件是封閉原始碼。
什麼!?他們不是宣傳這是開源的嗎?他們怎麼能這樣騙我?
然後我回到 MeshCore 網站,才發現他們從來沒有在任何地方寫過「open-source」。

一定是我夢到他們把 MeshCore 宣傳為開源的那部分了。
它看起來就是個十足的開源專案,讓我理所當然地以為它是。但發現 MeshCore 的關鍵部分是專有軟體時,我感到非常失望。
沒有開源的用戶端,MeshCore 對我來說就不可行。
更新(2026-01-13):現在已有非官方的開源用戶端。
我並不是開源狂熱者,我認為軟體是專有軟體也無妨,但離線通訊的重點就在於去中心化和技術自由,所以我無法接受封閉原始碼的解決方案。
MeshCore 生態系中的某些部分確實是開源且採用寬鬆授權的,但關鍵在於,T-Deck 韌體、網頁應用程式和行動應用程式全都是封閉原始碼且為專有軟體。我刷入 Heltec v3 和 T-1000e 的韌體是開源的,但我用來操作這些無線電的行動應用程式和 Android 應用程式(用戶端)卻是封閉原始碼且為專有軟體。就我所見,除了開發用的 CLI 之外,沒有任何開源的 MeshCore 用戶端。
| 產品 | 是否開源? | 是否免費使用? |
|---|---|---|
| MeshCore 無線電韌體 | 是 | 是 |
| MeshCore 協定 | 是 | 是 |
| 網頁版 MeshCore 韌體刷寫工具 | 是 | 是 |
| 官方 Android / iOS MeshCore 應用程式 | 否 | 是,但部分功能需付費解鎖 |
| 官方 MeshCore 網頁應用程式 | 否 | 是,但部分功能需付費解鎖 |
| T-Deck MeshCore 韌體 | 否 | 是,但部分功能需付費解鎖 |
總結
最終感想
我依然喜歡 MeshCore 的理念,但它目前在緊急情況下通訊還不夠實用。軟體太難用了,而且我一直無法將訊息傳送到超過五個街區(約 0.3 英里)以外的地方。
我願意之後再回來嘗試 MeshCore,但我會先等待開源的用戶端和可用性的改善。
我喜歡 MeshCore 的地方
- 不用依賴大公司的基礎設施就能傳送文字訊息,這實在太酷了。
- 這個概念滿足了我喜歡為災難做準備的那部分腦袋。
- MeshCore 可在各種價格低廉的裝置上運行,其中許多也同時支援 Meshtastic。
- 圍繞著它有一個活躍且充滿熱情的社群。
我不喜歡 MeshCore 的地方
隨機一篇部落格






