410 型优卡特称重台 · 2026.09.09

扫码中断会议逻辑复核与确定性模拟

日期: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次应足够’成立的假设

  1. “连续”是相邻有效处理回包的运行长度,任何有效盘码必须清零;不是总累计、滑动窗口内凑够3次或三个计时器叠加。
  2. 真实扫码周期与上报周期有确定上界;不能只用平均300ms/100ms代替最大间隔、抖动及调度边界。
  3. 回包中的空表示什么已有定义。若中间两次是保持上次码,与“中间两次没有新扫码所以回空”是不同协议,不能混用。
  4. 在盘真实扫码每次成功,或业务明确容忍的漏扫次数有上界;“采样是真实的”本身不保证识别成功。
  5. 启动、换盘、恢复及重新初始化不会制造多次空码;状态及计数更新串行且不会重复处理同一包。
  6. 无回包不由这个按包计数规则解决;它需要独立定义为设备不可用/通信超时,不能直接伪装成物理盘被拿走。

在理想的“中间没有新扫描就回空,但每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信息

这些信息不妨碍完成静态审计,但在不足时不能宣布硬件已排除、真实根因已定位或修改已修复现场问题。