diff --git a/README.md b/README.md index 8aaff51..8072210 100644 --- a/README.md +++ b/README.md @@ -4,45 +4,65 @@ ## 插件列表 -| 插件 | 说明 | -|------|------| -| [dglab_ws](./dglab_ws.py) | DG-Lab 郊狼 3.0 WebSocket 控制插件 | +| 插件 | 说明 | 依赖 | +|------|------|------| +| [dglab_ws](./dglab_ws/) | DG-Lab 郊狼 3.0 WebSocket 控制 | websocket-client, qrcode(可选) | ## 安装方式 -将插件 `.py` 文件复制到 xiaoli-cli 项目的 `plugins/` 目录下,然后在 `plugins_config.py` 中启用: +1. 将插件文件夹中的 `.py` 文件复制到 xiaoli-cli 的 `plugins/` 目录 +2. 在 `plugins_config.py` 中启用对应插件 -```python -ENABLE_DGLAB_WS = True # 启用 DG-Lab 插件 +```bash +# 示例:安装 dglab_ws 插件 +cp dglab_ws/dglab_ws.py /path/to/xiaoli-cli/plugins/ ``` -## 插件开发 +```python +# plugins_config.py +ENABLE_DGLAB_WS = True +``` -每个插件是一个独立的 `.py` 文件,需包含 `Liugin` 类(兼容 `Plugin` 类名): +## 插件目录结构 + +每个插件一个文件夹,包含: + +``` +插件名/ +├── 插件名.py # 插件代码 +└── README.md # 使用教程 +``` + +## 开发插件 + +插件是一个独立 `.py` 文件,需包含 `Liugin` 类(兼容 `Plugin`): ```python class Liugin: def get_tool_info(self): + """返回插件元信息""" return { "name": "插件名", - "description": "插件描述", - "keywords": ["关键词1", "关键词2"], + "description": "一句话描述", + "keywords": ["关键词"], "usage": "使用说明" } def handle(self, args): - return "处理结果" + """处理命令,返回结果字符串""" + return "结果" - # 可选:注册CLI命令 def set_cli(self, cli): - self.cli = cli + """可选:注册CLI斜杠命令""" + pass - # 可选:MCP支持 def get_mcp_definition(self): - return {...} + """可选:MCP工具定义""" + return {} def convert_mcp_args(self, arguments): - return "转换后的参数" + """可选:MCP参数转CLI参数""" + return "" ``` ## License diff --git a/dglab_ws/README.md b/dglab_ws/README.md new file mode 100644 index 0000000..36e84af --- /dev/null +++ b/dglab_ws/README.md @@ -0,0 +1,163 @@ +# DG-Lab 郊狼 WebSocket 控制插件 + +> 基于 [DG-LAB-OPENSOURCE](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE) 官方 Socket V2 协议 +> 支持郊狼 3.0 脉冲主机的远程强度控制与波形发送 + +## 前置准备 + +### 1. 安装依赖 + +```bash +pip install websocket-client # 必须 +pip install qrcode # 可选,终端显示ASCII二维码 +``` + +### 2. 安装插件 + +将 `dglab_ws.py` 复制到 xiaoli-cli 项目的 `plugins/` 目录下: + +```bash +cp dglab_ws.py /path/to/xiaoli-cli/plugins/ +``` + +在 `plugins_config.py` 中添加: + +```python +ENABLE_DGLAB_WS = True +``` + +### 3. 启动 WebSocket 服务端 + +你需要一个 DG-LAB Socket V2 后端服务。官方参考实现位于 [socket/v2/backend](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE/tree/main/socket/v2/backend): + +```bash +cd socket/v2/backend +npm install +npm start +``` + +默认监听 `ws://0.0.0.0:9999`。 + +## 使用教程 + +### 连接与配对 + +``` +# 第一步:连接到 WebSocket 服务端 +/dglab connect ws://192.168.1.100:9999 + +# 第二步:生成二维码,用 DG-LAB APP 扫码 +/dglab qr + +# 查看连接状态 +/dglab status +``` + +**配对流程:** +1. 本插件连接 WebSocket 服务端,获得 `clientId` +2. 生成二维码(含 `clientId`) +3. DG-LAB APP 扫码连接服务端,获得 `targetId` +4. 服务端自动完成绑定,双方即可通信 + +> 💡 APP 端操作:打开 DG-LAB APP → SOCKET 功能 → 扫描二维码 + +### 强度控制 + +控制 A/B 两个通道的脉冲强度(范围 0-200): + +``` +# 通道A 增加 10 +/dglab strength a + 10 + +# 通道B 减少 5 +/dglab strength b - 5 + +# 通道A 设为 50 +/dglab strength a = 50 +``` + +| 操作符 | 说明 | 示例 | +|--------|------|------| +| `+` | 增加 | `strength a + 10` | +| `-` | 减少 | `strength b - 5` | +| `=` | 设为指定值 | `strength a = 50` | + +### 波形发送 + +发送参数化波形脉冲: + +``` +# 通道A: 频率30, 强度50, 持续5秒 +/dglab pulse a 30 50 5 + +# 通道B: 频率100, 强度80, 持续10秒 +/dglab pulse b 100 80 10 +``` + +**参数说明:** + +| 参数 | 范围 | 说明 | +|------|------|------| +| 频率 | 10-1000 | 脉冲频率,内部自动映射到 10-240 | +| 强度 | 0-100 | 波形强度 | +| 持续时间 | 1-60 | 秒数,默认5秒 | + +### 原始波形数据 + +如果你有现成的波形 HEX 数据,可以直接发送: + +``` +# 每条波形 = 8字节 = 16个HEX字符 +# 格式: 频率x4 + 强度x4 +/dglab wave a 0A0A0A0A64646464 +``` + +### 清空波形队列 + +``` +/dglab clear a # 清空通道A +/dglab clear b # 清空通道B +/dglab clear both # 清空双通道 +``` + +### 断开连接 + +``` +/dglab disconnect +``` + +## 命令速查 + +| 命令 | 说明 | +|------|------| +| `/dglab connect ` | 连接 WebSocket 服务器 | +| `/dglab qr` | 生成配对二维码 | +| `/dglab status` | 查看状态 | +| `/dglab strength <+/−/=> <值>` | 控制强度 | +| `/dglab pulse <频率> <强度> [秒数]` | 发送波形 | +| `/dglab wave ` | 发送原始波形 | +| `/dglab clear ` | 清空波形队列 | +| `/dglab disconnect` | 断开连接 | +| `/dglab help` | 显示帮助 | + +## 常见问题 + +**Q: 连接超时怎么办?** +A: 检查 WebSocket 服务端是否启动,防火墙是否放行端口,地址格式是否为 `ws://ip:port`。 + +**Q: 配对失败 (400)?** +A: 该 clientId 已被其他 APP 绑定。断开重连会生成新的 clientId。 + +**Q: 强度设为软上限以上会怎样?** +A: 实际强度不会超过软上限。比如软上限 100,设为 150 实际只会到 100。 + +**Q: 波形数据格式是什么?** +A: 每条 8 字节 HEX,前 4 字节是频率,后 4 字节是强度。详见 [官方波形说明](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE/blob/main/coyote/extra/README.md)。 + +## 参考资料 + +- [DG-LAB 官方开源仓库](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE) +- [Socket V2 协议文档](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE/blob/main/socket/v2/README.md) +- [V3 蓝牙协议](https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE/blob/main/coyote/v3/README_V3.md) +- [PyDG-Lab-WS (Python库)](https://pypi.org/project/pydglab-ws/) +- [XToys.app 集成](https://xtoys.app) diff --git a/dglab_ws.py b/dglab_ws/dglab_ws.py similarity index 100% rename from dglab_ws.py rename to dglab_ws/dglab_ws.py