蓝牙设备对接文档

广播指令集

不同设备型号的广播命令映射

指令概述

广播设备通过 Hex 编码的指令字符串控制。每个品牌拥有独立的指令集,指令分为三类:

  • 长指令 (Classic Modes) — 设备持续执行,需要发送停止指令才会停止
  • 短指令 (Short Broadcast Modes) — 设备执行约 2 秒后自动停止
  • 停止指令 (Stop Command) — 立即停止设备运行

系统根据设备的 modelName 自动选择对应的指令集。当设备 API 返回的 funcmodes 数组为空时,使用 deviceModes.ts 中定义的默认指令集。

Default 设备指令

适用于大多数广播设备(modelName 不包含 NNGNONOMY),使用 22 字符 Hex 命令,前缀为 6db643ce97fe427c

长指令(持续模式)

通过 getClassicModes() 获取。设备接收后持续执行,直到收到停止指令。

档位指令 (Hex)电机强度 [M1, M2, M3]
停止6db643ce97fe427ce5157d[0, 0, 0]
16db643ce97fe427ce49c6c[1, 1, 1]
26db643ce97fe427ce7075e[2, 2, 2]
36db643ce97fe427ce68e4f[3, 3, 3]
46db643ce97fe427ce1313b[4, 4, 4]
56db643ce97fe427ce0b82a[5, 5, 5]
66db643ce97fe427ce32318[6, 6, 6]
76db643ce97fe427ce2aa09[7, 7, 7]
86db643ce97fe427ced5df1[8, 8, 8]
96db643ce97fe427cecd4e0[9, 9, 9]

短指令(2 秒自动停止)

通过 getShortBroadcastModes() 获取。设备接收后执行约 2 秒自动停止,无需发送停止指令。

档位指令 (Hex)电机强度 [M1, M2, M3]
16db643ce97fe427cf41d7c[1, 1, 1]
26db643ce97fe427cf7864e[2, 2, 2]
36db643ce97fe427cf60f5f[3, 3, 3]
46db643ce97fe427cf1b02b[4, 4, 4]
56db643ce97fe427cf0393a[5, 5, 5]
66db643ce97fe427cf3a208[6, 6, 6]
76db643ce97fe427cf22b19[7, 7, 7]
86db643ce97fe427cfddce1[8, 8, 8]
96db643ce97fe427cfc55f0[9, 9, 9]

停止指令

6db643ce97fe427ce5157d

NNG / NONO 设备指令

适用于 modelName 包含 NNGNONO 的设备,使用 22 字符 Hex 命令,前缀为 6DB64324F89D427C

长指令(持续模式)

档位指令 (Hex)
16DB64324F89D427CE4E7B0
26DB64324F89D427CE77C82
36DB64324F89D427CE6F593
46DB64324F89D427CE14AE7
56DB64324F89D427CE0C3F6
66DB64324F89D427CE358C4
76DB64324F89D427CE2D1D5
86DB64324F89D427CED262D
96DB64324F89D427CECAF3C

短指令

NNG 设备的短指令与长指令相同(设备端自行控制执行时长):

档位指令 (Hex)
16DB64324F89D427CE4E7B0
26DB64324F89D427CE77C82
36DB64324F89D427CE6F593
46DB64324F89D427CE14AE7
56DB64324F89D427CE0C3F6
66DB64324F89D427CE358C4
76DB64324F89D427CE2D1D5
86DB64324F89D427CED262D
96DB64324F89D427CECAF3C

停止指令

6DB64324F89D427CE56EA1

MY 设备指令

适用于 modelName 包含 MY 的设备,使用 10 字符 Hex 命令,前缀为 AA0B

长指令(持续模式)

档位指令 (Hex)
1AA0B010109
2AA0B010209
3AA0B010309
4AA0B000001
5AA0B000002
6AA0B000003
7AA0B000004
8AA0B000005
9AA0B000006

短指令

档位指令 (Hex)
1AA0B000001
2AA0B000003
3AA0B000005
4AA0B000007
5AA0B000009
6AA0B00000B
7AA0B00000B
8AA0B000011
9AA0B000013

停止指令

AA0B140000

长指令与短指令的区别

特性长指令 (Classic Modes)短指令 (Short Broadcast Modes)
获取方式getClassicModes(modelName)getShortBroadcastModes(modelName)
设备行为持续运行,直到收到停止指令执行约 2 秒后自动停止
停止方式必须发送停止指令自动停止,无需额外操作
适用场景经典模式预设切换,需要持续控制联动控制(视频、音乐、滑动等)
数据来源deviceModes.ts 中的 modes / nngModes / myModesdeviceModes.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停止
06db643ce97fe427cf5946d基础档
16db643ce97fe427cf41d7c档位 1
26db643ce97fe427cf7864e档位 2
.........
96db643ce97fe427cfc55f0档位 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 数据中的命令
  • 如果 funcmodes 都为空,则根据 modelName 使用 deviceModes.ts 中的默认指令集

协议对比总结

特性DefaultNNG / NONOMY
命令前缀6db643ce97fe427c6DB64324F89D427CAA0B
命令长度22 字符22 字符10 字符
停止命令...e5157d...E56EA1AA0B140000
模式数量9 档9 档9 档
型号匹配默认 / 其他NNG / NONOMY
电机控制三电机同步三电机同步独立控制
短指令特点独立命令集与长指令相同独立命令集