package com.gzlh.device.rfid.handler.impl; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.gzlh.bus.EventBus; import com.gzlh.bus.EventDataManager; import com.gzlh.config.ModuleEnum; import com.gzlh.device.led.utils.CRC16; import com.gzlh.device.rfid.action.IElectronAction; import com.gzlh.device.rfid.brand.ElectronBrandType; import com.gzlh.device.rfid.client.ElectronNettyConfig; import com.gzlh.device.rfid.enums.CardType; import com.gzlh.device.rfid.event.RFIDDefaultEvent; import com.gzlh.device.rfid.handler.IElectronHandler; import com.gzlh.device.rfid.service.RfidService; import com.gzlh.utils.CRC16Util; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.xml.bind.DatatypeConverter; import java.util.ArrayList; import java.util.List; @Slf4j @Component public class ZKRfidHandler implements IElectronHandler { private static final TimedCache TIMED_CACHE = CacheUtil.newTimedCache(30000); @Resource private ElectronNettyConfig electronNettyConfig; @Resource private RfidService rfidService; @Override public ElectronBrandType brandType() { return ElectronBrandType.ZH_BRAND; } @Override public void handlerAction(String action) { if (action.equals(IElectronAction.START_READ_CARD)) { startToRead(CardType.TYPE_6C); } else if (action.equals(IElectronAction.CHECK_HARBORPOLE_VERIFICATION)) { rfidService.checkHarborpoleVerification(); } else if (action.equalsIgnoreCase(IElectronAction.FIND_CAR_NO_BY_RFID)) { rfidService.findCarNoByRfid(); } } @Override public void sendMsg(String msg) { electronNettyConfig.send(msg); } @Override public void handlerMsg(String msg) { int len = msg.length(); String crcStr = StrUtil.sub(msg, len - 4, len); String packetStr = StrUtil.sub(msg, 0, len - 4); String checkCRC16 = CRC16Util.getCRC16Hex(packetStr); if (!StrUtil.equals(crcStr, checkCRC16)) { return; } String dataPack = StrUtil.subSuf(packetStr, 10); //卡数量 int cardNum = Integer.parseInt(StrUtil.sub(packetStr, 8, 10)); List cardList = new ArrayList<>(); int startIndex = 2; for (int i = 0; i < cardNum; i++) { String cardHex = StrUtil.sub(dataPack, startIndex, startIndex + 24); startIndex += 26; System.out.println(cardHex); cardList.add(cardHex); } String cacheKey = StrUtil.join(",", cardList); Integer count = TIMED_CACHE.get(cacheKey, true); if (count != null && count == 5) { log.info("rfid dataHex zk==== :{}", cacheKey); EventBus eventBus = SpringUtil.getBean(EventBus.class); EventDataManager.cacheData("eri", cacheKey); eventBus.startEvent(ModuleEnum.ELECTRON_MODULE.getModuleEn() + "." + RFIDDefaultEvent.RFID_READ); return; } if (count == null) { count = 0; } count = count + 1; TIMED_CACHE.put(cacheKey, count); //13 00 01 01 01 0C E2 00 00 00 1A 0C 02 72 18 20 EC B8 16EA //20 00 01 01 02 0C E200001D8817007817602D1F 0C E20000001A0C02721820ECB8 2813 //3A000101040CFEDC000000000000008102BA0CE200001B170902202610C3A60CE200001D8817007817602D1F0CE20000001A0C02721820ECB81F29 // log.info("接收到ZKRfid消息:{}", msg); // TODO 卡号处理 } @Override public void setReaderCmdModule(boolean commandModule) { } @Override public void startToRead(CardType cardType) { String command = "040001DB4B"; // String command="040036E70E"; sendMsg(command); } }