diff --git a/src/main/java/iflytop/app/controler/ws/AppEventWSEndpoint.java b/src/main/java/iflytop/app/controler/ws/AppEventWSEndpoint.java index 76c1b78..fc1a5ad 100644 --- a/src/main/java/iflytop/app/controler/ws/AppEventWSEndpoint.java +++ b/src/main/java/iflytop/app/controler/ws/AppEventWSEndpoint.java @@ -1,6 +1,6 @@ package iflytop.app.controler.ws; -import iflytop.app.service.ui.AppWebSocketEndpointMgr; +import iflytop.app.service.base.WebSocketEndpointMgr; import iflytop.app.utils.SpringBootBeanUtil; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; @@ -27,14 +27,14 @@ public class AppEventWSEndpoint { public void onOpen(Session session, EndpointConfig endpointConfig) { // 保存 session 到对象 this.session = session; - SpringBootBeanUtil.getBean(AppWebSocketEndpointMgr.class).pushEventWebsocketSession(session); + SpringBootBeanUtil.getBean(WebSocketEndpointMgr.class).pushEventWebsocketSession(session); log.info("[websocket] 新的连接:id={}", this.session.getId()); } // 连接关闭 @OnClose public void onClose(CloseReason closeReason) { - SpringBootBeanUtil.getBean(AppWebSocketEndpointMgr.class).removeEventWebsocketSession(this.session); + SpringBootBeanUtil.getBean(WebSocketEndpointMgr.class).removeEventWebsocketSession(this.session); log.info("[websocket] 连接断开:id={},reason={}", this.session.getId(), closeReason); } diff --git a/src/main/java/iflytop/app/controler/ws/AppStateWSEndpoint.java b/src/main/java/iflytop/app/controler/ws/AppStateWSEndpoint.java index e1ed75c..a5fbe99 100644 --- a/src/main/java/iflytop/app/controler/ws/AppStateWSEndpoint.java +++ b/src/main/java/iflytop/app/controler/ws/AppStateWSEndpoint.java @@ -1,6 +1,6 @@ package iflytop.app.controler.ws; -import iflytop.app.service.ui.AppWebSocketEndpointMgr; +import iflytop.app.service.base.WebSocketEndpointMgr; import iflytop.app.utils.SpringBootBeanUtil; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; @@ -13,11 +13,8 @@ import java.io.IOException; @Slf4j @Component public class AppStateWSEndpoint { - private Session session; - - // 收到消息 @OnMessage public void onMessage(String message) throws IOException { @@ -29,14 +26,14 @@ public class AppStateWSEndpoint { public void onOpen(Session session, EndpointConfig endpointConfig) { // 保存 session 到对象 this.session = session; - SpringBootBeanUtil.getBean(AppWebSocketEndpointMgr.class).pushStateWebsocketSession(session); - log.info("[websocket] 新的连接:id={}", this.session.getId()); + SpringBootBeanUtil.getBean(WebSocketEndpointMgr.class).pushStateWebsocketSession(session); + log.info("{} [websocket] 新的连接:id={}", this,this.session.getId()); } // 连接关闭 @OnClose public void onClose(CloseReason closeReason) { - SpringBootBeanUtil.getBean(AppWebSocketEndpointMgr.class).removeStateWebsocketSession(this.session); + SpringBootBeanUtil.getBean(WebSocketEndpointMgr.class).removeStateWebsocketSession(this.session); log.info("[websocket] 连接断开:id={},reason={}", this.session.getId(), closeReason); } diff --git a/src/main/java/iflytop/app/driver/SubDeviceDriver.java b/src/main/java/iflytop/app/driver/SubDeviceDriver.java index 10e97c3..8360404 100644 --- a/src/main/java/iflytop/app/driver/SubDeviceDriver.java +++ b/src/main/java/iflytop/app/driver/SubDeviceDriver.java @@ -7,6 +7,7 @@ import iflytop.app.type.SubDeviceChannel; import iflytop.app.type.exception.AppException; import iflytop.app.type.protocol.TPMIPacket; import jakarta.annotation.Resource; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component @@ -39,7 +40,7 @@ public class SubDeviceDriver { public TPMIStatus getStatus() { var status = new TPMIStatus(); - if (subDeviceUartChannel.getSubDeviceState().isConnect) { + if (subDeviceUartChannel.isConnected()) { status.status = SubDeviceChannel.UART_CHANNEL; status.state = subDeviceUartChannel.getSubDeviceState(); status.connected = true; @@ -55,6 +56,10 @@ public class SubDeviceDriver { } } + public Boolean isConnected() { + return subDeviceUartChannel.isConnected() || subDeviceBleChannel.isConnected(); + } + public boolean ping() { var packet = TPMIPacketFactory.buildCommand(TPMIPacket.Command.PING); @@ -99,6 +104,7 @@ public class SubDeviceDriver { txPacket(packet, 10); } + // // PRIVATE // @@ -108,4 +114,11 @@ public class SubDeviceDriver { } return subDeviceUartChannel.sendPacket(packet, overtime); } + + @Scheduled(fixedDelay = 10000) + void pingSubDevice() { + if (isConnected()) { + ping(); + } + } } diff --git a/src/main/java/iflytop/app/driver/channel/SubDeviceUartChannel.java b/src/main/java/iflytop/app/driver/channel/SubDeviceUartChannel.java index 9c78146..e94614b 100644 --- a/src/main/java/iflytop/app/driver/channel/SubDeviceUartChannel.java +++ b/src/main/java/iflytop/app/driver/channel/SubDeviceUartChannel.java @@ -169,7 +169,6 @@ public class SubDeviceUartChannel { byte[] newData = new byte[clientPort.bytesAvailable()]; int numRead = clientPort.readBytes(newData, newData.length); rxBuffer.push(newData, numRead); - dumpRawRx(newData, numRead); } else if (serialPortEvent.getEventType() == SerialPort.LISTENING_EVENT_PORT_DISCONNECTED) { log.warn("serialEvent: port disconnected"); closeCom(); @@ -209,6 +208,10 @@ public class SubDeviceUartChannel { return state; } + synchronized public Boolean isConnected() { + return client != null && client.isOpen(); + } + synchronized public TPMIPacket sendPacket(TPMIPacket tx, Integer overtime) throws AppException { return sendPacket(client, tx, overtime); } @@ -233,7 +236,14 @@ public class SubDeviceUartChannel { ctCxt.newCtCxt(tx); serialPort.writeBytes(tx.rawpacket, tx.rawpacket.length); - log.info("TX PACKET: {}", ZByteUtils.bytesToHexString(tx.rawpacket, tx.rawpacket.length)); + + + if (tx.getCommand().equals(TPMIPacket.Command.PING)) { + log.debug("TX PACKET: {}", ZByteUtils.bytesToHexString(tx.rawpacket, tx.rawpacket.length)); + } else { + log.info("TX PACKET: {}", ZByteUtils.bytesToHexString(tx.rawpacket, tx.rawpacket.length)); + } + try { ctCxt.waitCxt(overtime); @@ -292,7 +302,7 @@ public class SubDeviceUartChannel { byte[] rxbuf = new byte[1024]; //RX VAL int rxlen = serialPort.readBytes(rxbuf, rxbuf.length); - dumpRawRx(rxbuf, rxlen); + log.info("RX RAW: {} ({})", ZByteUtils.bytesToHexString(rxbuf, rxlen), rxlen); //Return packet return TPMIPacketFactory.parseRawRxPacketToResponse(rxbuf, rxlen); @@ -304,10 +314,6 @@ public class SubDeviceUartChannel { log.info("TX RAW: {}", packet); } - static private void dumpRawRx(byte[] packet, int len) { - log.debug("RX RAW: {} ({})", ZByteUtils.bytesToHexString(packet, len), len); - } - private void processUartRxData() { rxBuffer.waitData(); //block @@ -321,10 +327,21 @@ public class SubDeviceUartChannel { byte[] processbuf = rxBuffer.cpy(); int offset = 0; + log.debug("PARSE RX: {} ({})", ZByteUtils.bytesToHexString(processbuf, processbuf.length), processbuf.length); + for (offset = 0; offset < processbuf.length; ) { var report = TPMIPacketFactory.analysisRawRxData(processbuf, processbuf.length, offset); if (report.result.equals(TPMIPacketFactory.PacketAnalysisResult.SUC)) { - log.info("RX PACKET: {}", report.packet); + var rxpacket = report.packet; + if (rxpacket.getCommand() != null) { + if (rxpacket.getCommand().equals(TPMIPacket.Command.PING)) { + log.debug("RX PACKET: {}", rxpacket); + } else { + log.info("RX PACKET: {}", rxpacket); + } + } else { + log.warn("RX UNKOWN COMMAND PACKET: {}", rxpacket); + } offset += report.packet.getPacketLen(); processRXPacket(report.packet); lastRxPacketTime = System.currentTimeMillis(); diff --git a/src/main/java/iflytop/app/factory/TPMIPacketFactory.java b/src/main/java/iflytop/app/factory/TPMIPacketFactory.java index cdcd54e..e77baab 100644 --- a/src/main/java/iflytop/app/factory/TPMIPacketFactory.java +++ b/src/main/java/iflytop/app/factory/TPMIPacketFactory.java @@ -111,7 +111,7 @@ public class TPMIPacketFactory { rawpacket[TPMIPacket.P_LEN_OFF] = (byte) (data.length + TPMIPacket.FIX_PACKET_LEN); rawpacket[TPMIPacket.P_INDEX_OFF] = rx.getIndex(); rawpacket[TPMIPacket.P_TYPE_OFF] = (byte) TPMIPacket.PacketType.RESPONSE.ordinal(); - rawpacket[TPMIPacket.P_CMD_OFF] = (byte) rx.getCommand().ordinal(); + rawpacket[TPMIPacket.P_CMD_OFF] = (byte) rx.getCommand().getIndex(); rawpacket[TPMIPacket.P_DATA_TYPE_OFF] = (byte) dataType.ordinal(); System.arraycopy(data, 0, rawpacket, TPMIPacket.P_DATA_OFF, data.length); rawpacket[rawpacket.length - 1] = TPMIPacket.P_TAIL; @@ -193,20 +193,12 @@ public class TPMIPacketFactory { } - /** - * 解析接收到的数据包,并构造成SubDevicePacket, - * @param rawpacket 接收到的数据包,包含多个数据包时,返回第一个数据包 - * @param length 数据包长度 - * @return 第一个数据包 - */ synchronized static public TPMIPacket parseRawRxPacketToResponse(byte[] rawpacket, int length) { // SubDevicePacketUtils - for (int i = 0; i < length; i++) { - if (isValidatePacket(rawpacket, length, i).equals(PacketAnalysisResult.SUC)) { - var newPacket = new TPMIPacket(rawpacket); - if (newPacket.getPacketType().equals(TPMIPacket.PacketType.RESPONSE)) { - return newPacket; - } + if (isValidatePacket(rawpacket, length, 0).equals(PacketAnalysisResult.SUC)) { + var newPacket = new TPMIPacket(rawpacket, 0, length); + if (newPacket.getPacketType().equals(TPMIPacket.PacketType.RESPONSE)) { + return newPacket; } } return null; diff --git a/src/main/java/iflytop/app/service/base/AppEventBusService.java b/src/main/java/iflytop/app/service/base/EventBusService.java similarity index 91% rename from src/main/java/iflytop/app/service/base/AppEventBusService.java rename to src/main/java/iflytop/app/service/base/EventBusService.java index 181fc9f..e83f595 100644 --- a/src/main/java/iflytop/app/service/base/AppEventBusService.java +++ b/src/main/java/iflytop/app/service/base/EventBusService.java @@ -17,8 +17,8 @@ import java.util.concurrent.LinkedBlockingQueue; * 事件总线 */ @Component -public class AppEventBusService implements ApplicationListener { - public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class); +public class EventBusService implements ApplicationListener { + public static final Logger logger = LoggerFactory.getLogger(EventBusService.class); @FunctionalInterface public interface AppEventListener { diff --git a/src/main/java/iflytop/app/service/base/GstateService.java b/src/main/java/iflytop/app/service/base/GstateService.java new file mode 100644 index 0000000..0a7097c --- /dev/null +++ b/src/main/java/iflytop/app/service/base/GstateService.java @@ -0,0 +1,7 @@ +package iflytop.app.service.base; + +import org.springframework.stereotype.Component; + +@Component +public class GstateService { +} diff --git a/src/main/java/iflytop/app/service/ui/UIStateControlService.java b/src/main/java/iflytop/app/service/base/UIStateControlService.java similarity index 82% rename from src/main/java/iflytop/app/service/ui/UIStateControlService.java rename to src/main/java/iflytop/app/service/base/UIStateControlService.java index 860e572..5bd054c 100644 --- a/src/main/java/iflytop/app/service/ui/UIStateControlService.java +++ b/src/main/java/iflytop/app/service/base/UIStateControlService.java @@ -1,4 +1,4 @@ -package iflytop.app.service.ui; +package iflytop.app.service.base; /** * diff --git a/src/main/java/iflytop/app/service/ui/AppWebSocketEndpointMgr.java b/src/main/java/iflytop/app/service/base/WebSocketEndpointMgr.java similarity index 93% rename from src/main/java/iflytop/app/service/ui/AppWebSocketEndpointMgr.java rename to src/main/java/iflytop/app/service/base/WebSocketEndpointMgr.java index 3d5583b..c93a933 100644 --- a/src/main/java/iflytop/app/service/ui/AppWebSocketEndpointMgr.java +++ b/src/main/java/iflytop/app/service/base/WebSocketEndpointMgr.java @@ -1,6 +1,5 @@ -package iflytop.app.service.ui; +package iflytop.app.service.base; -import iflytop.app.service.base.AppEventBusService; import iflytop.app.utils.ZJsonHelper; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -20,7 +19,7 @@ import java.util.List; @Component @EnableScheduling @Slf4j -public class AppWebSocketEndpointMgr { +public class WebSocketEndpointMgr { public static class Report { public String messageType = "Report"; @@ -35,7 +34,7 @@ public class AppWebSocketEndpointMgr { } @Resource - AppEventBusService appEventBusService; + EventBusService eventBusService; List stateWebsocketSessions = new ArrayList<>(); diff --git a/src/main/java/iflytop/app/service/task/MeasurementTaskCtrlService.java b/src/main/java/iflytop/app/service/task/MeasurementTaskCtrlService.java index c868bfb..c9b7450 100644 --- a/src/main/java/iflytop/app/service/task/MeasurementTaskCtrlService.java +++ b/src/main/java/iflytop/app/service/task/MeasurementTaskCtrlService.java @@ -20,5 +20,29 @@ public class MeasurementTaskCtrlService { // reMeasure // + // + // + // + // + // 最终目的:出报告 + // + // 1. 建立链接(其他服务负责)? + // 2. -->开始测量(session)此时传过来一些模型,测量的数据,等数据 + // 3. <--右侧数据开始上报 + // 4. <--数据上报 + // 5. <--右侧数据上报结束 + // 6. <--左侧数据开始上报 + // 7. <--数据上报 + // 8. <--左侧数据上报结束 + // + // 10 ---> 分析数据(返回报告) + // 11 ---> 保存报告() + // + // + + public void startMeasurementTask() { + log.info("startMeasurementTask"); + //下发测量指令 + } } diff --git a/src/main/java/iflytop/config/WebSocketConfiguration.java b/src/main/java/iflytop/config/WebSocketConfiguration.java new file mode 100644 index 0000000..adf7d41 --- /dev/null +++ b/src/main/java/iflytop/config/WebSocketConfiguration.java @@ -0,0 +1,13 @@ +package iflytop.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfiguration { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +}