diff --git a/pom.xml b/pom.xml index 033c242..9f4d69f 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,17 @@ lombok + + + + + + + + - com.new.reader - reader-api + com.readwriter + readwriter 1.0 diff --git a/pom.xml b/pom.xml index 033c242..9f4d69f 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,17 @@ lombok + + + + + + + + - com.new.reader - reader-api + com.readwriter + readwriter 1.0 diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index ad9b6c8..e0ef3be 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -2,13 +2,20 @@ import com.casic.missiles.model.ReturnDTO; import com.casic.missiles.service.IBusinessReadWriterService; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.API.entityclass.MemoryBank; +import com.rfid.API.entityclass.ScanTagParameter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutionException; /** @@ -29,6 +36,7 @@ * TCP连接,需配置和192.168.1.201一个段 * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/readList") public ReturnDTO> tIdNewReadList() { return readWriterService.tIdNewReadList(); @@ -39,6 +47,7 @@ * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/mini/readList") public ReturnDTO> tIdMiniReadList() { return readWriterService.tIdMiniReadList(); @@ -51,6 +60,7 @@ * 二维码由样品编号/设备编号生成 * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) */ + @CrossOrigin @GetMapping("/code/gun/readList") public ReturnDTO> codeGunReadList() { return readWriterService.codeGunReadList(); @@ -59,6 +69,7 @@ /** * 有线扫码枪(二维码)和大读写器结合扫描 */ + @CrossOrigin @GetMapping("/gunAndTId/readList") public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { return readWriterService.gunAndTIdNewReadList(); @@ -67,6 +78,7 @@ /** * 大读写器和小读写器识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMini/readList") public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniReadList(); @@ -75,8 +87,255 @@ /** * 大读写器和小读写器和有线扫码枪(二维码)识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMiniAndGun/readList") public ReturnDTO> tIdAndMiniAndGun() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniAndGunReadList(); } + + + public static void main(String[] args) { +// CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + CommonReader reader = new CommonReader("Reader1", "RS232", "COM5:115200"); + +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.GRP); + reader.setReaderProtocol(ProtocolVersion.GRP); + reader.setPortSum(4); + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { + System.out.println("设备连接状态:" + b); + } + }); + + + if (reader.getIsConnected() == true) { + System.out.println("连接成功..."); + boolean a = reader.BuzzerControl(true, false); + System.out.println("**********************"); + System.out.println("1.查询功率 2.设置功率 3.盘点标签 4.查询GPI状态 5. 开门开灯"); + while (true) { + Scanner input = new Scanner(System.in); + System.out.println("请输入菜单编号:"); + int bh = input.nextInt(); + if (bh == 1) { + HashMap powerList = reader.reader_GetPowerList(); + for (Byte key : powerList.keySet()) { + System.out.println("端口:" + key + " 功率:" + powerList.get(key)); + } + } else if (bh == 2) { + HashMap map = new HashMap(); + System.out.println("输入需要修改的端口:"); + int k = input.nextInt(); + byte k1 = (byte) k; + System.out.println("输入需要修改的功率:"); + int v = input.nextByte(); + byte v1 = (byte) v; + map.put(k1, v1); + boolean set = reader.reader_SetPowerList(map); + System.out.println("功率修改成功"); + } else if (bh == 3) { + //添加标签读取回调 + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + param.tidParameter = new byte[]{0,8}; + boolean b = reader.reader_Inventory(param, (byte) 0x01); +// System.out.println("开始盘点:" + b); +// boolean b1 = reader.ScanUserData(0x01,true,2); + +// boolean b = reader.ScanEPC(0x01,true); + boolean b2 = reader.ScanTID(0x01,true,8); +// System.out.println("开始盘点:" + b1); +// reader.OnRxdGpiTriggerState + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getTID()); +// String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); +// String s2 = Util.convertByteArrayToHexString(tagData.getTID()); + System.out.println("1读取到EPC:" + s); +// System.out.println("用户区:"+s1); +// System.out.println("TID:"+s2); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 4) { + + // 查询GPI + HashMap gpiLis = reader.GetGpi(); + for (Byte key : gpiLis.keySet()) { + System.out.println("gpi " + key + " 电平:" + gpiLis.get(key)); + } + } else if (bh == 5) { + /** + * 设置单个GPIO参数 + */ + + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 0); + reader.reader_SetGpo(Gpomap); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + do { + HashMap gpiLis = reader.GetGpi(); + Byte I1 = 1; + Byte gpi1 = gpiLis.get(I1); + Byte I2 = 2; + Byte gpi2 = gpiLis.get(I2); + if (gpi1 == 0 && gpi2 == 0) { + //关灯 + HashMap Gpo2map = new HashMap<>(); + Gpo2map.put((byte) 2, (byte) 0); + reader.reader_SetGpo(Gpo2map); + + //添加标签读取回调' + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + boolean b = reader.reader_Inventory(param, (byte) 0x00); + System.out.println("开始盘点:" + b); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getEPC()); + System.out.println("读取到EPC:" + s); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + break; + + } else { + System.out.println("查询GPI状态中"); + } + + } while (true); + + + } else { + System.out.println("设备未连接·"); + } + } else if (bh == 6) { + //开锁、开灯 + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Gpomap.put((byte) 1, (byte) 0); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + } else { + System.out.println("设备未连接·"); + } + + } else if (bh == 7) { +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x01; +// param.isLoop = true; +// //写标签测试,感应区一次只能写一个标签,如果没有扫瞄到标签,返回 -2;如果扫描到有多个标签,返回-1;如果参数不合法,返回-3;写入成功,返回 0 +// System.out.println("请输入需要写入的EPC:"); +// String Repc = input.next(); +// int i = reader.writeEPC(param, Repc); +// if (i == 0) { +// System.out.println("标签写入成功"); +// } else if (i == -1) { +// System.out.println("扫描到多张标签"); +// } else if (i == -2) { +// System.out.println("未扫描到标签"); +// } else { +// System.out.println("EPC输入不合格"); +// } +// try { +// Thread.sleep(1000 * 2); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + + } else if (bh == 8) { + // 读用户区 + boolean b = reader.ScanUserData(0x01, true, 2); + System.out.println(b); + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getUserData() != null) { + String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); + System.out.println("用户区:" + s1); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 9) { + // 写用户区 + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + + int i = reader.writTagData(MemoryBank.UserMemory, param, "00001111"); + System.out.println("写入用户区:" + i); + } else if (bh == 10) { + // 查询盘点模式 + reader.getEpcBasebandParameter(); + + } else if (bh == 11) { + reader.getIsConnected(); + } + } + } else { + System.out.println("连接失败..."); + } + + + } + } diff --git a/pom.xml b/pom.xml index 033c242..9f4d69f 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,17 @@ lombok + + + + + + + + - com.new.reader - reader-api + com.readwriter + readwriter 1.0 diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index ad9b6c8..e0ef3be 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -2,13 +2,20 @@ import com.casic.missiles.model.ReturnDTO; import com.casic.missiles.service.IBusinessReadWriterService; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.API.entityclass.MemoryBank; +import com.rfid.API.entityclass.ScanTagParameter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutionException; /** @@ -29,6 +36,7 @@ * TCP连接,需配置和192.168.1.201一个段 * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/readList") public ReturnDTO> tIdNewReadList() { return readWriterService.tIdNewReadList(); @@ -39,6 +47,7 @@ * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/mini/readList") public ReturnDTO> tIdMiniReadList() { return readWriterService.tIdMiniReadList(); @@ -51,6 +60,7 @@ * 二维码由样品编号/设备编号生成 * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) */ + @CrossOrigin @GetMapping("/code/gun/readList") public ReturnDTO> codeGunReadList() { return readWriterService.codeGunReadList(); @@ -59,6 +69,7 @@ /** * 有线扫码枪(二维码)和大读写器结合扫描 */ + @CrossOrigin @GetMapping("/gunAndTId/readList") public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { return readWriterService.gunAndTIdNewReadList(); @@ -67,6 +78,7 @@ /** * 大读写器和小读写器识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMini/readList") public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniReadList(); @@ -75,8 +87,255 @@ /** * 大读写器和小读写器和有线扫码枪(二维码)识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMiniAndGun/readList") public ReturnDTO> tIdAndMiniAndGun() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniAndGunReadList(); } + + + public static void main(String[] args) { +// CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + CommonReader reader = new CommonReader("Reader1", "RS232", "COM5:115200"); + +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.GRP); + reader.setReaderProtocol(ProtocolVersion.GRP); + reader.setPortSum(4); + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { + System.out.println("设备连接状态:" + b); + } + }); + + + if (reader.getIsConnected() == true) { + System.out.println("连接成功..."); + boolean a = reader.BuzzerControl(true, false); + System.out.println("**********************"); + System.out.println("1.查询功率 2.设置功率 3.盘点标签 4.查询GPI状态 5. 开门开灯"); + while (true) { + Scanner input = new Scanner(System.in); + System.out.println("请输入菜单编号:"); + int bh = input.nextInt(); + if (bh == 1) { + HashMap powerList = reader.reader_GetPowerList(); + for (Byte key : powerList.keySet()) { + System.out.println("端口:" + key + " 功率:" + powerList.get(key)); + } + } else if (bh == 2) { + HashMap map = new HashMap(); + System.out.println("输入需要修改的端口:"); + int k = input.nextInt(); + byte k1 = (byte) k; + System.out.println("输入需要修改的功率:"); + int v = input.nextByte(); + byte v1 = (byte) v; + map.put(k1, v1); + boolean set = reader.reader_SetPowerList(map); + System.out.println("功率修改成功"); + } else if (bh == 3) { + //添加标签读取回调 + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + param.tidParameter = new byte[]{0,8}; + boolean b = reader.reader_Inventory(param, (byte) 0x01); +// System.out.println("开始盘点:" + b); +// boolean b1 = reader.ScanUserData(0x01,true,2); + +// boolean b = reader.ScanEPC(0x01,true); + boolean b2 = reader.ScanTID(0x01,true,8); +// System.out.println("开始盘点:" + b1); +// reader.OnRxdGpiTriggerState + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getTID()); +// String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); +// String s2 = Util.convertByteArrayToHexString(tagData.getTID()); + System.out.println("1读取到EPC:" + s); +// System.out.println("用户区:"+s1); +// System.out.println("TID:"+s2); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 4) { + + // 查询GPI + HashMap gpiLis = reader.GetGpi(); + for (Byte key : gpiLis.keySet()) { + System.out.println("gpi " + key + " 电平:" + gpiLis.get(key)); + } + } else if (bh == 5) { + /** + * 设置单个GPIO参数 + */ + + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 0); + reader.reader_SetGpo(Gpomap); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + do { + HashMap gpiLis = reader.GetGpi(); + Byte I1 = 1; + Byte gpi1 = gpiLis.get(I1); + Byte I2 = 2; + Byte gpi2 = gpiLis.get(I2); + if (gpi1 == 0 && gpi2 == 0) { + //关灯 + HashMap Gpo2map = new HashMap<>(); + Gpo2map.put((byte) 2, (byte) 0); + reader.reader_SetGpo(Gpo2map); + + //添加标签读取回调' + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + boolean b = reader.reader_Inventory(param, (byte) 0x00); + System.out.println("开始盘点:" + b); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getEPC()); + System.out.println("读取到EPC:" + s); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + break; + + } else { + System.out.println("查询GPI状态中"); + } + + } while (true); + + + } else { + System.out.println("设备未连接·"); + } + } else if (bh == 6) { + //开锁、开灯 + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Gpomap.put((byte) 1, (byte) 0); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + } else { + System.out.println("设备未连接·"); + } + + } else if (bh == 7) { +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x01; +// param.isLoop = true; +// //写标签测试,感应区一次只能写一个标签,如果没有扫瞄到标签,返回 -2;如果扫描到有多个标签,返回-1;如果参数不合法,返回-3;写入成功,返回 0 +// System.out.println("请输入需要写入的EPC:"); +// String Repc = input.next(); +// int i = reader.writeEPC(param, Repc); +// if (i == 0) { +// System.out.println("标签写入成功"); +// } else if (i == -1) { +// System.out.println("扫描到多张标签"); +// } else if (i == -2) { +// System.out.println("未扫描到标签"); +// } else { +// System.out.println("EPC输入不合格"); +// } +// try { +// Thread.sleep(1000 * 2); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + + } else if (bh == 8) { + // 读用户区 + boolean b = reader.ScanUserData(0x01, true, 2); + System.out.println(b); + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getUserData() != null) { + String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); + System.out.println("用户区:" + s1); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 9) { + // 写用户区 + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + + int i = reader.writTagData(MemoryBank.UserMemory, param, "00001111"); + System.out.println("写入用户区:" + i); + } else if (bh == 10) { + // 查询盘点模式 + reader.getEpcBasebandParameter(); + + } else if (bh == 11) { + reader.getIsConnected(); + } + } + } else { + System.out.println("连接失败..."); + } + + + } + } diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java index c63c48d..9193fe7 100644 --- a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -16,7 +16,7 @@ import com.rfid.API.ProtocolVersion; import com.rfid.API.Util; import com.rfid.API.core.BaseReader; -import com.rfid.ui.GlobalData; +import com.rfid.API.entityclass.ScanTagParameter; import gnu.io.SerialPort; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -48,21 +48,41 @@ @Override public ReturnDTO> tIdNewReadList() { - // TODO: 2023/3/21 实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 - CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + //TCP连接方式(笔记本只有一个网口,内网还要连网线,该方案不可行),实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 +// CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + CommonReader reader = null; + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); try { -// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); -// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); - reader.setProtocol(ProtocolVersion.CRP); - reader.setReaderProtocol(ProtocolVersion.CRP); -// reader.setPortSum(4);//只对LRP的有效 - reader.connect(false, new BaseReader.IConnectListener() { - @Override - public void callback(boolean b) { -// log.info("大读写器设备连接状态:" + b); + List ports = serialPortUtil.findPort(); + log.info("RFID大读写器,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //RS232连接方式 + CommonReader readerOne = new CommonReader("Reader1", "RS232", port + ":115200"); +// CommonReader readerOne = new CommonReader("Reader1", "RS232", port + "COM:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + if (Objects.nonNull(readerOne)) { + reader = readerOne; + //RFID厂家最新协议采用GRP + reader.setProtocol(ProtocolVersion.GRP); + reader.setReaderProtocol(ProtocolVersion.GRP); + reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { + log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == false) { + continue; + } + break; } - }); + } if (reader.getIsConnected() == true) { + boolean a = reader.BuzzerControl(true, false); Set tIds = receiveNewTIds(reader); if (CollectionUtils.isEmpty(tIds)) { return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); @@ -76,7 +96,9 @@ return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); } finally { //不断开连接,读写器会每秒发送心跳 -// reader.disconnect(); + if (Objects.nonNull(reader)) { + reader.disconnect(); + } } } @@ -219,13 +241,14 @@ private Set receiveNewTIds(CommonReader reader) throws InterruptedException { Set tIds = new HashSet<>(); // boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 -// ScanTagParameter param = new ScanTagParameter(); -// param.antenna = 0x0001; -// param.isLoop = true;//持续盘点 // boolean b = reader.reader_Inventory(param, (byte) 0x0001); //四个天线都开填0x0F,需要4个天线都连上才行 - boolean b1 = reader.ScanTID(readWriterConfig.getAntenna(), true, 1111); - log.info("大读写器开始盘点:" + b1); + ScanTagParameter param = new ScanTagParameter(); + param.antenna = readWriterConfig.getAntenna(); + param.isLoop = true; + param.tidParameter = new byte[]{0,8}; + boolean b = reader.reader_Inventory(param, (byte) 0x01); + log.info("大读写器开始盘点:" + b); reader.OnTagDataReceivedHandle = (gateName, tagData) -> { if (tagData != null && tagData.getTID() != null) { String tid = Util.convertByteArrayToHexString(tagData.getTID()); diff --git a/pom.xml b/pom.xml index 033c242..9f4d69f 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,17 @@ lombok + + + + + + + + - com.new.reader - reader-api + com.readwriter + readwriter 1.0 diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index ad9b6c8..e0ef3be 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -2,13 +2,20 @@ import com.casic.missiles.model.ReturnDTO; import com.casic.missiles.service.IBusinessReadWriterService; +import com.rfid.API.CommonReader; +import com.rfid.API.ProtocolVersion; +import com.rfid.API.Util; +import com.rfid.API.core.BaseReader; +import com.rfid.API.entityclass.MemoryBank; +import com.rfid.API.entityclass.ScanTagParameter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutionException; /** @@ -29,6 +36,7 @@ * TCP连接,需配置和192.168.1.201一个段 * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/readList") public ReturnDTO> tIdNewReadList() { return readWriterService.tIdNewReadList(); @@ -39,6 +47,7 @@ * USB-HID连接(HID是一种USB通信协议,无需安装驱动就能进行交互) * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 */ + @CrossOrigin @GetMapping("/tId/mini/readList") public ReturnDTO> tIdMiniReadList() { return readWriterService.tIdMiniReadList(); @@ -51,6 +60,7 @@ * 二维码由样品编号/设备编号生成 * 扫描收入、扫描检完等,以及大读写器的补充(包括新建委托书和待收入中使用) */ + @CrossOrigin @GetMapping("/code/gun/readList") public ReturnDTO> codeGunReadList() { return readWriterService.codeGunReadList(); @@ -59,6 +69,7 @@ /** * 有线扫码枪(二维码)和大读写器结合扫描 */ + @CrossOrigin @GetMapping("/gunAndTId/readList") public ReturnDTO> equipmentLabelReadList() throws ExecutionException, InterruptedException { return readWriterService.gunAndTIdNewReadList(); @@ -67,6 +78,7 @@ /** * 大读写器和小读写器识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMini/readList") public ReturnDTO> allTidReadList() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniReadList(); @@ -75,8 +87,255 @@ /** * 大读写器和小读写器和有线扫码枪(二维码)识别结合的结果TID列表 */ + @CrossOrigin @GetMapping("/tIdAndMiniAndGun/readList") public ReturnDTO> tIdAndMiniAndGun() throws ExecutionException, InterruptedException { return readWriterService.tIdAndMiniAndGunReadList(); } + + + public static void main(String[] args) { +// CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + CommonReader reader = new CommonReader("Reader1", "RS232", "COM5:115200"); + +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + reader.setProtocol(ProtocolVersion.GRP); + reader.setReaderProtocol(ProtocolVersion.GRP); + reader.setPortSum(4); + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { + System.out.println("设备连接状态:" + b); + } + }); + + + if (reader.getIsConnected() == true) { + System.out.println("连接成功..."); + boolean a = reader.BuzzerControl(true, false); + System.out.println("**********************"); + System.out.println("1.查询功率 2.设置功率 3.盘点标签 4.查询GPI状态 5. 开门开灯"); + while (true) { + Scanner input = new Scanner(System.in); + System.out.println("请输入菜单编号:"); + int bh = input.nextInt(); + if (bh == 1) { + HashMap powerList = reader.reader_GetPowerList(); + for (Byte key : powerList.keySet()) { + System.out.println("端口:" + key + " 功率:" + powerList.get(key)); + } + } else if (bh == 2) { + HashMap map = new HashMap(); + System.out.println("输入需要修改的端口:"); + int k = input.nextInt(); + byte k1 = (byte) k; + System.out.println("输入需要修改的功率:"); + int v = input.nextByte(); + byte v1 = (byte) v; + map.put(k1, v1); + boolean set = reader.reader_SetPowerList(map); + System.out.println("功率修改成功"); + } else if (bh == 3) { + //添加标签读取回调 + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + param.tidParameter = new byte[]{0,8}; + boolean b = reader.reader_Inventory(param, (byte) 0x01); +// System.out.println("开始盘点:" + b); +// boolean b1 = reader.ScanUserData(0x01,true,2); + +// boolean b = reader.ScanEPC(0x01,true); + boolean b2 = reader.ScanTID(0x01,true,8); +// System.out.println("开始盘点:" + b1); +// reader.OnRxdGpiTriggerState + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getTID()); +// String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); +// String s2 = Util.convertByteArrayToHexString(tagData.getTID()); + System.out.println("1读取到EPC:" + s); +// System.out.println("用户区:"+s1); +// System.out.println("TID:"+s2); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 4) { + + // 查询GPI + HashMap gpiLis = reader.GetGpi(); + for (Byte key : gpiLis.keySet()) { + System.out.println("gpi " + key + " 电平:" + gpiLis.get(key)); + } + } else if (bh == 5) { + /** + * 设置单个GPIO参数 + */ + + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 0); + reader.reader_SetGpo(Gpomap); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + do { + HashMap gpiLis = reader.GetGpi(); + Byte I1 = 1; + Byte gpi1 = gpiLis.get(I1); + Byte I2 = 2; + Byte gpi2 = gpiLis.get(I2); + if (gpi1 == 0 && gpi2 == 0) { + //关灯 + HashMap Gpo2map = new HashMap<>(); + Gpo2map.put((byte) 2, (byte) 0); + reader.reader_SetGpo(Gpo2map); + + //添加标签读取回调' + + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + boolean b = reader.reader_Inventory(param, (byte) 0x00); + System.out.println("开始盘点:" + b); + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getEPC() != null) { + + String s = Util.convertByteArrayToHexString(tagData.getEPC()); + System.out.println("读取到EPC:" + s); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + break; + + } else { + System.out.println("查询GPI状态中"); + } + + } while (true); + + + } else { + System.out.println("设备未连接·"); + } + } else if (bh == 6) { + //开锁、开灯 + if (reader != null && reader.getIsConnected()) { + HashMap Gpomap = new HashMap<>(); + Gpomap.put((byte) 1, (byte) 1); + Gpomap.put((byte) 2, (byte) 1); + if (reader.reader_SetGpo(Gpomap)) { + System.out.println("设置成功"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Gpomap.put((byte) 1, (byte) 0); + } + }, 2000); + } else { + System.out.println("设置失败"); + } + } else { + System.out.println("设备未连接·"); + } + + } else if (bh == 7) { +// ScanTagParameter param = new ScanTagParameter(); +// param.antenna = 0x01; +// param.isLoop = true; +// //写标签测试,感应区一次只能写一个标签,如果没有扫瞄到标签,返回 -2;如果扫描到有多个标签,返回-1;如果参数不合法,返回-3;写入成功,返回 0 +// System.out.println("请输入需要写入的EPC:"); +// String Repc = input.next(); +// int i = reader.writeEPC(param, Repc); +// if (i == 0) { +// System.out.println("标签写入成功"); +// } else if (i == -1) { +// System.out.println("扫描到多张标签"); +// } else if (i == -2) { +// System.out.println("未扫描到标签"); +// } else { +// System.out.println("EPC输入不合格"); +// } +// try { +// Thread.sleep(1000 * 2); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + + } else if (bh == 8) { + // 读用户区 + boolean b = reader.ScanUserData(0x01, true, 2); + System.out.println(b); + + reader.OnTagDataReceivedHandle = (gateName, tagData) -> { + if (tagData != null && tagData.getUserData() != null) { + String s1 = Util.convertByteArrayToHexString(tagData.getUserData()); + System.out.println("用户区:" + s1); + } + }; + new Timer().schedule(new TimerTask() { + @Override + public void run() { + boolean stop = reader.reader_StopInventory(); + + System.out.println("停止盘点:" + stop); + + } + }, 2000); + + } else if (bh == 9) { + // 写用户区 + ScanTagParameter param = new ScanTagParameter(); + param.antenna = 0x01; + param.isLoop = true; + + int i = reader.writTagData(MemoryBank.UserMemory, param, "00001111"); + System.out.println("写入用户区:" + i); + } else if (bh == 10) { + // 查询盘点模式 + reader.getEpcBasebandParameter(); + + } else if (bh == 11) { + reader.getIsConnected(); + } + } + } else { + System.out.println("连接失败..."); + } + + + } + } diff --git a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java index c63c48d..9193fe7 100644 --- a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -16,7 +16,7 @@ import com.rfid.API.ProtocolVersion; import com.rfid.API.Util; import com.rfid.API.core.BaseReader; -import com.rfid.ui.GlobalData; +import com.rfid.API.entityclass.ScanTagParameter; import gnu.io.SerialPort; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -48,21 +48,41 @@ @Override public ReturnDTO> tIdNewReadList() { - // TODO: 2023/3/21 实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 - CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + //TCP连接方式(笔记本只有一个网口,内网还要连网线,该方案不可行),实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 +// CommonReader reader = new CommonReader("Reader1", GlobalData.ConnectType.TcpClient.name(), "192.168.1.201:9090"); + CommonReader reader = null; + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); try { -// CommonReader reader = new CommonReader("Reader1", "RS232", "COM20:115200"); -// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); - reader.setProtocol(ProtocolVersion.CRP); - reader.setReaderProtocol(ProtocolVersion.CRP); -// reader.setPortSum(4);//只对LRP的有效 - reader.connect(false, new BaseReader.IConnectListener() { - @Override - public void callback(boolean b) { -// log.info("大读写器设备连接状态:" + b); + List ports = serialPortUtil.findPort(); + log.info("RFID大读写器,当前可用串口:{}", ports); + if (CollectionUtils.isEmpty(ports)) { + return ReturnUtil.failed(BusinessExceptionEnum.NO_PROPERLY_CONNECTED.getMessage()); + } + for (String port : ports) { + //RS232连接方式 + CommonReader readerOne = new CommonReader("Reader1", "RS232", port + ":115200"); +// CommonReader readerOne = new CommonReader("Reader1", "RS232", port + "COM:115200"); +// CommonReader reader = new CommonReader("Reader1", "USB-HID", ""); + if (Objects.nonNull(readerOne)) { + reader = readerOne; + //RFID厂家最新协议采用GRP + reader.setProtocol(ProtocolVersion.GRP); + reader.setReaderProtocol(ProtocolVersion.GRP); + reader.setPortSum(4);//只对LRP的有效 + reader.connect(false, new BaseReader.IConnectListener() { + @Override + public void callback(boolean b) { + log.info("大读写器设备连接状态:" + b); + } + }); + if (reader.getIsConnected() == false) { + continue; + } + break; } - }); + } if (reader.getIsConnected() == true) { + boolean a = reader.BuzzerControl(true, false); Set tIds = receiveNewTIds(reader); if (CollectionUtils.isEmpty(tIds)) { return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); @@ -76,7 +96,9 @@ return ReturnUtil.failed(BusinessExceptionEnum.FAIL_READ_EPC_TID.getCode(), BusinessExceptionEnum.FAIL_READ_EPC_TID.getMessage()); } finally { //不断开连接,读写器会每秒发送心跳 -// reader.disconnect(); + if (Objects.nonNull(reader)) { + reader.disconnect(); + } } } @@ -219,13 +241,14 @@ private Set receiveNewTIds(CommonReader reader) throws InterruptedException { Set tIds = new HashSet<>(); // boolean a = reader.BuzzerControl(true, false);//蜂鸣器协议 -// ScanTagParameter param = new ScanTagParameter(); -// param.antenna = 0x0001; -// param.isLoop = true;//持续盘点 // boolean b = reader.reader_Inventory(param, (byte) 0x0001); //四个天线都开填0x0F,需要4个天线都连上才行 - boolean b1 = reader.ScanTID(readWriterConfig.getAntenna(), true, 1111); - log.info("大读写器开始盘点:" + b1); + ScanTagParameter param = new ScanTagParameter(); + param.antenna = readWriterConfig.getAntenna(); + param.isLoop = true; + param.tidParameter = new byte[]{0,8}; + boolean b = reader.reader_Inventory(param, (byte) 0x01); + log.info("大读写器开始盘点:" + b); reader.OnTagDataReceivedHandle = (gateName, tagData) -> { if (tagData != null && tagData.getTID() != null) { String tid = Util.convertByteArrayToHexString(tagData.getTID()); diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index 803f3d7..a5090db 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -11,7 +11,11 @@ casic: readwriter: - antenna: 0x0001 - readDuration: 3 - miniReadDuration: 3 +# 开启大读写器天线个数,0x01一个,0x0F全开,四个天线都开需要4个天线都连上才行 + antenna: 0x01 +# 大读写器读取时长(秒) + readDuration: 5 +# 小读写器读取时长(秒) + miniReadDuration: 5 +# 有线扫码枪监听器接收数据时长(秒) receiveDuration: 10 \ No newline at end of file