🔌 郊狼情趣脉冲主机 V2 蓝牙协议
📝 核心概览
- 架构特点:V2 协议采用多特性(Characteristic)分工模式,强度与波形分开控制。
- 数据结构:数据包为 3 字节(24位),需要进行复杂的位运算拼接。
- 关键变量:
S(强度),X(脉冲数),Y(间隙),Z(脉宽)。 - 实时性:波形数据不具备记忆性,需 每 100ms 发送一次以维持输出。
📶 蓝牙特性
基础 UUID:955Axxxx-0FE2-F5AA-A094-84B8D4F3E8AD
(请将下表中的 xxxx 替换为具体的特性 UUID)
| 标识符 | 服务 UUID | 特性 UUID | 属性 | 数据长度 | 功能描述 |
|---|---|---|---|---|---|
| Battery_Level | 0x180A | 0x1500 | READNOTIFY | 1 Byte | 设备电量 (0-100) |
| PWM_AB2 | 0x180B | 0x1504 | WRITENOTIFY | 3 Bytes | AB 两通道强度控制 |
| PWM_A34 | 0x180B | 0x1505 | WRITE | 3 Bytes | A 通道 波形数据 (X/Y/Z) |
| PWM_B34 | 0x180B | 0x1506 | WRITE | 3 Bytes | B 通道 波形数据 (X/Y/Z) |
蓝牙名称
设备广播名称通常为:D-LAB ESTIM01
🛠️ 基本原理
郊狼 V2 通过 S (强度) 和 X/Y/Z (波形) 四个变量来控制脉冲。
🔋 电源模块 (S)
- 控制对象:
PWM_AB2 - 数值范围:
0 ~ 2047(超过此值无效) - 生效机制:写入即刻改变电压并保持。
- 换算关系:
App显示值 = S / 7(即 App 每增加 1,底层 S 增加 7)。
🌊 波形模块 (X, Y, Z)
- 控制对象:
PWM_A34(A通道) /PWM_B34(B通道) - 时效性:每组数据仅在 0.1s (100ms) 内有效。
- 控制逻辑:
- X (脉冲连发): 连续 X 毫秒,每毫秒发射 1 个脉冲。范围
0-31。 - Y (脉冲间隙): 发射完 X 个脉冲后,静默 Y 毫秒。范围
0-1023。 - Z (脉冲宽度): 单个脉冲的物理宽度。范围
0-31。- 实际宽度 =
Z * 5us - 体感参考:Z > 20 时刺痛感较强,Z 较小时为酥麻感。
- 实际宽度 =
- X (脉冲连发): 连续 X 毫秒,每毫秒发射 1 个脉冲。范围
💻 蓝牙指令与数据结构
V2 协议的数据包均为 3 Bytes (24 bits),请严格按照位分布进行拼包。
1. 强度数据包 (PWM_AB2)
| 字节位置 | Byte 2 (高位) | Byte 1 (中位) | Byte 0 (低位) |
|---|---|---|---|
| 位图 | RR AAAAAA | AAAAA BBB | BBBBBBBB |
| Bit 索引 | 23 - 16 | 15 - 8 | 7 - 0 |
| 内容 | 保留(2) + A高6位 | A低5位 + B高3位 | B低8位 |
- Reserved: Bit [23-22]
- Channel A: Bit [21-11] (11 bits, S值)
- Channel B: Bit [10-0] (11 bits, S值)
2. 波形数据包 (PWM_A34 / B34)
| 字节位置 | Byte 2 (高位) | Byte 1 (中位) | Byte 0 (低位) |
|---|---|---|---|
| 位图 | RRRR ZZZZ | Z YYYYYYY | YYY XXXXX |
| Bit 索引 | 23 - 16 | 15 - 8 | 7 - 0 |
| 内容 | 保留(4) + Z高4位 | Z低1位 + Y高7位 | Y低3位 + X全5位 |
- Reserved: Bit [23-20]
- Z (脉宽): Bit [19-15] (5 bits)
- Y (间隙): Bit [14-5] (10 bits)
- X (脉冲): Bit [4-0] (5 bits)
🧮 算法与示例
频率计算公式
如何通过 X 和 Y 模拟目标频率(Frequency):
为了获得最佳体感,建议使用以下算法根据目标频率反推 X 和 Y:
kotlin
// 推荐比例算法
// Frequency 取值范围:10 ~ 1000
val x = Math.sqrt(Frequency / 1000.0) * 15
val y = Frequency - x
// 注意:当 X:Y > 1:9 (例如 8:2) 时,波形能量密度过大,体感会变弱。波形序列示例
由于 V2 没有内置波形存储,需通过 App 建立 100ms 定时器连续发送数据。
🚀 场景 1:频率渐变(引擎加速感)
| 步骤 (每100ms) | X | Y | Z | 预估频率 |
|---|---|---|---|---|
| 1 | 5 | 135 | 20 | ~7 Hz |
| 2 | 5 | 115 | 20 | ~8 Hz |
| 3 | 5 | 95 | 20 | 10 Hz |
| 4 | 4 | 66 | 20 | 14 Hz |
| 5 | 3 | 37 | 20 | 25 Hz |
| 6 | 2 | 18 | 20 | 50 Hz |
| 7 | 1 | 9 | 20 | 100 Hz |
🥁 场景 2:双频切换(节奏打击)
text
[5, 95, 20] -> 10Hz 酥麻
[5, 95, 20] -> 10Hz 酥麻
[5, 95, 20] -> 10Hz 酥麻
[5, 95, 20] -> 10Hz 酥麻
[1, 9, 20] -> 100Hz 爆发
[1, 9, 20] -> 100Hz 爆发
(循环)💪 场景 3:恒定频率,变宽(推力增强)
保持 X=1, Y=9 (100Hz),仅改变 Z 值:
text
[1, 9, 4] -> [1, 9, 8] -> [1, 9, 12] -> [1, 9, 16] -> [1, 9, 20]💡 补充提示
⚠️ 开发核心注意事项
- 心跳维持:V2 协议必须每 0.1s 发送一次波形数据包。如果蓝牙写入停止,设备输出也会立即停止。
- 数值映射:V2 的
Z=20大约对应 V3 的波形强度=100。 - 体感迟钝:人体对频率变化的感知有延迟,频率切换过快(如每 100ms 变一次频率)可能导致体感混乱,建议通过改变脉宽 (Z) 来制造瞬时节奏感。