@seeed-studio/meshtastic 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh-CN.md CHANGED
@@ -1,60 +1,52 @@
1
- # OpenClaw Meshtastic 插件
1
+ # MeshClaw:OpenClaw Meshtastic 频道插件
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@seeed-studio/meshtastic.svg)](https://www.npmjs.com/package/@seeed-studio/meshtastic)
4
- [![license](https://img.shields.io/npm/l/@seeed-studio/meshtastic.svg)](https://www.npmjs.com/package/@seeed-studio/meshtastic)
3
+ <p align="center">
4
+ <a href="https://www.npmjs.com/package/@seeed-studio/meshtastic">
5
+ <img alt="npm 版本" src="https://img.shields.io/npm/v/@seeed-studio/meshtastic.svg" />
6
+ </a>
7
+ <a href="https://www.npmjs.com/package/@seeed-studio/meshtastic">
8
+ <img alt="许可证" src="https://img.shields.io/npm/l/@seeed-studio/meshtastic.svg" />
9
+ </a>
10
+ </p>
5
11
 
6
- [English](README.md) | **[中文](README.zh-CN.md)**
12
+ <!-- LANG_SWITCHER_START -->
13
+ <p align="center">
14
+ <a href="README.md">English</a> | <b>中文</b> | <a href="README.ja.md">日本語</a> | <a href="README.fr.md">Français</a> | <a href="README.pt.md">Português</a> | <a href="README.es.md">Español</a>
15
+ </p>
16
+ <!-- LANG_SWITCHER_END -->
7
17
 
8
- [OpenClaw](https://github.com/openclaw/openclaw) [Meshtastic](https://meshtastic.org/) LoRa 网状网络频道插件。通过 USB 串口、HTTP MQTT 将 AI 网关连接到 mesh 网络,无需云服务。
18
+ MeshClaw 是一个 OpenClaw 频道插件,让你的 AI 网关通过 Meshtastic 发送和接收消息——无需互联网、无需蜂窝网络,只靠电波。在山里、海上,或任何不在电网覆盖范围的地方,都能与 AI 助手沟通。
19
+
20
+ ⭐ 欢迎在 GitHub 上为我们点 Star——这对我们很有激励!
9
21
 
10
22
  > [!IMPORTANT]
11
- > 这是 [OpenClaw](https://github.com/openclaw/openclaw) AI 网关的**频道插件**,不是独立应用程序。你需要一个运行中的 OpenClaw 实例(Node.js 22+)才能使用。
23
+ > 这是用于 [OpenClaw](https://github.com/openclaw/openclaw) AI 网关的“频道插件”,并非独立应用。使用前需要一个已运行的 OpenClaw 实例(Node.js 22+)。
12
24
 
13
- [文档][docs] · [硬件指南](#推荐硬件) · [报告问题][issues] · [功能请求][issues]
14
-
15
- <p align="center">
16
- <img src="media/hardware.jpg" width="420" alt="Meshtastic LoRa 硬件" />
17
- </p>
25
+ [文档][docs] · [硬件指南](#recommended-hardware) · [提交 Bug][issues] · [功能请求][issues]
18
26
 
19
27
  ## 目录
20
28
 
21
- - [快速开始](#快速开始)
22
29
  - [工作原理](#工作原理)
23
30
  - [推荐硬件](#推荐硬件)
31
+ - [功能](#功能)
32
+ - [能力与路线图](#能力与路线图)
24
33
  - [演示](#演示)
25
- - [功能特性](#功能特性)
34
+ - [快速开始](#快速开始)
26
35
  - [设置向导](#设置向导)
27
- - [配置](#配置)
28
- - [故障排查](#故障排查)
29
- - [开发](#开发)
30
- - [贡献](#贡献)
31
-
32
- ## 快速开始
33
-
34
- ```bash
35
- # 1. 安装插件
36
- openclaw plugins install @seeed-studio/meshtastic
37
-
38
- # 2. 交互式设置 — 引导完成传输方式、频率区域、访问策略等配置
39
- openclaw setup
40
-
41
- # 3. 验证
42
- openclaw channels status --probe
43
- ```
44
-
45
- <p align="center">
46
- <img src="media/setup-screenshot.png" width="700" alt="OpenClaw 设置向导" />
47
- </p>
36
+ - [配置](#1-传输方式)
37
+ - [故障排查](#2-lora-区域)
38
+ - [开发](#3-节点名称)
39
+ - [贡献](#4-频道访问grouppolicy)
48
40
 
49
41
  ## 工作原理
50
42
 
51
43
  ```mermaid
52
44
  flowchart LR
53
- subgraph mesh ["📻 LoRa Mesh 网络"]
54
- N["Meshtastic 节点"]
45
+ subgraph mesh ["📻 LoRa Mesh Network"]
46
+ N["Meshtastic Nodes"]
55
47
  end
56
- subgraph gw ["⚙️ OpenClaw 网关"]
57
- P["Meshtastic 插件"]
48
+ subgraph gw ["⚙️ OpenClaw Gateway"]
49
+ P["Meshtastic Plugin"]
58
50
  AI["AI Agent"]
59
51
  end
60
52
  N -- "Serial (USB)" --> P
@@ -63,13 +55,13 @@ flowchart LR
63
55
  P <--> AI
64
56
  ```
65
57
 
66
- 本插件在 Meshtastic LoRa 设备和 OpenClaw AI Agent 之间架起桥梁,支持三种传输模式:
58
+ 该插件在 Meshtastic LoRa 设备与 OpenClaw AI 代理之间建立桥接。支持三种传输模式:
67
59
 
68
- - **Serial** — 通过 USB 直连本地 Meshtastic 设备
69
- - **HTTP** 通过 WiFi / 局域网连接设备
70
- - **MQTT** 订阅 Meshtastic MQTT broker,无需本地硬件
60
+ - 串口(Serial)——通过 USB 直连本地 Meshtastic 设备
61
+ - HTTP ——通过 WiFi/局域网连接设备
62
+ - MQTT ——订阅 Meshtastic MQTT 代理,无需本地硬件
71
63
 
72
- 入站消息经过访问控制(私信策略、群组策略、@mention 门控)后到达 AI。出站回复会自动去除 markdown 格式(LoRa 设备无法渲染),并按无线电包大小限制进行分片。
64
+ 入站消息会经过访问控制(私信策略、群组策略、@提及门槛)后再交给 AI。出站回复会移除 Markdown 格式(LoRa 设备无法渲染),并按无线电数据包大小限制进行分片发送。
73
65
 
74
66
  ## 推荐硬件
75
67
 
@@ -77,110 +69,149 @@ flowchart LR
77
69
  <img src="media/XIAOclaw.png" width="760" alt="搭载 Seeed XIAO 模组的 Meshtastic 设备" />
78
70
  </p>
79
71
 
80
- | 设备 | 适用场景 | 链接 |
81
- |---|---|---|
82
- | XIAO ESP32S3 + Wio-SX1262 套件 | 低成本离网节点 | [购买][hw-xiao] |
83
- | Wio Tracker L1 Pro | 即插即用网关 | [购买][hw-wio] |
84
- | SenseCAP Card Tracker T1000-E | 便携追踪器 | [购买][hw-sensecap] |
72
+ | 设备 | 最佳用途 | 链接 |
73
+ | ---------------------------- | ---------------------- | ------------------ |
74
+ | XIAO ESP32S3 + Wio-SX1262 套件 | 入门级开发 | [购买][hw-xiao] |
75
+ | Wio Tracker L1 Pro | 便携式现场网关 | [购买][hw-wio] |
76
+ | SenseCAP Card Tracker T1000-E | 小型追踪器 | [购买][hw-sensecap] |
77
+
78
+ 没有硬件?可使用 MQTT 传输通过代理连接——无需本地设备。
79
+
80
+ 任何兼容 Meshtastic 的设备都可以使用。
85
81
 
86
- 任何 Meshtastic 兼容设备均可使用。Serial 和 HTTP 直连设备;MQTT 完全不需要本地硬件。
82
+ ## 功能
83
+
84
+ - AI 代理集成——将 OpenClaw AI 代理与 Meshtastic LoRa Mesh 网络桥接,实现无云依赖的智能通信。
85
+
86
+ - 三种传输模式——支持串口(USB)、HTTP(WiFi)与 MQTT
87
+
88
+ - 私信与群组频道的访问控制——支持两种会话模式,提供私信白名单、频道响应规则与@提及门槛
89
+
90
+ - 多账号支持——可同时运行多个独立连接
91
+
92
+ - 稳健的 Mesh 通信——可配置自动重连与重试,优雅应对掉线与中断
93
+
94
+ ## 能力与路线图
95
+
96
+ 该插件将 Meshtastic 视为一等公民的通讯渠道——就像 Telegram 或 Discord 一样——使 AI 对话与工具调用完全通过 LoRa 无线电进行,无需依赖互联网。
97
+
98
+ | 离线查询信息 | 跨渠道桥接:离网发送,任意处接收 | 🔜 接下来: |
99
+ | ------------------------------------------------------- | ------------------------------------------------------- | --------------------------------------------------------- |
100
+ | <img src="media/image1.png" alt="离线查询信息" /> | <img src="media/image2.png" alt="跨渠道桥接" /> | 我们计划将实时节点数据(GPS 位置、环境传感、设备状态)注入 OpenClaw 上下文,让 AI 能监控 Mesh 网络健康状况,并主动广播告警,而无需等待用户发问。 |
87
101
 
88
102
  ## 演示
89
103
 
90
- https://github.com/user-attachments/assets/a3e46e9d-cf5a-4743-9830-f671a1998ca0
104
+ <div align="center">
105
+
106
+ https://github.com/user-attachments/assets/837062d9-a5bb-4e0a-b7cf-298e4bdf2f7c
107
+
108
+ </div>
109
+
110
+ 备用视频: [media/demo.mp4](media/demo.mp4)
111
+
112
+ ## 快速开始
113
+
114
+ ```bash
115
+ # 1. Install plugin
116
+ openclaw plugins install @seeed-studio/meshtastic
91
117
 
92
- 备用链接:[media/demo.mp4](media/demo.mp4)
118
+ # 2. Guided setup — walks you through transport, region, and access policy
119
+ openclaw onboard
93
120
 
94
- ## 功能特性
121
+ # 3. Verify
122
+ openclaw channels status --probe
123
+ ```
95
124
 
96
- - **私信和 mesh 频道** — 支持按频道设置独立规则
97
- - **访问控制** — 私信策略(`open` / `pairing` / `allowlist`)、群组策略(`open` / `allowlist` / `disabled`)、@mention 门控、按频道白名单
98
- - **多账户** — 同时运行独立的 serial、HTTP、MQTT 连接
99
- - **区域感知** — 连接时自动设置设备区域,自动推导 MQTT topic 默认值
100
- - **自动重连** — 弹性重试处理
125
+ <p align="center">
126
+ <img src="media/setup-screenshot.png" width="700" alt="OpenClaw 设置向导" />
127
+ </p>
101
128
 
102
129
  ## 设置向导
103
130
 
104
- 运行 `openclaw setup` 会启动一个交互式向导,逐步引导你完成配置。以下是每一步的含义和选择建议。
131
+ 运行 `openclaw onboard` 会启动交互式向导,引导你完成每一步配置。下面解释每一步的含义与选择建议。
105
132
 
106
- ### 1. 传输方式(Transport)
133
+ ### 1. 传输方式
107
134
 
108
- 网关如何连接到 Meshtastic mesh 网络:
135
+ 网关如何连接到 Meshtastic Mesh:
109
136
 
110
- | 选项 | 说明 | 要求 |
111
- |---|---|---|
112
- | **Serial**(USB 串口) | 通过 USB 直连本地设备,自动检测可用端口。 | Meshtastic 设备已通过 USB 连接 |
113
- | **HTTP**(WiFi) | 通过局域网连接设备。 | 设备 IP 或主机名(如 `meshtastic.local`) |
114
- | **MQTT**(broker) | 通过 MQTT broker 连接 mesh 网络,无需本地硬件。 | broker 地址、凭据和订阅 topic |
137
+ | 选项 | 说明 | 要求 |
138
+ | ------------------ | ------------------------------------------------------------- | ---------------------------------------------- |
139
+ | 串口(SerialUSB | 通过 USB 直连本地设备。可自动检测可用端口。 | 通过 USB 连接的 Meshtastic 设备 |
140
+ | HTTPWiFi) | 通过局域网连接设备。 | 设备 IP 或主机名(如 `meshtastic.local`) |
141
+ | MQTT(代理) | 通过 MQTT 代理接入 Mesh——无需本地硬件。 | 代理地址、凭据与订阅主题 |
115
142
 
116
- ### 2. LoRa 频率区域(Region)
143
+ ### 2. LoRa 区域
117
144
 
118
- > Serial 和 HTTP 模式需要。MQTT 模式从订阅 topic 中自动推导区域。
145
+ > 仅适用于串口与 HTTPMQTT 会根据订阅主题推导区域。
119
146
 
120
- 设置设备的无线电频率区域,必须与当地法规和 mesh 网络中其他节点一致。常用选项:
147
+ 设置设备的无线频段区域。必须符合当地法规,并与 Mesh 上其他节点一致。常见选项:
121
148
 
122
- | 区域 | 频率 |
123
- |---|---|
124
- | `US` | 902–928 MHz |
125
- | `EU_868` | 869 MHz |
126
- | `CN` | 470–510 MHz |
127
- | `JP` | 920 MHz |
128
- | `UNSET` | 保持设备默认值 |
149
+ | 区域 | 频段 |
150
+ | -------- | ------------------ |
151
+ | `US` | 902–928 MHz |
152
+ | `EU_868` | 869 MHz |
153
+ | `CN` | 470–510 MHz |
154
+ | `JP` | 920 MHz |
155
+ | `UNSET` | 保持设备默认 |
129
156
 
130
157
  完整列表参见 [Meshtastic 区域文档](https://meshtastic.org/docs/getting-started/initial-config/#lora)。
131
158
 
132
- ### 3. 节点名称(Node Name)
159
+ ### 3. 节点名称
133
160
 
134
- 设备在 mesh 网络中的显示名称,同时作为群组频道中的 **@mention 触发词** — 其他用户发送 `@OpenClaw` 即可与你的 bot 对话。
161
+ 设备在 Mesh 上的显示名称。也作为群组频道中的“@提及触发词”——其他用户发送 `@OpenClaw` 与机器人对话。
135
162
 
136
- - **Serial / HTTP**:可选 — 留空会自动从连接的设备读取名称。
137
- - **MQTT**:必填 — 没有物理设备可供读取名称。
163
+ - 串口/HTTP:可选——若留空,将自动从连接的设备读取名称。
164
+ - MQTT:必填——因为没有实体设备可读取名称。
138
165
 
139
- ### 4. 频道访问控制(Channel Access / `groupPolicy`)
166
+ ### 4. 频道访问(groupPolicy
140
167
 
141
- 控制 bot 是否以及如何响应 **mesh 群组频道**(如 LongFast、Emergency)中的消息:
168
+ 控制机器人在“Mesh 群组频道”(如 LongFast、Emergency)中的响应策略:
142
169
 
143
- | 策略 | 行为 |
144
- |---|---|
145
- | `disabled`(默认) | 忽略所有群组频道消息。仅处理私信。 |
146
- | `open` | 在 mesh 上的**所有**频道中响应消息。 |
147
- | `allowlist` | 仅在**指定频道**中响应。设置时会提示输入频道名称(逗号分隔,如 `LongFast, Emergency`)。使用 `*` 通配符匹配所有频道。 |
170
+ | 策略 | 行为说明 |
171
+ | -------------------- | ------------------------------------------------------------ |
172
+ | `disabled`(默认) | 忽略所有群组频道消息。仅处理私信。 |
173
+ | `open` | 在 Mesh 上的“所有”频道中响应。 |
174
+ | `allowlist` | 仅在“列出的”频道中响应。会提示输入频道名(逗号分隔,如 `LongFast, Emergency`)。使用 `*` 作为通配符匹配全部。 |
148
175
 
149
- ### 5. 需要 @mention 才回复(Require Mention)
176
+ ### 5. 需要 @提及
150
177
 
151
- > 仅在频道访问控制不为 `disabled` 时出现。
178
+ > 仅当频道访问已启用(非 `disabled`)时出现。
152
179
 
153
- 启用时(默认:**是**),bot 在群组频道中只有被 @mention 时才会回复(如 `@OpenClaw 天气怎么样?`),防止 bot 对频道中的每条消息都回复。
180
+ 启用时(默认:是),机器人只在群组频道里被@到其节点名时才回应(例如 `@OpenClaw 天气怎么样?`)。这可避免机器人对频道中每一条消息都做出回复。
154
181
 
155
- 禁用时,bot 会回复允许频道中的**所有**消息。
182
+ 若关闭,则机器人会在允许的频道中对“所有”消息回复。
156
183
 
157
- ### 6. 私信访问策略(DM Access Policy / `dmPolicy`)
184
+ ### 6. 私信访问策略(dmPolicy
158
185
 
159
- 控制谁可以给 bot 发送**私信(Direct Message)**:
186
+ 控制谁可以给机器人发送“私信”:
160
187
 
161
- | 策略 | 行为 |
162
- |---|---|
163
- | `pairing`(默认) | 新发送者会触发配对请求,审批通过后才能对话。 |
164
- | `open` | mesh 上的任何人都可以自由私信 bot。 |
165
- | `allowlist` | `allowFrom` 列表中的节点可以私信,其他人被忽略。 |
188
+ | 策略 | 行为说明 |
189
+ | -------------------- | ------------------------------------------------------------ |
190
+ | `pairing`(默认) | 新发送者会触发配对请求,需先批准后才能聊天。 |
191
+ | `open` | Mesh 上任何人都可以自由私信机器人。 |
192
+ | `allowlist` | 只有 `allowFrom` 列表中的节点可以私信。其他一律忽略。 |
166
193
 
167
- ### 7. 私信白名单(DM Allowlist / `allowFrom`)
194
+ ### 7. 私信白名单(allowFrom
168
195
 
169
- > 仅在 `dmPolicy` 为 `allowlist` 或向导判断需要时出现。
196
+ > 仅当 `dmPolicy` 为 `allowlist`,或向导判定需要时出现。
170
197
 
171
- 允许发送私信的 Meshtastic 节点 ID 列表。格式为 `!aabbccdd`(十六进制节点 ID),多个条目用逗号分隔。
198
+ 允许发送私信的 Meshtastic 用户 ID 列表。格式:`!aabbccdd`(16 进制用户 ID)。多个条目用逗号分隔。
199
+
200
+ <p align="center">
201
+ <img src="media/image3.jpg" width="400" />
202
+ </p>
172
203
 
173
- ### 8. 账户显示名称(Account Display Names)
204
+ ### 8. 账号显示名称
174
205
 
175
- > 仅在多账户配置时出现。可选。
206
+ > 仅对多账号配置显示。可选。
176
207
 
177
- 为你的账户设置人类可读的显示名称。例如,ID 为 `home` 的账户可以显示为「家里基站」。如果跳过,系统直接使用原始 account ID。这是纯展示性的设置,不影响任何功能。
208
+ 为你的账号分配易读的显示名称。比如,将 ID 为 `home` 的账号显示为 “Home Station”。若跳过,将直接使用原始账号 ID。仅用于显示,不影响功能。
178
209
 
179
210
  ## 配置
180
211
 
181
- 交互式设置(`openclaw setup`)涵盖以下所有内容。详细步骤说明参见[设置向导](#设置向导)。如需手动编辑,使用 `openclaw config edit`。
212
+ 引导式设置(`openclaw onboard`)已覆盖以下所有内容。详见[设置向导](#setup-wizard)。若需手动配置,可用 `openclaw config edit` 编辑。
182
213
 
183
- ### Serial(USB 串口)
214
+ ### 串口(USB
184
215
 
185
216
  ```yaml
186
217
  channels:
@@ -200,7 +231,7 @@ channels:
200
231
  nodeName: OpenClaw
201
232
  ```
202
233
 
203
- ### MQTT(broker)
234
+ ### MQTT(代理)
204
235
 
205
236
  ```yaml
206
237
  channels:
@@ -214,7 +245,7 @@ channels:
214
245
  topic: "msh/US/2/json/#"
215
246
  ```
216
247
 
217
- ### 多账户
248
+ ### 多账号
218
249
 
219
250
  ```yaml
220
251
  channels:
@@ -231,76 +262,76 @@ channels:
231
262
  ```
232
263
 
233
264
  <details>
234
- <summary><b>全部选项参考</b></summary>
235
-
236
- | 配置项 | 类型 | 默认值 | 说明 |
237
- |---|---|---|---|
238
- | `transport` | `serial \| http \| mqtt` | `serial` | |
239
- | `serialPort` | `string` | — | Serial 模式必填 |
240
- | `httpAddress` | `string` | `meshtastic.local` | HTTP 模式必填 |
241
- | `httpTls` | `boolean` | `false` | |
242
- | `mqtt.broker` | `string` | `mqtt.meshtastic.org` | |
243
- | `mqtt.port` | `number` | `1883` | |
244
- | `mqtt.username` | `string` | `meshdev` | |
245
- | `mqtt.password` | `string` | `large4cats` | |
246
- | `mqtt.topic` | `string` | `msh/US/2/json/#` | 订阅 topic |
247
- | `mqtt.publishTopic` | `string` | 自动推导 | |
248
- | `mqtt.tls` | `boolean` | `false` | |
249
- | `region` | 枚举 | `UNSET` | `US`、`EU_868`、`CN`、`JP`、`ANZ`、`KR`、`TW`、`RU`、`IN`、`NZ_865`、`TH`、`EU_433`、`UA_433`、`UA_868`、`MY_433`、`MY_919`、`SG_923`、`LORA_24`。仅 Serial/HTTP 模式。 |
250
- | `nodeName` | `string` | 自动检测 | 显示名称及 @mention 触发词。MQTT 模式必填。 |
251
- | `dmPolicy` | `open \| pairing \| allowlist` | `pairing` | 私信访问策略。详见[私信访问策略](#6-私信访问策略dm-access-policy--dmpolicy)。 |
252
- | `allowFrom` | `string[]` | — | 私信白名单节点 ID,如 `["!aabbccdd"]` |
253
- | `groupPolicy` | `open \| allowlist \| disabled` | `disabled` | 群组频道响应策略。详见[频道访问控制](#4-频道访问控制channel-access--grouppolicy)。 |
254
- | `channels` | `Record<string, object>` | — | 按频道覆盖:`requireMention`、`allowFrom`、`tools` |
265
+ <summary><b>所有选项参考</b></summary>
266
+
267
+ | | 类型 | 默认值 | 说明 |
268
+ | -------------------- | -------------------------------- | -------------------- | ------------------------------------------------------------ |
269
+ | `transport` | `serial \| http \| mqtt` | `serial` | |
270
+ | `serialPort` | `string` | — | 串口模式必填 |
271
+ | `httpAddress` | `string` | `meshtastic.local` | HTTP 模式必填 |
272
+ | `httpTls` | `boolean` | `false` | |
273
+ | `mqtt.broker` | `string` | `mqtt.meshtastic.org`| |
274
+ | `mqtt.port` | `number` | `1883` | |
275
+ | `mqtt.username` | `string` | `meshdev` | |
276
+ | `mqtt.password` | `string` | `large4cats` | |
277
+ | `mqtt.topic` | `string` | `msh/US/2/json/#` | 订阅主题 |
278
+ | `mqtt.publishTopic` | `string` | derived | |
279
+ | `mqtt.tls` | `boolean` | `false` | |
280
+ | `region` | enum | `UNSET` | `US`, `EU_868`, `CN`, `JP`, `ANZ`, `KR`, `TW`, `RU`, `IN`, `NZ_865`, `TH`, `EU_433`, `UA_433`, `UA_868`, `MY_433`, `MY_919`, `SG_923`, `LORA_24`。仅串口/HTTP |
281
+ | `nodeName` | `string` | auto-detect | 显示名与 @提及触发词。MQTT 必填。 |
282
+ | `dmPolicy` | `open \| pairing \| allowlist` | `pairing` | 谁可以发送私信。见[私信访问策略](#6-私信访问策略-dmpolicy)。 |
283
+ | `allowFrom` | `string[]` | — | 私信白名单节点 ID,例如 `["!aabbccdd"]` |
284
+ | `groupPolicy` | `open \| allowlist \| disabled` | `disabled` | 群组频道响应策略。见[频道访问](#4-频道访问-grouppolicy)。 |
285
+ | `channels` | `Record<string, object>` | — | 按频道覆盖:`requireMention`、`allowFrom`、`tools` |
255
286
 
256
287
  </details>
257
288
 
258
289
  <details>
259
290
  <summary><b>环境变量覆盖</b></summary>
260
291
 
261
- 以下环境变量覆盖默认账户的配置(YAML 中的命名账户配置优先):
292
+ 这些环境变量会覆盖“默认账号”的配置(对命名账号,以 YAML 配置为准):
262
293
 
263
- | 变量 | 等效配置项 |
264
- |---|---|
265
- | `MESHTASTIC_TRANSPORT` | `transport` |
266
- | `MESHTASTIC_SERIAL_PORT` | `serialPort` |
267
- | `MESHTASTIC_HTTP_ADDRESS` | `httpAddress` |
268
- | `MESHTASTIC_MQTT_BROKER` | `mqtt.broker` |
269
- | `MESHTASTIC_MQTT_TOPIC` | `mqtt.topic` |
294
+ | 变量名 | 等效配置键 |
295
+ | --------------------------- | ------------------ |
296
+ | `MESHTASTIC_TRANSPORT` | `transport` |
297
+ | `MESHTASTIC_SERIAL_PORT` | `serialPort` |
298
+ | `MESHTASTIC_HTTP_ADDRESS` | `httpAddress` |
299
+ | `MESHTASTIC_MQTT_BROKER` | `mqtt.broker` |
300
+ | `MESHTASTIC_MQTT_TOPIC` | `mqtt.topic` |
270
301
 
271
302
  </details>
272
303
 
273
304
  ## 故障排查
274
305
 
275
- | 症状 | 检查项 |
276
- |---|---|
277
- | Serial 无法连接 | 设备路径是否正确?主机是否有权限? |
278
- | HTTP 无法连接 | `httpAddress` 是否可达?`httpTls` 是否与设备设置匹配? |
279
- | MQTT 收不到消息 | `mqtt.topic` 中的区域是否正确?broker 凭据是否有效? |
280
- | 私信无回复 | `dmPolicy` `allowFrom` 是否已配置?详见[私信访问策略](#6-私信访问策略dm-access-policy--dmpolicy)。 |
281
- | 群组频道无回复 | `groupPolicy` 是否已启用?频道是否在白名单中?是否需要 @mention?详见[频道访问控制](#4-频道访问控制channel-access--grouppolicy)。 |
306
+ | 现象 | 检查点 |
307
+ | --------------------- | ----------------------------------------------------------- |
308
+ | 串口无法连接 | 设备路径是否正确?主机是否有访问权限? |
309
+ | HTTP 无法连接 | `httpAddress` 是否可达?`httpTls` 是否与设备设置匹配? |
310
+ | MQTT 没有收到消息 | `mqtt.topic` 中的区域是否正确?代理凭据是否有效? |
311
+ | 私信没响应 | `dmPolicy` `allowFrom` 是否配置?见[私信访问策略](#6-私信访问策略-dmpolicy)。 |
312
+ | 群组无回复 | `groupPolicy` 是否启用?频道是否在白名单?是否需要 @提及?见[频道访问](#4-频道访问-grouppolicy)。 |
282
313
 
283
- 发现 bug?请[提交 issue][issues],附上传输方式、配置(隐去密钥)以及 `openclaw channels status --probe` 的输出。
314
+ 发现 Bug?请[提交 Issue][issues],并附上传输类型、配置(注意去除敏感信息)以及 `openclaw channels status --probe` 的输出。
284
315
 
285
316
  ## 开发
286
317
 
287
318
  ```bash
288
- git clone https://github.com/Seeed-Solution/openclaw-meshtastic.git
289
- cd openclaw-meshtastic
319
+ git clone https://github.com/Seeed-Solution/MeshClaw.git
320
+ cd MeshClaw
290
321
  npm install
291
- openclaw plugins install -l ./openclaw-meshtastic
322
+ openclaw plugins install -l ./MeshClaw
292
323
  ```
293
324
 
294
- 无构建步骤 — OpenClaw 直接加载 TypeScript 源码。使用 `openclaw channels status --probe` 验证。
325
+ 无需构建步骤——OpenClaw 会直接加载 TypeScript 源码。使用 `openclaw channels status --probe` 进行验证。
295
326
 
296
327
  ## 贡献
297
328
 
298
- - [提交 issue][issues] 报告 bug 或提出功能请求
299
- - 欢迎 Pull Request — 请保持与现有 TypeScript 代码风格一致
329
+ - 发现问题或需要新功能,请[提交 Issue][issues]
330
+ - 欢迎提交 PR——请保持代码风格与现有 TypeScript 约定一致
300
331
 
301
332
  <!-- Reference-style links -->
302
333
  [docs]: https://meshtastic.org/docs/
303
- [issues]: https://github.com/Seeed-Solution/openclaw-meshtastic/issues
334
+ [issues]: https://github.com/Seeed-Solution/MeshClaw/issues
304
335
  [hw-xiao]: https://www.seeedstudio.com/Wio-SX1262-with-XIAO-ESP32S3-p-5982.html
305
336
  [hw-wio]: https://www.seeedstudio.com/Wio-Tracker-L1-Pro-p-6454.html
306
- [hw-sensecap]: https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html
337
+ [hw-sensecap]: https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@seeed-studio/meshtastic",
3
- "version": "0.2.0",
4
- "description": "OpenClaw Meshtastic LoRa mesh channel plugin",
3
+ "version": "0.2.1",
4
+ "description": "MeshClaw — OpenClaw channel plugin for Meshtastic LoRa mesh networks",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/Seeed-Solution/openclaw-meshtastic"
9
+ "url": "https://github.com/Seeed-Solution/MeshClaw"
10
10
  },
11
11
  "keywords": [
12
+ "meshclaw",
12
13
  "openclaw",
13
14
  "meshtastic",
14
15
  "lora",
package/src/channel.ts CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  resolveDefaultGroupPolicy,
11
11
  setAccountEnabledInConfigSection,
12
12
  type ChannelPlugin,
13
- } from "openclaw/plugin-sdk";
13
+ } from "openclaw/plugin-sdk/irc";
14
14
  import {
15
15
  listMeshtasticAccountIds,
16
16
  resolveDefaultMeshtasticAccountId,
@@ -294,7 +294,7 @@ export const meshtasticPlugin: ChannelPlugin<ResolvedMeshtasticAccount, Meshtast
294
294
  if (!account.configured) {
295
295
  return {
296
296
  ok: false,
297
- error: "Not configured. Run 'openclaw setup' to configure.",
297
+ error: "Not configured. Run 'openclaw onboard' to configure.",
298
298
  transport: account.transport,
299
299
  } as MeshtasticProbe;
300
300
  }
@@ -377,7 +377,7 @@ export const meshtasticPlugin: ChannelPlugin<ResolvedMeshtasticAccount, Meshtast
377
377
  if (!account.configured) {
378
378
  throw new Error(
379
379
  `Meshtastic is not configured for account "${account.accountId}". ` +
380
- `Run 'openclaw setup' or set channels.meshtastic.transport and connection details in config.`,
380
+ `Run 'openclaw onboard' or set channels.meshtastic.transport and connection details in config.`,
381
381
  );
382
382
  }
383
383
  const transportDesc =
@@ -5,7 +5,7 @@ import {
5
5
  ReplyRuntimeConfigSchemaShape,
6
6
  ToolPolicySchema,
7
7
  requireOpenAllowFrom,
8
- } from "openclaw/plugin-sdk";
8
+ } from "openclaw/plugin-sdk/irc";
9
9
  import { z } from "zod";
10
10
 
11
11
  const MeshtasticGroupSchema = z
package/src/inbound.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  GROUP_POLICY_BLOCKED_LABEL,
3
3
  createNormalizedOutboundDeliverer,
4
- createReplyPrefixOptions,
5
4
  formatTextWithAttachmentLinks,
6
5
  logInboundDrop,
7
6
  resolveControlCommandGate,
@@ -12,7 +11,8 @@ import {
12
11
  type OutboundReplyPayload,
13
12
  type OpenClawConfig,
14
13
  type RuntimeEnv,
15
- } from "openclaw/plugin-sdk";
14
+ } from "openclaw/plugin-sdk/irc";
15
+ import { createReplyPrefixOptions } from "openclaw/plugin-sdk/matrix";
16
16
  import type { ResolvedMeshtasticAccount } from "./accounts.js";
17
17
  import {
18
18
  normalizeMeshtasticAllowlist,
package/src/monitor.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { createLoggerBackedRuntime, type RuntimeEnv } from "openclaw/plugin-sdk";
2
+ import { createLoggerBackedRuntime, type RuntimeEnv } from "openclaw/plugin-sdk/irc";
3
3
  import { resolveMeshtasticAccount } from "./accounts.js";
4
4
  import { connectMeshtasticClient, DeviceStatus, SetOwnerRebootError, type MeshtasticClient } from "./client.js";
5
5
  import { handleMeshtasticInbound } from "./inbound.js";
@@ -59,7 +59,7 @@ export async function monitorMeshtasticProvider(
59
59
  if (!account.configured) {
60
60
  throw new Error(
61
61
  `Meshtastic is not configured for account "${account.accountId}". ` +
62
- `Run 'openclaw setup' or set channels.meshtastic.transport and connection details in config.`,
62
+ `Run 'openclaw onboard' or set channels.meshtastic.transport and connection details in config.`,
63
63
  );
64
64
  }
65
65
 
@@ -247,7 +247,7 @@ async function monitorMqtt(params: {
247
247
  const mqttConfig = account.config.mqtt;
248
248
 
249
249
  if (!mqttConfig?.broker) {
250
- throw new Error("MQTT broker not configured. Set channels.meshtastic.mqtt.broker or run 'openclaw setup'.");
250
+ throw new Error("MQTT broker not configured. Set channels.meshtastic.mqtt.broker or run 'openclaw onboard'.");
251
251
  }
252
252
 
253
253
  let mqttClient: MeshtasticMqttClient | null = null;
package/src/onboarding.ts CHANGED
@@ -3,13 +3,17 @@ import {
3
3
  addWildcardAllowFrom,
4
4
  DEFAULT_ACCOUNT_ID,
5
5
  formatDocsLink,
6
- promptAccountId,
7
- promptChannelAccessConfig,
8
- type ChannelOnboardingAdapter,
9
- type ChannelOnboardingDmPolicy,
10
6
  type DmPolicy,
11
7
  type WizardPrompter,
12
- } from "openclaw/plugin-sdk";
8
+ } from "openclaw/plugin-sdk/irc";
9
+ import {
10
+ promptAccountId,
11
+ promptChannelAccessConfig,
12
+ } from "openclaw/plugin-sdk/matrix";
13
+ import type {
14
+ ChannelSetupAdapter as ChannelOnboardingAdapter,
15
+ ChannelSetupDmPolicy as ChannelOnboardingDmPolicy,
16
+ } from "openclaw/plugin-sdk/setup";
13
17
  import {
14
18
  listMeshtasticAccountIds,
15
19
  resolveDefaultMeshtasticAccountId,
package/src/send.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
 
3
- import { stripMarkdown } from "openclaw/plugin-sdk";
3
+ import { stripMarkdown } from "openclaw/plugin-sdk/text-runtime";
4
4
 
5
5
  import { resolveMeshtasticAccount } from "./accounts.js";
6
6
  import { hexToNodeNum, normalizeMeshtasticMessagingTarget } from "./normalize.js";
@@ -53,7 +53,7 @@ export async function sendMessageMeshtastic(
53
53
  if (!account.configured) {
54
54
  throw new Error(
55
55
  `Meshtastic is not configured for account "${account.accountId}". ` +
56
- `Run 'openclaw setup' or set channels.meshtastic.transport and connection details in config.`,
56
+ `Run 'openclaw onboard' or set channels.meshtastic.transport and connection details in config.`,
57
57
  );
58
58
  }
59
59
 
package/src/types.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { BaseProbeResult } from "openclaw/plugin-sdk";
2
1
  import type {
2
+ BaseProbeResult,
3
3
  BlockStreamingCoalesceConfig,
4
4
  DmConfig,
5
5
  DmPolicy,
@@ -8,7 +8,7 @@ import type {
8
8
  GroupToolPolicyConfig,
9
9
  MarkdownConfig,
10
10
  OpenClawConfig,
11
- } from "openclaw/plugin-sdk";
11
+ } from "openclaw/plugin-sdk/irc";
12
12
 
13
13
  export type MeshtasticChannelConfig = {
14
14
  requireMention?: boolean;