Browse Source

update

master
zhaohe 6 months ago
parent
commit
74deae6c18
  1. 6
      src/main/java/iflytop/app/controler/ws/AppEventWSEndpoint.java
  2. 11
      src/main/java/iflytop/app/controler/ws/AppStateWSEndpoint.java
  3. 15
      src/main/java/iflytop/app/driver/SubDeviceDriver.java
  4. 33
      src/main/java/iflytop/app/driver/channel/SubDeviceUartChannel.java
  5. 18
      src/main/java/iflytop/app/factory/TPMIPacketFactory.java
  6. 4
      src/main/java/iflytop/app/service/base/EventBusService.java
  7. 7
      src/main/java/iflytop/app/service/base/GstateService.java
  8. 2
      src/main/java/iflytop/app/service/base/UIStateControlService.java
  9. 7
      src/main/java/iflytop/app/service/base/WebSocketEndpointMgr.java
  10. 24
      src/main/java/iflytop/app/service/task/MeasurementTaskCtrlService.java
  11. 13
      src/main/java/iflytop/config/WebSocketConfiguration.java

6
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);
}

11
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);
}

15
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();
}
}
}

33
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();

18
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;

4
src/main/java/iflytop/app/service/base/AppEventBusService.java → src/main/java/iflytop/app/service/base/EventBusService.java

@ -17,8 +17,8 @@ import java.util.concurrent.LinkedBlockingQueue;
* 事件总线
*/
@Component
public class AppEventBusService implements ApplicationListener<ContextRefreshedEvent> {
public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class);
public class EventBusService implements ApplicationListener<ContextRefreshedEvent> {
public static final Logger logger = LoggerFactory.getLogger(EventBusService.class);
@FunctionalInterface
public interface AppEventListener {

7
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 {
}

2
src/main/java/iflytop/app/service/ui/UIStateControlService.java → src/main/java/iflytop/app/service/base/UIStateControlService.java

@ -1,4 +1,4 @@
package iflytop.app.service.ui;
package iflytop.app.service.base;
/**
*

7
src/main/java/iflytop/app/service/ui/AppWebSocketEndpointMgr.java → 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<Session> stateWebsocketSessions = new ArrayList<>();

24
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");
//下发测量指令
}
}

13
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();
}
}
Loading…
Cancel
Save