OpenClaw AI助手接入蓝牙Mesh网络:离线通信与本地AI协作实践
1. 项目概述:当AI助手遇上蓝牙Mesh网络
如果你和我一样,对去中心化、离线优先的通信技术着迷,同时又希望自己的AI助手能摆脱对互联网的依赖,在本地网络中自由“交谈”,那么openclaw-bitchat这个项目绝对值得你花时间研究。简单来说,它是一个为 OpenClaw AI 助手框架设计的插件,让 OpenClaw 能够接入 Bitchat 这个基于蓝牙低功耗(BLE)的 P2P 网状网络。想象一下,你和几个朋友在同一个空间里,手机、电脑上的AI助手无需Wi-Fi或蜂窝网络,仅通过蓝牙就能互相传递消息、协作完成任务,这就是它要实现的场景。
这个项目目前还处于Alpha阶段,意味着它充满了探索的乐趣,但也伴随着API变动和不稳定性。它不是一个开箱即用的成熟产品,而更像是一个技术原型,为开发者、极客和隐私倡导者提供了一个将AI能力与本地Mesh网络结合的实验平台。它的核心价值在于,在互联网中断、需要高隐私性或特定线下协作的场景下,为AI助手开辟了一条全新的、去中心化的通信通道。
2. 核心架构与工作原理拆解
要理解openclaw-bitchat,我们必须先理清它所依赖的整个技术栈。它不是凭空变出蓝牙Mesh能力,而是作为一个“桥梁”或“适配器”,将 OpenClaw 的消息处理能力与底层的 Bitchat 网络连接起来。
2.1 三层架构解析
整个系统可以清晰地分为三层,理解每一层的职责是成功部署和调试的关键。
第一层:Bitchat 蓝牙 Mesh 网络层这是整个通信的物理和协议基础。Bitchat 本身是一个独立的项目(bitchat-node),它实现了基于 BLE 的 P2P 消息传递协议。在这一层,设备(节点)通过蓝牙广播和扫描发现彼此,形成一个自组织的网状网络。消息可以在节点间“跳跃”传递,从而扩展通信范围。这一层只关心一件事:把一小段数据(文本消息)从节点A可靠地传递到节点B或广播给所有节点。
第二层:HTTP 桥接服务层(bitchat-node)bitchat-node在实现 BLE Mesh 协议的同时,还暴露了一个关键的HTTP Bridge(默认在localhost:3939)。这个桥接层是核心创新点,它将原始的、事件驱动的蓝牙通信,转换成了标准的、请求/响应模式的 HTTP API。这样一来,任何能发起 HTTP 请求的程序(比如我们的 OpenClaw 插件)都能与 BLE Mesh 网络交互,而无需直接处理复杂的蓝牙栈操作。你可以把它想象成一个“翻译官”,把 Web 世界的语言翻译成蓝牙世界的语言。
第三层:OpenClaw 插件层(openclaw-bitchat)这是我们今天的主角。它作为 OpenClaw 框架的一个“频道”(Channel)插件存在。它的工作模式通常是这样的:
- 轮询或接收Webhook:插件定期向
bitchat-node的 HTTP Bridge 发起请求(如GET /api/messages),询问“有没有给我的新消息?”;或者,更高效的方式是,插件在 Bridge 上注册一个 Webhook 地址,当有新消息时,Bridge 会主动推送过来。 - 消息格式转换:将从 Bitchat 网络收到的原始消息,转换为 OpenClaw 内部能够理解的会话消息格式。
- 路由到会话:将转换后的消息递交给 OpenClaw Gateway,由 Gateway 根据配置决定将其路由到哪个 AI 会话或技能(Skill)进行处理。
- 发送消息:当 OpenClaw 需要向外发送消息时(例如,AI 生成的回复),插件接收指令,将其封装成 Bitchat 网络要求的格式,通过 HTTP Bridge 的
POST /api/send接口发送出去,最终经由蓝牙 Mesh 网络抵达目标设备。
2.2 通信流程与数据流向
让我们跟踪一条消息的完整生命周期:
- 发送方(iOS Bitchat App):用户在手机 App 上输入“明天几点开会?”,并指定发送给名为“我的AI助手”的节点(即你的电脑)。
- BLE Mesh 传输:手机通过蓝牙广播这条消息。如果你的电脑(运行着
bitchat-node)在蓝牙范围内,它会接收到这条消息。 - HTTP Bridge 接收:
bitchat-node将接收到的 BLE 消息放入内部队列,并通过其 HTTP 服务使其可用。 - 插件获取消息:
openclaw-bitchat插件通过轮询GET /api/messages或接收 Webhook 调用,从 Bridge 拿到这条消息。 - OpenClaw 处理:插件将消息交给 OpenClaw Gateway。Gateway 发现消息来自
bitchat频道,且发送者 ID 在允许列表中,于是将其路由到一个预先配置好的、处理日常问答的 AI 会话。 - AI 生成回复:AI 模型(可能是本地运行的 Llama 或调用的 API)分析问题,生成回复:“根据您的日历,明天上午10点有团队周会。”
- 插件发送回复:OpenClaw 将回复交给
openclaw-bitchat插件,并告知目标接收者的 Peer ID(即那个手机 App 的节点 ID)。 - HTTP Bridge 发送:插件调用
POST /api/send,将回复内容、接收者 ID 等信息提交给 Bridge。 - BLE Mesh 回传:
bitchat-node通过蓝牙 Mesh 网络,将回复消息发送给手机 App。 - 接收方显示:手机 App 收到并显示来自“我的AI助手”的回复。
这个过程完全在本地发生,不经过任何互联网服务器,实现了隐私和离线场景下的 AI 辅助通信。
3. 环境准备与核心组件部署
在开始配置插件之前,我们需要搭建好底层的基础设施。这个过程有点像盖房子,必须先打好地基(BLE环境)和搭建主体结构(bitchat-node)。
3.1 硬件与系统要求
首先,确保你的设备满足基本条件:
- 蓝牙适配器:设备必须支持蓝牙 4.0 或更高版本(即蓝牙低功耗 BLE)。几乎所有现代笔记本和部分台式机(需额外适配器)都满足。
- 操作系统:
- macOS:通常内置良好支持,无需额外驱动。
- Linux:需要
BlueZ蓝牙协议栈。在 Ubuntu/Debian 上可以运行sudo apt-get install bluez。你需要确保你的用户有权限操作蓝牙(通常需要将用户加入bluetooth组:sudo usermod -aG bluetooth $USER,并重新登录)。 - Windows:理论上支持,但
bitchat-node对 Windows 的 BLE 支持可能处于实验阶段,需要更复杂的配置(如可能需要WinRTAPI 环境)。对于初次尝试,强烈建议使用 macOS 或 Linux。
注意:在 Linux 上,有时需要禁用系统自带的蓝牙管理器(如
blueman),因为它们会独占蓝牙适配器,导致bitchat-node无法访问。可以尝试在运行节点前停止相关服务:sudo systemctl stop bluetooth(但注意这会影响其他蓝牙设备连接),或者使用rfkill和hciconfig工具进行更精细的控制。
3.2 部署 bitchat-node 服务
bitchat-node是整个系统的核心引擎。我们需要先把它跑起来。
获取代码:
git clone https://github.com/wkyleg/bitchat-node.git cd bitchat-node安装依赖:
npm install这一步可能会编译一些本地依赖(如蓝牙相关的
noble或bleno库),请确保你的开发环境(如node-gyp需要的 Python、C++编译工具链)是完整的。编译与运行:
# 编译TypeScript源码 npm run build # 以最简单的方式启动,指定昵称和端口 node dist/bin/bitchat.js --nickname="MyOpenClawHub" --port=3939如果一切顺利,你会在终端看到类似以下的输出,表明蓝牙适配器已初始化,节点正在广播和扫描:
[info] Bitchat node starting... [info] Adapter state: poweredOn [info] Starting to advertise and scan... [info] HTTP bridge listening on http://localhost:3939验证服务: 打开浏览器或使用
curl访问http://localhost:3939/api/status。你应该能收到一个 JSON 响应,包含你的节点 ID (peerID)、昵称和已连接的对等点数量。这个peerID是一个重要的字符串,是你在 Mesh 网络中的唯一标识,后续配置会用到。curl http://localhost:3939/api/status # 预期返回:{"peerID":"some-unique-id","nickname":"MyOpenClawHub","peerCount":0}
实操心得:进程管理与后台运行直接在前台运行node命令不是长久之计。我推荐以下两种方式:
- 使用
pm2(推荐):一个强大的 Node.js 进程管理器。npm install -g pm2 cd /path/to/bitchat-node pm2 start dist/bin/bitchat.js --name bitchat-node -- --nickname="MyHub" --port=3939 pm2 save pm2 startup # 设置开机自启(根据提示操作) - 使用系统服务(Systemd):对于 Linux 服务器更规范。 创建服务文件
/etc/systemd/system/bitchat-node.service:
然后启用并启动:[Unit] Description=Bitchat Node BLE Mesh Service After=network.target bluetooth.target [Service] Type=simple User=your_username WorkingDirectory=/path/to/bitchat-node ExecStart=/usr/bin/node dist/bin/bitchat.js --nickname="MyHub" --port=3939 Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl enable bitchat-node.service sudo systemctl start bitchat-node.service sudo systemctl status bitchat-node.service # 检查状态
4. OpenClaw 插件安装与深度配置
基础服务就绪后,现在我们来安装和配置openclaw-bitchat插件,让 OpenClaw 能够“看见”并“使用”这个 Mesh 网络。
4.1 插件安装方式详解
根据你的使用场景,有三种安装方式:
从 npm 仓库安装(稳定版):
# 全局安装OpenClaw CLI后,使用其插件管理命令 openclaw plugins install openclaw-bitchat这是最简单的方式,适合大多数只想使用功能的用户。
从源码链接安装(开发模式):
git clone https://github.com/wkyleg/openclaw-bitchat.git cd openclaw-bitchat npm install npm run build # 编译TypeScript openclaw plugins install -l .-l参数代表link,这会在你的 OpenClaw 插件目录创建一个符号链接,指向你的本地代码库。这样,你在本地代码的任何修改都会立即生效,无需重新安装。这是为插件贡献代码或进行深度定制的标准方式。手动安装:你也可以直接将编译后的插件目录(
dist文件夹)复制到 OpenClaw 的插件目录下(通常位于~/.openclaw/plugins)。但这种方式不便于管理,一般不推荐。
4.2 配置文件逐项解析
插件的所有行为都由 OpenClaw 的主配置文件~/.openclaw/openclaw.json控制。你需要在其channels部分添加bitchat的配置。下面我为你逐项拆解每个配置项的含义和最佳实践。
{ // ... OpenClaw 其他配置 ... "channels": { "bitchat": { "enabled": true, "nickname": "我的AI助理", "bridgeUrl": "http://localhost:3939", "webhookPath": "/bitchat-webhook", "autoStart": false, "dmPolicy": "allowlist", "allowFrom": ["peer-id-of-my-phone", "peer-id-of-colleague"] } } }enabled(布尔值,默认true)- 作用:总开关。设为
false将完全禁用该频道,OpenClaw 不会加载它。 - 建议:在调试其他问题时,可以临时关闭。
- 作用:总开关。设为
nickname(字符串,默认"openclaw")- 作用:你的 OpenClaw 节点在 Bitchat 网络中显示的名称。其他用户在他们的 Bitchat App 中会看到这个名字。
- 建议:起一个易于识别的名字,如“会议室AI”、“车库助手”等。注意,这个名字和
bitchat-node启动时的--nickname是独立的,但通常建议保持一致以避免混淆。
bridgeUrl(字符串,默认"http://localhost:3939")- 作用:指向
bitchat-nodeHTTP Bridge 服务的 URL。 - 关键点:如果
bitchat-node和 OpenClaw 运行在同一台机器,用localhost即可。如果分布式部署(例如,bitchat-node运行在树莓派上专门做蓝牙网关,OpenClaw 运行在另一台性能更强的服务器上),则需要填写树莓派的 IP 地址,如"http://192.168.1.100:3939"。务必确保防火墙允许该端口的通信。
- 作用:指向
webhookPath(字符串,默认"/bitchat-webhook")- 作用:OpenClaw Gateway 上一个用于接收消息推送的端点路径。
- 工作机制:插件启动时,会向
bridgeUrl + /api/webhook注册一个 URL,格式为{OpenClaw Gateway 地址}{webhookPath}。当bitchat-node收到新消息,它会主动向这个注册的 URL 发起 POST 请求,实现消息的实时推送,比轮询更高效。 - 注意:这要求你的 OpenClaw Gateway 必须有一个能被
bitchat-node访问到的网络地址(例如,有公网IP或在同一内网)。如果 Gateway 只在本地(如localhost:3000)且bitchat-node在另一台机器,Webhook 将无法工作,此时插件会自动回退到轮询模式。
autoStart(布尔值,默认false)- 作用:是否尝试自动启动
bitchat-node进程。 - 警告:这是一个实验性功能,可靠性不高。它可能尝试通过
child_process模块去执行一个预设的命令来启动节点。强烈建议手动管理bitchat-node服务(如用pm2或systemd),将这个选项设为false。
- 作用:是否尝试自动启动
dmPolicy(字符串,默认"open")- 作用:这是最重要的安全与隐私配置项,决定了谁可以直接给你的 AI 助手发送私聊(Direct Message)消息。
- 可选值:
"open":完全开放。任何在 BLE 范围内的 Bitchat 用户都可以向你的 AI 助手发送私聊消息。仅在完全信任的环境(如家庭内部)中使用。"allowlist":白名单模式。只有allowFrom列表中指定的 Peer ID 可以发送私聊消息。这是推荐的生产环境配置。"disabled":禁用私聊。你的 AI 助手只接收广播消息或群聊消息(如果 Bitchat 支持的话),不接收任何私聊。适合纯广播公告场景。
allowFrom(字符串数组,默认[])- 作用:当
dmPolicy设为"allowlist"时,在此数组中填入你允许的、其他设备的 Bitchat Peer ID。 - 如何获取 Peer ID:在对方的 Bitchat 客户端(如 iOS App)中,通常可以在“设置”或“关于”页面找到本设备的 Peer ID(一串长哈希字符串)。你也可以让对方在 App 里给你发一条消息,然后查看
bitchat-node的日志或调用GET /api/peers接口,找到对应昵称的peerID。
- 作用:当
4.3 配置生效与网关重启
修改完配置文件后,必须重启 OpenClaw Gateway 才能使新的频道配置生效。
openclaw gateway restart重启后,检查 OpenClaw Gateway 的日志,你应该能看到类似以下的条目,表明bitchat频道插件已成功加载并初始化:
[info] Loading channel: bitchat [info] Bitchat channel initialized. Bridge URL: http://localhost:3939 [info] Webhook registered successfully. // 如果Webhook注册成功同时,你也可以再次检查bitchat-node的日志或状态接口,确认 OpenClaw 插件已经连接上来。
5. 实战应用:从基础测试到场景化技能
一切配置妥当,让我们开始真正使用它。我们从最简单的测试开始,逐步深入到实用的自动化场景。
5.1 基础功能测试:发送与接收
首先,我们需要一个 Bitchat 消息的发送端。最方便的是使用官方的Bitchat iOS App(如果可用)。如果没有,你可以启动另一个bitchat-node实例作为模拟对等点。
测试步骤:
准备发送端:
- 方案A(iOS App):在 iPhone 上安装 Bitchat App,确保蓝牙已打开。App 会自动扫描,你应该能看到昵称为“我的AI助理”(或你配置的
nickname)的设备。 - 方案B(另一个节点):在另一台电脑或终端窗口,启动第二个
bitchat-node实例,使用不同的端口和昵称。cd /path/to/bitchat-node node dist/bin/bitchat.js --nickname="Tester" --port=3940
- 方案A(iOS App):在 iPhone 上安装 Bitchat App,确保蓝牙已打开。App 会自动扫描,你应该能看到昵称为“我的AI助理”(或你配置的
发送测试消息:
- 从发送端,向“我的AI助理”发送一条私聊或广播消息。内容可以是简单的“你好,AI!”。
观察接收端:
- 查看运行 OpenClaw 的服务器终端或日志。如果消息路由成功,你应该能看到 OpenClaw 处理消息的日志,例如,它可能触发了一个默认的对话技能。
- 更直接的方式是,如果你为 OpenClaw 配置了其他输出频道(如命令行回复、Telegram Bot等),你可能会看到 AI 生成的回复。
从 OpenClaw 主动发送: OpenClaw 可以通过其Message Tool主动向外发送消息。这通常在 AI 技能中被调用。
# 这是一个在 OpenClaw 技能脚本或调试中可能使用的命令示例 # 假设你有一个会话工具可以调用 message tool openclaw tools message send --channel=bitchat --target=<目标PeerID> --text="这是来自OpenClaw的回复"或者,在一个自定义技能(Skill)的代码中:
// 伪代码示例 const result = await openclaw.tools.message.send({ channel: 'bitchat', target: peerID, text: '会议提醒:10分钟后开始。' });
5.2 构建场景化 AI 技能
单纯收发消息意义不大,真正的威力在于将 Bitchat 作为触发器,驱动 OpenClaw 背后强大的 AI 技能。下面我设计两个实用场景。
场景一:离线智能家居控制中枢假设你在一个没有稳定互联网的车库或地下室工作,但有一个本地运行的 OpenClaw 和 Home Assistant 集成。
- 技能设计:创建一个名为
offline_ha_control的 OpenClaw Skill。 - 触发条件:该技能监听
bitchat频道,并解析消息内容。 - 逻辑实现:
- 当收到消息如“打开车库灯”时,技能通过 Home Assistant 本地 API 调用相关服务。
- 执行后,通过
bitchat频道向发送者手机回复“车库灯已打开”。
- 优势:完全离线运行,响应迅速,隐私无忧。
场景二:本地化团队协作机器人在小团队办公室,部署一个公共的 OpenClaw 助手。
- 技能设计:创建
team_assistant技能。 - 功能:
- 信息查询:员工通过 Bitchat 提问“本周谁值日?”,技能查询本地的值班表文件并回复。
- 广播通知:管理员发送“@all 下午三点会议室开会”,技能识别
@all指令,通过 Bitchat 广播给所有在线同事(需要遍历GET /api/peers获取列表并群发)。 - 简易工单:发送“报修:3号打印机卡纸”,技能将信息追加到本地共享的工单日志文件中,并回复“已记录,工单ID:123”。
- 配置:将团队所有成员的手机 Peer ID 加入
allowFrom白名单。
实现要点: 在技能开发中,你需要从上下文中获取来自 Bitchat 的消息详情:
// 在技能处理函数中 async function handleBitchatMessage(context) { const message = context.message; // 原始消息对象 const text = message.text; const senderPeerId = message.sender; // 发送者的Peer ID const channel = message.channel; // 应为 'bitchat' // 根据text内容进行逻辑处理 if (text.includes('打开')) { // ... 控制智能家居 ... // 回复发送者 await context.tools.message.send({ channel: 'bitchat', target: senderPeerId, // 回复给发送者 text: '指令已执行。' }); } }6. 高级配置、故障排查与安全加固
当基本功能跑通后,我们会遇到更复杂的情况和问题。这一章分享一些进阶技巧和避坑指南。
6.1 性能优化与稳定运行
- 轮询间隔调整:如果无法使用 Webhook,插件会回退到轮询模式。轮询间隔在插件内部可能已设定(如每5秒一次)。频繁轮询会增加
bitchat-node的负担。如果消息实时性要求不高,可以考虑修改插件源码,增加轮询间隔配置项,或优化为长轮询(如果 Bridge 支持)。 - 日志管理:
bitchat-node和 OpenClaw 都会产生日志。长期运行可能日志量很大。建议配置日志轮转(log rotation)。对于pm2,可以使用pm2 install pm2-logrotate。对于systemd,其journald自带日志管理。 - 资源监控:注意 Node.js 进程的内存使用。BLE 栈和消息处理在极端情况下可能有内存泄漏。使用
pm2 monit或简单的htop命令定期观察。
6.2 常见问题与排查清单
遇到问题时,请按照以下清单逐项检查:
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
OpenClaw 启动时报错,无法加载bitchat频道 | 1. 插件未正确安装。 2. 配置文件语法错误。 3. 插件依赖缺失。 | 1. 运行openclaw plugins list确认插件存在。2. 使用 jsonlint等工具检查openclaw.json配置文件。3. 进入插件目录 ~/.openclaw/plugins/openclaw-bitchat,运行npm install。 |
| 插件日志显示 “无法连接到 bridge” | 1.bitchat-node未运行。2. bridgeUrl配置错误。3. 防火墙/端口阻止。 | 1. 检查bitchat-node进程状态:pm2 list或systemctl status。2. 用 curl http://localhost:3939/api/status手动测试 Bridge 是否可达。3. 确认端口号(默认3939)是否正确,防火墙是否开放。 |
| 能连接 Bridge,但收不到消息 | 1. 发送端不在 BLE 范围内。 2. dmPolicy设置过严。3. Webhook 注册失败,轮询也未生效。 | 1. 确保发送设备蓝牙已开,且在10米内。 2. 检查 dmPolicy和allowFrom列表。可暂时设为"open"测试。3. 查看 bitchat-node日志,确认收到消息;查看 OpenClaw 日志,确认插件是否在轮询或收到 Webhook。 |
| 可以收到消息,但 OpenClaw 不回复/不处理 | 1. 消息未正确路由到技能。 2. 技能处理逻辑有误。 3. 发送回复的代码未执行或出错。 | 1. 检查 OpenClaw 会话路由规则。消息是否传递到了预期的技能?查看技能日志。 2. 在技能中增加调试日志,确认处理函数被触发。 3. 检查 message.send工具调用是否成功,查看是否有权限或参数错误。 |
| BLE 连接不稳定,时断时续 | 1. 物理环境干扰(如大量 WiFi、微波炉)。 2. 蓝牙适配器驱动问题。 3. 系统电源管理导致蓝牙休眠。 | 1. 更换位置测试,远离强干扰源。 2. 更新操作系统和蓝牙驱动。 3. 在 Linux 上,检查 bluetooth服务设置,或尝试在bitchat-node启动脚本中禁止蓝牙休眠(如使用rfkill相关参数)。 |
一个关键的调试技巧:充分利用bitchat-node的 API。
GET /api/peers:查看当前有哪些对等点在线。这能验证 BLE 连接本身是否成功。GET /api/messages?since=<timestamp>:手动获取某个时间点之后的消息,可以验证消息是否成功到达 Bridge。- 查看
bitchat-node的标准输出日志,里面包含了 BLE 扫描、连接、消息收发的详细信息,是排查底层问题的一手资料。
6.3 安全加固实践
在公开或半公开环境中使用,安全配置至关重要。
- 强制使用白名单(Allowlist):如前所述,在生产环境中,永远不要将
dmPolicy设置为"open"。仔细管理allowFrom列表,只添加可信设备的 Peer ID。 - 网络隔离:如果
bridgeUrl配置为局域网 IP,确保你的路由器防火墙或主机防火墙(如ufw)只允许来自 OpenClaw 服务器 IP 的访问,禁止外部网络访问 3939 端口。# 例如,在运行bitchat-node的机器上,使用ufw sudo ufw allow from 192.168.1.50 to any port 3939 # 只允许OpenClaw服务器IP sudo ufw deny 3939/tcp # 拒绝其他所有访问 - 最小权限原则:运行
bitchat-node和 OpenClaw 的服务账户,应使用非 root 的普通用户,降低潜在风险。 - 关注项目安全更新:由于是 Alpha 软件,关注 GitHub 仓库的 Issue 和 Release,及时更新以获取安全修复。
7. 开发与扩展:深入插件内部
如果你想定制插件功能,或为开源项目做贡献,就需要深入了解其代码结构。
7.1 项目结构与核心代码
克隆项目后,你会看到类似如下的结构:
openclaw-bitchat/ ├── src/ │ ├── index.ts # 插件主入口,注册频道 │ ├── BitchatChannel.ts # 频道核心实现类 │ ├── types.ts # TypeScript 类型定义 │ └── ... ├── package.json ├── tsconfig.json └── ...核心逻辑在BitchatChannel类中。它通常需要实现 OpenClaw 频道插件的标准接口,主要包括:
initialize():初始化,连接 Bridge,注册 Webhook。sendMessage():实现将 OpenClaw 的内部消息发送到 Bitchat 网络。- 一个用于接收来自 Bridge 消息的回调处理器。
研究src/index.ts的createChannel函数和BitchatChannel类的方法,是理解插件如何工作的最佳途径。
7.2 如何添加新功能
假设你想增加一个“广播给所有已知对等点”的功能。
- 修改配置:首先在
types.ts中为频道配置接口添加一个新选项,比如allowBroadcast: boolean。 - 修改逻辑:在
BitchatChannel的sendMessage方法中,判断如果消息的target是某个特殊值(如"broadcast")且配置允许,则不指定recipientPeerID调用 Bridge 的发送接口(根据 Bitchat 协议,这可能意味着广播)。或者,更复杂一点,先调用GET /api/peers获取所有对等点,然后遍历发送。 - 编译与测试:运行
npm run build编译 TypeScript,然后使用开发模式链接插件进行测试。
7.3 调试技巧
- 使用 VS Code 调试:在
.vscode/launch.json中配置调试任务,附加到 OpenClaw Gateway 进程,可以打断点调试插件代码。 - 详细的日志:在插件代码中关键位置增加
console.log或使用 OpenClaw 的日志工具,输出更详细的状态信息。记得在npm run build前移除或禁用这些调试日志。 - 模拟测试:可以编写一个简单的脚本,直接调用
bitchat-node的 HTTP API 来模拟消息发送和接收,从而隔离测试插件与 Bridge 的交互逻辑,而不需要真实的蓝牙环境。
这个项目为我们展示了一个非常有趣的范式:将前沿的去中心化通信协议与强大的AI代理框架相结合,创造出不受制于中心化服务的智能边缘应用。虽然目前它还是一个需要较多手动配置和调试的“极客玩具”,但其代表的离线、隐私、自主可控的方向,对于构建鲁棒性更强的个人AI基础设施和特定场景的协作工具,具有重要的启发意义。我在实验过程中最大的体会是,耐心和细致的日志分析是成功的关键,每一步的验证(BLE是否连通、Bridge是否响应、插件是否加载、消息路由是否正确)都必不可少。
