From 265da00472a237381329924df2add598d48bcc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Mon, 11 Dec 2023 10:17:13 +0800 Subject: [PATCH] =?UTF-8?q?rfid=E4=BF=AE=E6=94=B9=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E7=90=83=E6=9C=BA=E5=9E=82=E7=9B=B4=E6=96=B9?= =?UTF-8?q?=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/pom.xml | 29 + .../web/lib/CameraControlModule.java | 3 + .../com/zhehekeji/web/lib/hik/HCNetSDK.java | 5 + .../lib/hik/HikCameraControlModuleImpl.java | 34 ++ .../JoywareCameraControlModuleImpl.java | 7 + .../com/zhehekeji/web/pojo/CameraPtzPojo.java | 13 + .../com/zhehekeji/web/service/PlcService.java | 61 +- .../web/service/RFID/RFIDReader.java | 541 ++++++++++++++++++ .../web/service/RFID/RFIDSocket.java | 331 +++++------ .../web/service/RFID/RFIDSocketOld.java | 163 ++++++ .../web/service/ksec/KsecDecoder.java | 2 + .../web/service/sick/SickSocket.java | 56 +- .../java/com/zhehekeji/web/util/ToolUtil.java | 30 + 13 files changed, 1052 insertions(+), 223 deletions(-) create mode 100644 web/src/main/java/com/zhehekeji/web/pojo/CameraPtzPojo.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/RFID/RFIDReader.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocketOld.java create mode 100644 web/src/main/java/com/zhehekeji/web/util/ToolUtil.java diff --git a/web/pom.xml b/web/pom.xml index 90169b6..f6e84a7 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -85,6 +85,35 @@ system ${project.basedir}/src/main/resources/libs/rxtx-2.1.7.jar + + + com + javaRFID-helloworld + 1.0 + system + ${project.basedir}/src/main/resources/libs/javaRFID-helloworld.jar + + + com.payne.connect + payne + 1.0 + system + ${project.basedir}/src/main/resources/libs/connect-lib.jar + + + com.payne.reader + payneReader + 1.0 + system + ${project.basedir}/src/main/resources/libs/lib_reader.jar + + + gnu.io + rxtxcomm + 1.0 + system + ${project.basedir}/src/main/resources/libs/RXTXcomm.jar + diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java index 7c124a3..2e3236c 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java @@ -1,5 +1,7 @@ package com.zhehekeji.web.lib; +import com.zhehekeji.web.pojo.CameraPtzPojo; + import java.time.LocalDateTime; public interface CameraControlModule { @@ -34,6 +36,7 @@ public interface CameraControlModule { boolean ptzControlRightEnd(Integer cameraId, int nChannelID); + CameraPtzPojo ptzGetDVRConfig(Integer cameraId); /** * 向左上 */ diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HCNetSDK.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HCNetSDK.java index 9e2e61f..ee6765d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HCNetSDK.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HCNetSDK.java @@ -3134,6 +3134,11 @@ DVR实现巡航数据结构 public short wPanPos;//水平参数 public short wTiltPos;//垂直参数 public short wZoomPos;//变倍参数 + @Override + protected List getFieldOrder() { + // TODO Auto-generated method stub + return Arrays.asList("wAction","wPanPos","wTiltPos","wZoomPos"); //这里参数顺序和SDK开发包的C++定义必须完全一致 + } } //球机范围信息 diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java index 433bbe9..f6458a4 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java @@ -1,12 +1,14 @@ package com.zhehekeji.web.lib.hik; import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraControlModule; import com.zhehekeji.web.lib.joyware.NetSDKLib; +import com.zhehekeji.web.pojo.CameraPtzPojo; import lombok.extern.slf4j.Slf4j; import java.io.*; @@ -18,6 +20,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Timer; +import static com.zhehekeji.web.lib.hik.HCNetSDK.NET_DVR_GET_PTZPOS; + /** * 云台控制接口实现 * 主要有 :八个方向控制、变倍、变焦、光圈功能 @@ -85,6 +89,36 @@ public class HikCameraControlModuleImpl implements CameraControlModule { return HikLoginModuleImpl.hcNetsdk.NET_DVR_PTZControl_Other(lUserId, 1, HCNetSDK.PAN_RIGHT, 0); } + @Override + public CameraPtzPojo ptzGetDVRConfig(Integer lUserID) { + + CameraPtzPojo cameraPtzPojo = new CameraPtzPojo(); + int lUserId = CameraConnMap.getConnId(lUserID).intValue(); + HCNetSDK.NET_DVR_PTZPOS netDvrPtzpos = new HCNetSDK.NET_DVR_PTZPOS(); + Pointer pointer = netDvrPtzpos.getPointer(); + IntByReference intByReference = new IntByReference(1); + boolean b_GetPTZ = HikLoginModuleImpl.hcNetsdk.NET_DVR_GetDVRConfig(lUserId, NET_DVR_GET_PTZPOS,1,pointer,netDvrPtzpos.size(),intByReference); + if (b_GetPTZ == false) { + System.out.println("获取PTZ坐标信息失败,错误码:" +HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError()); + cameraPtzPojo.setGetSuccess(false); + }else { + + cameraPtzPojo.setGetSuccess(true); + netDvrPtzpos.read(); + cameraPtzPojo.setWPanPos(hexToDegree(netDvrPtzpos.wPanPos)); + cameraPtzPojo.setWTiltPos(hexToDegree(netDvrPtzpos.wTiltPos)); + cameraPtzPojo.setWZoomPos(hexToDegree(netDvrPtzpos.wZoomPos)); + } + return cameraPtzPojo; + } + + static double hexToDegree(short hex) { + String value = Integer.toHexString(hex); + Integer v = Integer.parseInt(value); + int integerPart = v / 10; + int decimalPart = v % 10; + return integerPart + decimalPart / 10.0; + } public boolean ptzControlRightEnd(Integer cameraId, int nChannelID) { int lUserId = CameraConnMap.getConnId(cameraId).intValue(); diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java index 76c36c9..aca83de 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java @@ -5,6 +5,7 @@ import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraControlModule; +import com.zhehekeji.web.pojo.CameraPtzPojo; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; @@ -93,6 +94,12 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { 0, 0, 0, 1); } + //暂未开发 + @Override + public CameraPtzPojo ptzGetDVRConfig(Integer lUserID) { + return null; + } + /** * 向左上 */ diff --git a/web/src/main/java/com/zhehekeji/web/pojo/CameraPtzPojo.java b/web/src/main/java/com/zhehekeji/web/pojo/CameraPtzPojo.java new file mode 100644 index 0000000..7c60c56 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/CameraPtzPojo.java @@ -0,0 +1,13 @@ +package com.zhehekeji.web.pojo; + + +import lombok.Data; + +@Data +public class CameraPtzPojo { + short wAction;//获取时该字段无效 + double wPanPos;//水平参数 + double wTiltPos;//垂直参数 + double wZoomPos;//变倍参数 + boolean getSuccess; +} diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 9249936..13feda9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -8,6 +8,7 @@ import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.entity.*; import com.zhehekeji.web.lib.*; import com.zhehekeji.web.mapper.*; +import com.zhehekeji.web.pojo.CameraPtzPojo; import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.service.RFID.RFIDMap; import com.zhehekeji.web.service.RFID.RFIDSocket; @@ -154,6 +155,45 @@ public class PlcService { return true; } + public void verticalAdjustmentByStreet(String SRMNumber){ + Street street = streetService.getStreetByPlcId(SRMNumber); + if(street.getCamera1Id()!=null){ + //重置垂直方向球机 + verticalAdjustment(street.getCamera1Id()); + } + if(street.getCamera2Id()!=null){ + //重置垂直方向球机 + verticalAdjustment(street.getCamera2Id()); + } + } + public void verticalAdjustment(Integer cameraId){ + log.info("球机"+cameraId+"重置垂直方向开始"); + Double origin = null; + int i = 10 ; + while (i >=0){ + i-- ; + CameraPtzPojo cameraPtzPojo = cameraControlModule.ptzGetDVRConfig(cameraId); + if(cameraPtzPojo.isGetSuccess()) { + cameraControlModule.ptzControlDownStart(cameraId, 0, 0, 1); + log.info("球机控制向下"); + System.out.println("获取的垂直位置"+cameraPtzPojo.getWTiltPos()); + if (origin == null) { + origin = cameraPtzPojo.getWTiltPos(); + } else if (cameraPtzPojo.getWTiltPos() <= origin) { + break; + } + } + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + log.info("球机"+cameraId+"重置垂直方向成功"); + cameraControlModule.ptzControlDownEnd(cameraId,0); + gyrateCameraByCode(cameraId,"C1"); + } + public boolean closeStreetLightSource( Integer streetId){ List lightSources = lightSourceService.getLightSourceByStreetId(streetId); lightSources.forEach(lightSource -> { @@ -723,31 +763,30 @@ public class PlcService { if(street != null){ RFID rfid = rfidService.getRFIDByPlc(street.getId()); if(rfid != null){ - RFIDStart(rfid.getIp(),rfid.getPort(),street.getId()); + RFIDStart(rfid.getIp(),rfid.getPort(),street.getId(),1); } } } - public void RFIDStart(String ip,Integer port,Integer streetId){ - RFIDSocket rfidSocket = new RFIDSocket(ip,port); - rfidSocket.startCheck(); - rfidSocket.readData(); - RFIDMap.put(streetId,rfidSocket); + public void RFIDStart(String ip, Integer port, Integer streetId, Integer direction) { + RFIDSocket rfidSocket = new RFIDSocket(ip, port); + log.info("rfid调用,ip:" + ip + ";port:" + port); + rfidSocket.startCheck(direction, true); + RFIDMap.put(streetId, rfidSocket); } - public Set RFIDStop(PlcCmdInfo plcCmdInfo){ + public Set RFIDStop(PlcCmdInfo plcCmdInfo) { Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); RFIDSocket rfidSocket = RFIDMap.get(street.getId()); Set tags = null; - if(rfidSocket != null){ + if (rfidSocket != null) { tags = rfidSocket.getTags(); - log.info("tags:{}",tags); - rfidSocket.close(); + log.info("tags:{}", tags); + rfidSocket.stopCheck(); RFIDMap.remove(street.getId()); } return tags; } - public ConfigProperties getConfigProperties(){ return configProperties; } diff --git a/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDReader.java b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDReader.java new file mode 100644 index 0000000..7bdaf5b --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDReader.java @@ -0,0 +1,541 @@ +package com.zhehekeji.web.service.RFID; + +import com.payne.reader.Reader; +import com.payne.reader.base.Consumer; +import com.payne.reader.bean.config.*; +import com.payne.reader.bean.receive.*; +import com.payne.reader.bean.send.*; +import com.payne.reader.communication.ConnectHandle; +import com.payne.reader.communication.DataPacket; + +import java.security.InvalidParameterException; +/** + * 读取器接口 + */ +public interface RFIDReader extends Reader { + /** + * 连接读取器 + * + * @param var1 连接处理回调 + * @return 连接是否成功 + */ + boolean connect(ConnectHandle var1); + + /** + * 连接读取器,并设置回调线程 + * + * @param var1 连接处理回调 + * @param var2 回调线程 + * @return 连接是否成功 + */ + boolean connect(ConnectHandle var1, boolean var2); + + /** + * 判断是否已连接 + * + * @return 是否已连接 + */ + boolean isConnected(); + + /** + * 断开连接 + */ + void disconnect(); + + /** + * 获取读取器地址 + * + * @return 读取器地址 + */ + byte getReaderAddress(); + + /** + * 获取天线数量 + * + * @return 天线数量 + */ + AntennaCount getAntennaCount(); + + /** + * 切换天线数量 + * + * @param var1 天线数量 + */ + void switchAntennaCount(AntennaCount var1); + + /** + * 设置命令超时时间 + * + * @param var1 超时时间 + */ + void setCmdTimeout(long var1); + + /** + * 重置读取器 + * + * @param var1 失败处理回调 + */ + void reset(Consumer var1); + + /** + * 设置波特率 + * + * @param var1 波特率类型 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setBaudRate(BaudRate var1, Consumer var2, Consumer var3); + + /** + * 设置波特率 + * + * @param var1 波特率类型 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + * @param var4 异常处理回调 + */ + void setBaudRate(BaudRate var1, Consumer var2, Consumer var3, Consumer var4); + + /** + * 设置读取器地址 + * + * @param var1 读取器地址 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setReaderAddress(byte var1, Consumer var2, Consumer var3); + + /** + * 获取固件版本 + * + * @param var1 版本获取成功处理回调 + * @param var2 失败处理回调 + */ + void getFirmwareVersion(Consumer var1, Consumer var2); + + /** + * 设置蜂鸣器模式 + * + * @param var1 蜂鸣器模式 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setBeeperMode(Beeper var1, Consumer var2, Consumer var3); + + /** + * 获取读取器温度 + * + * @param var1 读取器温度获取成功处理回调 + * @param var2 失败处理回调 + */ + void getReaderTemperature(Consumer var1, Consumer var2); + + /** + * 读取GPIO输出 + * + * @param var1 GPIO输出获取成功处理回调 + * @param var2 失败处理回调 + */ + void readGpio(Consumer var1, Consumer var2); + + /** + * 写入GPIO输入 + * + * @param var1 GPIO输入类型 + * @param var2 输入值 + * @param var3 成功处理回调 + * @param var4 失败处理回调 + */ + void writeGpio(GpioInType var1, boolean var2, Consumer var3, Consumer var4); + + /** + * 设置天线连接探测器地址 + * + * @param var1 探测器地址 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setAntConnectionDetector(byte var1, Consumer var2, Consumer var3); + + /** + * 获取天线连接探测器地址 + * + * @param var1 探测器地址获取成功处理回调 + * @param var2 失败处理回调 + */ + void getAntConnectionDetector(Consumer var1, Consumer var2); + + /** + * 设置工作天线 + * + * @param var1 工作天线 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + * @throws InvalidParameterException 参数无效异常 + */ + void setWorkAntenna(int var1, Consumer var2, Consumer var3) throws InvalidParameterException; + + /** + * 获取工作天线 + * + * @param var1 工作天线获取成功处理回调 + * @param var2 失败处理回调 + */ + void getWorkAntenna(Consumer var1, Consumer var2); + + /** + * 获取缓存工作天线 + * + * @return 缓存工作天线 + */ + int getCacheWorkAntenna(); + + /** + * 获取缓存天线组 + * + * @return 缓存天线组 + */ + int getCacheAntennaGroup(); + + /** + * 设置输出功率 + * + * @param var1 输出功率配置 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + * @throws InvalidParameterException 参数无效异常 + */ + void setOutputPower(OutputPowerConfig var1, Consumer var2, Consumer var3) throws InvalidParameterException; + + /** + * 获取输出功率 + * + * @param var1 输出功率获取成功处理回调 + * @param var2 失败处理回调 + */ + void getOutputPower(Consumer var1, Consumer var2); + + /** + * 设置均匀输出功率 + * + * @param var1 均匀输出功率 + * @param var2 设置成功处理回调 + * @param var3 失败处理回调 + */ + void setOutputPowerUniformly(byte var1, boolean var2, Consumer var3, Consumer var4); + + /** + * 设置频率区域 + * + * @param var1 频率区域类型 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setFrequencyRegion(FreqNormal var1, Consumer var2, Consumer var3); + + /** + * 设置用户定义频率 + * + * @param var1 用户定义频率类型 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setUserDefineFrequency(FreqUserDefine var1, Consumer var2, Consumer var3); + + /** + * 获取频率区域 + * + * @param var1 频率区域获取成功处理回调 + * @param var2 失败处理回调 + */ + void getFrequencyRegion(Consumer var1, Consumer var2); + + /** + * 设置读取器标识 + * + * @param var1 读取器标识 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setReaderIdentifier(Identifier var1, Consumer var2, Consumer var3); + + /** + * 获取读取器标识 + * + * @param var1 读取器标识获取成功处理回调 + * @param var2 失败处理回调 + */ + void getReaderIdentifier(Consumer var1, Consumer var2); + + /** + * 设置RF链接配置 + * + * @param var1 链接配置 + * @param var2 成功处理回调 + * @param var3 失败处理回调 + */ + void setRfLinkProfile(ProfileId var1, Consumer var2, Consumer var3); + + /** + * 获取RF链接配置 + * + * @param var1 RF链接配置获取成功处理回调 + * @param var2 失败处理回调 + */ + void getRfLinkProfile(Consumer var1, Consumer var2); + + /** + * 设置E710链接配置 + * + * @param var1 链接配置 + * @param var2 配置类型 + * @param var3 成功处理回调 + * @param var4 失败处理回调 + */ + void setE710LinkProfile(ProfileId var1, byte var2, Consumer var3, Consumer var4); + + /** + * 获取E710链接配置 + * + * @param var1 E710链接配置获取成功处理回调 + * @param var2 失败处理回调 + */ + void getE710LinkProfile(Consumer var1, Consumer var2); + + /** + * 获取RF端口返回损耗 + * + * @param var1 端口号 + * @param var2 返回损耗获取成功处理回调 + * @param var3 失败处理回调 + */ + void getRfPortReturnLoss(byte var1, Consumer var2, Consumer var3); + + /** + * 设置库存配置 + * + * @param var1 库存配置 + * @throws InvalidParameterException 参数无效异常 + */ + void setInventoryConfig(InventoryConfig var1) throws InvalidParameterException; + + /** + * 开始库存盘点 + * + * @param var1 是否开启多天线读取 + */ + void startInventory(boolean var1); + + /** + * 停止盘点。 + */ + void stopInventory(); + + /** + * 停止盘点,参数为一个布尔值。 + * + * @param var1 布尔值参数 + */ + void stopInventory(boolean var1); + + /** + * 设置MultiAntReadTagConfig配置。 + * + * @param var1 MultiAntReadTagConfig对象 + */ + void setMultiAntReadTagConfig(MultiAntReadTagConfig var1); + + /** + * 启动MultiAntReadTag。 + */ + void startMultiAntReadTag(); + + /** + * 停止MultiAntReadTag。 + */ + void stopMultiAntReadTag(); + + /** + * 读取标签。 + * + * @param var1 读取配置ReadConfig对象 + * @param var2 操作标签回调函数 + * @param var3 失败回调函数 + */ + void readTag(ReadConfig var1, Consumer var2, Consumer var3); + + /** + * 读取标签。 + * + * @param var1 自定义会话读取配置CustomSessionReadConfig对象 + * @param var2 操作标签回调函数 + * @param var3 失败回调函数 + */ + void readTag(CustomSessionReadConfig var1, Consumer var2, Consumer var3); + + /** + * 写入标签。 + * + * @param var1 写入配置WriteConfig对象 + * @param var2 布尔值参数 + * @param var3 操作标签回调函数 + * @param var4 失败回调函数 + */ + void writeTag(WriteConfig var1, boolean var2, Consumer var3, Consumer var4); + + /** + * 锁定标签。 + * + * @param var1 锁定配置LockConfig对象 + * @param var2 操作标签回调函数 + * @param var3 失败回调函数 + */ + void lockTag(LockConfig var1, Consumer var2, Consumer var3); + + /** + * 杀死标签。 + * + * @param var1 杀死配置KillConfig对象 + * @param var2 操作标签回调函数 + * @param var3 失败回调函数 + */ + void killTag(KillConfig var1, Consumer var2, Consumer var3); + + /** + * 设置ImpinjFastTid。 + * + * @param var1 FastTidType对象 + * @param var2 布尔值参数 + * @param var3 成功回调函数 + * @param var4 失败回调函数 + */ + void setImpinjFastTid(FastTidType var1, boolean var2, Consumer var3, Consumer var4); + + /** + * 获取ImpinjFastTid。 + * + * @param var1 成功回调函数 + * @param var2 失败回调函数 + */ + void getImpinjFastTid(Consumer var1, Consumer var2); + + /** + * 设置EpcMatch。 + * + * @param var1 匹配配置MatchConfig对象 + * @param var2 成功回调函数 + * @param var3 失败回调函数 + */ + void setEpcMatch(MatchConfig var1, Consumer var2, Consumer var3); + + /** + * 获取EpcMatch。 + * + * @param var1 成功回调函数 + * @param var2 失败回调函数 + */ + void getEpcMatch(Consumer var1, Consumer var2); + + /** + * 清除EpcMatch。 + * + * @param var1 成功回调函数 + * @param var2 失败回调函数 + */ + void clearEpcMatch(Consumer var1, Consumer var2); + + /** + * 设置TagMask。 + * + * @param var1 掩码配置MaskConfig对象 + * @param var2 成功回调函数 + * @param var3 失败回调函数 + */ + void setTagMask(MaskConfig var1, Consumer var2, Consumer var3); + + /** + * 获取TagMask。 + * + * @param var1 成功回调函数 + * @param var2 失败回调函数 + */ + void getTagMask(Consumer var1, Consumer var2); + + /** + * 清除TagMask。 + * + * @param var1 清除的TagMaskID + * @param var2 成功回调函数 + * @param var3 失败回调函数 + */ + void clearTagMask(ClearMaskId var1, Consumer var2, Consumer var3); + + /** + * 设置ReaderStatus。 + * + * @param var1 字节参数 + * @param var2 成功回调函数 + * @param var3 失败回调函数 + */ + void setReaderStatus(byte var1, Consumer var2, Consumer var3); + + /** + * 获取ReaderStatus。 + * + * @param var1 成功回调函数 + * @param var2 失败回调函数 + */ + void getReaderStatus(Consumer var1, Consumer var2); + + /** + * 获取TempLabel2。 + * + * @param var1 TempLabel2对象 + * @param var2 失败回调函数 + */ + void measTempLabel2(TempLabel2Config var1, Consumer var2, Consumer var3); + + /** + * 设置CommandStatusCallback。 + * + * @param var1 回调函数 + */ + void setCommandStatusCallback(Consumer var1); + + /** + * 设置OriginalDataCallback。 + * + * @param var1 原始数据回调函数 + * @param var2 失败回调函数 + */ + void setOriginalDataCallback(Consumer var1, Consumer var2); + + /** + * 设置UndefinedResultCallback。 + * + * @param var1 未定义结果回调函数 + */ + void setUndefinedResultCallback(Consumer var1); + + /** + * @deprecated 已过时,请勿使用 + */ + @Deprecated + void sendCustomRequest(byte var1, byte[] var2); + + /** + * 发送自定义请求。 + * + * @param var1 数据包对象 + */ + void sendCustomRequest(DataPacket var1); + + /** + * 获取SdkBuildInfo。 + * + * @return SdkBuildInfo信息 + */ + default String getSdkBuildInfo() { + return "add cmd:89, packaged at 2022-10-13 04.00"; + } +} \ No newline at end of file diff --git a/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java index 8e33031..871c471 100644 --- a/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java +++ b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java @@ -1,238 +1,175 @@ package com.zhehekeji.web.service.RFID; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -import java.io.*; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.*; - -/** - * sick扫码枪 - */ -@Slf4j -public class RFIDSocket { - - private Socket socket; - - private OutputStream os; - - private InputStream is; - - private Queue buffer; +import com.payne.connect.net.NetworkHandle; +import com.payne.reader.Reader; +import com.payne.reader.base.Consumer; +import com.payne.reader.bean.config.AntennaCount; +import com.payne.reader.bean.receive.*; +import com.payne.reader.bean.send.FastSwitchFourAntennaInventory; +import com.payne.reader.bean.send.InventoryConfig; +import com.payne.reader.process.ReaderImpl; +import com.zhehekeji.web.util.ToolUtil; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +public class RFIDSocket { + private String ip; + private int port; private boolean running; + Reader mReader; - private int step; - - private int length; - - private int index; - - /** - * 读到的所有code标签 - */ private Set tags = new HashSet<>(); - private List byteList = new ArrayList<>(30); + private Map tagsCount = new ConcurrentHashMap<>(); - public Set getTags(){ + public Set getTags() { return tags; } + public RFIDSocket(String ip, Integer port) { + this.ip = ip; + this.port = port; - public RFIDSocket(String ip,int port){ - socket = new Socket(); - os = null; - is = null; - try { - socket.connect(new InetSocketAddress(ip,port),3000); - os = socket.getOutputStream(); - is = socket.getInputStream(); - } catch (IOException e) { - log.error("RFIDSocket time out,ip:{},info:{}",ip,e); - - close(); + NetworkHandle handle = new NetworkHandle(ip, (port)); + mReader = ReaderImpl.create(AntennaCount.FOUR_CHANNELS); + boolean linkSuccess =false; + try { + linkSuccess = mReader.connect(handle); + }catch (Exception e) { + e.printStackTrace(); + } + if (linkSuccess) { + System.out.println("reader1 connect success"); + } else { + throw new RuntimeException("reader1 connect fail"); } + } - public void readData(){ + public void startCheck(Integer direction,boolean foreach) { +// Reader mReader = ReaderImpl.create(AntennaCount.SIXTEEN_CHANNELS); +// Reader mReader = ReaderImpl.create(AntennaCount.EIGHT_CHANNELS); running = true; - buffer = new LinkedList(); - Thread thread = new Thread(new Runnable() { - - @SneakyThrows - @Override public void run() { - while (true){ - if(!running){ - System.out.println("stop"); - break; - } - int i = 0; - try { - //读不到会阻塞 返回-1表示连接已断开 - i = is.read(); - } catch (IOException e) { - log.error("disconnect"); - } - if(i == -1){ + mReader.setOriginalDataCallback( + new Consumer() { + @Override + public void accept(byte[] onSend) throws Exception { + //System.out.println("---reader 1 send :" + ArrayUtils.bytesToHexString(onSend, 0, onSend.length)); + } + }, + new Consumer() { + @Override + public void accept(byte[] onReceive) throws Exception { + - break; - } - int count = 0; - try { - count = is.available(); - if(count > 0){ - //把之前read的字节嫁过来 - byte[]readBytes = new byte[count+1]; - readBytes[0] = (byte)i; - is.read(readBytes,1,count); - for(byte b:readBytes){ - buffer.offer(b); + } + }); + FastSwitchFourAntennaInventory inventory = new FastSwitchFourAntennaInventory.Builder().build(); + InventoryConfig config = new InventoryConfig.Builder() + .setInventory(inventory) + .setOnInventoryTagSuccess(new Consumer() { + + @Override + public void accept(InventoryTag tag) throws Exception { + System.out.println("reader1 inventory tag :" + tag.getEpc()); + String tagStr = tag.getEpc().replace(" ",""); + System.out.println("tag: " + tag.getEpc()); + tagStr = tagStr.replace("0000000000",""); + tags.add(tagStr); + if (ToolUtil.isNotEmpty(tagsCount.get(tagStr))) { + tagsCount.put(tagStr, tagsCount.get(tagStr) + 1); + } else { + tagsCount.put(tagStr, 1); + } + } + }) + .setOnInventoryTagEndSuccess(new Consumer() { + + @Override + public void accept(InventoryTagEnd arg0) throws Exception { +// System.out.println("reader1 InventoryTagEnd"); + } + }) + .setOnFailure(new Consumer() { + + @Override + public void accept(InventoryFailure failure) throws Exception { + System.out.println("reader1 inventory fail :" + (failure.getErrorCode() & 0xFF)); + } + }) + .build(); + mReader.setInventoryConfig(config); + mReader.startInventory(true); + + mReader.setWorkAntenna(direction, + new Consumer() { + @Override + public void accept(Success success) throws Exception { + //切换天线 + //处理成功 + } + }, new Consumer() { + @Override + public void accept(Failure failure) throws Exception { + //处理失败情况 } } - } catch (IOException e) { - log.error(""); - } - while (buffer.size()> 0){ - String code = readTag(); - if(code != null){ - tags.add(code); + ); + byte[] bytes = new byte[1]; + bytes[0] = 0x01; + while (running) { + try { + bytes[0] = (byte) (bytes[0] == 0x01 ? 0x00 : 0x01); + Thread.sleep(1000); + if(foreach){ + mReader.setWorkAntenna(bytes[0],(v)->{ + System.out.println("reader1 setWorkAntenna success"); + },(v)->{ + System.out.println("reader1 setWorkAntenna fail"); + }); } + } catch (Exception e) { + e.printStackTrace(); + stopCheck(); } } - } + }); thread.start(); - } - - private String readTag(){ - String tag = null; - Byte b = buffer.poll(); - if(b == null){ - return tag; - } - if(step == 0){ - //判断是否表示头 - if(b == HEAD.HEAD){ - step++; - byteList.add(b); - } - }else if(step == 1){ - //读长度 - length = b & 0xff; - step++; - byteList.add(b); - }else if(step == 2){ - byteList.add(b); - index++; - if(index == length-1){ - step++; - } - }else if(step == 3){ - byteList.add(b); - byte[]bytes = new byte[byteList.size()]; - for(int i = 0;i tags = new HashSet<>(); + + private Map tagsCount = new ConcurrentHashMap<>(); + public Set getTags(){ + return tags; + } + + + private Observer mObserver = new RXObserver() { + @Override + protected void onInventoryTag(RXInventoryTag tag) { + System.out.println("EPC data:" + tag.strEPC); + } + + @Override + protected void onInventoryTagEnd(RXInventoryTag.RXInventoryTagEnd endTag) { + System.out.println("inventory end:" + endTag.mTotalRead); + ((RFIDReaderHelper) mReaderHelper).realTimeInventory((byte) 0xff,(byte)0x01); + } + + @Override + protected void onExeCMDStatus(byte cmd,byte status) { + System.out.format("CDM:%s Execute status:%S\n", + String.format("%02X",cmd),String.format("%02x", status)); + } + }; + private RXTXListener mListener = new RXTXListener() { + @Override + //获取接收器返回的数据 + public void reciveData(byte[] btAryReceiveData) { + // TODO Auto-generated method stub + System.out.println("reciveData: " + StringTool.byteArrayToString(btAryReceiveData, 0, btAryReceiveData.length)); + MessageTran messageTran = new MessageTran(btAryReceiveData); + if (messageTran != null){ + System.out.println("ary data length: " + messageTran.getAryData().length); + System.out.println("artData: " + StringTool.byteArrayToString(messageTran.getAryData(), 0, messageTran.getAryData().length)); + StringBuffer sb = new StringBuffer(); + int aryDataLength = messageTran.getAryData().length; + if (aryDataLength > 8){ + for (int i = 0; i < aryDataLength; ++i){ + sb.append(String.format("%02X",messageTran.getAryData()[i])); + } + + String tag = sb.toString(); + //int index = st.indexOf("E"); + //String tag = st.substring(index, index+16); + System.out.println("tag: "+tag); + tags.add(tag); + if(ToolUtil.isNotEmpty(tagsCount.get(tag))){ + tagsCount.put(tag, tagsCount.get(tag)+1); + }else{ + tagsCount.put(tag, 1); + } + } + } + } + + @Override + public void sendData(byte[] btArySendData) { + // TODO Auto-generated method stub + System.out.println("sendData: " + StringTool.byteArrayToString(btArySendData, 0, btArySendData.length)); + } + + @Override + public void onLostConnect() { + // TODO Auto-generated method stub + } + + }; + public RFIDSocketOld(String ip, Integer port){ + mReaderConnector = new ReaderConnector(); + mReaderHelper = mReaderConnector.connectNet(ip, port); + } + public void startCheck(Integer direction){ + running = true; + Thread thread = new Thread(new Runnable() { + public void run() { + + if (mReaderHelper != null) { + System.out.println("Connect success!"); + try { + mReaderHelper.registerObserver(mObserver); + mReaderHelper.setRXTXListener(mListener); + + Thread.sleep(500); + //start to find the tags +// ((RFIDReaderHelper) mReaderHelper).realTimeInventory((byte) 0xff,(byte)0x01); + while (true) { +// if (i%2==0){ + if (!running){ + break; + } + if (direction == 1) { + //切换天线 0x00:天线1;0x01:天线2 + ((RFIDReaderHelper) mReaderHelper).setWorkAntenna((byte) 0xFF, (byte) 0x00); + } else { + ((RFIDReaderHelper) mReaderHelper).setWorkAntenna((byte) 0xFF, (byte) 0x01); + } + //开始盘存180006B + //((RFIDReaderHelper) mReaderHelper).iso180006BInventory((byte) 0xFF); + ((RFIDReaderHelper) mReaderHelper).inventory((byte) 0xFF, (byte) 0x0A); +// i++; + Thread.sleep(70); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else { + System.out.println("Connect faild!"); + mReaderConnector.disConnect(); + } + } + }); + thread.start(); + } + + public void stopCheck(){ + running = false; + if (mReaderConnector.isConnected()){ + mReaderConnector.disConnect(); + } + } + public String getTag(){ + if(ToolUtil.isNotEmpty(tagsCount)){ + int i = 0; + String tag = "" ; + for (String t : tagsCount.keySet()){ + if (i) o).isEmpty(); + } + if (o instanceof Map) { + return ((Map) o).isEmpty(); + } + if (o.getClass().isArray()) { + return Array.getLength(o) == 0; + } + return "".equals(o.toString()); + } + + public static boolean isNotEmpty(Object o) { + return !isEmpty(o); + } +}