package com.ard.work.sdk.fjr.service; import com.ard.common.core.exception.ServiceException; import com.ard.work.api.domian.*; import com.ard.work.device.camera.domain.PtzParamDTO; import com.ard.work.event.LoginEvent; import com.ard.work.sdk.fjr.netty.FjrNettyClient; import com.ard.work.sdk.fjr.netty.ThermalCommand; import com.ard.work.sdk.model.DeviceCFG; import com.ard.work.sdk.model.PtzScope; import com.ard.work.sdk.service.CameraSDK; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 类描述:富吉瑞机芯SDK * * @author lsy * @since 2026/3/11 7:55 */ @Service("fjrSDK") @Slf4j public class FjrSDK implements CameraSDK { @Resource private ApplicationEventPublisher eventPublisher; @Resource private FjrNettyClient nettyClient; @Override public void login(ArdCamera camera) { try { // 3. 建立连接 boolean success = nettyClient.connect(camera); if (success) { // 登录成功处理 handleLoginSuccess(camera); } else { handleLoginFail(camera); } // 发布登录事件 eventPublisher.publishEvent(new LoginEvent(camera)); } catch (Exception e) { camera.setLoginId(-1L); log.error("登录失败: {}", e.getMessage()); } } /** * 登录失败处理 */ private void handleLoginFail(ArdCamera camera) { camera.setChanNum(0); camera.setLoginId(-1L); camera.setState("0"); log.warn("设备[{}:{}]登录失败", camera.getIp(), camera.getPort()); } /** * 登录成功处理 */ private void handleLoginSuccess(ArdCamera camera) { Long loginId = System.currentTimeMillis(); // 更新设备信息 camera.setLoginId(loginId); camera.setState("1"); camera.setChanNum(1); // 获取最新通道 List channels = getChannels(camera); if (!channels.isEmpty()) { camera.setChannelList(channels); } // 登录成功 log.info("设备登录成功 [{}:{}]", camera.getIp(), camera.getPort()); } @Override public void logout(String cameraId) { try { nettyClient.disconnect(cameraId); } catch (Exception e) { log.error("【{}】注销异常", cameraId, e); } } @Override public Boolean isOnLine(CameraCmd cmd) { return true; } @Override public Boolean pTZControl(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer speed = cmd.getSpeed(); // 1. 先判断是否是“停止”动作 // 如果 isEnable 为 false,说明按钮松开了,必须发送停止指令 if (!cmd.isEnable()) { ThermalCommand stopCmd = ThermalCommand.createFocusStopCmd(cameraId); nettyClient.send(cameraId, stopCmd); if (cmd.getCode() == 10 || cmd.getCode() == 11) { // 2. 延迟 300ms 发送自动调焦 ThermalCommand autoFocusCmd = ThermalCommand.createAutoFocusCmd(cameraId); nettyClient.sendDelay(cameraId, autoFocusCmd, 1000); } return true; } // 1. 创建一个统一速度指令 ThermalCommand uniformSpeedCmd = ThermalCommand.createUniformSpeedCmd(cameraId, speed); nettyClient.send(cameraId, uniformSpeedCmd); // 2. 如果是“开始”动作 (isEnable == true),再判断方向 switch (cmd.getCode()) { case 10: // 变倍+ ThermalCommand zoomPlus = ThermalCommand.createZoomCmd(cameraId, true); nettyClient.send(cameraId, zoomPlus); break; case 11: // 变倍- ThermalCommand zoomMinus = ThermalCommand.createZoomCmd(cameraId, false); nettyClient.send(cameraId, zoomMinus); break; case 12: // 调焦- // 这里假设你的 createFocusCmd 接受 boolean,true代表+,false代表- ThermalCommand cmdMinus = ThermalCommand.createFocusCmd(cameraId, false); nettyClient.send(cameraId, cmdMinus); break; case 13: // 调焦+ ThermalCommand cmdPlus = ThermalCommand.createFocusCmd(cameraId, true); nettyClient.send(cameraId, cmdPlus); break; default: System.err.println("未知的指令码: " + cmd.getCode()); return false; } return true; } @Override public Boolean setFocusPos(CameraCmd cmd) { return true; } @Override public Integer getFocusPos(CameraCmd cmd) { return 0; } @Override public Boolean setPreset(CameraCmd cmd) { return true; } @Override public Boolean gotoPreset(CameraCmd cmd) { return true; } @Override public VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd) { return null; } @Override public Boolean controlDefog(CameraCmd cmd) { return true; } @Override public Boolean isEnableDefog(CameraCmd cmd) { return true; } @Override public Boolean controlInfrared(CameraCmd cmd) { return true; } @Override public Boolean isEnableInfrared(CameraCmd cmd) { return true; } @Override public Boolean controlFocusMode(CameraCmd cmd) { return true; } @Override public Boolean getFocusMode(CameraCmd cmd) { return true; } @Override public Boolean controlPTHeater(CameraCmd cmd) { return true; } @Override public Boolean controlCameraDeicing(CameraCmd cmd) { return true; } @Override public Boolean getPTZLockInfo(CameraCmd cmd) { return true; } @Override public Boolean setPTZLockInfo(CameraCmd cmd) { return true; } @Override public byte[] localCapture(CameraCmd cmd) { return new byte[0]; } @Override public String picCutCate(CameraCmd cmd) { return ""; } @Override public String picCutCate(CameraCmd cmd, String bucketName, String objectName) { return ""; } @Override public PtzDto getPtz(CameraCmd cmd) { return null; } @Override public PtzDto getPtzHigh(CameraCmd cmd) { return null; } @Override public PtzScope getPtzScope(CameraCmd cmd) { return null; } @Override public Boolean setPtz(CameraCmd cmd) { return true; } @Override public Boolean setPtzHigh(CameraCmd cmd) { return true; } @Override public Boolean setPtzHighT(CameraCmd cmd) { return true; } @Override public Boolean setZeroPtz(CameraCmd cmd) { return true; } @Override public String record(CameraCmd cmd) { return ""; } @Override public Boolean guideTargetPosition(CameraCmd cmd) { return true; } @Override public Boolean recordStart(CameraCmd cmd) { return true; } @Override public String recordStop(CameraCmd cmd) { return ""; } @Override public PtzParamDTO getGisInfo(CameraCmd cmd) { return null; } @Override public Double correctPitch(CameraCmd cmd) { return 0.0; } @Override public List getChannels(ArdCamera camera) { //获取通道 List channelList = new ArrayList<>(); try { ArdChannel ardChannel = new ArdChannel(); ardChannel.setName("热红外"); ardChannel.setChanNo(2); ardChannel.setDeviceId(camera.getId()); ardChannel.setVideoCode("h264"); String rtspUrl = String.format("rtsp://%s:%s@%s:%d/h264/ch%d/main/av_stream", camera.getUsername(), camera.getPassword(), camera.getIp(), camera.getRtspPort(), 2 ); ardChannel.setLiveAddress(rtspUrl); channelList.add(ardChannel); } catch (Exception ex) { log.error("获取IP通道异常:{}", ex.getMessage(), ex); } return channelList; } @Override public Boolean set3DPosition(CameraCmd cmd) { return null; } @Override public DeviceCFG getSystemInfo(CameraCmd cmd) { return null; } @Override public List> getCameraVideoLable(Long userId, CameraCmd cmd)throws ServiceException { return null; } }