Skip to main content

解碼 Meshtastic QR Code

Author
Kuan-Yi Li

上次碰 Meshtastic 是好幾年前的事了,最近跟朋友聊天提到,回來看看。

Matter 有 CHIP Tool 可以直接 parse setup payload;Meshtastic 不想弄 node 或裝 App,要怎麼看社群裡頻道的設定呢?

通常頻道設定會用 QR Code 分享,像這邊

裡面有個

Meshtastic QR Code for DEFCON 32

帶著網址

https://meshtastic.org/e/#CjISIDhLvMAdwCLRgb82uGEh4fuWty5Vv3Qifp1q-0jWTLGhGgpERUZDT05uZWN0OgIIDRIRCAEQBjgBQANIAVAeaAHABgE

爬了一下 code,payload 是把 Protocol Buffers 的 binary message 用 URL safe 的 Base64 裝起來。

知道了這點之後我們就可以用 CyberChef 簡單做到 QR Code to Protobuf Text

右上角直接塞 QR Code 圖檔就可以解碼。用 🚫 關掉解 QR Code 的部份改成貼網址也可以。

如果輸出要更人性化一點,Meshtastic 官方有提供 Protobuf schema。拉回來之後,用 🚫 關掉解 Protobuf 的部份,另外用 protoc 解碼。

protoc --decode=meshtastic.ChannelSet meshtastic/apponly.proto

就可以得到可讀性較高的輸出:

settings {
  psk: "8K\274\300\035\300\"\321\201\2776\270a!\341\373\226\267.U\277t\"~\235j\373H\326L\261\241"
  name: "DEFCONnect"
  module_settings {
    position_precision: 13
  }
}
lora_config {
  use_preset: true
  modem_preset: SHORT_FAST
  region: US
  hop_limit: 3
  tx_enabled: true
  tx_power: 30
  sx126x_rx_boosted_gain: true
  ignore_mqtt: true
}

備註:實測在 CyberChef 裡貼入 Protobuf schema 也可以做到,但要剪貼的檔案內容太多太麻煩。

雜談
#

跟過去不同的地方
#

2022 的時候 Meshtastic 有根據中華民國無線電頻率分配表更新了台灣的頻段,現在整個開放頻段都可用了。

加解密
#

  • Algorithm: AES
  • Mode: CTR
  • Key: PSK
  • IV: 16 bytes as shown below
4 bytes (nonce)4 bytes (nonce)4 bytes (nonce)4 bytes (counter)
packet id (little endian)0x00000000from node id (little endian)0x00000000

AQ== 對應到 default key:1PG7OiApB1nwvP+rz05pAQ==

用 LoRaWAN Gateway 硬體聽多個頻率相異的頻道?
#

假如我們手上有一堆 QR Code,我們就可以知道各個團體所用的 PSK、頻率、頻寬等資訊。那我們有沒有辦法用可以同時解調 8 channels,多種 SF 的 LoRaWAN gateway 硬體(SX13xx)來大量收 Meshtastic 封包呢?

答案是 SX13xx 並沒有顯著優勢。

我們可以拿 chip block diagram 來看:

Chip Block Diagram

從圖中可以發現,SX13xx 多工最強的 8 個 channels(IF0-IF7)只能處理頻寬 125 kHz 的 LoRa 訊號,頻寬 250 kHz 或 500 kHz 的 LoRa 訊號只能交由 IF8 處理。IF8 同一時間又只能選擇單一 SF 解調,基本上跟 end-node IC 沒什麼兩樣。

Meshtastic 的 presets 中多數頻寬都不是 125 kHz 的,拿 gateway IC 來用就浪費了。

看來要做這樣的事還是得用 SDR。

MQTT Server Address and Location
#

如果期待 MQTT 中繼在緊急時刻也可以通,怎麼提高可用性可能要思考一下。

若國際連線發生障礙,台灣的使用者

  • 不是 .tw 的 address 可以解析嗎?
  • 連得到不在台灣的 server 嗎?