package com.ard.tianyu.service.impl; import com.ard.tianyu.config.TyConfiguration; import com.ard.tianyu.http.TyClient; import com.ard.tianyu.model.dto.BoxHistoryDTO; import com.ard.tianyu.model.dto.BoxPhotosDTO; import com.ard.tianyu.model.dto.BoxSettingsDTO; import com.ard.tianyu.model.receiver.*; import com.ard.tianyu.netty.command.BaseCommand; import com.ard.tianyu.netty.command.ControlAngleCommand; import com.ard.tianyu.netty.command.HeartbeatCommand; import com.ard.tianyu.netty.command.RegisterCommand; import com.ard.tianyu.netty.TyNettyTcpClient; import com.ard.tianyu.service.ITyService; import com.ard.vtdu.util.ArdTool; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.net.InetSocketAddress; import java.util.List; /** * TyServiceImpl * * @author liusuyi * @date 2024年10月22日8:37 **/ @Slf4j @Service public class TyServiceImpl implements ITyService { @Resource private TyClient tyClient; @Resource private TyConfiguration tyConfiguration; /** * 获取天宇token信息 * * @return */ @Override public AccessTokenReceiver getAccessToken() { return tyConfiguration.getAccessToken(); } /** * 获取云盒列表 * * @return */ @Override public List getBoxList() { //请求云盒列表 TyHttpCommonReceiver> boxListReveiver = tyClient.getBoxList(tyConfiguration.getAccessToken().convertFromDTO()); return boxListReveiver.getContent(); } /** * 获取直播地址 * * @return */ @Override public PullStreamUrlReceiver getBoxLiveUrl(String boxSn) { TyHttpCommonReceiver boxLiveUrl = tyClient.getBoxLiveUrl(boxSn, tyConfiguration.getAccessToken().convertFromDTO()); return boxLiveUrl.getContent(); } /** * 获取飞行历史 * * @return */ @Override public List getBoxHistory(BoxHistoryDTO boxHistoryDTO) { TyHttpCommonReceiver> boxHistory = tyClient.getBoxHistory(boxHistoryDTO, tyConfiguration.getAccessToken().convertFromDTO()); return boxHistory.getContent(); } /** * 获取盒子图片 * * @return */ @Override public List getBoxPhotos(BoxPhotosDTO boxPhotosDTO) { TyHttpCommonReceiver> boxPhotos = tyClient.getBoxPhotos(boxPhotosDTO, tyConfiguration.getAccessToken().convertFromDTO()); return boxPhotos.getContent(); } /** * 修改云盒设置 */ @Override public Boolean updateBoxSettings(BoxSettingsDTO boxSettingsDTO) { TyHttpCommonReceiver result = tyClient.updateBoxSettings(boxSettingsDTO, tyConfiguration.getAccessToken().convertFromDTO()); return result.getState() == 1; } /** * 注册天宇平台 */ @Override public void registerMessage() { AccessTokenReceiver tyToken = tyConfiguration.getAccessToken(); RegisterCommand registerMessage = new RegisterCommand(tyToken.getCompanyId(), tyToken.getAccessToken().getBytes()); this.sendMessage(tyConfiguration.getIpPort(), registerMessage); } /** * 发送消息 */ public boolean sendMessage(String key, BaseCommand msg) { //将从用户接收的信息发送到天宇 commandCache boolean cmdResult = false; try { ChannelFuture future = TyNettyTcpClient.channels.get(key).getFuture(); Channel channel = future.channel(); if (future != null && channel.isActive()) { InetSocketAddress ipSocket = (InetSocketAddress) channel.remoteAddress(); String host = ipSocket.getHostString(); int port = ipSocket.getPort(); // 创建 ByteBuf 并编码消息 ByteBuf buffer = Unpooled.buffer(); msg.encode(buffer); // 确保对消息进行编码 channel.writeAndFlush(buffer); // 发送编码后的数据 cmdResult = true; log.info("向天宇服务器" + host + ":" + port + "发送数据" + ",命令码:" + String.format("0x%02X", msg.getCmdCode() & 0xFF)); } else { log.error("与天宇服务器链接断开,无法发送数据!"); } } catch (Exception e) { log.info("Failed to publish the message. {}", "转发信息"); e.printStackTrace(); } finally { return cmdResult; } } @Override public void controlAngle(String boxSn) { ControlAngleCommand controlAngleCommand = new ControlAngleCommand(boxSn.getBytes(),(byte)0x00,(byte)0x00,(byte)0x05); this.sendMessage(tyConfiguration.getIpPort(), controlAngleCommand); } @Scheduled(fixedRate = 5000) public void sendHeartBeat() { long timestamp = System.currentTimeMillis(); log.info("定时向天宇发送⼼跳,时间戳{}", timestamp); HeartbeatCommand heartbeatMessage = new HeartbeatCommand(timestamp); this.sendMessage(tyConfiguration.getIpPort(), heartbeatMessage); } }