Commit cc80fa48 authored by zhangyanduan's avatar zhangyanduan

add: 提交大华摄像头抓取图像的测试代码,目前还没有整合到业务中

parent ad85ce29
......@@ -7,11 +7,9 @@ import org.rcisoft.core.anno.CyOpeLogAnno;
import org.rcisoft.core.operlog.enums.CyLogTypeEnum;
import org.rcisoft.integration.aep.service.IAepPushService;
import org.rcisoft.integration.jieLink.dto.JieLinkResultDto;
import org.rcisoft.integration.video.Service.IDaHuaVideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
......@@ -22,6 +20,9 @@ public class AepPushController {
private IAepPushService aepPushService;
@Autowired
private IDaHuaVideoService daHuaVideoService;
/**
* 门磁推送数据接口
* @param data
......@@ -78,4 +79,26 @@ public class AepPushController {
return result;
}
/**
* 门磁推送数据接口
* @param data
* @return
*/
@ApiOperation(value="大华视频监控设备抓图", notes="大华视频监控设备抓图")
@GetMapping(value = "/grabVideoPic")
public JieLinkResultDto grabVideoPic() {
JieLinkResultDto result = new JieLinkResultDto();
boolean grabFlag = daHuaVideoService.grabVideoDevicePicData();
if(grabFlag){
result.setCode("200");
result.setMsg("抓取成功");
}else{
result.setCode("-1");
result.setMsg("抓取失败");
}
return result;
}
}
package org.rcisoft.integration.video.Service;
import org.springframework.stereotype.Service;
/**
* 大华视频监控设备服务
*/
@Service
public interface IDaHuaVideoService {
/**
......
package org.rcisoft.integration.video.Service.impl;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.Service.IDaHuaVideoService;
import org.rcisoft.integration.video.common.VideoDeviceHandel;
import org.rcisoft.integration.video.config.CapturePicCallBack;
import org.rcisoft.integration.video.config.DaHuaVideoInitConfig;
import org.rcisoft.integration.video.utils.CapturePictureUtils;
import org.rcisoft.sys.doorreportdata.entity.DoorReportData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
* 大华视频监控设备服务
*/
@Service
@Slf4j
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public class DahuaVideoServiceImpl implements IDaHuaVideoService {
@Override
public boolean grabVideoDevicePicData() {
/**
* 先判断是否已经初始化
* 先判断是否已经初始化,
* 2、获取设备的配置信息
* 3、判断设备是否已经登录
* 4、未登录登录 一登录获取登录句柄
* 5、调用抓图工具类
* 6、回调写入数据
*/
VideoDeviceHandel handel = null;
if(!DaHuaVideoInitConfig.videoDeviceMap.containsKey(0L)){
String deviceIp="192.168.1.199";
int devicePort = 37777;
String deviceAccount = "admin";
String deviceSign = "admin123";
boolean login = DaHuaVideoInitConfig.login(deviceIp, devicePort, deviceAccount, deviceSign);
if(login){
handel = DaHuaVideoInitConfig.videoDeviceMap.get(0l);
}
}else{
handel = DaHuaVideoInitConfig.videoDeviceMap.get(0l);
if(handel.isLoginStatus()){
String deviceIp="192.168.1.199";
int devicePort = 37777;
String deviceAccount = "admin";
String deviceSign = "admin123";
boolean login = DaHuaVideoInitConfig.login(deviceIp, devicePort, deviceAccount, deviceSign);
if(login){
handel = DaHuaVideoInitConfig.videoDeviceMap.get(0l);
}
}
}
if(handel == null ||!handel.isLoginStatus()){
return false;
}
String basePath = "E:\\DAHUAPIC";
String strFileName =basePath+"\\"+new Date().getTime()+".jpg";
CapturePicCallBack callBack = new CapturePicCallBack("11111111",strFileName);
CapturePictureUtils.setSnapRevCallBack(callBack,null);
boolean picture = CapturePictureUtils.remoteCapturePicture(handel.getDeviceLoginHandle(), 0);
return picture;
}
}
package org.rcisoft.integration.video.common;
import lombok.Data;
import org.rcisoft.integration.video.lib.NetSDKLib;
/**
* 大华视频监控设备登录状态实体
*/
@Data
public class VideoDeviceHandel {
/**
* 设备登录句柄
*/
private NetSDKLib.LLong deviceLoginHandle;
/**
* 登录状态
*/
private boolean loginStatus;
}
package org.rcisoft.integration.video.common;
import org.rcisoft.integration.video.config.DaHuaVideoInitConfig;
/**
* 大华视频监控设备SDK公共服务类
*/
public class VideoDeviceSDKComm {
/**
* 获取接口错误码和错误信息,用于打印
* @return
*/
public static String getErrorCodePrint() {
return "\n{error code: (0x80000000|" + (DaHuaVideoInitConfig.netsdk.CLIENT_GetLastError() & 0x7fffffff) +").参考 NetSDKLib.java }"
+ " - {error info:" + ErrorCode.getErrorCode(DaHuaVideoInitConfig.netsdk.CLIENT_GetLastError()) + "}\n";
}
}
package org.rcisoft.integration.video.config;
import com.alibaba.fastjson.JSONObject;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.lib.NetSDKLib;
import org.rcisoft.integration.video.utils.SpringBeanUtils;
import org.rcisoft.sys.doorreportdata.entity.DoorReportData;
import org.rcisoft.sys.doorreportdata.service.DoorReportDataService;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Date;
@Slf4j
public class CapturePicCallBack implements NetSDKLib.fSnapRev{
private String dataId;
private String savePath;
private DoorReportDataService doorReportDataService = SpringBeanUtils.getBean(DoorReportDataService.class);
public CapturePicCallBack(String dataId, String savePath) {
this.dataId = dataId;
this.savePath = savePath;
}
/**
* 抓图回调方法
* @param lLoginID
* @param pBuf
* @param RevLen
* @param EncodeType
* @param CmdSerial
* @param dwUser
*/
@Override
public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
BufferedImage bufferedImage = null;
if(pBuf != null && RevLen > 0) {
// String basePath = "E:\\DAHUAPIC";
// String strFileName =basePath+"\\"+new Date().getTime()+".jpg";
String strFileName = savePath;
log.info("回调函数中的dataId:"+dataId);
DoorReportData byId = doorReportDataService.findById(1);
log.info(JSONObject.toJSONString(byId));
System.out.println("strFileName = " + strFileName);
byte[] buf = pBuf.getByteArray(0, RevLen);
ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
try {
bufferedImage = ImageIO.read(byteArrInput);
if(bufferedImage == null) {
return;
}
ImageIO.write(bufferedImage, "jpg", new File(strFileName));
} catch (IOException e) {
log.error("抓图回调函数出现异常:"+e.getMessage(),e);
}
}
}
public String getDataId() {
return dataId;
}
public void setDataId(String dataId) {
this.dataId = dataId;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
}
......@@ -2,6 +2,7 @@ package org.rcisoft.integration.video.config;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.common.VideoDeviceHandel;
import org.rcisoft.integration.video.lib.NetSDKLib;
import org.rcisoft.integration.video.lib.NetSDKLib.LLong;
......@@ -17,7 +18,7 @@ public class DaHuaVideoInitConfig {
/**
* 全局视频监控设备登录集合
*/
public static ConcurrentHashMap<Long,LLong> videoDeviceMap = new ConcurrentHashMap();
public static ConcurrentHashMap<Long, VideoDeviceHandel> videoDeviceMap = new ConcurrentHashMap();
/**
* SDK核心
......@@ -40,11 +41,6 @@ public class DaHuaVideoInitConfig {
*/
private static boolean bLogopen = false;
// device disconnect callback instance
private static DisConnect disConnect = new DisConnect();
// device reconnect callback instance
private static HaveReConnect haveReConnect = new HaveReConnect();
/**
* 初始化
*/
......@@ -123,7 +119,10 @@ public class DaHuaVideoInitConfig {
}
boolean loginStatus =m_hLoginHandle.longValue() == 0? false:true;
if(loginStatus){
videoDeviceMap.put(0L,m_hLoginHandle);
VideoDeviceHandel handel = new VideoDeviceHandel();
handel.setDeviceLoginHandle(m_hLoginHandle);
handel.setLoginStatus(true);
videoDeviceMap.put(0L,handel);
}
return loginStatus;
}
......@@ -151,7 +150,10 @@ public class DaHuaVideoInitConfig {
}
boolean loginStatus =m_hLoginHandle.longValue() == 0? false:true;
if(loginStatus){
videoDeviceMap.put(deviceId,m_hLoginHandle);
VideoDeviceHandel handel = new VideoDeviceHandel();
handel.setDeviceLoginHandle(m_hLoginHandle);
handel.setLoginStatus(true);
videoDeviceMap.put(0L,handel);
}
return loginStatus;
}
......@@ -162,7 +164,9 @@ public class DaHuaVideoInitConfig {
*/
public static boolean logout() {
if(videoDeviceMap.containsKey(0L)){
LLong m_hLoginHandle = videoDeviceMap.get(0L);
VideoDeviceHandel handel = videoDeviceMap.get(0L);
if(handel.getDeviceLoginHandle()!=null && handel.isLoginStatus()){
LLong m_hLoginHandle = handel.getDeviceLoginHandle();
if(m_hLoginHandle.longValue() == 0) {
return false;
}
......@@ -174,6 +178,9 @@ public class DaHuaVideoInitConfig {
}else{
return false;
}
}else{
return false;
}
}
}
......@@ -2,6 +2,7 @@ package org.rcisoft.integration.video.config;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.common.VideoDeviceHandel;
import org.rcisoft.integration.video.lib.NetSDKLib;
import java.util.concurrent.ConcurrentHashMap;
......@@ -13,17 +14,24 @@ import java.util.concurrent.ConcurrentHashMap;
public class DisConnect implements NetSDKLib.fDisConnect{
@Override
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
ConcurrentHashMap<Long, NetSDKLib.LLong> videoDeviceMap = DaHuaVideoInitConfig.videoDeviceMap;
ConcurrentHashMap<Long, VideoDeviceHandel> videoDeviceMap = DaHuaVideoInitConfig.videoDeviceMap;
Long nowDeviceId = null;
for(Long deviceId: videoDeviceMap.keySet()){
NetSDKLib.LLong lLong = videoDeviceMap.get(deviceId);
if(lLong.longValue() == lLoginID.longValue()){
VideoDeviceHandel handel = videoDeviceMap.get(deviceId);
if(!handel.isLoginStatus() || handel.getDeviceLoginHandle()==null){
continue;
}
NetSDKLib.LLong deviceLoginHandle = handel.getDeviceLoginHandle();
if(deviceLoginHandle.longValue() == lLoginID.longValue()){
handel.setLoginStatus(false);
nowDeviceId = deviceId;
break;
}
}
if(nowDeviceId!=null){
videoDeviceMap.remove(nowDeviceId);
VideoDeviceHandel handel = videoDeviceMap.get(nowDeviceId);
handel.setLoginStatus(false);
videoDeviceMap.put(nowDeviceId,handel);
}
}
}
......@@ -2,8 +2,11 @@ package org.rcisoft.integration.video.config;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.common.VideoDeviceHandel;
import org.rcisoft.integration.video.lib.NetSDKLib;
import java.util.concurrent.ConcurrentHashMap;
/**
*设备连接恢复策略,实现设备连接恢复接口
*/
......@@ -11,6 +14,23 @@ import org.rcisoft.integration.video.lib.NetSDKLib;
public class HaveReConnect implements NetSDKLib.fHaveReConnect{
@Override
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
ConcurrentHashMap<Long, VideoDeviceHandel> videoDeviceMap = DaHuaVideoInitConfig.videoDeviceMap;
Long nowDeviceId = null;
for(Long deviceId: videoDeviceMap.keySet()){
VideoDeviceHandel handel = videoDeviceMap.get(deviceId);
if(handel.isLoginStatus()){
continue;
}
NetSDKLib.LLong deviceLoginHandle = handel.getDeviceLoginHandle();
if(deviceLoginHandle!=null && deviceLoginHandle.longValue() == lLoginID.longValue()){
handel.setLoginStatus(true);
nowDeviceId = deviceId;
}
}
if(nowDeviceId!=null){
VideoDeviceHandel handel = videoDeviceMap.get(nowDeviceId);
handel.setLoginStatus(true);
videoDeviceMap.put(nowDeviceId,handel);
}
}
}
package org.rcisoft.integration.video.utils;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.integration.video.common.VideoDeviceSDKComm;
import org.rcisoft.integration.video.config.DaHuaVideoInitConfig;
import org.rcisoft.integration.video.lib.NetSDKLib;
/**
* 抓图工具类
*/
@Slf4j
public class CapturePictureUtils {
/**
* 本地抓图
*/
public static boolean localCapturePicture(NetSDKLib.LLong hPlayHandle, String picFileName) {
if (!DaHuaVideoInitConfig.netsdk.CLIENT_CapturePictureEx(hPlayHandle, picFileName, NetSDKLib.NET_CAPTURE_FORMATS.NET_CAPTURE_JPEG)) {
log.error("CLIENT_CapturePicture Failed!:"+ VideoDeviceSDKComm.getErrorCodePrint());
return false;
} else {
log.debug("CLIENT_CapturePicture success");
}
return true;
}
/**
* 远程抓图
*/
public static boolean remoteCapturePicture(NetSDKLib.LLong m_hLoginHandle,int chn) {
return snapPicture(m_hLoginHandle,chn, 0, 0);
}
/**
* 定时抓图
*/
public static boolean timerCapturePicture(NetSDKLib.LLong m_hLoginHandle,int chn) {
return snapPicture(m_hLoginHandle,chn, 1, 2);
}
/**
* 停止定时抓图
*/
public static boolean stopCapturePicture(NetSDKLib.LLong m_hLoginHandle,int chn) {
return snapPicture(m_hLoginHandle,chn, -1, 0);
}
/**
* 抓图 (除本地抓图外, 其他全部调用此接口)
*/
private static boolean snapPicture(NetSDKLib.LLong m_hLoginHandle, int chn, int mode, int interval) {
// send caputre picture command to device
NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
stuSnapParams.Channel = chn; // channel
stuSnapParams.mode = mode; // capture picture mode
stuSnapParams.Quality = 3; // picture quality
stuSnapParams.InterSnap = interval; // timer capture picture time interval
stuSnapParams.CmdSerial = 0; // request serial
IntByReference reserved = new IntByReference(0);
if (!DaHuaVideoInitConfig.netsdk.CLIENT_SnapPictureEx(m_hLoginHandle, stuSnapParams, reserved)) {
log.error("CLIENT_SnapPictureEx Failed!"+VideoDeviceSDKComm.getErrorCodePrint());
return false;
} else {
log.debug("CLIENT_SnapPictureEx success");
}
return true;
}
/**
* 设置抓图回调函数
*/
public static void setSnapRevCallBack(NetSDKLib.fSnapRev cbSnapReceive){
DaHuaVideoInitConfig.netsdk.CLIENT_SetSnapRevCallBack(cbSnapReceive, null);
}
/**
* 设置抓图回调函数
*/
public static void setSnapRevCallBack(NetSDKLib.fSnapRev cbSnapReceive, Pointer data){
DaHuaVideoInitConfig.netsdk.CLIENT_SetSnapRevCallBack(cbSnapReceive, data);
}
}
package org.rcisoft.integration.video.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* SpringBean工具
*/
@Component
public class SpringBeanUtils implements ApplicationContextAware{
/**
* 上下文对象实例
*/
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
......@@ -6,6 +6,7 @@ import org.rcisoft.core.model.CyPersistModel;
import org.rcisoft.core.model.CyPageInfo;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.List;
/**
......@@ -64,4 +65,6 @@ public interface OssInfoService {
List<OssInfo> export(OssInfo ossInfo);
OssInfo filePath(MultipartFile file, String temp);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment