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.utils.sdk.hiksdk.service.IHikClientService; import com.ruoyi.media.domain.Vtdu; import com.ruoyi.media.service.IVtduService; 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); IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.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 cameraChannelList = hikClientService.getCameraChannelList(camera); if (cameraChannelList.size() > 0) { //添加通道 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 comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue 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; } }