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<ArdChannel> 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<ArdChannel> getChannels(ArdCamera camera) {
|
//获取通道
|
List<ArdChannel> 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<Map<String, Object>> getCameraVideoLable(Long userId, CameraCmd cmd)throws ServiceException {
|
return null;
|
}
|
|
}
|