广播指令集
不同设备型号的广播命令映射
指令概述
广播设备通过 Hex 编码的指令字符串控制。每个品牌拥有独立的指令集,指令分为三类:
- 长指令 (Classic Modes) — 设备持续执行,需要发送停止指令才会停止
- 短指令 (Short Broadcast Modes) — 设备执行约 2 秒后自动停止
- 停止指令 (Stop Command) — 立即停止设备运行
系统根据设备的 modelName 自动选择对应的指令集。当设备 API 返回的 func 和 modes 数组为空时,使用 deviceModes.ts 中定义的默认指令集。
Default 设备指令
适用于大多数广播设备(modelName 不包含 NNG、NONO 或 MY),使用 22 字符 Hex 命令,前缀为 6db643ce97fe427c。
长指令(持续模式)
通过 getClassicModes() 获取。设备接收后持续执行,直到收到停止指令。
| 档位 | 指令 (Hex) | 电机强度 [M1, M2, M3] |
|---|---|---|
| 停止 | 6db643ce97fe427ce5157d | [0, 0, 0] |
| 1 | 6db643ce97fe427ce49c6c | [1, 1, 1] |
| 2 | 6db643ce97fe427ce7075e | [2, 2, 2] |
| 3 | 6db643ce97fe427ce68e4f | [3, 3, 3] |
| 4 | 6db643ce97fe427ce1313b | [4, 4, 4] |
| 5 | 6db643ce97fe427ce0b82a | [5, 5, 5] |
| 6 | 6db643ce97fe427ce32318 | [6, 6, 6] |
| 7 | 6db643ce97fe427ce2aa09 | [7, 7, 7] |
| 8 | 6db643ce97fe427ced5df1 | [8, 8, 8] |
| 9 | 6db643ce97fe427cecd4e0 | [9, 9, 9] |
短指令(2 秒自动停止)
通过 getShortBroadcastModes() 获取。设备接收后执行约 2 秒自动停止,无需发送停止指令。
| 档位 | 指令 (Hex) | 电机强度 [M1, M2, M3] |
|---|---|---|
| 1 | 6db643ce97fe427cf41d7c | [1, 1, 1] |
| 2 | 6db643ce97fe427cf7864e | [2, 2, 2] |
| 3 | 6db643ce97fe427cf60f5f | [3, 3, 3] |
| 4 | 6db643ce97fe427cf1b02b | [4, 4, 4] |
| 5 | 6db643ce97fe427cf0393a | [5, 5, 5] |
| 6 | 6db643ce97fe427cf3a208 | [6, 6, 6] |
| 7 | 6db643ce97fe427cf22b19 | [7, 7, 7] |
| 8 | 6db643ce97fe427cfddce1 | [8, 8, 8] |
| 9 | 6db643ce97fe427cfc55f0 | [9, 9, 9] |
停止指令
6db643ce97fe427ce5157dNNG / NONO 设备指令
适用于 modelName 包含 NNG 或 NONO 的设备,使用 22 字符 Hex 命令,前缀为 6DB64324F89D427C。
长指令(持续模式)
| 档位 | 指令 (Hex) |
|---|---|
| 1 | 6DB64324F89D427CE4E7B0 |
| 2 | 6DB64324F89D427CE77C82 |
| 3 | 6DB64324F89D427CE6F593 |
| 4 | 6DB64324F89D427CE14AE7 |
| 5 | 6DB64324F89D427CE0C3F6 |
| 6 | 6DB64324F89D427CE358C4 |
| 7 | 6DB64324F89D427CE2D1D5 |
| 8 | 6DB64324F89D427CED262D |
| 9 | 6DB64324F89D427CECAF3C |
短指令
NNG 设备的短指令与长指令相同(设备端自行控制执行时长):
| 档位 | 指令 (Hex) |
|---|---|
| 1 | 6DB64324F89D427CE4E7B0 |
| 2 | 6DB64324F89D427CE77C82 |
| 3 | 6DB64324F89D427CE6F593 |
| 4 | 6DB64324F89D427CE14AE7 |
| 5 | 6DB64324F89D427CE0C3F6 |
| 6 | 6DB64324F89D427CE358C4 |
| 7 | 6DB64324F89D427CE2D1D5 |
| 8 | 6DB64324F89D427CED262D |
| 9 | 6DB64324F89D427CECAF3C |
停止指令
6DB64324F89D427CE56EA1MY 设备指令
适用于 modelName 包含 MY 的设备,使用 10 字符 Hex 命令,前缀为 AA0B。
长指令(持续模式)
| 档位 | 指令 (Hex) |
|---|---|
| 1 | AA0B010109 |
| 2 | AA0B010209 |
| 3 | AA0B010309 |
| 4 | AA0B000001 |
| 5 | AA0B000002 |
| 6 | AA0B000003 |
| 7 | AA0B000004 |
| 8 | AA0B000005 |
| 9 | AA0B000006 |
短指令
| 档位 | 指令 (Hex) |
|---|---|
| 1 | AA0B000001 |
| 2 | AA0B000003 |
| 3 | AA0B000005 |
| 4 | AA0B000007 |
| 5 | AA0B000009 |
| 6 | AA0B00000B |
| 7 | AA0B00000B |
| 8 | AA0B000011 |
| 9 | AA0B000013 |
停止指令
AA0B140000长指令与短指令的区别
| 特性 | 长指令 (Classic Modes) | 短指令 (Short Broadcast Modes) |
|---|---|---|
| 获取方式 | getClassicModes(modelName) | getShortBroadcastModes(modelName) |
| 设备行为 | 持续运行,直到收到停止指令 | 执行约 2 秒后自动停止 |
| 停止方式 | 必须发送停止指令 | 自动停止,无需额外操作 |
| 适用场景 | 经典模式预设切换,需要持续控制 | 联动控制(视频、音乐、滑动等) |
| 数据来源 | deviceModes.ts 中的 modes / nngModes / myModes | deviceModes.ts 中的 shortBroadcastModes 等 |
使用建议
- 经典模式(用户手动选择模式按钮):使用长指令,用户切换模式时发送对应长指令,退出时发送停止指令
- 实时联动(音乐、视频、滑动、语音):使用长指令配合
BroadcastStrategyManager进行频率控制,利用档位变化检测避免重复发送
品牌识别逻辑
系统根据设备型号名称(modelName)自动选择对应的指令集:
// 获取长指令
export const getClassicModes = (modelName: string | undefined) => {
if (!modelName) return modes // 默认指令集
if (modelName.includes('NNG') || modelName.includes('NONO'))
return nngModes // NNG/NONO 指令集
if (modelName.includes('MY'))
return myModes // MY 指令集
return modes // 默认指令集
}
// 获取短指令
export const getShortBroadcastModes = (modelName: string | undefined) => {
if (!modelName) return shortBroadcastModes
if (modelName.includes('NNG') || modelName.includes('NONO'))
return nngShortBroadcastModes
if (modelName.includes('MY'))
return myShortBroadcastModes
return shortBroadcastModes
}
// 获取停止指令
export const getStopCommand = (modelName: string | undefined) => {
if (!modelName) return [STOP_COMMAND]
if (modelName.includes('NNG') || modelName.includes('NONO'))
return NONO_STOP_COMMAND // ['6DB64324F89D427CE56EA1']
if (modelName.includes('MY'))
return [STOP_COMMAND] // MY 使用默认停止指令
return [STOP_COMMAND] // '6db643ce97fe427ce5157d'
}func 功能指令
除了默认指令集外,设备 API 返回的 func 字段也包含指令。每个 DeviceFunction 拥有独立的命令集,支持精细的多功能控制。
interface DeviceFunction {
name: string // 功能名称(如 "组合模式")
key: string // 功能键(combination / thrust / vibrate / suction)
maxIntensity: number // 最大强度档位
commands: FunctionCommand[] // 命令列表
}
interface FunctionCommand {
intensity: number // 强度档位(-1: 停止, 0-9: 档位)
command: string // 蓝牙命令(Hex 字符串)
name: string // 命令名称
}MonstroRush 设备 func 示例
以 MonstroRush(modelName: MIT-010)为例,其 func 包含组合模式:
| 强度 | 指令 (Hex) | 说明 |
|---|---|---|
| -1 (停止) | 6db643ce97fe427ce5157d | 停止 |
| 0 | 6db643ce97fe427cf5946d | 基础档 |
| 1 | 6db643ce97fe427cf41d7c | 档位 1 |
| 2 | 6db643ce97fe427cf7864e | 档位 2 |
| ... | ... | ... |
| 9 | 6db643ce97fe427cfc55f0 | 档位 9 |
使用 func 还是默认指令集
function shouldUseDefaultProtocol(device: Device): boolean {
// 当 func 和 modes 都为空时,使用默认协议指令集
const hasFunc = device.func && device.func.length > 0
const hasModes = device.modes && device.modes.length > 0
return !hasFunc && !hasModes
}- 如果设备 API 返回了
func/modes数据,优先使用 API 数据中的命令 - 如果
func和modes都为空,则根据modelName使用deviceModes.ts中的默认指令集
协议对比总结
| 特性 | Default | NNG / NONO | MY |
|---|---|---|---|
| 命令前缀 | 6db643ce97fe427c | 6DB64324F89D427C | AA0B |
| 命令长度 | 22 字符 | 22 字符 | 10 字符 |
| 停止命令 | ...e5157d | ...E56EA1 | AA0B140000 |
| 模式数量 | 9 档 | 9 档 | 9 档 |
| 型号匹配 | 默认 / 其他 | 含 NNG / NONO | 含 MY |
| 电机控制 | 三电机同步 | 三电机同步 | 独立控制 |
| 短指令特点 | 独立命令集 | 与长指令相同 | 独立命令集 |