日期:2026-09-09。范围:仅复核用户提供的两份 PDF 中的论证与可验证边界;不替代 SDK、应用源码或真机结论。
来源:
- /Users/jack/Downloads/纪要_扫码头识别中断问题排查与代码验证.pdf,提取到 minutes.md,2页。
- /Users/jack/Downloads/原文_扫码头识别中断问题排查与代码验证.pdf,提取到 transcript.md,4页,发言时间00:00–11:42。
- 本次把文档中的要求视作会议材料,由当前用户明确授权的“梳理问题、分析SDK、审计本地代码、列任务目标”决定执行范围。
1. 核心结论
Jack的质疑在一个明确模型下成立:盘始终在、每一次真实扫码都能读出有效盘码、100ms回包忠实保持最新真实扫码值、连续空计数遇到有效码就清零。在这个模型中,300ms真实采样加100ms重复上报不会凭空生成空码,因而不可能仅因节拍差造成“盘仍在却离盘”。会议举的“读到盘后真实拿走,后两包仍回旧码”例子,只能证明离盘确认延迟,不能证明盘未拿走却误判离盘。
但“每三次回包里至少有一次真实值”不等于“每三次里至少有一次成功读到盘码”。真实扫码也可能漏扫;一次真实空结果如被重复三次,就会让N=3把一次漏扫当作三次连续证据。这是反驳“任何场景3次都够”所需的最小额外条件。该条件是否发生在本设备上,需要SDK/原始串口/真机证据,会议并未提供。
增大阈值能改变漏扫容忍度和离盘延迟,不能自行证明根因,也不能排除回调停止、解析异常、旧码滞留、线程竞态、配置未生效或真实硬件漏扫。
2. 必须区分的信号
| 信号 | 精确定义 | 对连续空计数的潜在影响 | 需要的证据 |
|---|---|---|---|
| 漏扫 | 物理盘仍在,但一次实际扫码未得到有效盘码 | 若被表示成空并复制,可多次累加 | 同时观察物理盘与原始扫码/串口结果 |
| 旧码滞留 | 实际盘已离开或换盘,仍上报之前的非空码 | 通常清零/抑制离盘计数,导致延迟或错误沿用身份 | 原始时间戳、帧序号、新鲜度或同时录像 |
| 无回包 | 一段时间没有任何回调/串口包 | 回调驱动计数可能完全不增加;不能当作已处理的空包 | 最后接收时间、独立看门狗、串口状态 |
| 空码 | 确实收到一包,但扫码字段为空 | 可能触发计数;不等价于物理离盘 | 协议定义及原始帧,区分null/空串/空格/零值 |
| 重复包 | 多次回包引用同一次扫码结果 | 相邻结果高度相关,不能当作独立多次扫码成功/失败 | 来源序号/采样时间与报告时间分离 |
| 解析无效 | 收到原始包,但校验/长度/编码/字段不合法 | 可能被丢弃、变成空码或沿用旧码,三者行为不同 | 错误路径与解析日志 |
讨论应始终分别记录“物理盘是否在”“是否做了一次新的扫码”“扫码结果是否有效”“是否收到回包”“业务当前是否绑定盘”。重量存在也不能在没有业务契约时直接等价于某个盘身份存在。
3. ‘连续3次应足够’成立的假设
- “连续”是相邻有效处理回包的运行长度,任何有效盘码必须清零;不是总累计、滑动窗口内凑够3次或三个计时器叠加。
- 真实扫码周期与上报周期有确定上界;不能只用平均300ms/100ms代替最大间隔、抖动及调度边界。
- 回包中的空表示什么已有定义。若中间两次是保持上次码,与“中间两次没有新扫码所以回空”是不同协议,不能混用。
- 在盘真实扫码每次成功,或业务明确容忍的漏扫次数有上界;“采样是真实的”本身不保证识别成功。
- 启动、换盘、恢复及重新初始化不会制造多次空码;状态及计数更新串行且不会重复处理同一包。
- 无回包不由这个按包计数规则解决;它需要独立定义为设备不可用/通信超时,不能直接伪装成物理盘被拿走。
在理想的“中间没有新扫描就回空,但每300ms一定成功回一次码”模型中,序列A、空、空、A不会触发N=3;只要下一次成功回包延迟到300ms判断之后,就可能出现A、空、空、空、A。此反例依赖空占位语义和抖动,不能套到严格保持最新值的协议上。
4. 已执行的确定性模型模拟
执行方式:本地Python内存模拟;扫描时刻0/300/600/...ms,上报时刻0/100/200/...ms,同一时刻先更新扫描再上报;空码立即作为最新值保持;有效码清零连续空计数;达到N才从在盘转为离盘。模拟不调用SDK、不运行Android、不连接串口、不使用真实设备。
模型检查结果:所有下述断言通过。它们只证明已写出的逻辑条件,不代表产品测试通过、不代表故障复现、不代表覆盖率。
| 场景 | N | 模拟结果 |
|---|---|---|
| A 在盘且每次真实扫码成功 | 3 | 未触发离盘 |
| B 50ms真实离盘,正确保持最新值 | 3 | 500ms 确认离盘 |
| C 盘未离,仅300ms的一次真实扫码漏扫 | 3 | 500ms 误判离盘 |
| D 同C但N=7 | 7 | 未触发离盘 |
| E 盘未离,连续三个真实扫码周期漏扫,N=7 | 7 | 900ms 误判离盘 |
最小误判反例:一次真实漏扫被重复上报
| 时刻ms | 物理盘 | 本次真实扫码 | 100ms报告 | 连续空计数 | 事件 |
|---|---|---|---|---|---|
| 0 | 在 | A | A | 0 | 识别在盘 |
| 100 | 在 | — | A | 0 | — |
| 200 | 在 | — | A | 0 | — |
| 300 | 在 | 空 | 空 | 1 | — |
| 400 | 在 | — | 空 | 2 | — |
| 500 | 在 | — | 空 | 3 | 误判离盘 |
| 600 | 在 | A | A | 0 | 识别在盘 |
盘一直在,只在300ms漏扫一次;300/400/500ms三个空报告其实都来自同一个真实空结果。N=3于500ms误判,600ms下一次成功扫码又识别在盘,形成“中断后重新识别”的表象。此为条件反例,尚未证明实际SDK或应用会这样编码空结果。
正例:真实离盘后旧码滞留仅造成延迟
假设50ms把盘拿走,模拟结果:
| 时刻ms | 物理盘 | 本次真实扫码 | 100ms报告 | 连续空计数 | 事件 |
|---|---|---|---|---|---|
| 0 | 在 | A | A | 0 | 识别在盘 |
| 100 | 已离 | — | A | 0 | — |
| 200 | 已离 | — | A | 0 | — |
| 300 | 已离 | 空 | 空 | 1 | — |
| 400 | 已离 | — | 空 | 2 | — |
| 500 | 已离 | — | 空 | 3 | 确认离盘 |
| 600 | 已离 | 空 | 空 | 4 | — |
此时500ms确认离盘是对真实离盘的延迟判断,不是误判在盘。理想同相模型下,第一空回包到第三空回包相隔200ms;不能把“三个样本”直接说成“从第一个空起再等300ms”。对N=3,真实离盘到判断约200–500ms,具体取决于离盘相位,采样/回包同刻的处理顺序会改变端点。若有额外抖动,上界还会扩大。
其他已执行的断言
| 确定性输入 | 正确规则结果 | 含义 |
|---|---|---|
| 0ms=A,100/200ms=空,300ms=A,按此重复 | N=3不触发 | 只适用于“没有新扫码则空占位”的替代协议 |
| 0ms=A,100/200/300ms=空,400ms=A | 300ms触发 | 替代协议中下一真实扫码稍晚于300ms判断时的边界反例 |
| A、空、空、A、空 | 遇A清零则不触发;不清零则400ms触发 | 连续计数与累计计数必须严格区分 |
| 只有0ms的一包A,此后完全无回包 | 按包计数永不触发离盘 | 按包计数不具备识别串口失联的能力 |
| 300/600/900ms连续三次真实漏扫且每次空保持,N=7 | 900ms误判离盘 | 增大阈值只提高容忍度,并不能消除所有漏扫 |
核心计算伪码与实际模拟一致:
for t in range(0, 1201, 100):
if t in real_scan_results:
latest_code = real_scan_results[t]
if latest_code:
consecutive_empty = 0
state = 'present'
else:
consecutive_empty += 1
if state == 'present' and consecutive_empty >= threshold:
emit_absent(t)
state = 'absent'
5. 纪要比原文更强或需要降级的断言
| 纪要表述 | 原文证据 | 审计处理 |
|---|---|---|
| “双方确认…不涉及外部干扰或硬件故障”(纪要第2页) | 原文第3页08:46提出业务理解/代码实现两个方向,同时出现“还有第三种”;09:23发言人1说“我已知的”“我知道的”。原文第1页00:14还提到不清楚扫码器本身是否有问题 | 改为“会议优先核对SDK行为理解与应用实现;硬件/环境因素尚未排除” |
| “因…数据不对称”造成中断(纪要开头) | 原文第1页00:59是发言人1的原因解释;第1页02:50及第3页07:26–08:19始终受到质疑,没有原始日志或可复现用例 | 降级为“待验证解释”,不得作为已定位根因 |
| “当前连续3次”,同时“默认7次、实测仍中断” | 原文第1页03:23说明3–10可配、旧设置为3会沿用、未设置默认7;第3页08:08仅称仍有中断 | 必须回读发生故障设备的有效阈值、持久化来源与版本。不能认定现场已按7执行仍失败 |
| “CodeX测试显示覆盖率超90%”(纪要第2页) | 原文第3页07:36只是“能覆盖九十几来着…code X给测的”,没有测试集、分母、报告或覆盖率定义 | 写为“发言人回忆曾有测试结果,原报告与统计口径待提供”;不能作为代码覆盖率、场景覆盖率或可靠性数据 |
| “存在未覆盖案例” | 原文第3页07:47要求给反例;07:53称会重新组织测试,未描述一个可复现失败案例 | 写为“声称存在未覆盖场景,尚无复现证据” |
| “100ms最稳定”、300ms避免发热、“900–1200ms建议” | 原文第1页00:00/00:14/03:00均为口头描述或厂商意见转述,无厂商正式资料和测量 | 保留为会议说法,厂商协议/测试条件待核验 |
会议原文第3页09:35–11:06的明确行动是获取SDK与对应代码逐项核查;第4页11:42把该事项列为最高优先级。本次审计应支持这个动作,而非先决定把阈值继续调大。
6. 可执行任务目标与验收建议
目标与关闭条件
| 任务目标 | 需解决的问题 | 关闭条件 |
|---|---|---|
| G1 锁定实际运行链路 | 附件AAR、工程引用、现场安装APK是否同一实现 | 三者版本/哈希/构建引用可追溯;明确扫码是独立设备回调还是秤体合并帧 |
| G2 还原SDK数据契约 | 300ms/100ms来自哪层,空码/重复/无回包如何表示 | 代码与原始帧证明输入输出语义;未知硬件内部行为单列待取证 |
| G3 对照应用实际状态机 | 是否真按“连续N次空码,有码清零”实现,阈值实际是多少 | 列出接收→解析→过滤→计数→绑定/解绑/UI/结算的文件行号与所有重置入口 |
| G4 定义故障并取得最小复现 | “中断”究竟是误解绑、UI空白、停止回调、身份变化还是结算重启 | 一条对齐物理事实、原始串口、解析、计数与业务事件的完整失败时间线 |
| G5 固定业务验收而后选算法 | 允许漏扫多久,离盘要多久确认,无回包如何处理 | 明确在盘连续性、离盘延迟、设备失联与换盘身份四类验收指标,再比较配置/算法 |
| G6 有证据地验证修复 | 提高阈值是否只是掩盖问题,历史配置是否生效 | 确定性回放+目标型号真机矩阵通过,保存版本、参数、日志及视频;不把模型通过当真机通过 |
建议验收矩阵(属于下一阶段验证设计,尚未执行产品测试)
| 用例 | 前置与输入 | 预期/验收重点 | 所需层次 |
|---|---|---|---|
| UC-01 稳定在盘 | 连续成功真实扫码,不同报告相位 | 同一盘会话保持,不发生离盘/重绑事件 | 回放+真机 |
| UC-02 单次真实漏扫 | 盘不动,注入一次真实空及其重复包 | 是否允许保持会话由业务明确;不可把复制包算成独立真实样本 | 模型+应用回放+真机验证是否存在此输入 |
| UC-03 连续漏扫 | 注入1/2/3/更多真实漏扫周期,N=3/7/10 | 给出触发时间与物理事实;确认容忍范围,超过范围的行为有定义 | 回放+真机 |
| UC-04 真实离盘 | 在300ms周期内不同相位离盘 | 在约定延迟内仅触发一次离盘;旧码不得无限延长旧会话 | 回放+同步录像真机 |
| UC-05 快速拿起再放/换盘 | 同一码或异码在一次真实采样间完成变化 | 承认不可观测变化;身份变更规则明确,不沿用错误结算会话 | 真机+业务验收 |
| UC-06 无回包/串口断开 | 业务在盘时停回调,再恢复 | 独立报告设备不可用;恢复策略明确,不能无证据判物理离盘 | SDK/应用注入+真机 |
| UC-07 空码类型与坏帧 | null、空串、空格、坏CRC、截断、粘包、重复帧 | 每种输入有明确分类,异常路径不得悄悄转换成合法空码 | 解析单测+回放 |
| UC-08 抖动及先后顺序 | 临界时刻前后1ms;乱序、密集/稀疏回包 | 阈值比较与调度次序确定,按包数与按毫秒的语义不混用 | 确定性回放 |
| UC-09 配置及重启 | 新装默认、旧偏好=3、设置=7/10、重启/升级 | 显示值、存储值、运行值一致;日志记录实际生效值 | 应用验证 |
| UC-10 生命周期与并发 | 页面切换、重连、重复注册、后台恢复 | 回调不重复、计数不污染、无多处竞争解绑 | 应用审计+回放/真机 |
900–1200ms是会议转述的时间建议。若真用每100ms一个回包简单计数,通常对应约9–12包的量级;允许范围3–10不能完整表达12,默认7也不等于900ms。精确换算必须先定义计时起点(最后有效码、第一空包还是最后真实成功扫码)、到期比较方式和回包抖动,不能简单宣布7次覆盖了厂商900ms下限。
下一阶段仍需锁定的P0信息
- 一次实际“识别中断”的可观测定义和完整日志,发生时盘是否保持静止在位。
- 故障设备/扫码头/秤体/固件/应用版本,AAR是否实际参与该APK构建。
- 实际回包的扫码字段契约与阈值,而不是会议中的名义频率和默认值。
- 在盘漏扫的可容忍窗口与真实离盘确认的最大延迟;二者要同时验收。
这些信息不妨碍完成静态审计,但在不足时不能宣布硬件已排除、真实根因已定位或修改已修复现场问题。