@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/.github/scripts/translate_readme.py +632 -0
- package/.github/translate/do-not-translate.md +6 -0
- package/.github/translate/glossary/es.md +23 -0
- package/.github/translate/glossary/fr.md +23 -0
- package/.github/translate/glossary/ja.md +23 -0
- package/.github/translate/glossary/pt.md +23 -0
- package/.github/translate/glossary/zh-CN.md +23 -0
- package/.github/translate/languages.json +37 -0
- package/.github/translate/prompts/es.md +16 -0
- package/.github/translate/prompts/fr.md +16 -0
- package/.github/translate/prompts/ja.md +17 -0
- package/.github/translate/prompts/pt.md +16 -0
- package/.github/translate/prompts/zh-CN.md +15 -0
- package/.github/workflows/readme-translate.yml +166 -0
- package/AGENTS.md +172 -0
- package/README.es.md +337 -0
- package/README.fr.md +350 -0
- package/README.ja.md +344 -0
- package/README.md +139 -101
- package/README.pt.md +337 -0
- package/README.zh-CN.md +183 -152
- package/package.json +4 -3
- package/src/channel.ts +3 -3
- package/src/config-schema.ts +1 -1
- package/src/inbound.ts +2 -2
- package/src/monitor.ts +3 -3
- package/src/onboarding.ts +9 -5
- package/src/send.ts +2 -2
- package/src/types.ts +2 -2
package/README.zh-CN.md
CHANGED
|
@@ -1,60 +1,52 @@
|
|
|
1
|
-
# OpenClaw Meshtastic
|
|
1
|
+
# MeshClaw:OpenClaw Meshtastic 频道插件
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
18
|
+
MeshClaw 是一个 OpenClaw 频道插件,让你的 AI 网关通过 Meshtastic 发送和接收消息——无需互联网、无需蜂窝网络,只靠电波。在山里、海上,或任何不在电网覆盖范围的地方,都能与 AI 助手沟通。
|
|
19
|
+
|
|
20
|
+
⭐ 欢迎在 GitHub 上为我们点 Star——这对我们很有激励!
|
|
9
21
|
|
|
10
22
|
> [!IMPORTANT]
|
|
11
|
-
>
|
|
23
|
+
> 这是用于 [OpenClaw](https://github.com/openclaw/openclaw) AI 网关的“频道插件”,并非独立应用。使用前需要一个已运行的 OpenClaw 实例(Node.js 22+)。
|
|
12
24
|
|
|
13
|
-
[文档][docs] · [硬件指南](
|
|
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
|
-
|
|
58
|
+
该插件在 Meshtastic LoRa 设备与 OpenClaw AI 代理之间建立桥接。支持三种传输模式:
|
|
67
59
|
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
60
|
+
- 串口(Serial)——通过 USB 直连本地 Meshtastic 设备
|
|
61
|
+
- HTTP ——通过 WiFi/局域网连接设备
|
|
62
|
+
- MQTT ——订阅 Meshtastic MQTT 代理,无需本地硬件
|
|
71
63
|
|
|
72
|
-
|
|
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 套件 |
|
|
83
|
-
| Wio Tracker L1 Pro
|
|
84
|
-
| SenseCAP Card Tracker T1000-E |
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
131
|
+
运行 `openclaw onboard` 会启动交互式向导,引导你完成每一步配置。下面解释每一步的含义与选择建议。
|
|
105
132
|
|
|
106
|
-
### 1.
|
|
133
|
+
### 1. 传输方式
|
|
107
134
|
|
|
108
|
-
网关如何连接到 Meshtastic
|
|
135
|
+
网关如何连接到 Meshtastic Mesh:
|
|
109
136
|
|
|
110
|
-
| 选项
|
|
111
|
-
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
137
|
+
| 选项 | 说明 | 要求 |
|
|
138
|
+
| ------------------ | ------------------------------------------------------------- | ---------------------------------------------- |
|
|
139
|
+
| 串口(Serial,USB) | 通过 USB 直连本地设备。可自动检测可用端口。 | 通过 USB 连接的 Meshtastic 设备 |
|
|
140
|
+
| HTTP(WiFi) | 通过局域网连接设备。 | 设备 IP 或主机名(如 `meshtastic.local`) |
|
|
141
|
+
| MQTT(代理) | 通过 MQTT 代理接入 Mesh——无需本地硬件。 | 代理地址、凭据与订阅主题 |
|
|
115
142
|
|
|
116
|
-
### 2. LoRa
|
|
143
|
+
### 2. LoRa 区域
|
|
117
144
|
|
|
118
|
-
>
|
|
145
|
+
> 仅适用于串口与 HTTP。MQTT 会根据订阅主题推导区域。
|
|
119
146
|
|
|
120
|
-
|
|
147
|
+
设置设备的无线频段区域。必须符合当地法规,并与 Mesh 上其他节点一致。常见选项:
|
|
121
148
|
|
|
122
|
-
| 区域
|
|
123
|
-
|
|
124
|
-
| `US`
|
|
125
|
-
| `EU_868` | 869 MHz
|
|
126
|
-
| `CN`
|
|
127
|
-
| `JP`
|
|
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.
|
|
159
|
+
### 3. 节点名称
|
|
133
160
|
|
|
134
|
-
设备在
|
|
161
|
+
设备在 Mesh 上的显示名称。也作为群组频道中的“@提及触发词”——其他用户发送 `@OpenClaw` 与机器人对话。
|
|
135
162
|
|
|
136
|
-
-
|
|
137
|
-
-
|
|
163
|
+
- 串口/HTTP:可选——若留空,将自动从连接的设备读取名称。
|
|
164
|
+
- MQTT:必填——因为没有实体设备可读取名称。
|
|
138
165
|
|
|
139
|
-
### 4.
|
|
166
|
+
### 4. 频道访问(groupPolicy)
|
|
140
167
|
|
|
141
|
-
|
|
168
|
+
控制机器人在“Mesh 群组频道”(如 LongFast、Emergency)中的响应策略:
|
|
142
169
|
|
|
143
|
-
| 策略
|
|
144
|
-
|
|
145
|
-
| `disabled`(默认)
|
|
146
|
-
| `open`
|
|
147
|
-
| `allowlist`
|
|
170
|
+
| 策略 | 行为说明 |
|
|
171
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
172
|
+
| `disabled`(默认) | 忽略所有群组频道消息。仅处理私信。 |
|
|
173
|
+
| `open` | 在 Mesh 上的“所有”频道中响应。 |
|
|
174
|
+
| `allowlist` | 仅在“列出的”频道中响应。会提示输入频道名(逗号分隔,如 `LongFast, Emergency`)。使用 `*` 作为通配符匹配全部。 |
|
|
148
175
|
|
|
149
|
-
### 5. 需要
|
|
176
|
+
### 5. 需要 @提及
|
|
150
177
|
|
|
151
|
-
>
|
|
178
|
+
> 仅当频道访问已启用(非 `disabled`)时出现。
|
|
152
179
|
|
|
153
|
-
|
|
180
|
+
启用时(默认:是),机器人只在群组频道里被@到其节点名时才回应(例如 `@OpenClaw 天气怎么样?`)。这可避免机器人对频道中每一条消息都做出回复。
|
|
154
181
|
|
|
155
|
-
|
|
182
|
+
若关闭,则机器人会在允许的频道中对“所有”消息回复。
|
|
156
183
|
|
|
157
|
-
### 6. 私信访问策略(
|
|
184
|
+
### 6. 私信访问策略(dmPolicy)
|
|
158
185
|
|
|
159
|
-
|
|
186
|
+
控制谁可以给机器人发送“私信”:
|
|
160
187
|
|
|
161
|
-
| 策略
|
|
162
|
-
|
|
163
|
-
| `pairing`(默认)
|
|
164
|
-
| `open`
|
|
165
|
-
| `allowlist`
|
|
188
|
+
| 策略 | 行为说明 |
|
|
189
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
190
|
+
| `pairing`(默认) | 新发送者会触发配对请求,需先批准后才能聊天。 |
|
|
191
|
+
| `open` | Mesh 上任何人都可以自由私信机器人。 |
|
|
192
|
+
| `allowlist` | 只有 `allowFrom` 列表中的节点可以私信。其他一律忽略。 |
|
|
166
193
|
|
|
167
|
-
### 7. 私信白名单(
|
|
194
|
+
### 7. 私信白名单(allowFrom)
|
|
168
195
|
|
|
169
|
-
>
|
|
196
|
+
> 仅当 `dmPolicy` 为 `allowlist`,或向导判定需要时出现。
|
|
170
197
|
|
|
171
|
-
允许发送私信的 Meshtastic
|
|
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.
|
|
204
|
+
### 8. 账号显示名称
|
|
174
205
|
|
|
175
|
-
>
|
|
206
|
+
> 仅对多账号配置显示。可选。
|
|
176
207
|
|
|
177
|
-
|
|
208
|
+
为你的账号分配易读的显示名称。比如,将 ID 为 `home` 的账号显示为 “Home Station”。若跳过,将直接使用原始账号 ID。仅用于显示,不影响功能。
|
|
178
209
|
|
|
179
210
|
## 配置
|
|
180
211
|
|
|
181
|
-
|
|
212
|
+
引导式设置(`openclaw onboard`)已覆盖以下所有内容。详见[设置向导](#setup-wizard)。若需手动配置,可用 `openclaw config edit` 编辑。
|
|
182
213
|
|
|
183
|
-
###
|
|
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
|
|
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
|
|
235
|
-
|
|
236
|
-
|
|
|
237
|
-
|
|
238
|
-
| `transport`
|
|
239
|
-
| `serialPort`
|
|
240
|
-
| `httpAddress`
|
|
241
|
-
| `httpTls`
|
|
242
|
-
| `mqtt.broker`
|
|
243
|
-
| `mqtt.port`
|
|
244
|
-
| `mqtt.username`
|
|
245
|
-
| `mqtt.password`
|
|
246
|
-
| `mqtt.topic`
|
|
247
|
-
| `mqtt.publishTopic`
|
|
248
|
-
| `mqtt.tls`
|
|
249
|
-
| `region`
|
|
250
|
-
| `nodeName`
|
|
251
|
-
| `dmPolicy`
|
|
252
|
-
| `allowFrom`
|
|
253
|
-
| `groupPolicy`
|
|
254
|
-
| `channels`
|
|
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
|
-
|
|
292
|
+
这些环境变量会覆盖“默认账号”的配置(对命名账号,以 YAML 配置为准):
|
|
262
293
|
|
|
263
|
-
|
|
|
264
|
-
|
|
265
|
-
| `MESHTASTIC_TRANSPORT`
|
|
266
|
-
| `MESHTASTIC_SERIAL_PORT`
|
|
267
|
-
| `MESHTASTIC_HTTP_ADDRESS`
|
|
268
|
-
| `MESHTASTIC_MQTT_BROKER`
|
|
269
|
-
| `MESHTASTIC_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
|
-
|
|
|
278
|
-
| HTTP 无法连接
|
|
279
|
-
| MQTT
|
|
280
|
-
|
|
|
281
|
-
|
|
|
306
|
+
| 现象 | 检查点 |
|
|
307
|
+
| --------------------- | ----------------------------------------------------------- |
|
|
308
|
+
| 串口无法连接 | 设备路径是否正确?主机是否有访问权限? |
|
|
309
|
+
| HTTP 无法连接 | `httpAddress` 是否可达?`httpTls` 是否与设备设置匹配? |
|
|
310
|
+
| MQTT 没有收到消息 | `mqtt.topic` 中的区域是否正确?代理凭据是否有效? |
|
|
311
|
+
| 私信没响应 | `dmPolicy` 与 `allowFrom` 是否配置?见[私信访问策略](#6-私信访问策略-dmpolicy)。 |
|
|
312
|
+
| 群组无回复 | `groupPolicy` 是否启用?频道是否在白名单?是否需要 @提及?见[频道访问](#4-频道访问-grouppolicy)。 |
|
|
282
313
|
|
|
283
|
-
发现
|
|
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/
|
|
289
|
-
cd
|
|
319
|
+
git clone https://github.com/Seeed-Solution/MeshClaw.git
|
|
320
|
+
cd MeshClaw
|
|
290
321
|
npm install
|
|
291
|
-
openclaw plugins install -l ./
|
|
322
|
+
openclaw plugins install -l ./MeshClaw
|
|
292
323
|
```
|
|
293
324
|
|
|
294
|
-
|
|
325
|
+
无需构建步骤——OpenClaw 会直接加载 TypeScript 源码。使用 `openclaw channels status --probe` 进行验证。
|
|
295
326
|
|
|
296
327
|
## 贡献
|
|
297
328
|
|
|
298
|
-
- [提交
|
|
299
|
-
-
|
|
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/
|
|
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.
|
|
4
|
-
"description": "OpenClaw Meshtastic LoRa mesh
|
|
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/
|
|
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
|
|
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
|
|
380
|
+
`Run 'openclaw onboard' or set channels.meshtastic.transport and connection details in config.`,
|
|
381
381
|
);
|
|
382
382
|
}
|
|
383
383
|
const transportDesc =
|
package/src/config-schema.ts
CHANGED
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
|
|
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
|
|
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
|
|
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;
|