From 3b1b756f1a619e60b2243d28817c39e0a7a0cb0c Mon Sep 17 00:00:00 2001
From: senzhi <10983298651@qq.com>
Date: Wed, 21 Jan 2026 14:20:58 +0800
Subject: [PATCH] fix:修改项目为组件
---
src/main/java/com/eternal/rfid/RfidReaderServer.java | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 251 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/eternal/rfid/RfidReaderServer.java b/src/main/java/com/eternal/rfid/RfidReaderServer.java
new file mode 100644
index 0000000..89c8eca
--- /dev/null
+++ b/src/main/java/com/eternal/rfid/RfidReaderServer.java
@@ -0,0 +1,251 @@
+package com.eternal.rfid;
+
+
+import com.eternal.event.DeviceWorkEvent;
+import com.eternal.monitor.AbstractEquipmentManager;
+import com.eternal.monitor.constant.ErrorTypeEnums;
+import com.eternal.monitor.constant.StatusTypeEnums;
+import com.eternal.monitor.entity.Device;
+import com.eternal.monitor.entity.DeviceErrorType;
+import com.eternal.monitor.entity.DeviceStatus;
+import com.eternal.monitor.entity.DeviceType;
+import com.eternal.rfid.params.UF3ReaderConfig;
+import com.eternal.rfid.service.UF3RFIDReader;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * description: 略
+ *
+ * @author senzhi
+ * @since 2026/1/19 17:14
+ */
+@Slf4j
+@Service("UF3RFIDReader")
+public class RfidReaderServer extends AbstractEquipmentManager {
+ @Autowired
+ private ApplicationEventPublisher eventPublisher;
+
+ @Autowired
+ private UF3ReaderConfig readerConfig;
+
+ @Getter
+ private final List<UF3RFIDReader> readers = new ArrayList<>();
+ /**
+ * 是否允许读写器工作
+ */
+ private boolean enableWork = false;
+
+ public void setEnableWork(boolean enableWork) {
+ log.info("RfidReaderServer work mode changed. from {} --> {}", this.enableWork, enableWork);
+ this.enableWork = enableWork;
+ }
+
+ @EventListener(DeviceWorkEvent.class)
+ public void onDeviceWorkEvent(DeviceWorkEvent event) {
+ setEnableWork(event.isEnableWork());
+ }
+
+ private final static int maxTryTime = 3;
+
+ private final AtomicInteger currentRunIndex = new AtomicInteger(-1);
+ private final AtomicInteger tryTime = new AtomicInteger(0);
+
+ @PostConstruct
+ public void init() {
+ String readerKey = readerConfig.getReaderKey();
+ String[] antennasKey = new String[4];
+ for (int j = 0; j < 4; j++) {
+ antennasKey[j] = "reader" + 1 + "-antenna" + (j + 1);
+ }
+ UF3RFIDReader uf3RFIDReader = new UF3RFIDReader(readerKey, "uf3-rfid-reader", antennasKey, "reader-antenna");
+ readers.add(uf3RFIDReader);
+ }
+
+ @Override
+ public void start() {
+ for (int i = 0; i < readers.size(); i++) {
+ UF3RFIDReader uf3RFIDReader = readers.get(i);
+ uf3RFIDReader.setUpdateDeviceStatusConsumer(this::updateDeviceStatus);
+ uf3RFIDReader.setEventConsumer(event -> eventPublisher.publishEvent(event));
+ uf3RFIDReader.init(i, readerConfig);
+
+ }
+ log.info("RfidReaderServer create finished,reader number:{}", readers.size());
+ }
+
+ @Scheduled(initialDelay = 100, fixedDelay = 3000)
+ public void checkingTimer() {
+ try {
+ if (enableWork) {
+ if (currentRunIndex.get() < 0) {
+ currentRunIndex.set(0);
+ }
+
+ UF3RFIDReader uf3RFIDReader = readers.get(currentRunIndex.get());
+ if (uf3RFIDReader.isOnline()) {
+ log.debug("ZebraReader<ip:{}> is online", uf3RFIDReader.getIp());
+ return;
+ }
+
+ log.info("Try to connect to ZebraReader<ip:{}>,attempts:{}", uf3RFIDReader.getIp(), tryTime.get());
+ uf3RFIDReader.start();
+ if (uf3RFIDReader.isOnline()) {
+ tryTime.set(0);
+ return;
+ }
+
+ // 超过最大尝试次数,切换下一个读写器
+ if (tryTime.incrementAndGet() > maxTryTime) {
+ log.warn("The ZebraReader<{}> exceeds the maximum attempts number<{}>, switch to the next reader", uf3RFIDReader.getIp(), maxTryTime);
+
+ // 重置尝试次数
+ tryTime.set(0);
+ // 切换下一个读写器
+ currentRunIndex.incrementAndGet();
+ if (currentRunIndex.get() >= readers.size()) {
+ currentRunIndex.set(0);
+ }
+ }
+ } else {
+ if (currentRunIndex.get() < 0) {
+ log.debug("The node is not ACTIVE, do not connect to RFIDReader");
+ return;
+ }
+ UF3RFIDReader zebraRFIDReader = readers.get(currentRunIndex.get());
+ zebraRFIDReader.disconnectReader();
+ currentRunIndex.set(-1);
+
+ log.info("The node is not ACTIVE, disconnect from RFIDReader");
+ }
+ } catch (Exception e) {
+ log.error("RfidReaderServer checkingTimer error", e);
+ }
+ }
+
+ /**
+ * 启动读
+ */
+ public void startRead() {
+ if (enableWork) {
+ if (currentRunIndex.get() < 0) {
+ log.warn("It is not working and cannot be started.");
+ return;
+ }
+ UF3RFIDReader zebraRFIDReader = readers.get(currentRunIndex.get());
+ try {
+ zebraRFIDReader.startRead();
+ } catch (Exception e) {
+ log.error("Failed to start read.", e);
+ }
+
+ }
+
+ }
+
+ /**
+ * 停止读
+ */
+ public void stopRead() {
+ if (enableWork) {
+ if (currentRunIndex.get() < 0) {
+ log.warn("It is not working and cannot be stopped.");
+ return;
+ }
+ UF3RFIDReader zebraRFIDReader = readers.get(currentRunIndex.get());
+ zebraRFIDReader.stopRead();
+ }
+ }
+
+
+ @PreDestroy
+ public void destroy() {
+ if (enableWork) {
+ if (currentRunIndex.get() < 0) {
+ return;
+ }
+
+ UF3RFIDReader zebraRFIDReader = readers.get(currentRunIndex.get());
+ zebraRFIDReader.disconnectReader();
+ currentRunIndex.set(-1);
+
+ log.info("Close the rfid-reader before closing the application");
+ }
+ }
+
+ @Override
+ public void initDevices() {
+ for (UF3RFIDReader reader : readers) {
+ int index = reader.getIndex();
+ // 添加设备类型
+ DeviceType readerType = new DeviceType();
+ readerType.setDeviceTypeKey("zebra-rfid-reader");
+ readerType.setName("东集读写器");
+ readerType.setTypeDescription("东集读写器");
+ addDeviceType(readerType);
+ DeviceType antennaType = new DeviceType();
+ antennaType.setDeviceTypeKey("reader-antenna");
+ antennaType.setName("读写器天线");
+ antennaType.setTypeDescription("RFID读写器天线");
+ addDeviceType(antennaType);
+
+ // 添加状态
+ for (StatusTypeEnums.Common value : StatusTypeEnums.Common.values()) {
+ // 读写器状态
+ DeviceStatus readerStatus = new DeviceStatus();
+ readerStatus.setDeviceTypeKey(readerType.getDeviceTypeKey());
+ readerStatus.setDeviceStatusKey(value.getKey());
+ readerStatus.setName(value.getName());
+ readerStatus.setStatusDescription(value.getDescription());
+ addDeviceStatusType(readerStatus);
+ // 天线状态
+ DeviceStatus antennaStatus = new DeviceStatus();
+ antennaStatus.setDeviceTypeKey(antennaType.getDeviceTypeKey());
+ antennaStatus.setDeviceStatusKey(value.getKey());
+ antennaStatus.setName(value.getName());
+ antennaStatus.setStatusDescription(value.getDescription());
+ addDeviceStatusType(antennaStatus);
+ }
+
+ // 添加错误码
+ for (ErrorTypeEnums.Common value : ErrorTypeEnums.Common.values()) {
+ DeviceErrorType readerErrorType = new DeviceErrorType(readerType.getDeviceTypeKey(), value.getKey(), value.getName(), value.getDescription());
+ addDeviceErrorType(readerErrorType);
+ DeviceErrorType antennaErrorType = new DeviceErrorType(readerType.getDeviceTypeKey(), value.getKey(), value.getName(), value.getDescription());
+ addDeviceErrorType(antennaErrorType);
+ }
+
+ // 添加设备
+ Device readerDevice = new Device();
+ readerDevice.setDeviceKey(reader.getReaderKey());
+ readerDevice.setName(readerConfig.getEquipType() + (index + 1));
+ readerDevice.setDeviceTypeKey(readerType.getDeviceTypeKey());
+ readerDevice.setDeviceStatusKey(StatusTypeEnums.Common.UNKNOWN.getKey());
+ addDevice(readerDevice);
+ for (int i = 0; i < 4; i++) {
+ Device antennaDevice = new Device();
+ antennaDevice.setParentDeviceKey(readerDevice.getDeviceKey());
+ antennaDevice.setDeviceKey(reader.getAntennasKey()[i]);
+ antennaDevice.setName("reader" + (index + 1) + "-antenna" + (i + 1));
+ antennaDevice.setDeviceTypeKey(antennaType.getDeviceTypeKey());
+ antennaDevice.setDeviceStatusKey(StatusTypeEnums.Common.UNKNOWN.getKey());
+ antennaDevice.setParentDeviceKey(readerDevice.getDeviceKey());
+ addDevice(antennaDevice);
+ }
+ }
+
+ }
+}
+
--
Gitblit v1.9.3