关于 meshcore-packet-capture
MeshCore Packet Capture 是用于操作和排查 MeshCore Companion 无线电设备抓包的技能,适用于配置、部署和维护场景。它覆盖 BLE、串口和 TCP 传输,以及 MQTT 发布、载荷解码和邻居信息发布;不用于中继器或 RoomServer 抓包。
主要功能
- 01支持 BLE、串口和 TCP 捕获
- 02向 MQTT Broker 发布数据
- 03可选解码载荷与邻居信息
- 04通过 TOML 和环境变量配置
- 05支持 Docker 与系统服务部署
- 06提供日志和数据边界验证
适用场景
- 01排查 Companion 无线电连接
- 02将捕获数据发布到 MQTT
- 03配置解码或邻居信息发布
- 04验证服务部署与数据输出
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ magnus919/ agent-skills --skill meshcore-packet-capture安装后在 Claude Code 中输入/meshcore-packet-capture确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdevals/evals.jsonreferences/configuration.mddeployment-and-troubleshooting.mdsource-index.md详细介绍
MeshCore Packet Capture
在操作、配置、部署或排查 meshcore-packet-capture 时使用此技能,尤其是涉及 Companion 电台、BLE/串口/TCP 捕获、MQTT 发布、LetsMesh、TOML 配置、Docker、systemd、launchd 或 NixOS 的请求。
范围边界
此项目仅从 MeshCore Companion 电台捕获数据。不要在此处处理中继器或 RoomServer 捕获;请改用 meshcoretomqtt。
操作工作流
- 更改配置前,先确定传输方式:
ble:直接指定地址、设备名称或进行常规扫描。serial:一个或多个串口;运行时使用第一个已配置的串口。tcp:主机和端口;默认启用 SDK 自动重连。
- 优先使用已安装的 CLI:
对于代码检出目录,请使用meshcore-packet-capture --help meshcore-packet-capture --debugpython3 -m meshcore_packet_capture或python3 packet_capture.py。 **已验证的 CLI 边界(v2.2.0):**解析器提供--output、--verbose、--debug、--no-mqtt、可重复使用的--config,以及邻居按需执行参数对--neighbors-now/--neighbors-exit(立即运行一次零跳邻居发现与 scopes 周期;使用--neighbors-exit时,在周期结束后退出)。它不提供--show-config或 dry-run 标志。记录文档或使用其他任何标志前,请先对实际安装的二进制运行--help;不要虚构配置预览命令。 - 配置一个 IATA 代码和至少一个 MQTT Broker,然后再期待上传网络数据。
LOC是占位符,不适合作为实际部署标识。 - 排查电台连接问题时,先使用
--no-mqtt。只有设备已能在本地捕获数据包后,再添加 MQTT。 - 每次更改后验证实际状态:设备连接日志、数据包输出、Broker 连接情况,以及服务/容器状态。不要把安装成功视为捕获正常运行的证明。
**变更门槛:**如果请求仅供只读或制定计划,不要把停止、启动、编辑、删除或重启命令作为待执行操作。请将未来可能执行的变更单独说明,并将每个示例标注为未执行;在首次变更前,必须确认目标、范围和回滚方案。
配置规则
配置优先级从高到低如下:
- 实际的
PACKETCAPTURE_*进程环境变量。 - TOML:先读取
/etc/meshcore-packet-capture/config.toml,再按排序读取config.d/*.toml。 - 工作目录/软件包目录中的旧版
.env.local,然后是.env。
使用多次 --config PATH,仅按顺序加载指定的 TOML 文件。后面的文件会覆盖前面的文件。TOML Broker 配置块按 name 合并;启用的 Broker 会依次展开为 PACKETCAPTURE_MQTT<n>_* 配置项。请将用户自定义覆盖项保存在 config.d/99-user.toml 中。
最简 TOML 结构:
[general]
iata = "SEA"
[capture]
connection_type = "serial"
# ble_pin = "123456" # optional six-digit PIN for BLE connections
[serial]
ports = ["/dev/ttyUSB0"]
[[broker]]
name = "home"
enabled = true
server = "mqtt.example.com"
port = 1883
transport = "tcp"
# include_decoded = true # publish the nested "decoded" object to this broker
# neighbors = true # publish the neighbors snapshot to this broker
[broker.auth]
method = "password"
username = "user"
password = "secret"
请阅读 references/configuration.md,了解完整选项映射、Broker 身份验证、主题模板、数据包过滤器和优先级边界情况。
可选功能块(v2.1.0+)
- 载荷解码(
decode_payloads、include_decoded、decode_hashtag_channels、decode_channel_keys、decode_include_public):添加一个包含纯文本/结构化字段的嵌套decoded对象。GRP_TXT 频道消息会被解密(发送者、文本),ADVERT 会被解析(名称、角色、纬度/经度),并附带易读的类型/路由标签和路径。原始字段保持不变。被动观察者无法解密直接消息(TXT_MSG)。默认关闭;在相应的[[broker]]块中设置include_decoded = true,即可为该代理启用。 - 发布邻居信息(每个代理的
neighbors,以及neighbors_interval_hours、neighbors_discover_window、neighbors_command_timeout、neighbors_scope_timeout、neighbors_scope_min_timeout、neighbors_scope_gap、neighbors_cycle_timeout、neighbors_max、neighbors_self_scopes):将定期零跳邻居表及每个邻居的区域范围发布到neighbors主题。默认关闭;仅当至少一个已启用的代理设置neighbors = true时,才会运行该周期任务。需要 IATA(或显式配置[broker.topics] neighbors)。间隔会限制在 12–336 小时,以匹配观察器固件。--neighbors-now/--neighbors-exit可按需触发周期任务。 - 日志轮转(
log_rotation= off|size|time、log_max_bytes、log_rotation_when、log_backup_count):仅当通过--output指定输出文件时适用。
MQTT 和身份验证
- 代理按顺序处理,数量没有固定上限。若缺少
MQTT<n>_ENABLED,发现过程就会终止,因此编号不要留空档。 - 支持的传输方式为
tcp和websockets;如需安全传输,请显式启用 TLS。 - 密码身份验证使用
username和password。 - 令牌身份验证使用 Ed25519 JWT 风格的令牌。如果已连接的无线电支持设备端签名,优先使用该方式;当存在有效的 64 字节私钥时,则使用 Python 签名作为备用方式。
- 切勿将私钥放入公开的技能、命令记录、已提交的
.env文件或共享的 Docker Compose 文件中。建议使用受保护的密钥文件或注入密钥。 - 主题占位符为
{IATA}、{IATA_lower}、{PUBLIC_KEY}和{TOKEN}。每个代理的主题配置会覆盖全局主题配置。除非显式配置,否则不会发布RAW。每个代理的主题包括:status、packets、decoded、debug、raw、neighbors。启用include_decoded时,decoded主题会携带嵌套的解码对象;启用neighbors时,neighbors主题会携带定期邻居快照。 - 对于使用令牌身份验证的代理,每个代理的
owner和email会覆盖全局的capture.owner_public_key/capture.owner_email。 - LetsMesh Analyzer 代理需要配置 IATA。部署 LetsMesh 时,请勿默认接受
LOC。
部署默认设置
可以使用旧式混合安装:systemd 或 launchd 单元可以包装用户主目录下的代码检出,并加载 .env.local,而不使用 /opt 或 /etc TOML 文件。选择现代托管安装路径之前,请检查正在运行的命令、工作目录、服务单元以及环境变量/配置来源。
- 手动/PyPI:
pipx install meshcore-packet-capture会安装 CLI,但不会安装后台服务。 - 托管式 Linux/macOS: root 引导安装程序会创建
/opt/meshcore-packet-capture、/etc/meshcore-packet-capture、虚拟环境和系统服务。默认安装最新发布版本;使用--tag或--branch固定版本。 - 用户服务(v2.1.0+): 对于 Linux 上的本地代码检出,
./install.sh --user-service会创建一个按用户运行的 systemd 服务,从代码检出的.venv启动(如果代码检出目录不是脚本所在目录,请传入--repo-dir PATH)。配置文件位于仓库本身(.env、.env.local、config.toml、config.d/)。从同一代码检出目录运行./uninstall.sh --user-service可移除服务;添加--remove-venv还会删除本地.venv。使用systemctl --user status|restart meshcore-packet-capture和journalctl --user -u meshcore-packet-capture -f管理服务。 - macOS BLE: 使用按用户运行的 LaunchAgent,因为蓝牙权限属于登录用户。Serial/TCP 可以使用 LaunchDaemon。
- Docker: 使用已发布的镜像或运行
docker compose up -d;Serial 需要设备映射,而 BLE 通常需要privileged: true,并且可能需要主机网络。Linux 是硬件访问最可靠的容器主机。 - NixOS: 使用
services.meshcore-packet-capture,并通过sudo nixos-rebuild switch重建。
阅读 references/deployment-and-troubleshooting.md,了解服务命令、Docker 硬件访问、迁移/更新行为以及有界诊断。
输出与验证
普通模式会输出最少的报文信息。--verbose 会附加 JSON 报文数据;--debug 会附加连接、重试、报文解析和 MQTT 诊断信息。--output PATH 会将报文数据写入文件。捕获的记录包含设备身份、时间戳、报文类型、路由、负载长度、原始十六进制数据、SNR、RSSI 和哈希值。启用 decode_payloads 后,记录还会包含嵌套的 decoded 对象,其中有便于阅读的字段(频道消息的发送者/文本、ADVERT 名称/角色/坐标、类型/路由标签)。
排查问题时,请按以下顺序收集证据:
- 运行
meshcore-packet-capture --debug --no-mqtt,并确认 BLE、Serial 或 TCP 连接正常。 - 确认报文记录出现在控制台或
--output文件中。 - 启用一个代理,并检查代理连接/重连消息。
- 检查解析后的环境变量/配置和主题名称,但不要打印机密信息。
- 对于托管服务,请检查服务自身的日志和状态。对于 Docker,请使用
docker compose config、docker compose ps和docker compose logs。
诊断期间不要删除安装目录、状态目录或配置。卸载程序会以交互方式运行并备份用户配置,但仍只会在确认后执行破坏性移除操作。
不适用场景
不要将此技能用于 MeshCore 中继器或 RoomServer 的报文捕获、通用 MQTT 管理,或在上游仓库中实施更改。对于代码更改,请使用仓库的贡献工作流,并单独验证项目测试。
参考资料
| 文件 | 加载时机 |
|---|---|
references/configuration.md | 编写 TOML/环境变量配置、MQTT 主题、身份验证或报文过滤器时 |
references/deployment-and-troubleshooting.md | 安装、升级、运行 Docker/systemd/launchd/NixOS,或调试故障服务时 |
references/source-index.md | 检查源码覆盖范围、版本标记,或根据上游重新验证此技能时 |
完成条件
当所选传输方式成功连接、本地观察到数据包、(若涉及 MQTT)预期的 MQTT 主题收到数据,且相关服务/容器报告健康时,即可停止。如果硬件、凭据或代理访问不可用,请准确说明未经验证的边界,不要声称已成功。