|
|
@@ -0,0 +1,508 @@
|
|
|
+package com.zd.alg.rfid.sdk;
|
|
|
+
|
|
|
+import com.gg.reader.api.dal.*;
|
|
|
+import com.gg.reader.api.protocol.gx.*;
|
|
|
+import com.zd.alg.rfid.service.HardwareRfidService;
|
|
|
+import com.zd.alg.rfid.service.ISendService;
|
|
|
+import com.zd.alg.rfid.service.IService;
|
|
|
+import com.zd.algorithm.api.rfid.domain.entity.HardwareRfid;
|
|
|
+import com.zd.common.core.utils.SpringUtils;
|
|
|
+import com.zd.model.entity.HardwareRfidDto;
|
|
|
+import com.zd.model.entity.InventoryTag;
|
|
|
+import com.zd.model.enums.DeviceStatusEnum;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.ScheduledExecutorService;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @创建人 hzw
|
|
|
+ * @描述 rfid客户端实现类
|
|
|
+ * @创建时间 2022/11/15
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class RfidClientImpl implements IService {
|
|
|
+ private static final ISendService sendService = SpringUtils.getBean("sendService");
|
|
|
+ private static final Map<String, GClient> clientMap = new ConcurrentHashMap<>();
|
|
|
+ private static final Map<String, GServer> serverMap = new ConcurrentHashMap<>();
|
|
|
+ private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
|
|
|
+ @Resource
|
|
|
+ private RedisTemplate<String, HardwareRfid> redisTemplate;
|
|
|
+ @Autowired
|
|
|
+ private HardwareRfidService hardwareRfidService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 启动读写器
|
|
|
+ *
|
|
|
+ * @Param [hardwareRfid 硬件信息]
|
|
|
+ * @Return void
|
|
|
+ **/
|
|
|
+ @Override
|
|
|
+ public void start(HardwareRfid hardwareRfid) {
|
|
|
+ GServer server = new GServer();
|
|
|
+ int port = getPort(hardwareRfid.getIpAddress());
|
|
|
+ if (server.open(port)) {
|
|
|
+ log.info("【RFID门禁机】开始监听");
|
|
|
+ subscribeServerHandler(hardwareRfid, server);
|
|
|
+ } else {
|
|
|
+ log.info("【RFID门禁机】监听失败,请检查端口号是否被占用!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订阅监听上报
|
|
|
+ */
|
|
|
+ private void subscribeServerHandler(HardwareRfid hardwareRfid, GServer server) {
|
|
|
+ //TCP 处于监听状态,远程读写设备主动连接上位机时,会触发此事件上报
|
|
|
+ server.onGClientConnected = new HandlerGClientConnected() {
|
|
|
+ @Override
|
|
|
+ public void log(GClient client, String serialNumber) {
|
|
|
+ try {
|
|
|
+ log.info("监听到远程读写设备主动连接...");
|
|
|
+ //初始化服务map
|
|
|
+ initServicesMap(client, server, hardwareRfid);
|
|
|
+ //开启心跳检测Tcp连接状态
|
|
|
+ client.setSendHeartBeat(true);
|
|
|
+ client.setPrint(true);
|
|
|
+ //订阅Tcp断连上报
|
|
|
+ subscribeTcpHandler(client, hardwareRfid);
|
|
|
+ //设置rfid初始化参数
|
|
|
+ setConfig(client, hardwareRfid);
|
|
|
+ //订阅报告启动事件
|
|
|
+ subscribeReportedStartEvents(client, hardwareRfid);
|
|
|
+ //订阅报告结束事件
|
|
|
+ subscribeReportedOverEvents(client, hardwareRfid);
|
|
|
+ //修改设备状态
|
|
|
+ changStatus(hardwareRfid, DeviceStatusEnum.ON_LINE);
|
|
|
+ log.info("【RFID门禁机】监听成功!{}", client.getName());
|
|
|
+ } catch (Exception e) {
|
|
|
+ changStatus(hardwareRfid, DeviceStatusEnum.EXCEPTION);
|
|
|
+ log.error("远程读写设备主动连接报错,请联系管理员!{}", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化保存客户端/服务端
|
|
|
+ *
|
|
|
+ * @param client 客户端
|
|
|
+ * @param server 服务端
|
|
|
+ * @param hardwareRfid 设备信息
|
|
|
+ */
|
|
|
+ private void initServicesMap(GClient client, GServer server, HardwareRfid hardwareRfid) {
|
|
|
+ String hardwareNum = hardwareRfid.getHardwareNum();
|
|
|
+ if (StringUtils.isBlank(hardwareNum)) {
|
|
|
+ log.info("设备编码为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (clientMap.containsKey(hardwareNum)) {
|
|
|
+ log.info("此序列编号已存在客户端,删除已存在客户端!");
|
|
|
+ clientMap.remove(hardwareNum);
|
|
|
+ }
|
|
|
+ if (serverMap.containsKey(hardwareNum)) {
|
|
|
+ log.info("此序列编号已存在服务端,删除已存在服务端!");
|
|
|
+ serverMap.remove(hardwareNum);
|
|
|
+ }
|
|
|
+ //存储客户端
|
|
|
+ clientMap.put(hardwareNum, client);
|
|
|
+ //储存服务端
|
|
|
+ serverMap.put(hardwareNum, server);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订阅TCP断开连接上报
|
|
|
+ */
|
|
|
+ private void subscribeTcpHandler(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ client.onDisconnected = new HandlerTcpDisconnected() {
|
|
|
+ @Override
|
|
|
+ public void log(String ipPort) {
|
|
|
+ log.info("【RFID门禁机】连接已断开:{}", ipPort);
|
|
|
+ changStatus(hardwareRfid, DeviceStatusEnum.OFF_LINE);
|
|
|
+ //释放当前连接资源
|
|
|
+ client.close();
|
|
|
+ //删除客户端map数据
|
|
|
+ clientMap.remove(hardwareRfid.getHardwareNum());
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订阅报告启动事件
|
|
|
+ *
|
|
|
+ * @param client 客户端
|
|
|
+ * @param hardwareRfid 硬件信息
|
|
|
+ */
|
|
|
+ private void subscribeReportedStartEvents(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ // 订阅标签上报事件
|
|
|
+ client.onTagEpcLog = new HandlerTagEpcLog() {
|
|
|
+ @Override
|
|
|
+ public void log(String readName, LogBaseEpcInfo logBaseEpcInfo) {
|
|
|
+ // 回调内部如有阻塞,会影响 API 正常使用
|
|
|
+ // 标签回调数量较多,请将标签数据先缓存起来再作业务处理
|
|
|
+ if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) {
|
|
|
+ log.info("接收到RFID读写器消息:{}", logBaseEpcInfo);
|
|
|
+ // redis是否存在此标签
|
|
|
+ int antId = logBaseEpcInfo.getAntId();
|
|
|
+ String epc = logBaseEpcInfo.getEpc();
|
|
|
+ if (Boolean.FALSE.equals(redisTemplate.hasKey(logBaseEpcInfo.getEpc() + antId))) {
|
|
|
+ //不存在缓存,设置间隔30s调用
|
|
|
+ redisTemplate.opsForValue().set(logBaseEpcInfo.getEpc() + antId, hardwareRfid, 30, TimeUnit.SECONDS);
|
|
|
+ scheduledExecutorService.execute(() -> {
|
|
|
+ InventoryTag tag = new InventoryTag();
|
|
|
+ BeanUtils.copyProperties(logBaseEpcInfo, tag);
|
|
|
+ HardwareRfidDto hardwareRfidDto = new HardwareRfidDto();
|
|
|
+ BeanUtils.copyProperties(hardwareRfid, hardwareRfidDto);
|
|
|
+ tag.setHardwareRfidDto(hardwareRfidDto);
|
|
|
+ sendService.send(tag);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ //标签存在缓存,间隔30s调用
|
|
|
+ log.info("标签操作频繁,请间隔30s调用!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订阅报告结束事件
|
|
|
+ *
|
|
|
+ * @param client 客户端
|
|
|
+ * @param hardwareRfid 硬件信息
|
|
|
+ */
|
|
|
+ private void subscribeReportedOverEvents(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ client.onTagEpcOver = new HandlerTagEpcOver() {
|
|
|
+ @Override
|
|
|
+ public void log(String s, LogBaseEpcOver logBaseEpcOver) {
|
|
|
+ log.info("【RFID门禁机】已离线!");
|
|
|
+ hardwareRfid.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getCode());
|
|
|
+ hardwareRfidService.updateHardwareRfid(hardwareRfid);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置rfid初始化参数
|
|
|
+ *
|
|
|
+ * @param client 客户顿
|
|
|
+ * @param hardwareRfid 硬件信息
|
|
|
+ */
|
|
|
+ private void setConfig(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ try {
|
|
|
+ // 读写器停止读写卡
|
|
|
+ if (stopMsg(client)) {
|
|
|
+ //设置GPI
|
|
|
+ if (!setGpi(client)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //设置session
|
|
|
+ if (!setSession(client)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 天线功率配置(将4个天线功率都设置为30dBm)
|
|
|
+ if (!setPower(client, hardwareRfid)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //天线读卡, 读取EPC数据区以及TID数据区
|
|
|
+ setInventory(client, hardwareRfid);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ changStatus(hardwareRfid, DeviceStatusEnum.EXCEPTION);
|
|
|
+ log.error("设置门禁机参数异常,请联系管理员!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改RFID硬件状态
|
|
|
+ *
|
|
|
+ * @param hardwareRfid 硬件信息
|
|
|
+ * @param deviceStatusEnum 设备状态枚举类
|
|
|
+ */
|
|
|
+ private void changStatus(HardwareRfid hardwareRfid, DeviceStatusEnum deviceStatusEnum) {
|
|
|
+ hardwareRfid.setDeviceStatus(deviceStatusEnum.getCode());
|
|
|
+ hardwareRfidService.updateHardwareRfid(hardwareRfid);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean setGpi(GClient client) {
|
|
|
+ MsgAppGetGpiState gpiState = new MsgAppGetGpiState();
|
|
|
+ client.sendSynMsg(gpiState);
|
|
|
+ HashMap<Integer, Integer> hashMap = gpiState.getHpGpiState();
|
|
|
+ boolean change = true;
|
|
|
+ for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
|
|
|
+ Integer k = entry.getKey();
|
|
|
+ MsgAppGetGpiTrigger getGpiTrigger = new MsgAppGetGpiTrigger();
|
|
|
+ getGpiTrigger.setGpiPort(k - 1);
|
|
|
+ client.sendSynMsg(getGpiTrigger);
|
|
|
+ if (getGpiTrigger.getRtCode() == 0) {
|
|
|
+ int triggerOver = getGpiTrigger.getTriggerOver();
|
|
|
+ int triggerStart = getGpiTrigger.getTriggerStart();
|
|
|
+ if (triggerStart != 0 || triggerOver != 0) {
|
|
|
+ MsgAppSetGpiTrigger gpiTrigger = new MsgAppSetGpiTrigger();
|
|
|
+ gpiTrigger.setGpiPort(getGpiTrigger.getGpiPort());
|
|
|
+ gpiTrigger.setTriggerOver(0);
|
|
|
+ gpiTrigger.setTriggerStart(0);
|
|
|
+ client.sendSynMsg(gpiTrigger);
|
|
|
+ if (0 != gpiTrigger.getRtCode()) {
|
|
|
+ log.error("GPI epc error.");
|
|
|
+ change = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("【RFID门禁机】GPI配置成功!");
|
|
|
+ return change;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean setSession(GClient client) {
|
|
|
+ MsgBaseGetBaseband msgBaseGetBaseband = new MsgBaseGetBaseband();
|
|
|
+ MsgBaseSetBaseband msgBaseSetBaseband = new MsgBaseSetBaseband();
|
|
|
+ client.sendSynMsg(msgBaseGetBaseband);
|
|
|
+ if (0 == msgBaseGetBaseband.getRtCode()) {
|
|
|
+ int session = msgBaseGetBaseband.getSession();
|
|
|
+ if (session == 0) {
|
|
|
+ log.info("【RFID门禁机】Session已配置成功!");
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ msgBaseSetBaseband.setSession(0);
|
|
|
+ client.sendSynMsg(msgBaseSetBaseband);
|
|
|
+ if (0 == msgBaseSetBaseband.getRtCode()) {
|
|
|
+ log.info("【RFID门禁机】Session配置成功!");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.error("【RFID门禁机】Session配置失败!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean setPower(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ MsgBaseGetPower msgBaseGetPower = new MsgBaseGetPower();
|
|
|
+ client.sendSynMsg(msgBaseGetPower);
|
|
|
+ if (0 == msgBaseGetPower.getRtCode()) {
|
|
|
+ return sendPower(client, hardwareRfid, msgBaseGetPower);
|
|
|
+ } else {
|
|
|
+ log.error("【RFID门禁机】获取天线功率失败!{}", msgBaseGetPower.getRtMsg());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean setInventory(GClient client, HardwareRfid hardwareRfid) {
|
|
|
+ //几路天线读卡和通道数保持一致。
|
|
|
+ if (hardwareRfid.getChannels() == null) {
|
|
|
+ log.error("【RFID门禁机】通道配置为空!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 4个天线读卡, 读取 EPC 数据区以及 TID 数据区 默认只读 EPC
|
|
|
+ MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc();
|
|
|
+ switch (hardwareRfid.getChannels()) {
|
|
|
+ case 4:
|
|
|
+ msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4);
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4 | EnumG.AntennaNo_5 | EnumG.AntennaNo_6 | EnumG.AntennaNo_7 | EnumG.AntennaNo_8);
|
|
|
+ break;
|
|
|
+ case 16:
|
|
|
+ msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4 | EnumG.AntennaNo_5 | EnumG.AntennaNo_6 | EnumG.AntennaNo_7 | EnumG.AntennaNo_8 | EnumG.AntennaNo_9 | EnumG.AntennaNo_10 | EnumG.AntennaNo_11 | EnumG.AntennaNo_12 | EnumG.AntennaNo_13 | EnumG.AntennaNo_14 | EnumG.AntennaNo_15 | EnumG.AntennaNo_16);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ default:
|
|
|
+ msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1);
|
|
|
+ }
|
|
|
+ msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory);
|
|
|
+ client.sendSynMsg(msgBaseInventoryEpc);
|
|
|
+ if (0 == msgBaseInventoryEpc.getRtCode()) {
|
|
|
+ log.info("【RFID门禁机】Inventory epc配置成功!");
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ log.error("【RFID门禁机】Inventory epc配置失败!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private boolean sendPower(GClient client, HardwareRfid hardwareRfid, MsgBaseGetPower msgBaseGetPower) {
|
|
|
+ //根据硬件配置参数配置设备功率
|
|
|
+ if (!hardwareRfid.getUniformPower().isEmpty() && hardwareRfid.getChannels() != null) {
|
|
|
+ Hashtable<Integer, Integer> dicPower = msgBaseGetPower.getDicPower();
|
|
|
+ Integer channels = hardwareRfid.getChannels();
|
|
|
+ String[] uniformPowers = hardwareRfid.getUniformPower().split(",");
|
|
|
+ for (int i = 1; i <= channels; i++) {
|
|
|
+ Integer power = dicPower.get(i);
|
|
|
+ String tempUniformPower = uniformPowers[i - 1];
|
|
|
+ String[] tempUniformPowers = tempUniformPower.split(":");
|
|
|
+ String temp = tempUniformPowers[0];
|
|
|
+ if (power == null || !Objects.equals(power, Integer.valueOf(temp))) {
|
|
|
+ dicPower.put(i, Integer.valueOf(temp));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ MsgBaseSetPower msgBaseSetPower = new MsgBaseSetPower();
|
|
|
+ msgBaseSetPower.setDicPower(dicPower);
|
|
|
+ client.sendSynMsg(msgBaseSetPower);
|
|
|
+ if (0 == msgBaseSetPower.getRtCode()) {
|
|
|
+ log.info("【RFID门禁机】设置天线功率成功!");
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ log.error("【RFID门禁机】设置天线功率失败!{}", msgBaseSetPower.getRtMsg());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.error("设备输出频率或通道参数配置为空,UniformPower={},Channels={}", hardwareRfid.getUniformPower(), hardwareRfid.getChannels());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param client 客户端
|
|
|
+ * @param state 报警状态(0不报警,1报警)
|
|
|
+ * @param delayTime 报警持续时间(单位:秒)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean changeGpo(GClient client, int state, int delayTime) {
|
|
|
+ log.info("进入控制报警方法!是否开启={}", state);
|
|
|
+ MsgAppSetGpo msgAppSetGpo = new MsgAppSetGpo();
|
|
|
+ msgAppSetGpo.setGpo1(state);
|
|
|
+ msgAppSetGpo.setGpo2(state);
|
|
|
+ msgAppSetGpo.setGpo3(state);
|
|
|
+ msgAppSetGpo.setGpo4(state);
|
|
|
+ client.sendSynMsg(msgAppSetGpo);//发送响铃之后,进入下方if,开启定时线程
|
|
|
+ String status = state == 1 ? "开启" : "关闭";
|
|
|
+ if (0 == msgAppSetGpo.getRtCode()) {
|
|
|
+ log.info("【RFID门禁机】灯带报警{}成功!", status);
|
|
|
+ if (state == 1) {
|
|
|
+ stopGpo(client, delayTime);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ log.info("【RFID门禁机】灯带报警{}失败!", status);
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 断开设备链接
|
|
|
+ *
|
|
|
+ * @param hardwareRfid 设备数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void disconnect(HardwareRfid hardwareRfid) {
|
|
|
+ String hardwareNum = hardwareRfid.getHardwareNum();
|
|
|
+ if (clientMap.containsKey(hardwareNum)) {
|
|
|
+ GClient client = clientMap.get(hardwareNum);
|
|
|
+ GServer server = serverMap.get(hardwareNum);
|
|
|
+ //关闭报警
|
|
|
+ changeGpo(client, 0, 0);
|
|
|
+ //停止读写卡
|
|
|
+ stopMsg(client);
|
|
|
+ //客户端资源释放
|
|
|
+ client.close();
|
|
|
+ //服务端接口释放
|
|
|
+ server.close();
|
|
|
+ //客户端清除
|
|
|
+ clientMap.remove(hardwareNum);
|
|
|
+ //服务端缓存清除
|
|
|
+ serverMap.remove(hardwareNum);
|
|
|
+ log.info("【RFID门禁机】关闭成功!");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 停止读写卡
|
|
|
+ *
|
|
|
+ * @param client 客户端
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean stopMsg(GClient client) {
|
|
|
+ // 停止指令,空闲态
|
|
|
+ MsgBaseStop msgBaseStop = new MsgBaseStop();
|
|
|
+ client.sendSynMsg(msgBaseStop);
|
|
|
+ if (0x00 == msgBaseStop.getRtCode()) {
|
|
|
+ log.info("【RFID门禁机】停止读写成功!");
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ log.error("【RFID门禁机】停止读写失败!{}", msgBaseStop.getRtMsg());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 报警实现
|
|
|
+ *
|
|
|
+ * @param hardwareRfid 硬件信息
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean alarm(HardwareRfid hardwareRfid) {
|
|
|
+ log.info("收到调用报警!");
|
|
|
+ //灯带设置
|
|
|
+ String hardwareNum = hardwareRfid.getHardwareNum();
|
|
|
+ if (clientMap.containsKey(hardwareNum)) {
|
|
|
+ GClient client = clientMap.get(hardwareNum);
|
|
|
+ synchronized (this) {
|
|
|
+ //设置开始报警、报警时长
|
|
|
+ return changeGpo(client, 1, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param client 客户端
|
|
|
+ * @param delayTime 报警持续时间(单位:秒)
|
|
|
+ */
|
|
|
+ public void stopGpo(GClient client, int delayTime) {
|
|
|
+ scheduledExecutorService.schedule(new TimerTask() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ changeGpo(client, 0, 0);
|
|
|
+ }
|
|
|
+ }, delayTime, TimeUnit.SECONDS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 去掉端口号,只获取ip
|
|
|
+ */
|
|
|
+ private static String getIp(HardwareRfid hardwareRfid) {
|
|
|
+ String ipAddress;
|
|
|
+ if (Objects.isNull(hardwareRfid) || StringUtils.isBlank(hardwareRfid.getIpAddress())) {
|
|
|
+ log.error("RFID配置ip为空!");
|
|
|
+ }
|
|
|
+ String[] ipPort = hardwareRfid.getIpAddress().split(":");
|
|
|
+ if (ipPort.length > 1) {
|
|
|
+ ipAddress = ipPort[0];
|
|
|
+ } else {
|
|
|
+ ipAddress = hardwareRfid.getIpAddress();
|
|
|
+ }
|
|
|
+ return ipAddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取端口号 未配置端口号默认给到8160
|
|
|
+ *
|
|
|
+ * @Param [ipPort]
|
|
|
+ * @Return int
|
|
|
+ **/
|
|
|
+ private static int getPort(String ipPort) {
|
|
|
+ //默认给到8160
|
|
|
+ int port = 8160;
|
|
|
+ if (null == ipPort || "".equals(ipPort)) {
|
|
|
+ return port;
|
|
|
+ }
|
|
|
+ String[] split = ipPort.split(":");
|
|
|
+ if (split.length > 1) {
|
|
|
+ port = Integer.valueOf(split[1]);
|
|
|
+ }
|
|
|
+ return port;
|
|
|
+ }
|
|
|
+}
|