---
# System prepended metadata

title: 在Linux Mint 22運行Meshtastic cli
tags: [網狀網路, Meshtastic, Mint 22.2, LoRa, Mint, Linux, Chinnamon]

---

# 🐧用Linux Mint 22.2 運行 Meshtastic cli
![meshcli](https://hackmd.io/_uploads/ryznXzYkWe.png)

之前的裝置零件都用得差不多了，最近在等待零件的空窗期，又剛好踢到一台筆電，拿來灌Linux系統，然後就研究了一下Meshtastic裝置，要如何在Linux的系統環境進行設定，所以這並不是讓筆電變成Meshtastic裝置的東西喔！

只是剛好閒來無事，研究玩玩看而已，順便紀錄一下以免日後忘記wwww

以下命令皆透過Linux終端機運行，Windows與Linux命令不同，所以Windows用戶可以略過本篇。

>[!note]
>目前我只有先用USB連接裝置，還沒試過藍芽連線，所以下面操作以USB連接裝置為主。

---

先介紹一下我踢到的💻環境 ~~(踢到的配備沒有很好www)~~
![Linux環境](https://hackmd.io/_uploads/H1ThS-KJZg.png)

## 🔌cp210x驅動
我查過Linux mint 22.2已經預設安裝cp210x驅動，所以現在要先確認是否有安裝成功，並且可以正常偵測到裝置。
``` zsh
dmesg | grep cp210x
```
正常會出現以下訊息
``` zsh
[ 6938.141684] usbcore: registered new interface driver cp210x

[ 6938.141708] usbserial: USB Serial support registered for cp210x

[ 6938.141733] cp210x 1-2:1.0: cp210x converter detected

[ 6938.143150] usb 1-2: cp210x converter now attached to ttyUSB0
```

>[!note] 訊息內容說明
[ 6938.141684] usbcore: registered new interface driver cp210x：Linux 核心已註冊CP210x驅動程式。
[ 6938.141733] cp210x 1-2:1.0: cp210x converter detected：您的CP210x裝置已成功被偵測到。
[ 6938.143150] usb 1-2: cp210x converter now attached to ttyUSB0：系統已為您的裝置建立了一個虛擬序列埠介面，名稱為 **/dev/ttyUSB0** 。(這邊要記一下PORT，待會會用到)

出現以上訊息就表示已經有安裝好CP210x驅動了，並且訊息中也告訴你PORT是/dev/ttyUSB0。

## 🚢確認Meshtastic PORT閘道
雖然在上面的訊息當中有告訴你是用哪一個PORT，但以防萬一沒有出現，或是想要單獨查詢，或是你有很多裝置同時插電腦就可以按照我這步驟做查詢。

1. Meshtastic裝置**先不要接上電腦**，開啟終端機輸入以下命令
``` zsh
ls /dev/tty*
```

2. 再將Meshtastic裝置透過USB接上電腦，再輸入一次命令
``` zsh
ls /dev/tty*
```

前後比對就可以知道Meshtastic PORT閘道的名字是哪一個
![ls-2](https://hackmd.io/_uploads/SJJxKfKJZx.png)


## 📟透過虛擬環境運行Meshtastic
因為我是使用Mint 22.2，根據PEP 668規範的實施，防止使用者使用pip在系統級別安裝、升級或移除套件，從而破壞作業系統或依賴於特定Python版本/套件組合的應用程式，所以我透過source建立虛擬環境來運行Meshtastic。

如果是非debian、ubuntu、mint…等，沒有鎖pip就可以直接按照Meshtastic官方的教學操作。

1. 設定使用者權限，然後登出再登入或重開機
``` zsh
sudo usermod -a -G dialout $USER
#或者
sudo usermod -a -G uucp $USER
```

>[!note] groups查詢權限設定
>登出後重新登入，或重開機之後，再確認權限是否設定成功，輸入`groups`就應該會有dialout或uucp

2. 先確認已經安裝python
```  zsh
sudo apt update
sudo apt install python3-full
 ```
 
3.  要建立虛擬環境，`meshtastic_cli`可以改成你喜歡的名字，如果這邊有改，下面第四步驟也要跟著改。

``` zsh
python3 -m venv ~/meshtastic_cli
```

4. 運行虛擬環境
輸入以下命令，就會看到終端機進入meshtastic_cli的環境
``` zsh
source ~/meshtastic_cli/bin/activate
```

5. 在虛擬環境中透過pip安裝Meshtastic
```zsh
pip install meshtastic
```

6. 運行Meshtastic
```zsh
meshtastic --port /dev/ttyUSB0
```
如果有出現下列訊息就表示有成功連接，就可以開始你的Meshtastic裝置設定。
```zsh
Connected to radio
```
7. 測試

節點查詢 `meshtastic --node`
![node節點查詢](https://hackmd.io/_uploads/rJ4p9-tkWe.png)

發送訊息測試`meshtastic --sendtext "Linux cli發送訊息測試" --ch-index 2`
![發送訊息測試](https://hackmd.io/_uploads/rkzeo-F1be.jpg)


8. 一些常用命令

```zsh
source ~/meshtastic_cli/bin/activate　#進入環境
```
```bash
meshtastic --info #查詢裝置資訊
meshtastic --node #查詢節點
meshtastic --port "PORT" --sendtext "訊息內容" #指定PORT裝置發送訊息(連多個裝置可用)
meshtastic --sendtext "訊息內容" #發送訊息，沒有指定頻道就是公頻
meshtastic --sendtext "訊息內容" --ch-index 1 #指定頻道1發送訊息(--info可以查頻道代號是多少)
meshtastic -listen #監聽訊息
meshtastic –reboot #裝置重開機
meshtastic –enter-dfu #nrf52進入DFU模式
meshtastic -h #查看使用說明
deactivate　#退出虛擬環境
```

9. 簡化指令（可選）
如果嫌每次要進虛擬環境都要打一長串命令，我們可以用`alies`來簡化命令 ~~(這個指令有玩過CS應該都不陌生XD)~~

先看你的Shell是zsh還是bash，可以輸入以下命令查詢。
``` zsh
echo $SHELL
```
再來看你是使用nano還是vim，如果沒有先安裝其中一個`sudo apt install vim`或`sudo apt install vim`，再透過vim或nano打開你的Shell檔案（zshrc或bashrc）
```zsh
nano ~/.zshrc #or nano ~/.bashrc
#or
vim ~/.zshrc #or vim ~/.bashrc
```
這時候你會開啟檔案，按page down(Pgdn)鍵到最下面，在最後加入以下文字
``` zsh
# 啟用 Meshtastic CLI 環境
alias mesh-on='source ~/meshtastic_cli/bin/activate'
# 停用虛擬環境
alias mesh-off='deactivate'
```
如果是用nano，存檔按Ctrl + X → 按 Y → Enter
如果是用vim，存檔Esc → 輸入:wq → Enter
這時候就會退回到先前終端機的畫面，但是修改完檔案後不會立即生效，需要執行命令來重新載入設定，或是關掉再重開終端機也可以。
```zsh
source ~/.zshrc #or ~/.bashrc
```


這樣日後只要在終端機輸入`mesh-on`就可以進入Meshtastic CLI虛擬環境，`mesh-off`就可以退出虛擬環境，也可以改成你覺得好記的命令。


# </>Meshtastic 命令大全

不負責任翻譯`meshtastic -h`所提供的內容，如果有誤還請留言給我，感謝。

用法: meshtastic [-h | --version | --support] [--port [PORT] | --host [HOST] | --ble [BLE]]
                  [--ble-scan] [--dest !xxxxxxxx] [--ch-index 索引] [--configure 配置檔案]
                  [--export-config [檔案]] [--get 欄位] [--set 欄位　值] [--begin-edit]
                  [--commit-edit] [--get-canned-message]
                  [--set-canned-message 設定罐頭訊息] [--get-ringtone]
                  [--set-ringtone 鈴聲] [--ch-vlongslow] [--ch-longslow] [--ch-longfast]
                  [--ch-medslow] [--ch-medfast] [--ch-shortslow] [--ch-shortfast]
                  [--set-owner 設定擁有者] [--set-owner-short 設定擁有者短名] [--set-ham 設定業餘無線電ID]
                  [--set-is-unmessageable 設定不可傳訊] [--ch-set-url 網址]
                  [--ch-add-url 網址] [--setalt 設定海拔] [--setlat 設定緯度] [--setlon 設定經度]
                  [--remove-position] [--pos-fields [位置欄位 ...]] [--ch-add 新增頻道]
                  [--ch-del] [--ch-set 欄位 值] [--channel-fetch-attempts 嘗試次數] [--qr]
                  [--qr-all] [--ch-enable] [--ch-disable] [--info] [--nodes]
                  [--show-fields 顯示欄位] [--sendtext 文字] [--private]
                  [--traceroute !xxxxxxxx] [--request-telemetry [類型]] [--request-position]
                  [--reply]
                  [--reboot | --reboot-ota | --enter-dfu | --shutdown | --device-metadata | --factory-reset | --factory-reset-device | --remove-node !xxxxxxxx | --set-favorite-node !xxxxxxxx | --remove-favorite-node !xxxxxxxx | --set-ignored-node !xxxxxxxx | --remove-ignored-node !xxxxxxxx | --reset-nodedb | --set-time [時間戳]]
                  [--seriallog [日誌目標]] [--ack] [--timeout 秒數] [--no-nodes]
                  [--debug] [--debuglib] [--test] [--wait-to-disconnect [秒數]] [--noproto]
                  [--listen] [--no-time]
                  [--power-riden 乘電源 | --power-ppk2-meter | --power-ppk2-supply | --power-sim]
                  [--power-voltage 電壓] [--power-stress] [--power-wait] [--slog [結構化日誌目標]]
                  [--gpio-wrb GPIO_WRB GPIO_WRB] [--gpio-rd 讀取GPIO] [--gpio-watch 監測GPIO]
                  [--tunnel] [--subnet 隧道網路]

協助 (Help):
  -h, --help                顯示此幫助訊息並退出
  --version                 顯示程式的版本號碼並退出
  --support                 顯示支援資訊 (在疑難排解問題時很有用)

---

### 🔗 **連線 (Connection)**

指定如何連線到 Meshtastic 裝置的可選參數。

| 參數 | 說明 |
| :--- | :--- |
| **--port [PORT]**, **--serial [PORT]**, **-s [PORT]** | 使用序列埠連線到裝置的埠號，例如 `/dev/ttyUSB0`。（預設會嘗試偵測埠號） |
| **--host [HOST]**, **--tcp [HOST]**, **-t [HOST]** | 使用 **TCP** 連線到裝置，可選擇傳入主機名稱或 IP 地址。（預設為 `'localhost'`） |
| **--ble [BLE]**, **-b [BLE]** | 連線到 **BLE**（藍牙低功耗）裝置，可選擇指定裝置名稱。（預設為 `'any'`） |
| **--ble-scan** | 掃描可連線的 Meshtastic BLE 裝置 |

---

### 🎯 **選擇 (Selection)**

選擇要使用的頻道、目標節點等的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--dest !xxxxxxxx** | 任何發送命令的**目標節點 ID**。如果未設定，則假定為 `^all`（所有）或 `^local`（本地）。使用帶有 `!` 或 `0x` 前綴的節點 ID 或節點編號。 |
| **--ch-index 索引** | 設定用於頻道特定命令的**指定頻道索引**。頻道從 **0** 開始（`0` 是主要頻道）。 |

---

### 📂 **匯入/匯出 (Import/Export)**

與匯入和匯出 Meshtastic 裝置配置相關的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--configure 配置檔案** | 指定一個 YAML (`.yml`) 檔案的路徑，其中包含連線裝置所需的設定。 |
| **--export-config [檔案]** | 將裝置配置匯出為 **YAML** 格式 (如果未指定檔案則輸出到標準輸出)。 |

---

### ⚙️ **配置 (Configuration)**

與 Meshtastic 裝置的一般配置相關的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--get 欄位** | 取得一個偏好設定欄位。使用無效欄位 (例如 `'0'`) 可取得所有欄位的列表。可使用 **`snake_case`** 或 **`camelCase`** 格式。 |
| **--set 欄位 值** | 設定一個偏好設定欄位。可使用 **`snake_case`** 或 **`camelCase`** 格式。 |
| **--begin-edit** | 告訴節點開啟一個**交易 (transaction)** 來編輯設定。 |
| **--commit-edit** | 告訴節點提交開啟的設定交易。 |
| **--get-canned-message** | 顯示**罐頭訊息**插件訊息。 |
| **--set-canned-message SET\_CANNED\_MESSAGE** | 設定罐頭訊息插件訊息 (最多 200 個字元)。 |
| **--get-ringtone** | 顯示儲存的**鈴聲**。 |
| **--set-ringtone RINGTONE** | 設定通知鈴聲 (最多 230 個字元)。 |
| **--ch-vlongslow** | 切換到 **超遠距離且慢速** 的數據機預設設定。 |
| **--ch-longslow** | 切換到 **遠距離且慢速** 的數據機預設設定。 |
| **--ch-longfast** | 切換到 **遠距離且快速** 的數據機預設設定。 |
| **--ch-medslow** | 切換到 **中距離且慢速** 的數據機預設設定。 |
| **--ch-medfast** | 切換到 **中距離且快速** 的數據機預設設定。 |
| **--ch-shortslow** | 切換到 **短距離且慢速** 的數據機預設設定。 |
| **--ch-shortfast** | 切換到 **短距離且快速** 的數據機預設設定。 |
| **--set-owner SET\_OWNER** | 設定裝置擁有者名稱。 |
| **--set-owner-short SET\_OWNER\_SHORT** | 設定裝置擁有者短名稱。 |
| **--set-ham SET\_HAM** | 設定持有許可證的**業餘無線電 ID** 並關閉加密。 |
| **--set-is-unmessageable SET\_IS\_UNMESSAGEABLE** | 設定節點是否**不可傳訊**。 |
| **--ch-set-url URL**, **--seturl URL** | 從提供的 URL 設定**所有頻道**和 LoRa 配置。 |
| **--ch-add-url URL** | 從提供的 URL **新增次要頻道**並設定 LoRa 配置。 |

---

### 📍 **位置配置 (Position Configuration)**

修改固定位置和其他位置相關配置的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--setalt SETALT** | 設定裝置的**海拔高度**（以公尺為單位，允許在沒有 GPS 的情況下使用），並啟用固定位置。 |
| **--setlat SETLAT** | 設定裝置的**緯度**（允許在沒有 GPS 的情況下使用），並啟用固定位置。接受十進位值或乘以 $1e7$ 的整數。 |
| **--setlon SETLON** | 設定裝置的**經度**（允許在沒有 GPS 的情況下使用），並啟用固定位置。接受十進位值或乘以 $1e7$ 的整數。 |
| **--remove-position** | **清除**任何現有的固定位置並禁用固定位置。 |
| **--pos-fields [位置欄位 ...]** | 指定發送位置時要發送的**欄位**。不帶參數可列出所有有效值。可以空格分隔多個值。 |

---

### 📡 **頻道配置 (Channel Configuration)**

與頻道配置相關的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--ch-add CH\_ADD** | **新增**一個次要頻道，您必須指定一個頻道名稱。 |
| **--ch-del** | **刪除**指定的頻道索引（`ch-index`）頻道。 |
| **--ch-set 欄位 值** | 設定一個頻道參數。例如：設定主要頻道加密金鑰為新隨機金鑰：`--ch-set psk random --ch-index 0`。 |
| **--channel-fetch-attempts 嘗試次數** | 在放棄之前，嘗試檢索頻道設定的次數。預設為 **3** 次。 |
| **--qr** | 顯示節點主要頻道的 **QR 碼** (使用 `--qr-all` 則顯示所有頻道)。也會顯示可共享的頻道 URL。 |
| **--qr-all** | 顯示節點所有頻道的 **QR 碼**和 URL。 |
| **--ch-enable** | **啟用**指定的頻道。（儘可能改用 `--ch-add`） |
| **--ch-disable** | **禁用**指定的頻道。（儘可能改用 `--ch-del`） |

---

### 🏠 **本地操作 (Local Actions)**

僅對本地節點執行操作或請求資訊的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--info** | 讀取並顯示無線電配置資訊。 |
| **--nodes** | 以美觀的格式化表格列印**節點列表**。 |
| **--show-fields 顯示欄位** | 使用 `--nodes` 時，指定要顯示的欄位 (以逗號分隔)。 |

---

### 🌐 **遠端操作 (Remote Actions)**

透過網狀網路 (mesh) 對本地節點或遠端節點執行操作或請求資訊的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--sendtext 文字** | **發送文字訊息**。可指定目標節點 (`--dest`)、使用私人應用程式埠 (`--private`) 和/或頻道索引 (`--ch-index`)。 |
| **--private** | 可選參數，用於將文字訊息發送到 **PRIVATE\_APP** 埠。與 `--sendtext` 結合使用。 |
| **--traceroute !xxxxxxxx** | 從已連線節點到目標節點的**路由追蹤**。您需要傳入目標 ID 作為參數。 |
| **--request-telemetry [類型]** | 向節點**請求遙測數據**。帶參數時，請求特定類型的遙測數據。 |
| **--request-position** | 向節點**請求位置資訊**。 |
| **--reply** | **回覆**收到的訊息。 |

---

### 👑 **遠端管理操作 (Remote Admin Actions)**

透過網狀網路與本地節點或遠端節點互動，需要管理員存取權限的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--reboot** | 告訴目標節點**重新啟動**。 |
| **--reboot-ota** | 告訴目標節點**重新啟動**進入原廠韌體 (ESP32)。 |
| **--enter-dfu** | 告訴目標節點進入 **DFU 模式** (NRF52)。 |
| **--shutdown** | 告訴目標節點**關機**。 |
| **--device-metadata** | 從節點取得**裝置元數據** (metadata)。 |
| **--factory-reset**, **--factory-reset-config** | 告訴目標節點安裝**預設配置**，保留 BLE 綁定和 PKI 密鑰。 |
| **--factory-reset-device** | 告訴目標節點安裝**預設配置**，並清除 BLE 綁定和 PKI 密鑰。 |
| **--remove-node !xxxxxxxx** | 告訴目標節點從其節點資料庫 (NodeDB) **移除**特定的節點。 |
| **--set-favorite-node !xxxxxxxx** | 告訴目標節點將指定的節點設定為節點資料庫中的**最愛節點**。 |
| **--remove-favorite-node !xxxxxxxx** | 告訴目標節點將指定的節點設定為節點資料庫中的**取消最愛節點**。 |
| **--set-ignored-node !xxxxxxxx** | 告訴目標節點將指定的節點設定為節點資料庫中的**忽略節點**。 |
| **--remove-ignored-node !xxxxxxxx** | 告訴目標節點將指定的節點設定為節點資料庫中的**取消忽略節點**。 |
| **--reset-nodedb** | 告訴目標節點**清除**其節點列表。 |
| **--set-time [時間戳]** | 設定時間為提供的 Unix 紀元時間戳，或如果省略或為 $0$ 則設定為系統當前時間。 |

---

### 📋 雜項參數 (Miscellaneous arguments)

| 參數 | 說明 |
| :--- | :--- |
| **--seriallog [日誌目標]** | 將裝置序列埠輸出記錄到 `'none'` 或要附加的檔案名稱。如果未指定檔案名稱，預設為 `'stdout'`。 |
| **--ack** | 與相容的操作 (例如 `--sendtext`) 結合使用，以**等待確認** (acknowledgment)。 |
| **--timeout 秒數** | 等待回覆的**時限**。預設為 300 秒。 |
| **--no-nodes** | 請求節點不要將節點資訊發送到客戶端。會破壞依賴節點資料庫的功能，但會加快啟動速度。需要韌體版本 $2.3.11$ 或更高。 |
| **--debug** | 顯示 **API 函式庫**的除錯日誌訊息。 |
| **--debuglib** | **僅顯示** API 函式庫的除錯日誌訊息。 |
| **--test** | 對所有連線的 Meshtastic 裝置執行**壓力測試**。 |
| **--wait-to-disconnect [秒數]** | 在與裝置斷開連線之前**等待的秒數**。 |
| **--noproto** | 不啟動 API，僅作為一個**簡易的序列埠終端**運作。 |
| **--listen** | 保持開啟並**監聽** Protobuf 串流。啟用除錯日誌記錄。 |
| **--no-time** | 已棄用。保留用於命令碼的向下相容性，但**無實際操作**。 |

---

### 🔋 **電源測試 (Power Testing)**

用於電源測試/日誌記錄的選項。

| 參數 | 說明 |
| :--- | :--- |
| **--power-riden POWER\_RIDEN** | 與 Riden 電源供應器通訊。您必須指定裝置路徑，例如 `/dev/ttyUSBxxx`。 |
| **--power-ppk2-meter** | 與 Nordic Power Profiler Kit 2 (在**測量模式**) 通訊。 |
| **--power-ppk2-supply** | 與 Nordic Power Profiler Kit 2 (在**供電模式**) 通訊。 |
| **--power-sim** | 使用**模擬**電量計 (用於開發)。 |
| **--power-voltage POWER\_VOLTAGE** | 在電源供應器上設定指定的**電壓**。請非常小心，可能會燒毀東西。 |
| **--power-stress** | 執行電源監視器**壓力測試**，以擷取裝置的功耗概況 (也需要 `--power-mon`)。 |
| **--power-wait** | 提示使用者在尋找裝置序列埠之前**等待裝置重設** (某些電路板會切斷 USB 序列埠的電源)。 |
| **--slog [SLOG]** | 儲存本次運行的**結構化日誌** (slogs)，可選地指定一個目標目錄。 |

---

### ⚙️ **遠端硬體 (Remote Hardware)**

與遠端硬體模組相關的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--gpio-wrb GPIO\_WRB GPIO\_WRB** | 將特定的 **GPIO 號碼**設定為 $1$ 或 $0$。 |
| **--gpio-rd GPIO\_RD** | 從 **GPIO 遮罩**中讀取 (例如: `'0x10'`)。 |
| **--gpio-watch GPIO\_WATCH** | 開始**監測 GPIO 遮罩**的變化 (例如: `'0x10'`)。 |

---

### 🌐 **隧道 (Tunnel)**

與透過網狀網路建立隧道裝置相關的參數。

| 參數 | 說明 |
| :--- | :--- |
| **--tunnel** | 建立一個 **TUN 隧道裝置**，用於透過網狀網路轉發 IP 封包。 |
| **--subnet TUNNEL\_NET** | 設定 **TUN IP 橋接器**的本地端子網路地址 (例如: `'10.115'`，這是預設值)。 |

---

如果未指定任何連線參數，程式將搜尋相容的序列埠裝置，如果找不到，則會嘗試對 `localhost` 進行 TCP 連線。

# **參考來源**

- [Meshtastic 官方網站](https://meshtastic.org/)
- [Meshtastic Python CLI 官方指南](https://meshtastic.org/docs/software/python/cli/)


## Meshtastic Taiwan
- [Meshtastic Taiwan Community 臺灣鏈網](https://www.facebook.com/groups/meshtastictw)
- [Meshtastic Taiwan 使用手冊 by BASHCAT](https://hackmd.io/@fL8pq60EQsG3RplVzWfGWA/S1m_x-AOA)