ard-work/src/main/java/com/ruoyi/device/camera/factory/CameraSDK.java
@@ -106,7 +106,7 @@ boolean recordStopNotToMinio(CameraCmd cmd); //获取相机通道信息 List<ArdChannel> getIPChannelInfo(ArdCameras camera); List<ArdChannel> getChannels(ArdCameras camera); //获取GIS信息数据 AjaxResult getGisInfo(CameraCmd cmd); ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
@@ -2,6 +2,8 @@ import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib; import com.ruoyi.utils.sdk.dhsdk.lib.ToolKits; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.ptr.IntByReference; import lombok.extern.slf4j.Slf4j; @@ -63,7 +65,7 @@ int nBufferLen = 2 * 1024 * 1024; byte[] strBuffer = new byte[nBufferLen]; if (netsdk.CLIENT_GetNewDevConfig(hLoginHandle, strCmd, nChn, strBuffer, nBufferLen, error, 3000)) { if (netsdk.CLIENT_GetNewDevConfig(hLoginHandle, strCmd, nChn, strBuffer, nBufferLen, error, 6000)) { cmdObject.write(); if (configsdk.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(), cmdObject.size(), null)) { cmdObject.read(); @@ -90,12 +92,57 @@ if (bRet) { cmdObject.read(); } else { log.error("Get ["+strCmd+"] Config Failed!Last Error = " + getErrorCodePrint()); log.error("Get [" + strCmd + "] Config Failed!Last Error = " + getErrorCodePrint()); result = false; } return result; } public static boolean queryCameraState(NetSDKLib.LLong hLoginHandle, Integer chanNum, Integer chanNo) { boolean bRet = false; try { NetSDKLib.NET_CAMERA_STATE_INFO[] arrCameraStatus = new NetSDKLib.NET_CAMERA_STATE_INFO[chanNum]; for (int i = 0; i < arrCameraStatus.length; i++) { arrCameraStatus[i] = new NetSDKLib.NET_CAMERA_STATE_INFO(); } // 入参 NetSDKLib.NET_IN_GET_CAMERA_STATEINFO stIn = new NetSDKLib.NET_IN_GET_CAMERA_STATEINFO(); stIn.bGetAllFlag = 0; // 全部 stIn.nValidNum = chanNum; stIn.nChannels[chanNo - 1] = chanNo - 1; // 出参 NetSDKLib.NET_OUT_GET_CAMERA_STATEINFO stOut = new NetSDKLib.NET_OUT_GET_CAMERA_STATEINFO(); stOut.nMaxNum = chanNum; stOut.pCameraStateInfo = new Memory(arrCameraStatus[0].size() * chanNum); stOut.pCameraStateInfo.clear(arrCameraStatus[0].size() * chanNum); ToolKits.SetStructArrToPointerData(arrCameraStatus, stOut.pCameraStateInfo); // 将数组内存拷贝到Pointer stIn.write(); stOut.write(); bRet = netsdk.CLIENT_QueryDevInfo(hLoginHandle, NetSDKLib.NET_QUERY_GET_CAMERA_STATE, stIn.getPointer(), stOut.getPointer(), null, 3000); if (bRet) { stOut.read(); ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, arrCameraStatus); // 将Pointer拷贝到数组内存 final String[] connectionState = {"未知", "正在连接", "已连接", "未连接", "通道未配置,无信息", "通道有配置,但被禁用"}; if (connectionState[arrCameraStatus[chanNo - 1].emConnectionState].equals("已连接")) { log.debug("通道" + arrCameraStatus[chanNo - 1].nChannel + connectionState[arrCameraStatus[chanNo - 1].emConnectionState]); bRet = true; } else { bRet = false; } } else { log.error("Query Camera State Failed!" + getErrorCodePrint()); } } catch (Exception ex) { log.error("Query Camera State Failed!" + ex.getMessage()); } return bRet; } // 获取配置 public static boolean GetConfig(NetSDKLib.LLong hLoginHandle, int nChn, int type, Structure cmdObject) { boolean result = false; ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -105,38 +105,22 @@ log.error("设备[" + camera.getIp() + ":" + camera.getPort() + "]登录失败:" + getErrorCodePrint()); return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); } if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); // if (GlobalVariable.loginMap.containsKey(camera.getId())) { // GlobalVariable.loginMap.remove(camera.getId()); // } camera.setState("1"); camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartDChan(1); camera.setLoginId((int) loginId.longValue()); ardCamerasService.updateArdCameras(camera); GlobalVariable.loginMap.put(camera.getId(), loginId); //获取最新通道 for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) { ArdChannel channel = new ArdChannel(); NetSDKLib.AV_CFG_ChannelName av_cfg_channelName = new NetSDKLib.AV_CFG_ChannelName(); boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName); if (b) { String chanName = ""; try { chanName = new String(av_cfg_channelName.szName, "GBK").trim(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } channel.setName(chanName.equals("") ? "通道" + i : chanName); } channel.setDeviceId(camera.getId()); channel.setChanNo(i); ardChannelService.insertArdChannel(channel); List<ArdChannel> ardChannelList = getChannels(camera); if (ardChannelList.size() > 0) { camera.setChanNum(ardChannelList.size()); ardCamerasService.updateArdCameras(camera); //配置到流媒体 addVtdu(camera); } //配置到流媒体 addVtdu(camera); //创建引导队列 createGuideQueue(camera); return AjaxResult.success("设备登录成功"); @@ -163,11 +147,9 @@ log.error("设备[" + camera.getIp() + ":" + camera.getPort() + "]登录失败:" + getErrorCodePrint()); return AjaxResult.warn(getErrorCodePrint()); } if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); // if (GlobalVariable.loginMap.containsKey(camera.getId())) { // GlobalVariable.loginMap.remove(camera.getId()); // } camera.setState("1"); camera.setChanNum(m_stDeviceInfo.byChanNum); camera.setStartDChan(1); @@ -176,28 +158,13 @@ GlobalVariable.loginMap.put(camera.getId(), loginId); //获取最新通道 for (int i = 1; i < m_stDeviceInfo.byChanNum + 1; i++) { ArdChannel channel = new ArdChannel(); NetSDKLib.AV_CFG_ChannelName av_cfg_channelName = new NetSDKLib.AV_CFG_ChannelName(); boolean b = ConfigModule.GetNewDevConfig(loginId, i-1, CFG_CMD_CHANNELTITLE, av_cfg_channelName); if (!b) { log.error("获取配置失败,请稍后重试" + getErrorCodePrint()); // return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); } String chanName = ""; try { chanName = new String(av_cfg_channelName.szName, "GBK").trim(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } channel.setName(chanName.equals("") ? "通道" + i : chanName); channel.setDeviceId(camera.getId()); channel.setChanNo(i); ardChannelService.insertArdChannel(channel); List<ArdChannel> ardChannelList = getChannels(camera); if (ardChannelList.size() > 0) { camera.setChanNum(ardChannelList.size()); ardCamerasService.updateArdCameras(camera); //配置到流媒体 addVtdu(camera); } //配置到流媒体 addVtdu(camera); //创建引导队列 createGuideQueue(camera); return AjaxResult.success("登录成功"); @@ -239,13 +206,49 @@ //创建引导队列 private void createGuideQueue(ArdCameras camera) { if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); //启动队列处理器 queueHandler.process(camera.getId()); if (camera.getGdtype().equals("1")) { if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); //启动队列处理器 queueHandler.process(camera.getId()); } } } //获取通道 public List<ArdChannel> getChannels(ArdCameras camera) { ardChannelService.deleteArdChannelByDeviceId(camera.getId()); LLong loginId = new LLong(camera.getLoginId()); List<ArdChannel> ardChannelList = new ArrayList<>(); for (int i = 1; i < camera.getChanNum() + 1; i++) { ArdChannel channel = new ArdChannel(); NetSDKLib.AV_CFG_ChannelName av_cfg_channelName = new NetSDKLib.AV_CFG_ChannelName(); boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName); if (!b) { log.error("获取配置失败,请稍后重试" + getErrorCodePrint()); // return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); } String chanName = ""; try { chanName = new String(av_cfg_channelName.szName, "GBK").trim(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } channel.setName(chanName.equals("") ? "通道" + i : chanName); channel.setDeviceId(camera.getId()); channel.setChanNo(i); if (camera.getGdtype().equals("2")) { //NVR过滤不在线的通道 if (!ConfigModule.queryCameraState(loginId, camera.getChanNum(), i)) { continue; } } ardChannelList.add(channel); ardChannelService.insertArdChannel(channel); } return ardChannelList; } /** @@ -758,10 +761,6 @@ return result; } @Override public List<ArdChannel> getIPChannelInfo(ArdCameras camera) { return null; } /** * 引导目标位置 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/LoginResultCallBack.java
@@ -53,7 +53,7 @@ camera.setChanNum((int) lpDeviceinfo.byChanNum); camera.setStartDChan((int) lpDeviceinfo.byStartDChan); //获取最新通道 List<ArdChannel> cameraChannelList = hikClientService.getIPChannelInfo(camera); List<ArdChannel> cameraChannelList = hikClientService.getChannels(camera); if (cameraChannelList.size() > 0) { camera.setChanNum(cameraChannelList.size()); //添加通道 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -138,15 +138,11 @@ } } if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); // if (GlobalVariable.loginMap.containsKey(camera.getId())) { // GlobalVariable.loginMap.remove(camera.getId()); // } GlobalVariable.loginMap.put(camera.getId(), lUserID); GlobalVariable.loginCameraMap.put(lUserID, camera); camera.setLoginId(lUserID); camera.setState("1"); int chanNum = m_strDeviceInfo.struDeviceV30.byChanNum; @@ -158,14 +154,10 @@ camera.setChanNum(chanNum); camera.setStartDChan(startDchan); //获取最新通道 List<ArdChannel> cameraChannelList = getIPChannelInfo(camera); List<ArdChannel> cameraChannelList = getChannels(camera); if (cameraChannelList.size() > 0) { camera.setChannelList(cameraChannelList); camera.setChanNum(cameraChannelList.size()); for (ArdChannel channel : cameraChannelList) { channel.setId(IdUtils.simpleUUID()); ardChannelService.insertArdChannel(channel); } ardCamerasService.updateArdCameras(camera); //添加到流媒体 addVtdu(camera); @@ -252,15 +244,11 @@ } } } if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); // if (GlobalVariable.loginMap.containsKey(camera.getId())) { // GlobalVariable.loginMap.remove(camera.getId()); // } GlobalVariable.loginMap.put(camera.getId(), lUserID); GlobalVariable.loginCameraMap.put(lUserID, camera); camera.setLoginId(lUserID); camera.setState("1"); int chanNum = m_strDeviceInfo.struDeviceV30.byChanNum; @@ -271,21 +259,15 @@ } camera.setChanNum(chanNum); camera.setStartDChan(startDchan); //获取最新通道 List<ArdChannel> cameraChannelList = getIPChannelInfo(camera); List<ArdChannel> cameraChannelList = getChannels(camera); if (cameraChannelList.size() > 0) { camera.setChannelList(cameraChannelList); camera.setChanNum(cameraChannelList.size()); for (ArdChannel channel : cameraChannelList) { channel.setId(IdUtils.simpleUUID()); ardChannelService.insertArdChannel(channel); } ardCamerasService.updateArdCameras(camera); //添加到流媒体 addVtdu(camera); } //创建引导队列 createGuideQueue(camera); return AjaxResult.success("设备登录成功"); @@ -297,12 +279,14 @@ //创建引导队列 private void createGuideQueue(ArdCameras camera) { if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); //启动队列处理器 queueHandler.process(camera.getId()); if (camera.getGdtype().equals("1")) { if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); //启动队列处理器 queueHandler.process(camera.getId()); } } } @@ -1259,7 +1243,7 @@ @Override public AjaxResult controlDefogcfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer chanNo=cmd.getChanNo(); Integer chanNo = cmd.getChanNo(); boolean enable = cmd.isEnable(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return AjaxResult.warn("设备未登录"); @@ -1845,10 +1829,12 @@ } //获取IP通道 public List<ArdChannel> getIPChannelInfo(ArdCameras camera) { public List<ArdChannel> getChannels(ArdCameras camera) { //获取通道 List<ArdChannel> channelList = new ArrayList<>(); try { //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数 HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40(); m_strIpparaCfg.write(); @@ -1858,7 +1844,7 @@ m_strIpparaCfg.read(); //log.debug("起始数字通道号:" + m_strIpparaCfg.dwStartDChan);//m_strIpparaCfg.dwDChanNum for (int iChannum = 0; iChannum < camera.getChanNum(); iChannum++) { ArdChannel ardChannel = new ArdChannel(); ArdChannel channel = new ArdChannel(); int chanNo = iChannum + camera.getStartDChan(); HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40(); strPicCfg.dwSize = strPicCfg.size(); @@ -1876,22 +1862,21 @@ if (m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType == 0) { m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class); m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.read(); int channel = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID + m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256; int channelNo = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID + m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256; String channelName = new String(strPicCfg.sChanName, "GBK").trim(); channelName = channelName.equals("") ? "通道" + chanNo : channelName; ardChannel.setDeviceId(camera.getId()); ardChannel.setName(channelName); ardChannel.setChanNo(chanNo); channel.setDeviceId(camera.getId()); channel.setName(channelName); channel.setChanNo(chanNo); if (camera.getGdtype().equals("3") || camera.getGdtype().equals("2")) { //NVR只获取在线通道 if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1) { //log.debug("IP通道" + channum + "在线"); channelList.add(ardChannel); //NVR过滤离线通道 if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable != 1) { continue; } } else { channelList.add(ardChannel); } channelList.add(channel); } ardChannelService.insertArdChannel(channel); } } catch (Exception ex) { log.error("获取IP通道异常:" + ex.getMessage());