Files
xiaoli-cli-plugins/dglab_ws/README.md
T
xiaoli-cli bot 6a56b262d4 feat: 添加 DG-Lab APP 模拟器,支持无真机测试
- dglab_app_simulator.py 模拟 APP 端行为
- 自动连接、自动接受配对
- 实时显示强度/波形指令
- 回传强度状态(与真机一致)
- README 添加测试教程
2026-04-30 02:33:04 +08:00

191 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 <ws_url>` | 连接 WebSocket 服务器 |
| `/dglab qr` | 生成配对二维码 |
| `/dglab status` | 查看状态 |
| `/dglab strength <a/b> <+/−/=> <值>` | 控制强度 |
| `/dglab pulse <a/b> <频率> <强度> [秒数]` | 发送波形 |
| `/dglab wave <a/b> <HEX数据>` | 发送原始波形 |
| `/dglab clear <a/b/both>` | 清空波形队列 |
| `/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)。
## 测试(无需真机)
本插件附带一个 **APP 模拟器**,可以模拟 DG-LAB APP 端行为,无需真实设备即可测试。
### 测试步骤
```
终端1: 启动 WebSocket 服务端
cd socket/v2/backend && npm start
终端2: 启动 APP 模拟器
python dglab_app_simulator.py ws://127.0.0.1:9999
终端3: 在 xiaoli-cli 中测试
/dglab connect ws://127.0.0.1:9999
/dglab qr
/dglab strength a + 10
/dglab pulse a 30 50 5
/dglab status
```
模拟器会:
- 模拟 APP 连接 WebSocket 服务端
- 自动接受配对请求
- 实时显示收到的强度/波形指令
- 回传强度状态(和真机行为一致)
## 参考资料
- [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)