我對 MeshCore 離線傳訊的第一印象
原文由 Michael Lynch 于 發布,訂閱此部落格
當我老婆看到我在把玩新買的加密無線電時,她問我這是做什麼用的。
「想像一下,」我說,「如果我能在手機上打一則訊息傳給你,訊息馬上就會出現在你的手機上。立刻就到!」
她不為所動。
「就算電話線路因為停電……或是社會崩潰而中斷,它還是能用喔。」她依然毫無反應。

「如果我們彼此不在無線電的通訊範圍內,還可以透過鄰居們的無線電組成的網狀網路來轉傳訊息。但別擔心!無線電會對我們的訊息做端對端加密,所以沒人能偷看我們在講什麼。」話還沒說完,她已經離開房間了。
我老婆有很多很棒的優點,但老實說,「對加密離線傳訊的熱情」從來都不是其中之一。
我當時向老婆極力推銷的技術,當然就是 MeshCore。

tl; dr —— 我的感想是什麼?
如果想直接看結論,請參考總結。
什麼是 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 這項技術所普及化的概念,用更新的方式重新實作。
我第一次聽到 Meshtastic 是在Tyler Cipriani 2022 年的部落格文章。我覺得概念聽起來很酷,但 Tyler 的結論是,當時的 Meshtastic 問題太多、也太難用,還不適合一般大眾。
我對 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 網頁 App透過藍牙把 Heltec 和我的手機配對。
在 MeshCore 網頁 App 裡摸索
好,我已經把手機和 MeshCore 裝置配對好了,但……接下來呢?

這個 App 在引導新手方面幾乎沒有提供什麼幫助。
我試著點選「Map」看看附近有沒有其他 MeshCore 使用者。

好吧,那是一張紐西蘭的地圖。我住在美國,所以有點意外。就算我到處瀏覽地圖,也完全看不到任何 MeshCore 的活動,根本不知道這張地圖是要做什麼的。
這張紐西蘭地圖提醒了我,不同國家使用的 LoRa 無線電頻率不同,如果 App 預設顯示紐西蘭的位置,很可能連廣播頻率也預設成了紐西蘭的頻段。
我進到設定,看到「Radio Settings」欄位,本來以為點下去會有下拉選單,結果它是要我輸入數字。接著我才注意到一個不太顯眼的「Choose Preset」按鈕,裡面列出了各種由「社群建議」的不同國家預設值。我完全不知道那些是什麼意思,但我哪有立場跟社群唱反調?我就選了「USA/Canada (Recommended)」。
我也注意到設定裡可以改裝置名稱,這似乎還蠻有用的:

看起來我附近沒有其他 MeshCore 使用者,這也在我預料之中。這就是我為什麼買了第二台 Heltec。

我用一支舊手機和第二台 Heltec v3 重複了同樣的流程,但它們就是看不到彼此。後來我才發現,我忘了把第二台裝置設定成美國的頻率。這也是為什麼我希望 MeshCore App 能更認真做好新手引導的另一個原因。
好了,它們終於看到彼此了!兩台裝置都可以在公開頻道上發訊息。

我的裝置終於可以在公開頻道上互相對話了。
摸索私訊功能
如果我要用 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 App?喔,你跟手機配對有問題?喔,你手機沒電了?」
T-Deck 看起來就像 2000 年代的 Blackberry。它似乎超級簡單好用,因為它是一體成形的裝置:不需要跟手機配對,也不用下載 App。我本來想多買幾台分給朋友。如果社會真的崩潰、城市陷入混亂,我們還是能用這些末日駭客 BlackBerry 像回到 2005 年那樣聊天。
這不是 Blackberry
一打開 T-Deck,我的美夢就破滅了。這根本就不是 Blackberry。

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

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:一英里距離測試
首先,我把 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 中「網狀」的關鍵。中繼器會把訊息傳給其他中繼器,把你的 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,並給出這樣的指示:「Just make sure your own IDE isn’t making unnecessary changes when you do a commit.」
為什麼?為什麼到了 2025 年,我還得去煩惱大括號要放在哪裡才能符合當地的風格?只要裝個格式化工具就好,讓我就不用再去想這些瑣碎的風格問題了。
等等,MeshCore 不是開源的嗎?
我本來是為了搞懂 T-Deck 的介面才開始挖 MeshCore 的原始碼,但我完全找不到相關的程式碼。我也找不到 MeshCore Android 版或網頁 App 的原始碼。
然後我才意識到:這些全都是閉源的。所有官方的 MeshCore 用戶端實作都是閉源、私有的。

讀了MeshCore FAQ 後,我才意識到關鍵的元件都是閉源的。
什麼!?他們不是宣傳這是開源的嗎!怎麼可以這樣騙我?
然後我回到 MeshCore 官網才發現,他們從頭到尾都沒提過「開源」兩個字。

肯定是我夢到他們宣傳 MeshCore 是開源的那段了。
它看起來就是很像開源的東西,所以我才理所當然地以為它就是。但發現 MeshCore 的關鍵部分竟然是私有的,讓我非常失望。
沒有開源的用戶端,MeshCore 對我來說就不可行。
更新(2026-01-13):現在已經有非官方的開源用戶端了。
我不是開源狂熱者,我也覺得軟體是私有的沒什麼問題,但離線通訊的重點就在於去中心化和技術自由,所以我無法接受閉源的解決方案。
MeshCore 生態系中的確有些部分是開源且採用寬鬆授權的,但關鍵的 T-Deck 韌體、網頁 App 和行動 App 全都是閉源、私有的。我刷到 Heltec v3 和 T-1000e 上的韌體是開源的,但我用來操作這些無線電的行動版和 Android App(用戶端)卻是閉源、私有的。就我所見,除了開發用的 CLI 之外,沒有任何開源的 MeshCore 用戶端。
| 產品 | 是否開源? | 是否免費使用? |
|---|---|---|
| MeshCore 無線電韌體 | 是 | 是 |
| MeshCore 協定 | 是 | 是 |
| 網頁版 MeshCore 韌體燒錄工具 | 是 | 是 |
| 官方 Android / iOS 版 MeshCore App | 否 | 是,但部分功能需付費 |
| 官方 MeshCore 網頁 App | 否 | 是,但部分功能需付費 |
| T-Deck MeshCore 韌體 | 否 | 是,但部分功能需付費 |
總結
最終感想
我還是很喜歡 MeshCore 的理念,但在緊急狀況下用它來通訊,目前還不太實際。軟體太難用了,而且我始終無法把訊息傳到超過五個街區(約 0.3 英里)以外。
我很樂意日後再回來試試 MeshCore,但我還在等開源用戶端和可用性的改善。
我喜歡 MeshCore 的地方
- 不依賴大公司的基礎設施就能傳文字訊息,真的超酷。
- 這個概念正中我喜歡做災難準備的那部分大腦。
- MeshCore 能在各種平價裝置上運作,其中很多也同時支援 Meshtastic。
- 它擁有一個活躍且熱情的社群。
我不喜歡 MeshCore 的地方
隨機一篇部落格







留言
登入後參與討論