JAVA如何对接海康威视门禁和摄像头视频取流
前言
本文旨在指导如何使用Java语言对接海康威视的iSecure Center综合安防管理平台,实现门禁系统和摄像头视频的取流功能。对接方式是通过调用海康的综合安防管理平台的Open API进行。
1. 海康威视(iSecure Center综合安防管理平台)
1.1 注册与认证
首先,需要访问海康开放平台进行注册和登录。如果已有账号,则直接登录;没有则需要注册。
登录后,可以在开放体系下找到综合安防管理平台的入口。
1.2 对接方式选型
进入综合安防管理平台后,点击场景方案,了解方案并进行选型。
点击开发指南,查看对接指南与API。
1.2.1 基础对接-接口安全认证规则
了解接口安全认证规则。
注意事项:主要了解host
、appKey
、appSecret
三个参数,这些通常由客户或海康提供。
1.2.1.2 基础对接-集成java安全认证库
下载java安全认证库,并在项目中引入。
- 点击下载java安全认证库,进入工具下载界面。
- 选择OpenAPI安全认证库(JAVA),下载后解压,并在项目中引用相关jar包。
2. 开始对接
2.1 导入Maven依赖
使用maven公共库中的依赖,或者手动导入jar包。
2.1.1 使用maven公共库中的依赖
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.3</version>
</dependency>
2.2.2 手动导入jar包
将下载的artemis-http-client-1.1.11.RELEASE.jar
包拷贝到项目目录下,并在pom.xml文件中引入依赖。
<!--海康威视依赖 -->
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.11.RELEASE</version>
</dependency>
2.2 在yml文件中,配置海康api所需信息
配置信息包括协议、IP、端口、appKey、appSecret等。
#根据现场情况进行调整:"https://" 或 "http://"
hikvision:
Protocol: "https://"
ip: 172.16.1.25
port: 443
appKey: H4sIAAAAAAAAASDSFDFDMyNje0NDK3BABFDAAAAA==
appSecret: H4sIAASDFDSFAPMrtAwvjHL2Di/2NzQz9M9O8FDSFDSX2FAAAAA==
#码流类型:0:主码流、1:子码流、2:第三码流
streamType: 0
#取流协议(应用层协议),参数不填,默认为HIK协议
#“hik”:HIK私有协议,使用视频SDK进行播放时,传入此类型;
#“rtsp”:RTSP协议;
#“rtmp”:RTMP协议(RTMP协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备;只支持H264视频编码和AAC音频编码);
#“hls”:HLS协议(HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备;只支持H264视频编码和AAC音频编码);
#“ws”:Websocket协议(一般用于H5视频播放器取流播放)。
streamProtocol: hls
# 传输协议(传输层协议),0:UDP,1:TCP,默认是TCP 注:GB28181 2011及以前版本只支持UDP传输
transmode: 1
#输出码流转封装格式,“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效,且不传值时默认为RTP封装协议。
streamform: ps
2.3 编写海康威视相关代码
2.3.1 解密工具类(GZipUtil)
package com.fz.coldchainbase.server.utils;
import com.myd.common.core.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZipUtil {
private final static Logger logger = LoggerFactory.getLogger(GZipUtil.class);
public static String compress(String str) {
if(StringUtils.isBlank(str)){
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = null;
try {
gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
} catch (IOException e) {
logger.error("字符串压缩错误",e);
} finally {
if (gzip != null) {
try {
gzip.close();
} catch (IOException e) {
logger.error("压缩流关闭失败",e);
}
}
}
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
}
public static String deCompress(String compressedStr) {
if(StringUtils.isBlank(compressedStr)){
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = null;
GZIPInputStream ginzip = null;
byte[] compressed = null;
String decompressed = null;
try {
compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
in = new ByteArrayInputStream(compressed);
ginzip = new GZIPInputStream(in);
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
logger.error("解压缩错误",e);
return null;
} finally {
if (ginzip != null) {
try {
ginzip.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
return decompressed;
}
}
2.3.2 海康威视配置类(HikvisionArtemisConfig)
package com.hikvision.sdk.config;
import com.fz.coldchainbase.server.common.config.NacosDataConfig;
import com.fz.coldchainbase.server.utils.GZipUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class HikvisionArtemisConfig {
@Autowired
private NacosDataConfig nacosDataConfig;
public ArtemisConfig setArtemisConfig(){
String ipAndPort = nacosDataConfig.getHkip()+":"+nacosDataConfig.getHkport();
String appKey = GZipUtil.deCompress(nacosDataConfig.getHkappKey());
String appSecret = GZipUtil.deCompress(nacosDataConfig.getHkappSecret());
return new ArtemisConfig(ipAndPort, appKey, appSecret);
}
}
2.3.3 海康Api相关的静态变量(HikvisionOpenAPIComstant)
package com.hikvision.sdk.constant;
public class HikvisionOpenAPIComstant {
public static Integer pageNoNum = 1;
public static Integer pageSizeNum = 1000;
public static String PAGENO = "pageNo";
public static String PAGESIZE = "pageSize";
public static String ZERO = "0";
public static String HKCODE = "code";
public static String HKMSG = "msg";
public static String HKDATA = "data";
public static String HKTOTAL = "total";
public static String HKLIST = "list";
public static String STARTTIME = "startTime";
public static String ENDTIME = "endTime";
public static String cameraIndexCode = "cameraIndexCode";
public static String cameraName = "cameraName";
public static String cameraType = "cameraType";
public static String cameraTypeName = "cameraTypeName";
public static String channelType = "channelType";
public static String channelTypeName = "channelTypeName";
public static String encodeDevIndexCode = "encodeDevIndexCode";
public static String regionIndexCode = "regionIndexCode";
public static String transTypeName = "transTypeName";
public static String indexCode = "indexCode";
public static String online = "online";
public static String onlineYes = "1";
public static String onlineNo = "0";
public static String streamType = "streamType";
public static String protocol = "protocol";
public static String transmode = "transmode";
public static String streamform = "streamform";
public static String url = "url";
public static String SVRINDEXCODE = "svrIndexCode";
public static String PICURI = "picUri";
public static String SORT = "sort";
public static String EVENTTIME = "eventTime";
public static String ORDER = "order";
public static String ASC = "asc";
public static String DESC = "desc";
public static String YYYYMMDDTHHMMSS = "yyyy-MM-dd'T'HH:mm:ssXXX";
public static String RESOURCETYPE = "resourceType";
public static String CAMERAINDEXCODE = "cameraIndexCode";
public static String ARTEMIS = "/artemis";
public static String EncodeDeviceDTO = "encodeDevice";
public static String CameraDTO = "camera";
public static String AcsDeviceDTO = "acsDevice";
public static String DoorDTO = "door";
public static String deviceResourceApi = ARTEMIS + "/api/irds/v2/deviceResource/resources";
public static String camerasByPageApi = ARTEMIS + "/api/resource/v1/cameras";
public static String searchCameraApi = ARTEMIS + "/api/resource/v2/camera/search";
public static String indexCodeCamerasApi = ARTEMIS + "/api/resource/v1/cameras/indexCode";
public static String previewURLsCamerasApi = ARTEMIS + "/api/video/v2/cameras/previewURLs";
public static String getCameraStatusApi = ARTEMIS + "/api/nms/v1/online/camera/get";
public static String searchAcsDeviceApi = ARTEMIS + "/api/resource/v2/acsDevice/search";
public static String getDeviceStatusApi = ARTEMIS + "/api/nms/v1/online/acs_device/get";
public static String getDoorEvents = ARTEMIS + "/api/acs/v2/door/events";
public static String getEventPictures = ARTEMIS + "/api/acs/v1/event/pictures";
}
2.3.4 海康威视门禁通用业务类(AccessCommonService)
package com.hikvision.sdk.service;
import com.alibaba.fastjson.JSON;
import com.fz.coldchainbase.server.common.config.NacosDataConfig;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hikvision.sdk.config.HikvisionArtemisConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class AccessCommonService {
private static Logger logger = LoggerFactory.getLogger(AccessCommonService.class);
@Autowired
private NacosDataConfig nacosDataConfig;
@Autowired
private HikvisionArtemisConfig hikvisionArtemisConfig;
public String getSearchAcsDeviceApi(String jsonBody){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.searchAcsDeviceApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
} catch (Exception e) {
logger.error("查询门禁设备列表v2出现异常:{}",e.getMessage());
}
return null;
}
public String getDeviceStatusApi(String jsonBody){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.getDeviceStatusApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
} catch (Exception e) {
logger.error("获取门禁设备在线状态出现异常:{}",e.getMessage());
}
return null;
}
public String getDoorEvents(String jsonBody){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.getDoorEvents);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
} catch (Exception e) {
logger.error("查询门禁点事件出现异常:{}",e.getMessage());
}
return null;
}
public String getEventPictures(String svrIndexCode,String picUri){
Map<String, Object> map = new HashMap<>();
map.put(HikvisionOpenAPIComstant.SVRINDEXCODE,svrIndexCode);
map.put(HikvisionOpenAPIComstant.PICURI,picUri);
String jsonBody = JSON.toJSONString(map);
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.getEventPictures);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
} catch (Exception e) {
logger.error("获取门禁设备在线状态出现异常:{}",e.getMessage());
}
return null;
}
}
2.3.5 海康威视(摄像头)视屏监控通用(CameraCommonService)
package com.hikvision.sdk.service;
import com.alibaba.fastjson.JSONObject;
import com.fz.coldchainbase.server.common.config.NacosDataConfig;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hikvision.sdk.config.HikvisionArtemisConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CameraCommonService {
private static Logger logger = LoggerFactory.getLogger(CameraCommonService.class);
@Autowired
private NacosDataConfig nacosDataConfig;
@Autowired
private HikvisionArtemisConfig hikvisionArtemisConfig;
public String getCamerasByPageApi(Integer pageNo, Integer pageSize){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
if(pageNo == null) pageNo = HikvisionOpenAPIComstant.pageNoNum;
if(pageSize == null) pageSize = HikvisionOpenAPIComstant.pageSizeNum;
Map<String, Integer> map = new HashMap<>();
map.put(HikvisionOpenAPIComstant.PAGENO, pageNo);
map.put(HikvisionOpenAPIComstant.PAGESIZE, pageSize);
String body = JSONObject.toJSONString(map);
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.camerasByPageApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
} catch (Exception e) {
logger.error("分页获取监控点资源出现异常:{}",e.getMessage());
}
return null;
}
public String getSearchCameraApi(String json){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path
= new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.searchCameraApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, json, null, null, "application/json");
} catch (Exception e) {
logger.error("查询监控点列表v2出现异常:{}",e.getMessage());
}
return null;
}
public String getIndexCodeCamerasApi(String cameraIndexCode){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> map = new HashMap<>();
map.put(HikvisionOpenAPIComstant.CAMERAINDEXCODE, cameraIndexCode);
String body = JSONObject.toJSONString(map);
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.indexCodeCamerasApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
} catch (Exception e) {
logger.error("根据编号获取监控点详细信息出现异常:{}",e.getMessage());
}
return null;
}
public String getPreviewURLsCamerasApi(String jsonbody){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.previewURLsCamerasApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonbody, null, null, "application/json");
} catch (Exception e) {
logger.error("获取监控点预览取流URLv2出现异常:{}",e.getMessage());
}
return null;
}
public String getCameraStatusApi(String jsonbody){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.getCameraStatusApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonbody, null, null, "application/json");
} catch (Exception e) {
logger.error("获取监控点在线状态出现异常:{}",e.getMessage());
}
return null;
}
}
2.3.6 海康威视设备资源通用(DeviceResourceCommonService)
package com.hikvision.sdk.service;
import com.alibaba.fastjson.JSONObject;
import com.fz.coldchainbase.server.common.config.NacosDataConfig;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hikvision.sdk.config.HikvisionArtemisConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class DeviceResourceCommonService {
private static Logger logger = LoggerFactory.getLogger(DeviceResourceCommonService.class);
@Autowired
private NacosDataConfig nacosDataConfig;
@Autowired
private HikvisionArtemisConfig hikvisionArtemisConfig;
public String getDeviceResourceApi(Integer pageNo, Integer pageSize, String resourceType){
ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
if(pageNo == null) pageNo = HikvisionOpenAPIComstant.pageNoNum;
if(pageSize == null) pageSize = HikvisionOpenAPIComstant.pageSizeNum;
Map<String, Object> map = new HashMap<>();
map.put(HikvisionOpenAPIComstant.PAGENO, pageNo);
map.put(HikvisionOpenAPIComstant.PAGESIZE, pageSize);
map.put(HikvisionOpenAPIComstant.RESOURCETYPE, resourceType);
String body = JSONObject.toJSONString(map);
Map<String, String> path = new HashMap<String, String>(2) {
{
put(nacosDataConfig.getProtocol(), HikvisionOpenAPIComstant.deviceResourceApi);
}
};
try {
return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
} catch (Exception e) {
logger.error("获取资源列表出现异常:{}",e.getMessage());
}
return null;
}
}
3. 扩展
3.1 视音频播放
海康威视提供了多种视音频播放方案,具体可以在官网查看详细文档。
3.2 工具下载
可以在海康威视的官网底部找到工具下载入口,下载所需的硬件产品和综合安防管理平台相关工具。
以上就是使用Java对接海康威视iSecure Center综合安防管理平台的基本步骤和代码示例。希望对你有所帮助。