ZKRfidHandler.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.gzlh.device.rfid.handler.impl;
  2. import cn.hutool.cache.CacheUtil;
  3. import cn.hutool.cache.impl.TimedCache;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.spring.SpringUtil;
  6. import com.gzlh.bus.EventBus;
  7. import com.gzlh.bus.EventDataManager;
  8. import com.gzlh.config.ModuleEnum;
  9. import com.gzlh.device.led.utils.CRC16;
  10. import com.gzlh.device.rfid.action.IElectronAction;
  11. import com.gzlh.device.rfid.brand.ElectronBrandType;
  12. import com.gzlh.device.rfid.client.ElectronNettyConfig;
  13. import com.gzlh.device.rfid.enums.CardType;
  14. import com.gzlh.device.rfid.event.RFIDDefaultEvent;
  15. import com.gzlh.device.rfid.handler.IElectronHandler;
  16. import com.gzlh.device.rfid.service.RfidService;
  17. import com.gzlh.utils.CRC16Util;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.stereotype.Component;
  20. import javax.annotation.Resource;
  21. import javax.xml.bind.DatatypeConverter;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. @Slf4j
  25. @Component
  26. public class ZKRfidHandler implements IElectronHandler {
  27. private static final TimedCache<String, Integer> TIMED_CACHE = CacheUtil.newTimedCache(30000);
  28. @Resource
  29. private ElectronNettyConfig electronNettyConfig;
  30. @Resource
  31. private RfidService rfidService;
  32. @Override
  33. public ElectronBrandType brandType() {
  34. return ElectronBrandType.ZH_BRAND;
  35. }
  36. @Override
  37. public void handlerAction(String action) {
  38. if (action.equals(IElectronAction.START_READ_CARD)) {
  39. startToRead(CardType.TYPE_6C);
  40. } else if (action.equals(IElectronAction.CHECK_HARBORPOLE_VERIFICATION)) {
  41. rfidService.checkHarborpoleVerification();
  42. } else if (action.equalsIgnoreCase(IElectronAction.FIND_CAR_NO_BY_RFID)) {
  43. rfidService.findCarNoByRfid();
  44. }
  45. }
  46. @Override
  47. public void sendMsg(String msg) {
  48. electronNettyConfig.send(msg);
  49. }
  50. @Override
  51. public void handlerMsg(String msg) {
  52. int len = msg.length();
  53. String crcStr = StrUtil.sub(msg, len - 4, len);
  54. String packetStr = StrUtil.sub(msg, 0, len - 4);
  55. String checkCRC16 = CRC16Util.getCRC16Hex(packetStr);
  56. if (!StrUtil.equals(crcStr, checkCRC16)) {
  57. return;
  58. }
  59. String dataPack = StrUtil.subSuf(packetStr, 10);
  60. //卡数量
  61. int cardNum = Integer.parseInt(StrUtil.sub(packetStr, 8, 10));
  62. List<String> cardList = new ArrayList<>();
  63. int startIndex = 2;
  64. for (int i = 0; i < cardNum; i++) {
  65. String cardHex = StrUtil.sub(dataPack, startIndex, startIndex + 24);
  66. startIndex += 26;
  67. System.out.println(cardHex);
  68. cardList.add(cardHex);
  69. }
  70. String cacheKey = StrUtil.join(",", cardList);
  71. Integer count = TIMED_CACHE.get(cacheKey, true);
  72. if (count != null && count == 5) {
  73. log.info("rfid dataHex zk==== :{}", cacheKey);
  74. EventBus eventBus = SpringUtil.getBean(EventBus.class);
  75. EventDataManager.cacheData("eri", cacheKey);
  76. eventBus.startEvent(ModuleEnum.ELECTRON_MODULE.getModuleEn() + "." + RFIDDefaultEvent.RFID_READ);
  77. return;
  78. }
  79. if (count == null) {
  80. count = 0;
  81. }
  82. count = count + 1;
  83. TIMED_CACHE.put(cacheKey, count);
  84. //13 00 01 01 01 0C E2 00 00 00 1A 0C 02 72 18 20 EC B8 16EA
  85. //20 00 01 01 02 0C E200001D8817007817602D1F 0C E20000001A0C02721820ECB8 2813
  86. //3A000101040CFEDC000000000000008102BA0CE200001B170902202610C3A60CE200001D8817007817602D1F0CE20000001A0C02721820ECB81F29
  87. // log.info("接收到ZKRfid消息:{}", msg);
  88. // TODO 卡号处理
  89. }
  90. @Override
  91. public void setReaderCmdModule(boolean commandModule) {
  92. }
  93. @Override
  94. public void startToRead(CardType cardType) {
  95. String command = "040001DB4B";
  96. // String command="040036E70E";
  97. sendMsg(command);
  98. }
  99. }