package com.ruoyi.device.hiksdk.util.hikSdkUtil; 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.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.hiksdk.service.IHikClientService; 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) { 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()); } if (dwResult == 1) { GlobalVariable.loginMap.put(camera.getId(), lUserID); log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功"); camera.setLoginId(lUserID); camera.setChanNum((int) lpDeviceinfo.byChanNum); camera.setStartDChan((int)lpDeviceinfo.byStartDChan); //获取最新通道 List cameraChannelList = hikClientService.getCameraChannelList(camera); if(cameraChannelList.size()>0) { //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); for (ArdChannel channel : cameraChannelList) { channel.setId(IdUtils.simpleUUID()); ardChannelService.insertArdChannel(channel); } } //创建引导队列 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); } ardCamerasService.updateArdCameras(camera); return 1; } }