@seeed-studio/meshtastic 0.1.1 → 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/publish.yml +25 -0
- package/.github/workflows/readme-translate.yml +166 -0
- package/AGENTS.md +172 -0
- package/LICENSE +21 -0
- package/README.es.md +337 -0
- package/README.fr.md +350 -0
- package/README.ja.md +344 -0
- package/README.md +262 -88
- package/README.pt.md +337 -0
- package/README.zh-CN.md +337 -0
- package/package.json +4 -3
- package/src/channel.ts +70 -17
- package/src/client.ts +108 -17
- package/src/config-schema.ts +37 -7
- package/src/inbound.ts +19 -4
- package/src/monitor.ts +131 -104
- package/src/mqtt-client.ts +30 -6
- package/src/normalize.ts +12 -4
- package/src/onboarding.ts +116 -28
- package/src/policy.ts +6 -2
- package/src/send.ts +13 -7
- package/src/types.ts +4 -2
package/README.pt.md
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# MeshClaw: Plugin de Canal Meshtastic para OpenClaw
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="https://www.npmjs.com/package/@seeed-studio/meshtastic">
|
|
5
|
+
<img alt="versão do 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="licença" src="https://img.shields.io/npm/l/@seeed-studio/meshtastic.svg" />
|
|
9
|
+
</a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<!-- LANG_SWITCHER_START -->
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="README.md">English</a> | <a href="README.zh-CN.md">中文</a> | <a href="README.ja.md">日本語</a> | <a href="README.fr.md">Français</a> | <b>Português</b> | <a href="README.es.md">Español</a>
|
|
15
|
+
</p>
|
|
16
|
+
<!-- LANG_SWITCHER_END -->
|
|
17
|
+
|
|
18
|
+
O MeshClaw é um plugin de canal do OpenClaw que permite ao seu gateway de IA enviar e receber mensagens via Meshtastic — sem internet, sem torres de celular, apenas ondas de rádio. Converse com seu assistente de IA das montanhas, do oceano ou de qualquer lugar onde a rede não chega.
|
|
19
|
+
|
|
20
|
+
⭐ Dê uma estrela no GitHub — isso nos motiva muito!
|
|
21
|
+
|
|
22
|
+
> [!IMPORTANT]
|
|
23
|
+
> Este é um plugin de canal para o gateway de IA [OpenClaw](https://github.com/openclaw/openclaw) — não é um aplicativo independente. Você precisa de uma instância do OpenClaw em execução (Node.js 22+) para usá-lo.
|
|
24
|
+
|
|
25
|
+
[Documentação][docs] · [Guia de Hardware](#hardware-recomendado) · [Reportar Problema][issues] · [Solicitar Recurso][issues]
|
|
26
|
+
|
|
27
|
+
## Sumário
|
|
28
|
+
|
|
29
|
+
- [Como Funciona](#como-funciona)
|
|
30
|
+
- [Hardware Recomendado](#hardware-recomendado)
|
|
31
|
+
- [Recursos](#recursos)
|
|
32
|
+
- [Capacidades e Roteiro](#capacidades-e-roteiro)
|
|
33
|
+
- [Demonstração](#demonstração)
|
|
34
|
+
- [Início Rápido](#início-rápido)
|
|
35
|
+
- [Assistente de Configuração](#assistente-de-configuração)
|
|
36
|
+
- [Configuração](#1-transporte)
|
|
37
|
+
- [Solução de Problemas](#2-região-lora)
|
|
38
|
+
- [Desenvolvimento](#3-nome-do-nó)
|
|
39
|
+
- [Contribuindo](#4-acesso-a-canais-grouppolicy)
|
|
40
|
+
|
|
41
|
+
## Como Funciona
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart LR
|
|
45
|
+
subgraph mesh ["📻 LoRa Mesh Network"]
|
|
46
|
+
N["Meshtastic Nodes"]
|
|
47
|
+
end
|
|
48
|
+
subgraph gw ["⚙️ OpenClaw Gateway"]
|
|
49
|
+
P["Meshtastic Plugin"]
|
|
50
|
+
AI["AI Agent"]
|
|
51
|
+
end
|
|
52
|
+
N -- "Serial (USB)" --> P
|
|
53
|
+
N -- "HTTP (WiFi)" --> P
|
|
54
|
+
N -. "MQTT (Broker)" .-> P
|
|
55
|
+
P <--> AI
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
O plugin faz a ponte entre dispositivos LoRa Meshtastic e o agente de IA do OpenClaw. Ele suporta três modos de transporte:
|
|
59
|
+
|
|
60
|
+
- Serial — conexão USB direta com um dispositivo Meshtastic local
|
|
61
|
+
- HTTP — conecta-se a um dispositivo via Wi-Fi / rede local
|
|
62
|
+
- MQTT — assina um broker MQTT do Meshtastic, sem necessidade de hardware local
|
|
63
|
+
|
|
64
|
+
Mensagens de entrada passam por controle de acesso (política de DM, política de grupo, exigência de menção) antes de chegar à IA. As respostas de saída têm a formatação Markdown removida (os dispositivos LoRa não a renderizam) e são fragmentadas para caber nos limites de tamanho dos pacotes de rádio.
|
|
65
|
+
|
|
66
|
+
## Hardware Recomendado
|
|
67
|
+
|
|
68
|
+
<p align="center">
|
|
69
|
+
<img src="media/XIAOclaw.png" width="760" alt="Dispositivo Meshtastic com módulo Seeed XIAO" />
|
|
70
|
+
</p>
|
|
71
|
+
|
|
72
|
+
| Dispositivo | Melhor para | Link |
|
|
73
|
+
| ----------------------------- | ------------------------ | --------------- |
|
|
74
|
+
| XIAO ESP32S3 + Wio-SX1262 kit | Desenvolvimento inicial | [Comprar][hw-xiao] |
|
|
75
|
+
| Wio Tracker L1 Pro | Gateway de campo portátil | [Comprar][hw-wio] |
|
|
76
|
+
| SenseCAP Card Tracker T1000-E | Rastreador compacto | [Comprar][hw-sensecap] |
|
|
77
|
+
|
|
78
|
+
Sem hardware? O transporte via MQTT conecta-se através do broker — nenhum dispositivo local é necessário.
|
|
79
|
+
|
|
80
|
+
Qualquer dispositivo compatível com Meshtastic funciona.
|
|
81
|
+
|
|
82
|
+
## Recursos
|
|
83
|
+
|
|
84
|
+
- Integração com Agente de IA — Faz a ponte entre agentes de IA do OpenClaw e redes de malha LoRa Meshtastic. Habilita comunicação inteligente sem dependência da nuvem.
|
|
85
|
+
|
|
86
|
+
- Três Modos de Transporte — Suporte a Serial (USB), HTTP (Wi-Fi) e MQTT
|
|
87
|
+
|
|
88
|
+
- Canais de DM e Grupo com Controle de Acesso — Suporta ambos os modos de conversa com listas de permissão para DMs, regras de resposta por canal e exigência de menção
|
|
89
|
+
|
|
90
|
+
- Suporte a Múltiplas Contas — Execute várias conexões independentes simultaneamente
|
|
91
|
+
|
|
92
|
+
- Comunicação Resiliente na Malha — Reconexão automática com tentativas configuráveis. Lida bem com quedas de conexão.
|
|
93
|
+
|
|
94
|
+
## Capacidades e Roteiro
|
|
95
|
+
|
|
96
|
+
O plugin trata o Meshtastic como um canal de primeira classe — como Telegram ou Discord — permitindo conversas com IA e invocação de habilidades inteiramente via rádio LoRa, sem dependência de internet.
|
|
97
|
+
|
|
98
|
+
| Consultar Informações Offline | Ponte entre Canais: Envie fora da rede, receba em qualquer lugar | 🔜 Próximos passos: |
|
|
99
|
+
| ----------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
100
|
+
| <img src="media/image1.png" alt="Consultar Informações Offline" /> | <img src="media/image2.png" alt="Ponte entre Canais" /> | Planejamos ingerir dados em tempo real dos nós (localização GPS, sensores ambientais, status do dispositivo) no contexto do OpenClaw, permitindo que a IA monitore a saúde da rede de malha e transmita alertas proativos sem esperar por perguntas dos usuários. |
|
|
101
|
+
|
|
102
|
+
## Demonstração
|
|
103
|
+
|
|
104
|
+
<div align="center">
|
|
105
|
+
|
|
106
|
+
https://github.com/user-attachments/assets/837062d9-a5bb-4e0a-b7cf-298e4bdf2f7c
|
|
107
|
+
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
Alternativa: [media/demo.mp4](media/demo.mp4)
|
|
111
|
+
|
|
112
|
+
## Início Rápido
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# 1. Install plugin
|
|
116
|
+
openclaw plugins install @seeed-studio/meshtastic
|
|
117
|
+
|
|
118
|
+
# 2. Guided setup — walks you through transport, region, and access policy
|
|
119
|
+
openclaw onboard
|
|
120
|
+
|
|
121
|
+
# 3. Verify
|
|
122
|
+
openclaw channels status --probe
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
<p align="center">
|
|
126
|
+
<img src="media/setup-screenshot.png" width="700" alt="Assistente de configuração do OpenClaw" />
|
|
127
|
+
</p>
|
|
128
|
+
|
|
129
|
+
## Assistente de Configuração
|
|
130
|
+
|
|
131
|
+
Executar `openclaw onboard` inicia um assistente interativo que guia você por cada etapa de configuração. Abaixo está o significado de cada etapa e como escolher.
|
|
132
|
+
|
|
133
|
+
### 1. Transporte
|
|
134
|
+
|
|
135
|
+
Como o gateway se conecta à malha Meshtastic:
|
|
136
|
+
|
|
137
|
+
| Opção | Descrição | Requisitos |
|
|
138
|
+
| ----------------- | ------------------------------------------------------------- | ------------------------------------------------- |
|
|
139
|
+
| Serial (USB) | Conexão USB direta a um dispositivo local. Detecta portas automaticamente. | Dispositivo Meshtastic conectado via USB |
|
|
140
|
+
| HTTP (Wi-Fi) | Conecta a um dispositivo na rede local. | IP ou hostname do dispositivo (ex.: `meshtastic.local`) |
|
|
141
|
+
| MQTT (broker) | Conecta à malha via um broker MQTT — sem necessidade de hardware local. | Endereço do broker, credenciais e tópico de assinatura |
|
|
142
|
+
|
|
143
|
+
### 2. Região LoRa
|
|
144
|
+
|
|
145
|
+
> Somente Serial e HTTP. O MQTT obtém a região a partir do tópico de assinatura.
|
|
146
|
+
|
|
147
|
+
Define a região de frequência de rádio no dispositivo. Deve corresponder às regulamentações locais e aos outros nós da malha. Opções comuns:
|
|
148
|
+
|
|
149
|
+
| Região | Frequência |
|
|
150
|
+
| -------- | ------------------- |
|
|
151
|
+
| US | 902–928 MHz |
|
|
152
|
+
| EU_868 | 869 MHz |
|
|
153
|
+
| CN | 470–510 MHz |
|
|
154
|
+
| JP | 920 MHz |
|
|
155
|
+
| UNSET | Manter padrão do dispositivo |
|
|
156
|
+
|
|
157
|
+
Veja a [documentação de regiões do Meshtastic](https://meshtastic.org/docs/getting-started/initial-config/#lora) para a lista completa.
|
|
158
|
+
|
|
159
|
+
### 3. Nome do Nó
|
|
160
|
+
|
|
161
|
+
O nome de exibição do dispositivo na malha. Também é usado como o gatilho de @menção em canais de grupo — outros usuários enviam `@OpenClaw` para falar com seu bot.
|
|
162
|
+
|
|
163
|
+
- Serial / HTTP: opcional — detecta automaticamente do dispositivo conectado se deixar em branco.
|
|
164
|
+
- MQTT: obrigatório — não há dispositivo físico do qual ler o nome.
|
|
165
|
+
|
|
166
|
+
### 4. Acesso a Canais (groupPolicy)
|
|
167
|
+
|
|
168
|
+
Controla se e como o bot responde em canais de grupo da malha (por exemplo, LongFast, Emergency):
|
|
169
|
+
|
|
170
|
+
| Política | Comportamento |
|
|
171
|
+
| ------------------- | ------------------------------------------------------------ |
|
|
172
|
+
| `disabled` (padrão) | Ignora todas as mensagens de canais de grupo. Somente DMs são processadas. |
|
|
173
|
+
| `open` | Responde em todos os canais da malha. |
|
|
174
|
+
| `allowlist` | Responde apenas nos canais listados. Você será solicitado a informar os nomes dos canais (separados por vírgulas, ex.: `LongFast, Emergency`). Use `*` como curinga para corresponder a todos. |
|
|
175
|
+
|
|
176
|
+
### 5. Exigir Menção
|
|
177
|
+
|
|
178
|
+
> Aparece apenas quando o acesso a canais está habilitado (não `disabled`).
|
|
179
|
+
|
|
180
|
+
Quando habilitado (padrão: sim), o bot só responde em canais de grupo quando alguém menciona seu nome de nó (ex.: `@OpenClaw como está o tempo?`). Isso evita que o bot responda a todas as mensagens do canal.
|
|
181
|
+
|
|
182
|
+
Quando desabilitado, o bot responde a todas as mensagens nos canais permitidos.
|
|
183
|
+
|
|
184
|
+
### 6. Política de Acesso a DM (dmPolicy)
|
|
185
|
+
|
|
186
|
+
Controla quem pode enviar mensagens diretas ao bot:
|
|
187
|
+
|
|
188
|
+
| Política | Comportamento |
|
|
189
|
+
| ------------------ | ------------------------------------------------------------- |
|
|
190
|
+
| `pairing` (padrão) | Novos remetentes disparam um pedido de pareamento que deve ser aprovado antes de poderem conversar. |
|
|
191
|
+
| `open` | Qualquer pessoa na malha pode enviar DMs livremente. |
|
|
192
|
+
| `allowlist` | Somente nós listados em `allowFrom` podem enviar DM. Todos os outros são ignorados. |
|
|
193
|
+
|
|
194
|
+
### 7. Lista de Permissões de DM (allowFrom)
|
|
195
|
+
|
|
196
|
+
> Aparece apenas quando `dmPolicy` é `allowlist`, ou quando o assistente determina que é necessário.
|
|
197
|
+
|
|
198
|
+
Uma lista de IDs de Usuário Meshtastic autorizados a enviar mensagens diretas. Formato: `!aabbccdd` (ID de usuário em hex). Entradas múltiplas são separadas por vírgulas.
|
|
199
|
+
|
|
200
|
+
<p align="center">
|
|
201
|
+
<img src="media/image3.jpg" width="400" />
|
|
202
|
+
</p>
|
|
203
|
+
|
|
204
|
+
### 8. Nomes de Exibição das Contas
|
|
205
|
+
|
|
206
|
+
> Aparece apenas para configurações com várias contas. Opcional.
|
|
207
|
+
|
|
208
|
+
Atribui nomes amigáveis às suas contas. Por exemplo, uma conta com ID `home` pode ser exibida como "Estação Casa". Se ignorado, o ID bruto da conta é usado como está. Isso é puramente cosmético e não afeta a funcionalidade.
|
|
209
|
+
|
|
210
|
+
## Configuração
|
|
211
|
+
|
|
212
|
+
A configuração guiada (`openclaw onboard`) cobre tudo abaixo. Veja o [Assistente de Configuração](#assistente-de-configuração) para um passo a passo. Para configurar manualmente, edite com `openclaw config edit`.
|
|
213
|
+
|
|
214
|
+
### Serial (USB)
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
channels:
|
|
218
|
+
meshtastic:
|
|
219
|
+
transport: serial
|
|
220
|
+
serialPort: /dev/ttyUSB0
|
|
221
|
+
nodeName: OpenClaw
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### HTTP (Wi-Fi)
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
channels:
|
|
228
|
+
meshtastic:
|
|
229
|
+
transport: http
|
|
230
|
+
httpAddress: meshtastic.local
|
|
231
|
+
nodeName: OpenClaw
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### MQTT (broker)
|
|
235
|
+
|
|
236
|
+
```yaml
|
|
237
|
+
channels:
|
|
238
|
+
meshtastic:
|
|
239
|
+
transport: mqtt
|
|
240
|
+
nodeName: OpenClaw
|
|
241
|
+
mqtt:
|
|
242
|
+
broker: mqtt.meshtastic.org
|
|
243
|
+
username: meshdev
|
|
244
|
+
password: large4cats
|
|
245
|
+
topic: "msh/US/2/json/#"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Várias contas
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
channels:
|
|
252
|
+
meshtastic:
|
|
253
|
+
accounts:
|
|
254
|
+
home:
|
|
255
|
+
transport: serial
|
|
256
|
+
serialPort: /dev/ttyUSB0
|
|
257
|
+
remote:
|
|
258
|
+
transport: mqtt
|
|
259
|
+
mqtt:
|
|
260
|
+
broker: mqtt.meshtastic.org
|
|
261
|
+
topic: "msh/US/2/json/#"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
<details>
|
|
265
|
+
<summary><b>Referência de Todas as Opções</b></summary>
|
|
266
|
+
|
|
267
|
+
| Chave | Tipo | Padrão | Observações |
|
|
268
|
+
| ------------------- | ------------------------------ | -------------------- | ---------------------------------------------------------- |
|
|
269
|
+
| `transport` | `serial \| http \| mqtt` | `serial` | |
|
|
270
|
+
| `serialPort` | `string` | — | Obrigatório para serial |
|
|
271
|
+
| `httpAddress` | `string` | `meshtastic.local` | Obrigatório para 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/#` | Tópico de assinatura |
|
|
278
|
+
| `mqtt.publishTopic` | `string` | derivado | |
|
|
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`. Apenas Serial/HTTP. |
|
|
281
|
+
| `nodeName` | `string` | auto-detect | Nome de exibição e gatilho de @menção. Obrigatório para MQTT. |
|
|
282
|
+
| `dmPolicy` | `open \| pairing \| allowlist` | `pairing` | Quem pode enviar mensagens diretas. Veja [Política de Acesso a DM](#6-política-de-acesso-a-dm-dmpolicy). |
|
|
283
|
+
| `allowFrom` | `string[]` | — | IDs de nós para a lista de permissões de DM, ex.: `["!aabbccdd"]` |
|
|
284
|
+
| `groupPolicy` | `open \| allowlist \| disabled`| `disabled` | Política de resposta em canais de grupo. Veja [Acesso a Canais](#4-acesso-a-canais-grouppolicy). |
|
|
285
|
+
| `channels` | `Record<string, object>` | — | Substituições por canal: `requireMention`, `allowFrom`, `tools` |
|
|
286
|
+
|
|
287
|
+
</details>
|
|
288
|
+
|
|
289
|
+
<details>
|
|
290
|
+
<summary><b>Substituições por Variáveis de Ambiente</b></summary>
|
|
291
|
+
|
|
292
|
+
Estas substituem a configuração da conta padrão (o YAML tem precedência para contas nomeadas):
|
|
293
|
+
|
|
294
|
+
| Variável | Chave de config equivalente |
|
|
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` |
|
|
301
|
+
|
|
302
|
+
</details>
|
|
303
|
+
|
|
304
|
+
## Solução de Problemas
|
|
305
|
+
|
|
306
|
+
| Sintoma | Verifique |
|
|
307
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
308
|
+
| Serial não conecta | Caminho do dispositivo correto? O host tem permissão? |
|
|
309
|
+
| HTTP não conecta | `httpAddress` acessível? `httpTls` corresponde ao do dispositivo? |
|
|
310
|
+
| MQTT não recebe nada | Região em `mqtt.topic` correta? Credenciais do broker válidas? |
|
|
311
|
+
| Sem respostas em DM | `dmPolicy` e `allowFrom` configurados? Veja [Política de Acesso a DM](#6-política-de-acesso-a-dm-dmpolicy). |
|
|
312
|
+
| Sem respostas em grupo | `groupPolicy` habilitada? Canal na lista de permissões? Menção exigida? Veja [Acesso a Canais](#4-acesso-a-canais-grouppolicy). |
|
|
313
|
+
|
|
314
|
+
Encontrou um bug? [Abra uma issue][issues] com o tipo de transporte, configuração (redija segredos) e a saída de `openclaw channels status --probe`.
|
|
315
|
+
|
|
316
|
+
## Desenvolvimento
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
git clone https://github.com/Seeed-Solution/MeshClaw.git
|
|
320
|
+
cd MeshClaw
|
|
321
|
+
npm install
|
|
322
|
+
openclaw plugins install -l ./MeshClaw
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
Sem etapa de build — o OpenClaw carrega o código-fonte TypeScript diretamente. Use `openclaw channels status --probe` para verificar.
|
|
326
|
+
|
|
327
|
+
## Contribuindo
|
|
328
|
+
|
|
329
|
+
- [Abra uma issue][issues] para bugs ou pedidos de recursos
|
|
330
|
+
- Pull requests são bem-vindos — mantenha o código alinhado com as convenções existentes de TypeScript
|
|
331
|
+
|
|
332
|
+
<!-- Links em estilo de referência -->
|
|
333
|
+
[docs]: https://meshtastic.org/docs/
|
|
334
|
+
[issues]: https://github.com/Seeed-Solution/MeshClaw/issues
|
|
335
|
+
[hw-xiao]: https://www.seeedstudio.com/Wio-SX1262-with-XIAO-ESP32S3-p-5982.html
|
|
336
|
+
[hw-wio]: https://www.seeedstudio.com/Wio-Tracker-L1-Pro-p-6454.html
|
|
337
|
+
[hw-sensecap]: https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# MeshClaw:OpenClaw Meshtastic 频道插件
|
|
2
|
+
|
|
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>
|
|
11
|
+
|
|
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 -->
|
|
17
|
+
|
|
18
|
+
MeshClaw 是一个 OpenClaw 频道插件,让你的 AI 网关通过 Meshtastic 发送和接收消息——无需互联网、无需蜂窝网络,只靠电波。在山里、海上,或任何不在电网覆盖范围的地方,都能与 AI 助手沟通。
|
|
19
|
+
|
|
20
|
+
⭐ 欢迎在 GitHub 上为我们点 Star——这对我们很有激励!
|
|
21
|
+
|
|
22
|
+
> [!IMPORTANT]
|
|
23
|
+
> 这是用于 [OpenClaw](https://github.com/openclaw/openclaw) AI 网关的“频道插件”,并非独立应用。使用前需要一个已运行的 OpenClaw 实例(Node.js 22+)。
|
|
24
|
+
|
|
25
|
+
[文档][docs] · [硬件指南](#recommended-hardware) · [提交 Bug][issues] · [功能请求][issues]
|
|
26
|
+
|
|
27
|
+
## 目录
|
|
28
|
+
|
|
29
|
+
- [工作原理](#工作原理)
|
|
30
|
+
- [推荐硬件](#推荐硬件)
|
|
31
|
+
- [功能](#功能)
|
|
32
|
+
- [能力与路线图](#能力与路线图)
|
|
33
|
+
- [演示](#演示)
|
|
34
|
+
- [快速开始](#快速开始)
|
|
35
|
+
- [设置向导](#设置向导)
|
|
36
|
+
- [配置](#1-传输方式)
|
|
37
|
+
- [故障排查](#2-lora-区域)
|
|
38
|
+
- [开发](#3-节点名称)
|
|
39
|
+
- [贡献](#4-频道访问grouppolicy)
|
|
40
|
+
|
|
41
|
+
## 工作原理
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart LR
|
|
45
|
+
subgraph mesh ["📻 LoRa Mesh Network"]
|
|
46
|
+
N["Meshtastic Nodes"]
|
|
47
|
+
end
|
|
48
|
+
subgraph gw ["⚙️ OpenClaw Gateway"]
|
|
49
|
+
P["Meshtastic Plugin"]
|
|
50
|
+
AI["AI Agent"]
|
|
51
|
+
end
|
|
52
|
+
N -- "Serial (USB)" --> P
|
|
53
|
+
N -- "HTTP (WiFi)" --> P
|
|
54
|
+
N -. "MQTT (Broker)" .-> P
|
|
55
|
+
P <--> AI
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
该插件在 Meshtastic LoRa 设备与 OpenClaw AI 代理之间建立桥接。支持三种传输模式:
|
|
59
|
+
|
|
60
|
+
- 串口(Serial)——通过 USB 直连本地 Meshtastic 设备
|
|
61
|
+
- HTTP ——通过 WiFi/局域网连接设备
|
|
62
|
+
- MQTT ——订阅 Meshtastic MQTT 代理,无需本地硬件
|
|
63
|
+
|
|
64
|
+
入站消息会经过访问控制(私信策略、群组策略、@提及门槛)后再交给 AI。出站回复会移除 Markdown 格式(LoRa 设备无法渲染),并按无线电数据包大小限制进行分片发送。
|
|
65
|
+
|
|
66
|
+
## 推荐硬件
|
|
67
|
+
|
|
68
|
+
<p align="center">
|
|
69
|
+
<img src="media/XIAOclaw.png" width="760" alt="搭载 Seeed XIAO 模组的 Meshtastic 设备" />
|
|
70
|
+
</p>
|
|
71
|
+
|
|
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 的设备都可以使用。
|
|
81
|
+
|
|
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 网络健康状况,并主动广播告警,而无需等待用户发问。 |
|
|
101
|
+
|
|
102
|
+
## 演示
|
|
103
|
+
|
|
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
|
|
117
|
+
|
|
118
|
+
# 2. Guided setup — walks you through transport, region, and access policy
|
|
119
|
+
openclaw onboard
|
|
120
|
+
|
|
121
|
+
# 3. Verify
|
|
122
|
+
openclaw channels status --probe
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
<p align="center">
|
|
126
|
+
<img src="media/setup-screenshot.png" width="700" alt="OpenClaw 设置向导" />
|
|
127
|
+
</p>
|
|
128
|
+
|
|
129
|
+
## 设置向导
|
|
130
|
+
|
|
131
|
+
运行 `openclaw onboard` 会启动交互式向导,引导你完成每一步配置。下面解释每一步的含义与选择建议。
|
|
132
|
+
|
|
133
|
+
### 1. 传输方式
|
|
134
|
+
|
|
135
|
+
网关如何连接到 Meshtastic Mesh:
|
|
136
|
+
|
|
137
|
+
| 选项 | 说明 | 要求 |
|
|
138
|
+
| ------------------ | ------------------------------------------------------------- | ---------------------------------------------- |
|
|
139
|
+
| 串口(Serial,USB) | 通过 USB 直连本地设备。可自动检测可用端口。 | 通过 USB 连接的 Meshtastic 设备 |
|
|
140
|
+
| HTTP(WiFi) | 通过局域网连接设备。 | 设备 IP 或主机名(如 `meshtastic.local`) |
|
|
141
|
+
| MQTT(代理) | 通过 MQTT 代理接入 Mesh——无需本地硬件。 | 代理地址、凭据与订阅主题 |
|
|
142
|
+
|
|
143
|
+
### 2. LoRa 区域
|
|
144
|
+
|
|
145
|
+
> 仅适用于串口与 HTTP。MQTT 会根据订阅主题推导区域。
|
|
146
|
+
|
|
147
|
+
设置设备的无线频段区域。必须符合当地法规,并与 Mesh 上其他节点一致。常见选项:
|
|
148
|
+
|
|
149
|
+
| 区域 | 频段 |
|
|
150
|
+
| -------- | ------------------ |
|
|
151
|
+
| `US` | 902–928 MHz |
|
|
152
|
+
| `EU_868` | 869 MHz |
|
|
153
|
+
| `CN` | 470–510 MHz |
|
|
154
|
+
| `JP` | 920 MHz |
|
|
155
|
+
| `UNSET` | 保持设备默认 |
|
|
156
|
+
|
|
157
|
+
完整列表参见 [Meshtastic 区域文档](https://meshtastic.org/docs/getting-started/initial-config/#lora)。
|
|
158
|
+
|
|
159
|
+
### 3. 节点名称
|
|
160
|
+
|
|
161
|
+
设备在 Mesh 上的显示名称。也作为群组频道中的“@提及触发词”——其他用户发送 `@OpenClaw` 与机器人对话。
|
|
162
|
+
|
|
163
|
+
- 串口/HTTP:可选——若留空,将自动从连接的设备读取名称。
|
|
164
|
+
- MQTT:必填——因为没有实体设备可读取名称。
|
|
165
|
+
|
|
166
|
+
### 4. 频道访问(groupPolicy)
|
|
167
|
+
|
|
168
|
+
控制机器人在“Mesh 群组频道”(如 LongFast、Emergency)中的响应策略:
|
|
169
|
+
|
|
170
|
+
| 策略 | 行为说明 |
|
|
171
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
172
|
+
| `disabled`(默认) | 忽略所有群组频道消息。仅处理私信。 |
|
|
173
|
+
| `open` | 在 Mesh 上的“所有”频道中响应。 |
|
|
174
|
+
| `allowlist` | 仅在“列出的”频道中响应。会提示输入频道名(逗号分隔,如 `LongFast, Emergency`)。使用 `*` 作为通配符匹配全部。 |
|
|
175
|
+
|
|
176
|
+
### 5. 需要 @提及
|
|
177
|
+
|
|
178
|
+
> 仅当频道访问已启用(非 `disabled`)时出现。
|
|
179
|
+
|
|
180
|
+
启用时(默认:是),机器人只在群组频道里被@到其节点名时才回应(例如 `@OpenClaw 天气怎么样?`)。这可避免机器人对频道中每一条消息都做出回复。
|
|
181
|
+
|
|
182
|
+
若关闭,则机器人会在允许的频道中对“所有”消息回复。
|
|
183
|
+
|
|
184
|
+
### 6. 私信访问策略(dmPolicy)
|
|
185
|
+
|
|
186
|
+
控制谁可以给机器人发送“私信”:
|
|
187
|
+
|
|
188
|
+
| 策略 | 行为说明 |
|
|
189
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
190
|
+
| `pairing`(默认) | 新发送者会触发配对请求,需先批准后才能聊天。 |
|
|
191
|
+
| `open` | Mesh 上任何人都可以自由私信机器人。 |
|
|
192
|
+
| `allowlist` | 只有 `allowFrom` 列表中的节点可以私信。其他一律忽略。 |
|
|
193
|
+
|
|
194
|
+
### 7. 私信白名单(allowFrom)
|
|
195
|
+
|
|
196
|
+
> 仅当 `dmPolicy` 为 `allowlist`,或向导判定需要时出现。
|
|
197
|
+
|
|
198
|
+
允许发送私信的 Meshtastic 用户 ID 列表。格式:`!aabbccdd`(16 进制用户 ID)。多个条目用逗号分隔。
|
|
199
|
+
|
|
200
|
+
<p align="center">
|
|
201
|
+
<img src="media/image3.jpg" width="400" />
|
|
202
|
+
</p>
|
|
203
|
+
|
|
204
|
+
### 8. 账号显示名称
|
|
205
|
+
|
|
206
|
+
> 仅对多账号配置显示。可选。
|
|
207
|
+
|
|
208
|
+
为你的账号分配易读的显示名称。比如,将 ID 为 `home` 的账号显示为 “Home Station”。若跳过,将直接使用原始账号 ID。仅用于显示,不影响功能。
|
|
209
|
+
|
|
210
|
+
## 配置
|
|
211
|
+
|
|
212
|
+
引导式设置(`openclaw onboard`)已覆盖以下所有内容。详见[设置向导](#setup-wizard)。若需手动配置,可用 `openclaw config edit` 编辑。
|
|
213
|
+
|
|
214
|
+
### 串口(USB)
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
channels:
|
|
218
|
+
meshtastic:
|
|
219
|
+
transport: serial
|
|
220
|
+
serialPort: /dev/ttyUSB0
|
|
221
|
+
nodeName: OpenClaw
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### HTTP(WiFi)
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
channels:
|
|
228
|
+
meshtastic:
|
|
229
|
+
transport: http
|
|
230
|
+
httpAddress: meshtastic.local
|
|
231
|
+
nodeName: OpenClaw
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### MQTT(代理)
|
|
235
|
+
|
|
236
|
+
```yaml
|
|
237
|
+
channels:
|
|
238
|
+
meshtastic:
|
|
239
|
+
transport: mqtt
|
|
240
|
+
nodeName: OpenClaw
|
|
241
|
+
mqtt:
|
|
242
|
+
broker: mqtt.meshtastic.org
|
|
243
|
+
username: meshdev
|
|
244
|
+
password: large4cats
|
|
245
|
+
topic: "msh/US/2/json/#"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 多账号
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
channels:
|
|
252
|
+
meshtastic:
|
|
253
|
+
accounts:
|
|
254
|
+
home:
|
|
255
|
+
transport: serial
|
|
256
|
+
serialPort: /dev/ttyUSB0
|
|
257
|
+
remote:
|
|
258
|
+
transport: mqtt
|
|
259
|
+
mqtt:
|
|
260
|
+
broker: mqtt.meshtastic.org
|
|
261
|
+
topic: "msh/US/2/json/#"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
<details>
|
|
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` |
|
|
286
|
+
|
|
287
|
+
</details>
|
|
288
|
+
|
|
289
|
+
<details>
|
|
290
|
+
<summary><b>环境变量覆盖</b></summary>
|
|
291
|
+
|
|
292
|
+
这些环境变量会覆盖“默认账号”的配置(对命名账号,以 YAML 配置为准):
|
|
293
|
+
|
|
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` |
|
|
301
|
+
|
|
302
|
+
</details>
|
|
303
|
+
|
|
304
|
+
## 故障排查
|
|
305
|
+
|
|
306
|
+
| 现象 | 检查点 |
|
|
307
|
+
| --------------------- | ----------------------------------------------------------- |
|
|
308
|
+
| 串口无法连接 | 设备路径是否正确?主机是否有访问权限? |
|
|
309
|
+
| HTTP 无法连接 | `httpAddress` 是否可达?`httpTls` 是否与设备设置匹配? |
|
|
310
|
+
| MQTT 没有收到消息 | `mqtt.topic` 中的区域是否正确?代理凭据是否有效? |
|
|
311
|
+
| 私信没响应 | `dmPolicy` 与 `allowFrom` 是否配置?见[私信访问策略](#6-私信访问策略-dmpolicy)。 |
|
|
312
|
+
| 群组无回复 | `groupPolicy` 是否启用?频道是否在白名单?是否需要 @提及?见[频道访问](#4-频道访问-grouppolicy)。 |
|
|
313
|
+
|
|
314
|
+
发现 Bug?请[提交 Issue][issues],并附上传输类型、配置(注意去除敏感信息)以及 `openclaw channels status --probe` 的输出。
|
|
315
|
+
|
|
316
|
+
## 开发
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
git clone https://github.com/Seeed-Solution/MeshClaw.git
|
|
320
|
+
cd MeshClaw
|
|
321
|
+
npm install
|
|
322
|
+
openclaw plugins install -l ./MeshClaw
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
无需构建步骤——OpenClaw 会直接加载 TypeScript 源码。使用 `openclaw channels status --probe` 进行验证。
|
|
326
|
+
|
|
327
|
+
## 贡献
|
|
328
|
+
|
|
329
|
+
- 发现问题或需要新功能,请[提交 Issue][issues]
|
|
330
|
+
- 欢迎提交 PR——请保持代码风格与现有 TypeScript 约定一致
|
|
331
|
+
|
|
332
|
+
<!-- Reference-style links -->
|
|
333
|
+
[docs]: https://meshtastic.org/docs/
|
|
334
|
+
[issues]: https://github.com/Seeed-Solution/MeshClaw/issues
|
|
335
|
+
[hw-xiao]: https://www.seeedstudio.com/Wio-SX1262-with-XIAO-ESP32S3-p-5982.html
|
|
336
|
+
[hw-wio]: https://www.seeedstudio.com/Wio-Tracker-L1-Pro-p-6454.html
|
|
337
|
+
[hw-sensecap]: https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-E-for-Meshtastic-p-5913.html
|