GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件运维 --- 某康SDK兼容问题排查

故障处理总结

一、主要故障概述

共两类被叫故障:
故障 A:.被叫闪退 —— 设备按呼叫按钮,PC 端来电窗口一闪而过(存活仅 0.23 秒)即被挂断。
故障 B: 被叫无响应 —— 设备按呼叫按钮,PC 端完全无反应,无窗口、无日志。

二、如何发现的

故障 A:抓包逐帧分析 + 代码链路印证

  1. 流量对比:正常场景 1100+ 帧媒体流,异常场景 0 帧、RTSP 会话 0.14 秒"建好即拆"——判断媒体从未建立。
  2. 毫秒级时间线:RTSP 握手全部成功,PLAY 成功后仅 45ms 客户端就主动发 TEARDOWN——0.23 秒远超人类反应速度,说明挂断是程序自动行为,不是用户操作也不是崩溃(心跳持续 14 秒)。
  3. 时钟偏差证据:解码报警包时间字段,发现设备时间与 PC 时间偏差 15 分 09 秒,且与某康 demo 正常场景的偏差完全一致 → 设备时钟慢 15 分钟(NTP 未同步)。
  4. 代码对账:反编译代码证实被叫链路把设备报警时间戳作为振铃计时基准,30 秒超时判定因此恒成立,定时器第一个 tick 就执行挂断。推算时刻与抓包实测时刻(45ms 空隙)严丝合缝,推测变实锤。

故障 B:排除法 + 版本对比

  1. 抓包:布防后 17 秒零报警——事件推送链路完全断裂,但布防确认、心跳全部正常(表象完美)。
  2. 逐项排除:设备时钟准确、无事件外发配置、无异常上报地址。
  3. 突破口——固件对比:同为一个型号,.141 是老固件 V5.1.6,.130 是新固件 V5.2.2,行为差异指向固件校验差异。
  4. 参数核对:某康 SDK 布防等级 byLevel 只有 0/1 两个合法值,而代码调用时传了 AlarmLevel.Low = 2(超范围)。自研工具 HkCallTool 用等级 1 在同一设备上一直正常——同设备、同 SDK、不同参数、不同结果,嫌疑锁定。改传合法值 1 后重新布防,按键 0.4 秒内报警到达,闭环验证。

三、如何解决的

故障修复
A 被叫不再使用设备时间戳,超时基准改用本地 DateTime.Now
A 配套 时间字段非法的设备回调崩溃,加 try-catch 回退本地时间
B 布防等级由 AlarmLevel.Low(2) 改为 AlarmLevel.Middle(1)
修复后均重新抓包 + 现场按键实测,证据链闭合。

四、本质原因

两类故障的共同本质是:代码中存在脆弱假设,被设备差异引爆。
  • 故障 A:假设"设备时钟 ≈ PC 时钟"。设备 NTP 未同步、慢 15 分钟,用设备时间戳做超时判断就恒超时。
  • 故障 B:假设"枚举值 Low=2 是合法布防等级"。老固件 V5.1.6 宽容(当作默认值照常工作),bug 被掩蔽多年;新固件 V5.2.2 严格校验,非法值导致布防订阅是"空壳"——连接、确认、心跳全部正常,事件却不推送。这解释了为什么故障集中出现在固件升级后的设备上。
更深一层的架构问题:某度客户端把 SDK 回调当作业务入口(6 层同步调用链、无异常保护、自动驱动开窗/挂断),而对照工具 HkCallTool 只读字段、只投递消息、不做判断——前者把 SDK 线程上的每个假设都变成了雷。
 

posted on 2026-10-02 21:27  GKLBB  阅读(5)  评论(0)    收藏  举报