package com.ruoyi.device.dhsdk.service.impl;
|
|
import com.ruoyi.common.utils.uuid.IdUtils;
|
import com.ruoyi.device.camera.domain.ArdCameras;
|
import com.ruoyi.device.camera.domain.CameraCmd;
|
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.dhsdk.common.Res;
|
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
|
import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong;
|
import com.ruoyi.device.dhsdk.lib.ToolKits;
|
import com.ruoyi.device.dhsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO;
|
import com.ruoyi.device.dhsdk.module.ConfigModule;
|
import com.ruoyi.device.dhsdk.module.LoginModule;
|
import com.ruoyi.device.dhsdk.module.PtzControlModule;
|
import com.ruoyi.device.dhsdk.service.IDhClientService;
|
import com.ruoyi.device.hiksdk.common.GlobalVariable;
|
import com.ruoyi.device.hiksdk.sdk.HCNetSDK;
|
import com.sun.jna.Pointer;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.text.DecimalFormat;
|
import java.util.*;
|
|
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
|
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
|
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_CHECK_USER_STATUS;
|
|
/**
|
* @ClassName DhSdkServiceImpl
|
* @Description:
|
* @Author 刘苏义
|
* @Date 2023/10/13 21:19
|
* @Version 1.0
|
*/
|
@Service
|
@Slf4j(topic = "dhSdk")
|
public class DhClientServiceImpl implements IDhClientService {
|
@Resource
|
private IArdCamerasService ardCamerasService;
|
@Resource
|
private IArdChannelService ardChannelService;
|
|
private Vector<String> chnlist = new Vector<String>();
|
// 设备断线通知回调
|
private static DisConnect disConnect = new DisConnect();
|
// 网络连接恢复
|
private static HaveReConnect haveReConnect = new HaveReConnect();
|
|
|
@Override
|
public void loginAll() {
|
try {
|
ArdCameras ardCamera = new ArdCameras();
|
ardCamera.setFactory("2");//获取大华相机
|
List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(ardCamera);
|
for (ArdCameras camera : ardCameras) {
|
Thread.sleep(500);
|
//异步登录
|
login(camera);
|
}
|
} catch (Exception ex) {
|
log.error("初始化登录相机异常:" + ex.getMessage());
|
}
|
}
|
|
@Override
|
public Boolean init() {
|
return LoginModule.init(disConnect, haveReConnect); // 打开工程,初始化
|
}
|
|
@Override
|
@Async
|
public Boolean login(ArdCameras camera) {
|
LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword());
|
if (loginId.longValue() > 0) {
|
//log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功");
|
if (GlobalVariable.loginMap.containsKey(camera.getId())) {
|
GlobalVariable.loginMap.remove(camera.getId());
|
}
|
//删除管理通道
|
ardChannelService.deleteArdChannelByDeviceId(camera.getId());
|
camera.setState("1");
|
camera.setChanNum(LoginModule.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 < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) {
|
chnlist.add(Res.string().getChannel() + " " + String.valueOf(i));
|
ArdChannel channel = new ArdChannel();
|
channel.setDeviceId(camera.getId());
|
channel.setName("通道" + i);
|
channel.setId(IdUtils.simpleUUID());
|
channel.setChanNo(i);
|
ardChannelService.insertArdChannel(channel);
|
}
|
} else {
|
//log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
|
camera.setChanNum(0);
|
camera.setLoginId(-1);
|
camera.setState("0");
|
ardCamerasService.updateArdCameras(camera);
|
return false;
|
}
|
|
return true;
|
}
|
|
@Override
|
public Boolean logout(String cameraId) {
|
if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
return false;
|
}
|
LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
return LoginModule.logout(loginId);
|
}
|
|
@Override
|
public boolean isOnLine(CameraCmd cmd) {
|
try {
|
String cameraId = cmd.getCameraId();
|
if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
return false;
|
}
|
LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
|
|
} catch (Exception ex) {
|
log.error("检测在线异常:" + ex.getMessage());
|
return false;
|
}
|
|
return false;
|
}
|
|
@Override
|
public boolean pTZControl(CameraCmd cmd) {
|
String cameraId = cmd.getCameraId();
|
boolean enable = cmd.isEnable();
|
Integer chanNo = cmd.getChanNo();
|
Integer speed = cmd.getSpeed();
|
Integer code = cmd.getCode();
|
if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
return false;
|
}
|
LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
int dwStop;
|
if (enable) {
|
dwStop = 0;//开启
|
} else {
|
dwStop = 1;//关闭
|
}
|
int dwPTZCommand = -1;
|
switch (code) {
|
/*方向*/
|
case 1:
|
dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
|
break;
|
case 2:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
|
break;
|
case 3:
|
dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
|
break;
|
case 4:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
|
break;
|
case 5:
|
dwPTZCommand = HCNetSDK.RUN_SEQ;
|
break;
|
case 6:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
|
break;
|
case 7:
|
dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
|
break;
|
case 8:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
|
break;
|
case 9:
|
dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
|
break;
|
/*焦距*/
|
case 10:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
|
break;
|
case 11:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
|
break;
|
/*焦点*/
|
case 12:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
|
break;
|
case 13:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
|
break;
|
/*光圈*/
|
case 14:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
|
break;
|
case 15:
|
dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
|
break;
|
}
|
boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
|
if (!bool) {
|
log.error("控制失败,请稍后重试" + getErrorCodePrint());
|
}
|
return bool;
|
}
|
|
@Override
|
public Map<String, Object> getPtz(CameraCmd cmd) {
|
Map<String, Object> ptzMap = new HashMap<>();
|
String cameraId = cmd.getCameraId();
|
if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
return null;
|
}
|
LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
NetSDKLib.NET_PTZ_LOCATION_INFO dh_ptz_location_info = new NetSDKLib.NET_PTZ_LOCATION_INFO();
|
boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_PTZ_LOCATION, dh_ptz_location_info);
|
if (b) {
|
DecimalFormat df = new DecimalFormat("0.0");//设置保留位数
|
String nPTZPan = df.format((float)dh_ptz_location_info.nPTZPan / 10);
|
String nPTZTilt = df.format((float)dh_ptz_location_info.nPTZTilt/10);
|
String nPTZZoom = df.format((float)dh_ptz_location_info.nPTZZoom);
|
ptzMap.put("p", nPTZPan);
|
ptzMap.put("t", nPTZTilt);
|
ptzMap.put("z", nPTZZoom);
|
}
|
return ptzMap;
|
}
|
|
// 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
|
private static class DisConnect implements NetSDKLib.fDisConnect {
|
public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
// 网络连接恢复,设备重连成功回调
|
// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
|
private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
|
@Override
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
|
}
|
}
|
}
|