diff --git a/pom.xml b/pom.xml index 9f4d69f..2562722 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ 1.0 + + org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + com.gg.reader diff --git a/pom.xml b/pom.xml index 9f4d69f..2562722 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ 1.0 + + org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + com.gg.reader diff --git a/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/pom.xml b/pom.xml index 9f4d69f..2562722 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ 1.0 + + org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + com.gg.reader diff --git a/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index 8617f24..8a5724f 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -142,35 +142,20 @@ 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 - + boolean b = reader.reader_Inventory(param, (byte) 0x00); 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); + System.out.println("1读取到TID:" + s); } }; new Timer().schedule(new TimerTask() { @Override public void run() { boolean stop = reader.reader_StopInventory(); - System.out.println("停止盘点:" + stop); - } - }, 2000); + }, 5000); } else if (bh == 4) { diff --git a/pom.xml b/pom.xml index 9f4d69f..2562722 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ 1.0 + + org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + com.gg.reader diff --git a/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index 8617f24..8a5724f 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -142,35 +142,20 @@ 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 - + boolean b = reader.reader_Inventory(param, (byte) 0x00); 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); + System.out.println("1读取到TID:" + s); } }; new Timer().schedule(new TimerTask() { @Override public void run() { boolean stop = reader.reader_StopInventory(); - System.out.println("停止盘点:" + stop); - } - }, 2000); + }, 5000); } else if (bh == 4) { 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 41807cb..172becf 100644 --- a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -7,6 +7,7 @@ import com.casic.missiles.model.ReturnUtil; import com.casic.missiles.service.IBusinessReadWriterService; import com.casic.missiles.utils.SerialPortUtil; +import com.casic.missiles.utils.WebSocket; import com.gg.reader.api.dal.GClient; import com.gg.reader.api.dal.HandlerTagEpcLog; import com.gg.reader.api.dal.HandlerTagEpcOver; @@ -34,12 +35,14 @@ * @Date: 2023/6/15 16:03 */ @Slf4j -@Service +@Service("readWriterServiceBean") public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { @Autowired private ForkJoinPool forkJoinPool; @Autowired private ReadWriterConfig readWriterConfig; + @Autowired + private WebSocket webSocket; public static SerialPort serialPort = null; @@ -267,12 +270,13 @@ param.tidParameter = new byte[]{0, 8}; param.writePower = readWriterConfig.getWritePower(); param.readPower = readWriterConfig.getReadPower(); - boolean b = reader.reader_Inventory(param, (byte) 0x01); + boolean b = reader.reader_Inventory(param, (byte) 0x00); log.info("大读写器开始盘点:" + b); reader.OnTagDataReceivedHandle = (gateName, tagData) -> { if (tagData != null && tagData.getTID() != null) { String tid = Util.convertByteArrayToHexString(tagData.getTID()); log.info("大读写器TID标签读取成功"); + webSocket.sendAllMessage(tid); tIds.add(tid); } }; diff --git a/pom.xml b/pom.xml index 9f4d69f..2562722 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ 1.0 + + org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + com.gg.reader diff --git a/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java index 8617f24..8a5724f 100644 --- a/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java +++ b/src/main/java/com/casic/missiles/cotroller/BusinessReadWriterController.java @@ -142,35 +142,20 @@ 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 - + boolean b = reader.reader_Inventory(param, (byte) 0x00); 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); + System.out.println("1读取到TID:" + s); } }; new Timer().schedule(new TimerTask() { @Override public void run() { boolean stop = reader.reader_StopInventory(); - System.out.println("停止盘点:" + stop); - } - }, 2000); + }, 5000); } else if (bh == 4) { 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 41807cb..172becf 100644 --- a/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java +++ b/src/main/java/com/casic/missiles/service/impl/BusinessReadWriterServiceImpl.java @@ -7,6 +7,7 @@ import com.casic.missiles.model.ReturnUtil; import com.casic.missiles.service.IBusinessReadWriterService; import com.casic.missiles.utils.SerialPortUtil; +import com.casic.missiles.utils.WebSocket; import com.gg.reader.api.dal.GClient; import com.gg.reader.api.dal.HandlerTagEpcLog; import com.gg.reader.api.dal.HandlerTagEpcOver; @@ -34,12 +35,14 @@ * @Date: 2023/6/15 16:03 */ @Slf4j -@Service +@Service("readWriterServiceBean") public class BusinessReadWriterServiceImpl implements IBusinessReadWriterService { @Autowired private ForkJoinPool forkJoinPool; @Autowired private ReadWriterConfig readWriterConfig; + @Autowired + private WebSocket webSocket; public static SerialPort serialPort = null; @@ -267,12 +270,13 @@ param.tidParameter = new byte[]{0, 8}; param.writePower = readWriterConfig.getWritePower(); param.readPower = readWriterConfig.getReadPower(); - boolean b = reader.reader_Inventory(param, (byte) 0x01); + boolean b = reader.reader_Inventory(param, (byte) 0x00); log.info("大读写器开始盘点:" + b); reader.OnTagDataReceivedHandle = (gateName, tagData) -> { if (tagData != null && tagData.getTID() != null) { String tid = Util.convertByteArrayToHexString(tagData.getTID()); log.info("大读写器TID标签读取成功"); + webSocket.sendAllMessage(tid); tIds.add(tid); } }; diff --git a/src/main/java/com/casic/missiles/utils/WebSocket.java b/src/main/java/com/casic/missiles/utils/WebSocket.java new file mode 100644 index 0000000..7a4fef0 --- /dev/null +++ b/src/main/java/com/casic/missiles/utils/WebSocket.java @@ -0,0 +1,104 @@ +package com.casic.missiles.utils; + +import com.casic.missiles.service.IBusinessReadWriterService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ExecutionException; + +/** + * @Description: Websocket ServerEndpoint + * @Author: wangpeng + * @Date: 2023/2/23 11:48 + */ +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap<>(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) throws ExecutionException, InterruptedException { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("websocket receive connect size:" + webSockets.size()); + IBusinessReadWriterService readWriterService = SpringContextUtil.getBean("readWriterServiceBean"); + readWriterService.tIdAndMiniAndGunReadList(); +// System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("【websocket消息】连接断开,总数为:" + webSockets.size()); +// System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("【websocket消息】收到客户端消息:" + message); +// System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { + log.info("【websocket消息】广播消息:" + message); +// System.out.println("【websocket消息】广播消息:" + message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】广播消息发送异常"); + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message) { + log.info("【websocket消息】列表消息:" + message); +// System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】列表消息发送异常"); + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("【websocket消息】单点消息:" + message); +// System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】单点消息发送异常"); + e.printStackTrace(); + } + } + } + +}