package com.ruoyi.utils.sdk.hiksdk.lib;
|
|
import com.ruoyi.alarm.global.domain.GuidePriorityQueue;
|
import com.ruoyi.alarm.global.domain.GuideTask;
|
import com.ruoyi.common.utils.spring.SpringUtils;
|
import com.ruoyi.common.utils.uuid.IdUtils;
|
import com.ruoyi.device.camera.domain.ArdCameras;
|
import com.ruoyi.device.camera.service.IArdCamerasService;
|
import com.ruoyi.device.channel.domain.ArdChannel;
|
import com.ruoyi.device.channel.service.IArdChannelService;
|
import com.ruoyi.utils.sdk.common.GlobalVariable;
|
import com.ruoyi.media.domain.Vtdu;
|
import com.ruoyi.media.service.IVtduService;
|
import com.ruoyi.utils.sdk.hiksdk.service.impl.HikvisionSDK;
|
import com.sun.jna.Pointer;
|
import lombok.extern.slf4j.Slf4j;
|
import java.util.Comparator;
|
import java.util.List;
|
import java.util.concurrent.PriorityBlockingQueue;
|
|
/**
|
* @Description: 异步登录回调
|
* @ClassName: FLoginResultCallBack
|
* @Author: 刘苏义
|
* @Date: 2023年06月12日13:34
|
* @Version: 1.0
|
**/
|
@Slf4j(topic = "hikSdk")
|
public class LoginResultCallBack implements HCNetSDK.FLoginResultCallBack {
|
|
private ArdCameras camera;
|
|
public LoginResultCallBack(ArdCameras camera) {
|
this.camera = camera;
|
}
|
|
@Override
|
public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) {
|
IVtduService vtduService = SpringUtils.getBean(IVtduService.class);
|
IArdChannelService ardChannelService = SpringUtils.getBean(IArdChannelService.class);
|
HikvisionSDK hikClientService = SpringUtils.getBean(HikvisionSDK.class);
|
IArdCamerasService ardCamerasService = SpringUtils.getBean(IArdCamerasService.class);
|
if (GlobalVariable.loginMap.containsKey(camera.getId())) {
|
GlobalVariable.loginMap.remove(camera.getId());
|
}
|
//删除管理通道
|
ardChannelService.deleteArdChannelByDeviceId(camera.getId());
|
if (dwResult == 1) {
|
GlobalVariable.loginMap.put(camera.getId(), lUserID);
|
log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功");
|
camera.setLoginId(lUserID);
|
camera.setState("1");
|
camera.setChanNum((int) lpDeviceinfo.byChanNum);
|
camera.setStartDChan((int) lpDeviceinfo.byStartDChan);
|
//获取最新通道
|
List<ArdChannel> cameraChannelList = hikClientService.getChannels(camera);
|
if (cameraChannelList.size() > 0) {
|
camera.setChanNum(cameraChannelList.size());
|
//添加通道
|
for (ArdChannel channel : cameraChannelList) {
|
channel.setId(IdUtils.simpleUUID());
|
ardChannelService.insertArdChannel(channel);
|
}
|
//配置到流媒体
|
for (ArdChannel channel : cameraChannelList) {
|
String name = camera.getId() + "_" + channel.getChanNo();
|
String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
|
Vtdu vtdu = vtduService.selectVtduByName(name);
|
if (vtdu != null) {
|
vtduService.deleteVtduByName(name);
|
}
|
//添加到流媒体
|
vtdu = new Vtdu();
|
vtdu.setRtspSource(rtspSource);
|
vtdu.setName(camera.getId() + "_" + channel.getChanNo());
|
vtdu.setIsCode("0");//默认不转码
|
vtdu.setMode("1");//默认CPU软解码
|
vtdu.setCameraId(camera.getId());
|
vtduService.insertVtdu(vtdu);
|
}
|
}
|
//创建引导队列
|
if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
|
Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
|
PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
|
GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
|
}
|
|
} else {
|
log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
|
camera.setChanNum(0);
|
camera.setLoginId(-1);
|
camera.setState("0");
|
}
|
ardCamerasService.updateArdCameras(camera);
|
return 1;
|
}
|
}
|