liusuyi
2025-03-22 fe63fd580c5b65fa398dfe1fdf44466b26c6aadd
优化
1 files added
4 files modified
2 files renamed
86 ■■■■■ changed files
ard-admin/src/main/resources/application-dev.yml 1 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/component/netty/NettyTcpClient.java 17 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/component/netty/TcpClientSession.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/component/netty/handler/ClientHandler.java 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/component/websocket/handler/TyMessageHandler.java 25 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/domain/enums/MessageType.java 29 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java 4 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application-dev.yml
@@ -43,6 +43,7 @@
 # 天宇tcp服务器地址
 tcpserver: 59.110.237.99
 tcpport: 8125
#流媒体配置
mediamtx:
  # 流媒体服务器地址
ard-work/src/main/java/com/ard/tianyu/component/netty/NettyTcpClient.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/component/netty/TyNettyTcpClient.java
@@ -21,9 +21,9 @@
@Component
@Slf4j
public class TyNettyTcpClient {
public class NettyTcpClient {
    public static Map<String, TyBoxSession> channels = new HashMap<>();
    public static Map<String, TcpClientSession> channels = new HashMap<>();
    EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
@@ -59,11 +59,11 @@
     */
    public void initConnection(String host, Integer port) {
        log.info("初始化连接天宇tcp服务器【{}:{}】", host, port);
        String currentBoxSn = "";
        log.info("初始化连接TCP服务器【{}:{}】", host, port);
        String clientId = "clientId_1";
        //判断是否已经存在连接,如果存在则关闭之前的连接
        if (channels.containsKey(host + ":" + port)) {
            currentBoxSn = channels.get(host + ":" + port).getSubBoxSn();
            clientId = channels.get(host + ":" + port).getClientId();
            channels.get(host + ":" + port).getChannelFuture().channel().close();
        }
@@ -71,12 +71,12 @@
        Bootstrap bootstrap = getBootstrap();
        ChannelFuture future = bootstrap.connect(host, port).addListener((ChannelFuture futureListener) -> {
            if (futureListener.isSuccess()) {
                log.info("连接天宇TCP服务器成功【{}:{}】", host, port);
                log.info("连接TCP服务器成功【{}:{}】", host, port);
                TyTcpServerCache.putTcpServerCache(host + ":" + port, true);
            } else {
                final EventLoop eventLoop = futureListener.channel().eventLoop();
                eventLoop.schedule(() -> {
                    log.info("连接天宇TCP服务器失败【{}:{}】,正尝试重连...", host, port);
                    log.info("连接TCP服务器失败【{}:{}】,正尝试重连...", host, port);
                    TyTcpServerCache.putTcpServerCache(host + ":" + port, false);
                    try {
                        initConnection(host, port);
@@ -87,7 +87,8 @@
            }
        });
        //将连接存入集合
        channels.put(host + ":" + port, TyBoxSession.builder().subBoxSn(currentBoxSn).channelFuture(future).isReConnect(!currentBoxSn.equals("")).build());
        channels.put(host + ":" + port,
                TcpClientSession.builder().ClientId(clientId).channelFuture(future).isReConnect(!clientId.isEmpty()).build());
    }
    //创建天宇连接
ard-work/src/main/java/com/ard/tianyu/component/netty/TcpClientSession.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/component/netty/TyBoxSession.java
@@ -10,9 +10,9 @@
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TyBoxSession {
public class TcpClientSession {
    public String subBoxSn;
    public String ClientId;
    public ChannelFuture channelFuture;
ard-work/src/main/java/com/ard/tianyu/component/netty/handler/ClientHandler.java
@@ -1,7 +1,7 @@
package com.ard.tianyu.component.netty.handler;
import com.ard.tianyu.domain.cache.TyTcpServerCache;
import com.ard.tianyu.component.netty.TyNettyTcpClient;
import com.ard.tianyu.component.netty.NettyTcpClient;
import com.ard.tianyu.component.netty.command.BaseCmd;
import com.ard.tianyu.service.ITyService;
import io.netty.channel.ChannelHandler;
@@ -25,7 +25,7 @@
    private ITyService tyService;
    @Resource
    private TyNettyTcpClient tyNettyTcpClient;
    private NettyTcpClient nettyTcpClient;
    @Override
    public void channelRead0(ChannelHandlerContext ctx, BaseCmd command) {
@@ -75,7 +75,7 @@
        ctx.channel().eventLoop().schedule(() -> {
            log.error("天宇服务端链接不上,开始重连操作...");
            try {
                tyNettyTcpClient.initConnection(host, port);
                nettyTcpClient.initConnection(host, port);
            } catch (Exception e) {
                log.error("天宇服务端连接异常: {}", e.getMessage());
            }
ard-work/src/main/java/com/ard/tianyu/component/websocket/handler/TyMessageHandler.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.ard.tianyu.component.websocket.WebSocketSessionManager;
import com.ard.tianyu.domain.enums.MessageType;
import com.ard.tianyu.domain.message.*;
import com.ard.tianyu.service.control.UavControlService;
import com.ard.tianyu.component.websocket.utils.WebSocketUtil;
@@ -12,6 +13,7 @@
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import javax.annotation.Resource;
@@ -33,34 +35,39 @@
    private UavControlManager uavControlManager;
    @Resource
    private UavAllManager uavAllManager;
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        try {
        String userIdStr = (String) session.getAttributes().get("userId");
        Long userId = Long.parseLong(userIdStr);
        String payload = message.getPayload();
        log.info("【cmd】Received message: {}", payload);
        log.info("【cmd】size: {}", WebSocketSessionManager.getOnlineUserCount());
        BaseMessage<?> baseMessage = JSON.parseObject(payload, BaseMessage.class);
        switch (baseMessage.getType()) {
            case "stream":
            MessageType messageType = MessageType.fromString(baseMessage.getType());
            switch (messageType) {
                case STREAM:
                handleStreamMessage(payload, userId);
                break;
            case "state":
                case STATE:
                handleStateMessage(payload, userId);
                break;
            case "telemetry":
                case TELEMETRY:
                handleTelemetryMessage(payload, userId);
                break;
            case "signal":
                case SIGNAL:
                handleSignalMessage(payload, userId);
                break;
            case "controller":
                case CONTROLLER:
                handleControlMessage(payload, userId);
                break;
            case "all":
                case ALL:
                handleAllMessage(payload, userId);
                break;
            }
        } catch (Exception e) {
            log.error("Error handling message: {}", message, e);
        }
    }
@@ -215,6 +222,7 @@
            }
        }
    }
    private void handleAllMessage(String payload, Long userId) {
        // 解析接收到的JSON消息,将其转换为BaseMessage对象
        BaseMessage<UavControlMessage> controlMessage = JSON.parseObject(payload,
@@ -238,6 +246,7 @@
            }
        }
    }
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        log.info("【cmd】Connected: {}", session.getId());
ard-work/src/main/java/com/ard/tianyu/domain/enums/MessageType.java
New file
@@ -0,0 +1,29 @@
package com.ard.tianyu.domain.enums;
public enum MessageType {
    STREAM("stream"),
    STATE("state"),
    TELEMETRY("telemetry"),
    SIGNAL("signal"),
    CONTROLLER("controller"),
    ALL("all");
    private final String type;
    MessageType(String type) {
        this.type = type;
    }
    public String getType() {
        return type;
    }
    public static MessageType fromString(String type) {
        for (MessageType messageType : MessageType.values()) {
            if (messageType.type.equalsIgnoreCase(type)) {
                return messageType;
            }
        }
        throw new IllegalArgumentException("Unknown message type: " + type);
    }
}
ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
@@ -34,7 +34,7 @@
import com.ard.tianyu.domain.dto.signal.SignalInfo;
import com.ard.tianyu.domain.dto.state.UavState;
import com.ard.tianyu.domain.dto.telemetry.TelemetryData;
import com.ard.tianyu.component.netty.TyNettyTcpClient;
import com.ard.tianyu.component.netty.NettyTcpClient;
import com.ard.tianyu.component.netty.command.control.AbsAngleControlCmd;
import com.ard.tianyu.component.netty.command.control.AngleControlCmd;
import com.ard.tianyu.component.netty.command.control.SpeedControlCmd;
@@ -827,7 +827,7 @@
     */
    private void sendMessage(String key, BaseCmd msg) {
        try {
            ChannelFuture future = TyNettyTcpClient.channels.get(key).getChannelFuture();
            ChannelFuture future = NettyTcpClient.channels.get(key).getChannelFuture();
            Channel channel = future.channel();
            if (channel.isActive()) {
                InetSocketAddress ipSocket = (InetSocketAddress) channel.remoteAddress();