
无人售货柜门锁异常自愈开门超时、卡死、误触发防护机制大家好我是黒漂技术佬。门锁专题第二篇咱们聊异常情况怎么处理。上一篇讲了正常的开门控制但实际量产中正常情况是少数各种奇葩异常才是常态。门开了不关怎么办门锁卡死了怎么办误触发开门导致丢货怎么办做工控设备正常功能只是及格线异常处理能力才是拉开差距的地方。今天给大家一套完整的门锁异常自愈方案。一、门锁常见异常场景盘点先列一下量产中最常见的门锁异常看看你遇到过几个异常类型现象危害开门超时发了开门指令但门一直没开用户用不了投诉关门超时门开了之后一直不关丢货、安全隐患门锁卡死门锁机械结构卡住开也开不了关也关不了设备瘫痪需现场维修误触发开门没收到指令门自己开了丢货、资损门磁异常门磁状态一直不变检测不到开关状态不准业务逻辑乱继电器粘住继电器触点熔焊一直通电开锁门一直开着严重丢货核心目标异常发生了设备能自己发现、自己尝试恢复、实在不行再告警尽量减少人工介入。二、开门超时处理什么是开门超时发了开门指令在规定时间内门没有打开就是开门超时。超时原因分析门锁坏了电机不工作机械结构卡住了锁舌弹不出来继电器没吸合锁没通电门被外力顶住了锁开了但门弹不开超时处理策略publicclassOpenTimeoutHandler{privatestaticfinallongOPEN_TIMEOUT5000;// 5秒开门超时privatestaticfinalintMAX_RETRY2;// 最多重试2次/** * 带重试的开门 */publicOpenResultopenDoorWithRetry(intdoorNo){intretryCount0;while(retryCountMAX_RETRY){OpenResultresultdoOpenDoor(doorNo);if(resultOpenResult.SUCCESS){returnOpenResult.SUCCESS;}retryCount;Log.w(Door,开门失败第 retryCount 次重试);// 重试前等一下try{Thread.sleep(500);}catch(InterruptedExceptione){break;}}// 重试都失败了onOpenFailedCompletely(doorNo);returnOpenResult.FAILED;}privateOpenResultdoOpenDoor(intdoorNo){// 发开门指令controller.openDoor(doorNo,3000);// 等待门打开longstartSystem.currentTimeMillis();while(System.currentTimeMillis()-startOPEN_TIMEOUT){if(controller.getDoorStatus(doorNo)1){returnOpenResult.SUCCESS;}try{Thread.sleep(100);}catch(InterruptedExceptione){break;}}returnOpenResult.TIMEOUT;}}重试失败后的升级处理重试几次都开不了就不能再试了升级处理privatevoidonOpenFailedCompletely(intdoorNo){// 1. 记录详细日志DoorAlarmLogger.logOpenFail(doorNo);// 2. 上报云端告警MqttManager.publishAlarm(door_open_failed,门doorNo开门失败重试MAX_RETRY次无效);// 3. 标记门锁故障后续开门指令直接拒绝markDoorFault(doorNo);// 4. 如果所有门都故障了触发整机异常状态checkAllDoorFault();}三、关门超时长时间开门处理这个是最危险的异常——门开了之后一直不关货就丢光了。超时检测publicclassDoorOpenMonitor{privatestaticfinallongMAX_OPEN_TIME120000;// 最长开门2分钟privateMapInteger,LongopenStartTimenewHashMap();/** * 门状态变化时调用 */publicvoidonDoorStatusChanged(intdoorNo,intnewStatus){if(newStatus1){// 门开了记录开始时间openStartTime.put(doorNo,System.currentTimeMillis());startMonitorTimer();}else{// 门关了清除openStartTime.remove(doorNo);}}/** * 定时检查 */privatevoidcheckOpenTimeout(){longnowSystem.currentTimeMillis();for(Map.EntryInteger,Longentry:openStartTime.entrySet()){intdoorNoentry.getKey();longdurationnow-entry.getValue();if(durationMAX_OPEN_TIME){// 开门超时了onDoorOpenTooLong(doorNo,duration);}}}}分级处理策略开门时间太长分等级处理从轻到重阶段开门时长处理动作预警 60秒提示音提醒用户上报预警一级处理 2分钟尝试自动落锁发关门脉冲二级处理 5分钟再次尝试落锁严重告警三级处理 10分钟持续告警通知运营人员现场处理privatevoidonDoorOpenTooLong(intdoorNo,longduration){if(duration2*60*1000){// 60秒~2分钟预警playReminderSound();reportWarning(doorNo,duration);}elseif(duration5*60*1000){// 2~5分钟一级处理尝试自动关门tryForceCloseDoor(doorNo);reportLevel1Alarm(doorNo,duration);}elseif(duration10*60*1000){// 5~10分钟二级处理再试一次tryForceCloseDoor(doorNo);reportLevel2Alarm(doorNo,duration);}else{// 10分钟以上严重告警reportCriticalAlarm(doorNo,duration);}}强制关门的实现怎么强制关门看门锁类型电磁锁断电就落锁直接断继电器就行电机锁发关门指令电机反转锁上弹簧锁一般开门是脉冲超时了弹不回去可能卡住了再给个脉冲试试publicvoidtryForceCloseDoor(intdoorNo){Log.w(Door,尝试强制关门: doorNo);// 先确保继电器断开controller.relayOff(doorNo);// 等一下再给个反向脉冲如果支持的话try{Thread.sleep(500);}catch(InterruptedExceptione){}// 有些门锁需要发专门的关门指令controller.sendCloseCommand(doorNo);}四、门锁卡死检测与处理什么是门锁卡死门锁机械结构卡住了既开不了也关不上处于中间状态。卡死的检测特征开门指令发了门状态没变化关门指令发了门状态也没变化连续多次操作都没反应手动推门也推不动这个设备检测不到靠用户反馈卡死检测逻辑publicclassDoorStuckDetector{privatestaticfinalintSTUCK_THRESHOLD3;// 连续3次操作失败判定为卡死privateMapInteger,IntegerfailCountnewHashMap();/** * 每次开门失败调用 */publicvoidonOpenFail(intdoorNo){intcountfailCount.getOrDefault(doorNo,0)1;failCount.put(doorNo,count);if(countSTUCK_THRESHOLD){// 可能卡死了onDoorStuckDetected(doorNo);}}/** * 开门成功了重置计数 */publicvoidonOpenSuccess(intdoorNo){failCount.put(doorNo,0);}}卡死自愈尝试检测到卡死可以尝试一些恢复手段反复脉冲连续给几次开关脉冲有时候能震开反向驱动如果电机支持正反转反着转一下试试延迟重试等一会儿再试可能是临时卡住privatevoidonDoorStuckDetected(intdoorNo){Log.e(Door,检测到门锁可能卡死: doorNo);// 尝试自愈连续脉冲3次newThread(()-{for(inti0;i3;i){controller.pulseDoor(doorNo,500);try{Thread.sleep(1000);}catch(InterruptedExceptione){break;}}// 自愈后检查状态intstatuscontroller.getDoorStatus(doorNo);if(status0){Log.i(Door,门锁自愈成功);failCount.put(doorNo,0);}else{Log.e(Door,门锁自愈失败需要人工处理);reportStuckAlarm(doorNo);markDoorFault(doorNo);}}).start();}五、误开门防护误开门就是没收到指令门自己开了这个直接导致丢货必须防。误开门的原因继电器误触发干扰、静电门锁电路板bug串口通信干扰误解析成开门指令软件bug错误调用了开门接口防护机制一开门指令二次校验publicclassDoorCommandValidator{/** * 校验开门指令是否合法 */publicbooleanvalidateOpenCommand(OpenCommandcmd){// 1. 检查签名/Token防止伪造指令if(!verifySignature(cmd)){Log.w(Door,开门指令签名校验失败);returnfalse;}// 2. 检查时间戳防止重放攻击if(Math.abs(cmd.getTimestamp()-System.currentTimeMillis())5*60*1000){Log.w(Door,开门指令时间戳过期);returnfalse;}// 3. 检查订单状态同一个订单不能重复开if(OrderManager.isOrderUsed(cmd.getOrderId())){Log.w(Door,订单已使用过);returnfalse;}// 4. 检查设备状态故障状态下拒绝开门if(isDoorFault(cmd.getDoorNo())){Log.w(Door,门锁故障拒绝开门);returnfalse;}returntrue;}}防护机制二开门白名单时段非正常营业时间不允许开门publicbooleanisBusinessHours(){inthourCalendar.getInstance().get(Calendar.HOUR_OF_DAY);// 比如早7点到晚10点是营业时间returnhour7hour22;}防护机制三异常开门检测没人扫码的时候门开了就是异常publicvoidonDoorOpened(intdoorNo){// 检查最近有没有合法的开门指令if(!hasValidOpenRequest(doorNo)){// 异常开门Log.e(Door,检测到异常开门没有对应开门请求);reportAbnormalOpenAlarm(doorNo);// 立刻尝试关门tryForceCloseDoor(doorNo);// 触发录像拍下来是谁开的VideoManager.triggerRecord(abnormal_open);}}六、门磁异常检测门磁是判断门状态的依据门磁坏了整个逻辑都乱了。常见门磁异常一直显示开门磁短路或者线断了一直显示关门磁断路频繁跳变接触不良或者干扰异常检测逻辑publicclassDoorSensorChecker{privatestaticfinallongSTUCK_CHECK_TIME24*3600*1000;// 24小时privateMapInteger,LonglastChangeTimenewHashMap();privateMapInteger,IntegerlastStatusnewHashMap();/** * 定期检查门磁状态 */publicvoidcheckSensorAbnormal(intdoorNo,intcurrentStatus){longnowSystem.currentTimeMillis();// 状态没变if(lastStatus.containsKey(doorNo)lastStatus.get(doorNo)currentStatus){// 检查是不是太久没变过了if(lastChangeTime.containsKey(doorNo)){longdurationnow-lastChangeTime.get(doorNo);if(durationSTUCK_CHECK_TIME){// 24小时状态没变过可能门磁坏了Log.w(Door,门磁可能异常状态 currentStatus 持续24小时未变);reportSensorWarning(doorNo);}}}else{// 状态变了更新时间lastChangeTime.put(doorNo,now);lastStatus.put(doorNo,currentStatus);}}}七、交易保护机制开门期间如果交易还没完成不能随便关门。交易中的门锁保护publicclassTransactionDoorProtector{privateMapInteger,StringactiveTransactionsnewHashMap();/** * 交易开始标记门为交易中 */publicvoidstartTransaction(intdoorNo,StringorderId){activeTransactions.put(doorNo,orderId);}/** * 交易结束解除保护 */publicvoidendTransaction(intdoorNo){activeTransactions.remove(doorNo);}/** * 能不能强制关门 */publicbooleancanForceClose(intdoorNo){if(activeTransactions.containsKey(doorNo)){// 交易中不允许强制关门returnfalse;}returntrue;}}八、故障降级策略门锁坏了之后设备不能直接废了要有降级策略。单门故障标记该门故障拒绝开门指令其他门正常工作上报告警等运维维修前端展示该门暂不可用全部门故障设备进入故障状态所有扫码请求直接返回设备维护中持续告警等待现场维修九、踩坑经验坑1关门超时检测误判现象用户买东西慢一点就被强制关门夹到了原因超时时间设太短正常选购时间不够解决超时时间设长一点2分钟起步超时前先播语音提醒检测到人在的时候延长时间坑2继电器粘住检测不到现象继电器粘住了门一直开着但软件以为自己发了关门指令就没事了原因只看指令发没发不看门实际状态解决所有操作都以门磁反馈的实际状态为准指令只是触发结果看反馈坑3异常开门告警太频繁现象设备重启、初始化的时候门状态变化误报异常开门原因初始化阶段的状态变化没有排除解决设备启动后的前30秒不做异常开门检测区分主动开门和被动开门十、总结门锁异常自愈的核心早发现、分级处理、尽量自愈、实在不行告警。开门超时重试几次不行就告警标记故障关门超时分级处理提醒→尝试关门→严重告警门锁卡死检测到后尝试脉冲自愈不行就告警误开门多重校验异常检测发现了立刻关门录像门磁异常长期不变、频繁跳变都要检测交易保护交易中不能随便关门防止夹人夹货做工控设备异常处理的代码量往往比正常逻辑还多但这些才是量产稳定的关键。我是黒漂技术佬专注无人零售物联网实战。门锁专题两篇到这里结束下一章进入视频专题聊聊售货柜的视频录制和上传怎么搞。有门锁调试的奇葩经历欢迎私信交流大家一起避坑~