edit | blame | history | raw

2026-06-23 MLV6 触发排查

用户目标

  • 继续推进 2.1.0 / 20100 的 MLV6 触摸功能与异常触发排查。
  • 优先解决真实设备静止时仍触发震动或叫声音频的问题。
  • 后续再继续验证触摸片是否能采集速度并触发对应音频。

工作起点

  • App worktree:/Users/ar/Projects/langmei/.worktrees/lm-app-MV6touch-210
  • SDK worktree:/Users/ar/Projects/langmei/.worktrees/lm-sdk-MV6touch-210
  • 后端 worktree:/Users/ar/Projects/langmei/.worktrees/dudu-java-MV6touch-210
  • 当前目标版本:2.1.0 / 20100
  • 当前线上稳定版本:2.0.64 / 20065
  • 当前真机设备:Android 真机,已连接 MLV6 并进入辛灵通话页做过联调。

已完成事项

  • 已确认旧包卸载后重新安装 2.1.0 / 20100 APK,用户目测确认一段时间内不再出现莫名其妙自动震动。
  • 已确认本地震动误触发第一阶段修复有效:0x30 -> cmdScream 不再继续本地下发 0x45 震动命令。
  • 已抓到静止状态下仍持续收到 MLV6 的 0x30 上行日志。
  • 已确认辛灵持续播放叫声音频的直接原因:
  • 设备静止、用户未触摸/未晃动;
  • MLV6 仍周期性上报首字节 0x30
  • App 当前把 0x30 无条件当成 CMD_SCREAM / JJImpact
  • App 继续发送 /engine/input
  • 后端按三轴撞击时间间隔匹配叫声音频并返回播放。

关键代码结论

  • 旧设备链路:
  • 旧设备型号:BoboRobotsML-NML-MLV1MLV2
  • 通过 0x44 心跳里的加速度数据进入 AccelerationCalcUtil
  • AccelerationCalcUtil 会用平均加速度、角度相似度、阈值和至少第二次撞击等逻辑防误判。
  • 新设备链路:

  • 新设备型号:MLS3MLV3MLV5MLV6
  • 通过硬件直接上报 0x30 表示晃动/撞击。
  • 当前 App 只要收到 BLE 首字节 0x30,就透传为 CMD_SCREAM 并进入 cmdScream
  • 当前新设备链路没有等价于 AccelerationCalcUtil 的防误判门槛。
  • 当前“速度”定义:

  • 硬件 0x30 没有携带真实速度、强度或加速度值。
  • App 现在用两次 0x30 之间的时间间隔 timeIntervalMs 推导快/中/慢。
  • 后端 ThreeAxisSensorJJShock2AudioFiltersensor.three_axis.jjimpact 配置里的时间范围匹配标签。

关键决策

  • 两条链路同时存在是合理的,但必须按设备能力互斥,不能让同一设备同一场通话里两套判定同时独立触发后端音频。
  • 旧设备继续走 AccelerationCalcUtil 软件加速度判定。
  • 新设备可以接收硬件 0x30,但 0x30 不能再被无条件视为有效撞击。
  • 新设备 0x30 应从“有效撞击”降级为“候选撞击”,经过去抖/误报过滤后才允许上传后端。
  • 修复优先在 SDK 源头实现,再同步到 App 运行副本;尽量不改后端、不改协议。

建议的最小方案

  • 在 SDK 源头 noStory.vuecmdScream 前增加硬件 0x30 过滤状态机。
  • 每个设备独立维护状态,避免多个设备互相污染。
  • 建议规则:
  • 第一个 0x30 只进入 pending,不上传后端。
  • 小于 80ms100ms 的后续 0x30 视为重复包/抖动,不上传后端。
  • 超过确认窗口,例如 3000ms,视为孤立误报,重置 pending,不上传后端。
  • 只有确认窗口内出现第二个非重复 0x30,才视为有效撞击并上传后端。
  • 速度只用已确认的非重复事件间隔计算,不能用全部原始 0x30
  • 必须记录完整日志:
  • 原始 0x30
  • 设备 ID
  • 过滤结果
  • reason
  • interval
  • 是否发送 /engine/input

已修改文件

  • /Users/ar/Projects/langmei/.worktrees/lm-app-MV6touch-210/docs/round5/TODO.md
  • 追加静止 0x30 误触发音频的缺陷纠偏。
  • 记录旧策略“保留 0x30 无条件上报后端”已被真机证据推翻。
  • 增加后续 TODO:修复静止 0x30 误触发音频、静止验证、有效晃动回归。

证据文件

  • /Users/ar/Projects/langmei/.worktrees/lm-app-MV6touch-210/docs/round5/evidence/android-call-log-after-clean-install-20260623-1839.log
  • 证明本地 0x45 震动误触发已被切断。
  • /Users/ar/Projects/langmei/.worktrees/lm-app-MV6touch-210/docs/round5/evidence/android-unrequested-audio-log-20260623-1848.log

  • 证明静止状态下仍收到 0x30,并继续触发 /engine/inputCMD_SCREAM
  • 典型间隔包括约 4980ms 的周期包,以及 12ms22ms40ms 的短间隔重复包。

未决问题

  • 需要确认最终 0x30 过滤阈值:
  • 去抖阈值建议 80ms100ms
  • 确认窗口建议 3000ms
  • 需要实现过滤状态机并同步 SDK 到 App。
  • 需要重新打包 APK,确保安装包与当前 SDK 源码完全一致。
  • 需要真机验证:
  • 静止 60 秒不再触发 CMD_SCREAM 后端音频。
  • 真实晃动仍能触发 CMD_SCREAM
  • 触摸功能后续再继续验证。

后续建议

  • 下一步先把 0x30 过滤方案落到 round5 需求/TODO 中,再改 SDK 源头。
  • 修复后先做静止测试,再播放提醒音频请用户操作硬件做真实晃动测试。
  • 所有用户需要触摸片/晃动硬件的步骤前,必须播放 /Users/ar/.codex/audioalert/Langmei-真机测试提醒.mp3