关于JAVA如何对接海康威视(iSecure Center综合安防管理平台)门禁和摄像头视频取流

前言

  • 根据自己的需求灵活选用对接方式。我们客户购买了海康的综合安防管理平台,经与海康交流过后,我这里选择直接通过调用海康的综合安防管理平台的Open Api进行对接
  • 这篇文章只包含java如何对接海康威视,不涉及前端具体技术
  • 需求:对接海康威视的视频与门禁。(1)大屏可视化,实现视频的取流,摄像头监控实时预览。(2)获取摄像头监控点与门禁设备的状态,是否运行正常(3)获取门禁设备的事件,用户进出情况记录。
  • 大致对接流程:注册登录后,在场景方案中选择基础对接,先了解接口安全认证规则,确保必要参数客户/海康已经提供,选择集成Java安全认证库,下载OpenApi安全认证库(JAVA),解压后,在项目中引用相关jar包,调用jar包中ArtemisHttpUtil类的相关方法即可。
  • 一些常用的视频与门禁相关,均已封装好,在文章里直接复制即可
  • 注: (RTSP/RTMP/HLS) 三种取流方式可参考:http://t.csdnimg.cn/tKu1J

1. 海康威视(iSecure Center综合安防管理平台)

1.1 注册与认证

(1)海康开放平台地址:海康开放平台

(2)注册与登录:有账号直接登录即可,没有就注册一下账号。

(3)注册完成后直接登录,在开放体系下即可看到综合安防管理平台的入口。

1.2 对接方式选型

1.2.1 场景方案与开发指南

进入综合安防管理平台,点击场景方案,先了解方案,再进行选型。

点击开发指南,即可查看一些对接指南与API:

1.2.1.1 基础对接-接口安全认证规则

(1)先了解接口安全认证规则

(2)注意事项

这里就简单了解一下各名词啥意思就行,最后能用到的就只有:host、appKey、appSecret

这三个如果没有,需要你向客户/海康去询问。还需了解清楚是否可以通过外网调用(host、appKey、appSecret是内网的信息还是外网的信息)。如果是内网,先沟通是否可以提供外网,实在不行就只能去现场调试了。

1.2.1.2 基础对接-集成java安全认证库

(1)下载java安全认证库:在项目中引入安全认证库的jar包

  • 点击下载java安全认证库,进入工具下载界面
    • 注:综合安防管理平台的相关工具,都可以在这下载,其中还包含了前端对接的一些插件与开发包,后端的一些sdk,安全认证库,测试工具。

  • 选择OpenAPI安全认证库(JAVA),进行下载,里面包含一些必须得jar包与开发文档

下载后进行进行解压,详情如下

开发之前,建议阅读一下开发文档

1.2.2 视频和门禁

注:视频一般分为编码设备和监控点。根据自己需求来。

门禁一般分为门禁设备和门禁点。根据自己需求来。

(1)视频

在场景方案中,根据自己的需求选择相关操作。

点击进去,一般都会有流程,根据流程一步步调用接口即可。

(2)门禁

门禁在一卡通权限管理及应用中:

根据流程进行操作即可:

(3)对于某些接口不明白,可以直接询问客服即可

输入人工服务即可:

2. 开始对接

2.1 导入Maven依赖

2.1.1 使用maven公共库中的,可能不是最新的

OpenAPI 安全认证库 (Java) maven依赖坐标: 开发前请先导入 artemis-http-client.jar
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.3</version>
</dependency>

maven库:https://mvnrepository.com/artifact/com.hikvision.ga/artemis-http-client

最新的版本为1.1.3,如果想用更新的版本,就手动导入指定jar包即可

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>

刷新依赖后会报错,没事,找到你自己本地的maven库,手动创建即可

将jar包,放入指定文件夹:

重新刷新依赖即可:如果重新刷新还不行,请参考:http://t.csdnimg.cn/Jpxb6

2.2 在yml文件中,配置海康api所需信息

这里的appSecret、appKey,为了安全是加密后的,使用的时候解密即可

#根据现场情况进行调整:"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

编写配置类,动态获取yml配置信息:

package com.fz.coldchainbase.server.common.config;


import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;


/**
 * 读nacos中相关配置
 * @Author ZhaoShuHao
 * @Date 2023/10/17 9:58
 */
@Data
@Component
@RefreshScope
public class NacosDataConfig {
    /**
     * 海康威视相关
     */
    @Value("${hikvision.Protocol}")
    private String Protocol;
    @Value("${hikvision.streamType}")
    private Integer streamType;
    @Value("${hikvision.ip}")
    private String hkip;
    @Value("${hikvision.port}")
    private String hkport;
    @Value("${hikvision.appKey}")
    private String hkappKey;
    @Value("${hikvision.appSecret}")
    private String hkappSecret;
    @Value("${hikvision.streamProtocol}")
    private String streamProtocol;
    @Value("${hikvision.transmode}")
    private Integer transmode;
    @Value("${hikvision.streamform}")
    private String streamform;

}

2.2 编写海康威视相关代码

具体传参,根据海康开放平台api文档要求进行组装数据。

2.2.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;

/**
 * @Author huliang
 * @Created by 2023/9/4
 */
public class GZipUtil {
    private final static Logger logger = LoggerFactory.getLogger(GZipUtil.class);
    /**
     * 压缩进行base64加密
     * @param str
     * @return
     */
    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());
    }

    /**
     * base64解密进行解压缩
     * @param compressedStr
     * @return
     */
    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.2.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;

/**
 * @Author ZhaoShuHao
 * @Date 2024/4/18 13:42
 */
@Component
public class HikvisionArtemisConfig {
    @Autowired
    private NacosDataConfig nacosDataConfig;
    /**
     * 请根据技术支持提供的实际的平台IP/端口和API网关中的合作方信息更换static静态块中的三个参数.
     * [1 host]
     * 		host格式为IP:Port,如10.0.0.1:443
     * 		当使用https协议调用接口时,IP是平台(nginx)IP,Port是https协议的端口;
     *     当使用http协议调用接口时,IP是artemis服务的IP,Port是artemis服务的端口(默认9016)。
     * [2 appKey和appSecret]
     * 		请按照技术支持提供的合作方Key和合作方Secret修改
     * 	    appKey:合作方Key
     * 	    appSecret:合作方Secret
     * 调用前看清接口传入的是什么,是传入json就用doPostStringArtemis方法,是表单提交就用doPostFromArtemis方法
     *
     */
    public ArtemisConfig setArtemisConfig(){
        //代理API网关nginx服务器ip端口
        String ipAndPort = nacosDataConfig.getHkip()+":"+nacosDataConfig.getHkport();
        // 秘钥appkey
        String appKey = GZipUtil.deCompress(nacosDataConfig.getHkappKey());
        // 秘钥appSecret
        String appSecret = GZipUtil.deCompress(nacosDataConfig.getHkappSecret());
        ArtemisConfig config = new ArtemisConfig(ipAndPort,appKey,appSecret);
        return config;
    }
}

2.2.3 海康Api相关的静态变量(HikvisionOpenAPIComstant)

package com.hikvision.sdk.constant;

/**
 * 海康威视openAPI相关
 * @Author ZhaoShuHao
 * @Date 2024/4/16 14:58
 */
public class HikvisionOpenAPIComstant {
    /**
     * pageNo:范围 ( 0 , ~ ),若是范围内数字超过实际最大页码值,返回最后一页记录 注:0 < pageNo
     * pageSize 范围 ( 0 , 1000 ] 注:0 < pageSize≤1000
     */
    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";   //0:接口业务处理成功,
    //海康api通用标识
    public static String HKCODE = "code";   //返回码,0:接口业务处理成功,
    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";   //结束时间标识

    //海康获取监控点列表接api接口的返回值标识
    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";           //接入协议类型说明
    //海康获取监控点在线状态api接口的返回值标识
    public static String indexCode = "indexCode";           //资源(监控点)唯一编码
    public static String online = "online";           //在线状态,0离线,1在线
    public static String onlineYes = "1";           //在线状态,1在线
    public static String onlineNo = "0";           //在线状态,0离线,1在线
    //获取监控点预览取流api接口返回值
    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";           //取流URL
    //获取门禁事件和图片api相关
    public static String SVRINDEXCODE = "svrIndexCode";           //提供picUri处会提供此字段
    public static String PICURI = "picUri";           //图片相对地址
    public static String SORT = "sort";           //排序字段标识
    public static String EVENTTIME = "eventTime";           //事件产生时间
    public static String ORDER = "order";           //升/降序(指定排序字段是使用升序(asc)还是降序(desc)
    public static String ASC = "asc";               //升序(asc)
    public static String DESC = "desc";             //降序(desc)
    //字符串格式化标识,含有偏移量
    public static String YYYYMMDDTHHMMSS = "yyyy-MM-dd'T'HH:mm:ssXXX";



    /**
     * 资源类型
     */
    public static String RESOURCETYPE = "resourceType";
    /**
     * 监控点编号,可通过分页获取监控点资源获取
     */
    public static String CAMERAINDEXCODE = "cameraIndexCode";
    /**
     * API网关后端服务(artemis)的上下文为“/artemis”
     */
    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";
    /**
     * 获取资源列表v2:根据资源类型分页获取资源列表,主要用于资源信息的全量同步。
     */
    public static String deviceResourceApi = ARTEMIS + "/api/irds/v2/deviceResource/resources";
    /**
     * 分页获取监控点资源:获取监控点列表接口可用来全量同步监控点信息,返回结果分页展示。
     */
    public static String camerasByPageApi = ARTEMIS + "/api/resource/v1/cameras";
    /**
     *  查询监控点列表v2:根据条件查询目录下有权限的监控点列表。当返回字段对应的值为空时,该字段不返回。
     */
    public static String searchCameraApi = ARTEMIS + "/api/resource/v2/camera/search";
    /**
     * 根据编号获取监控点详细信息:获取单个监控点信息是指根据监控点唯一标识来获取指定的监控点信息。
     */
    public static String indexCodeCamerasApi = ARTEMIS + "/api/resource/v1/cameras/indexCode";
    /**
     * 获取监控点预览取流URLv2:
     * 1.平台正常运行;平台已经添加过设备和监控点信息。
     * 2.平台需要安装mgc取流服务。
     * 3.通过openAPI获取到监控点数据,依据自身业务开发监控点导航界面。
     * 4.根据监控点编号调用本接口获取预览取流URL,协议类型包括:hik、rtsp、rtmp、hls、ws。
     * 5.通过开放平台的开发包进行实时预览或者使用标准的GUI播放工具进行实时预览。
     * 6.为保证数据的安全性,取流URL设有有效时间,有效时间为5分钟。
     */
    public static String previewURLsCamerasApi = ARTEMIS + "/api/video/v2/cameras/previewURLs";
    /**
     * 获取监控点在线状态:
     * 根据条件获取监控点在线状态接口
     * 级联场景下, 如需调用需要在 "系统配置–>网络管理配置–>下级平台管理” 中进行配置
     */
    public static String getCameraStatusApi = ARTEMIS + "/api/nms/v1/online/camera/get";
    /**
     * 查询门禁设备列表v2:
     * 根据条件查询目录下有权限的门禁设备列表。
     * 当返回字段对应的值为空时,该字段不返回。
     */
    public static String searchAcsDeviceApi = ARTEMIS + "/api/resource/v2/acsDevice/search";
    /**
     * 获取门禁设备在线状态:根据条件获取门禁设备在线状态接口
     */
    public static String getDeviceStatusApi = ARTEMIS + "/api/nms/v1/online/acs_device/get";

    /**
     * 查询门禁点事件v2:
     * 功能描述:该接口可以查询发生在门禁点上的人员出入事件,支持多个维度来查询,支持按时间、人员、门禁点、事件类型四个维度来查询;
     * 其中按事件类型来查询的方式,如果查询不到事件,存在两种情况,一种是该类型的事件没有发生过,所以查询不到,还有一种情况,该类型的事件发生过,
     * 但是由于门禁管理组件对该事件类型订阅配置处于关闭状态,所以不会存储该类型的事件,导致查询不到,对于这种情况,需要到门禁管理组件中,将该事件类型的订阅配置打开。
     */
    public static String getDoorEvents = ARTEMIS + "/api/acs/v2/door/events";
    /**
     * 获取门禁事件的图片:
     * 获取门禁事件的图片,配合门禁实时订阅事件附录D2.1 门禁事件使用,或配合查询门禁点事件v2接口使用
     */
    public static String getEventPictures = ARTEMIS + "/api/acs/v1/event/pictures";
}

2.2.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 static com.hikvision.sdk.constant.HikvisionOpenAPIComstant.*;
import java.util.HashMap;
import java.util.Map;


/**
 * 海康威视,门禁通用
 * @Author ZhaoShuHao
 * @Date 2024/4/18 13:38
 */
@Component
public class AccessCommonService {
    private static Logger logger = LoggerFactory.getLogger(AccessCommonService.class);

    @Autowired
    private NacosDataConfig nacosDataConfig;
    @Autowired
    private HikvisionArtemisConfig hikvisionArtemisConfig;


    /**
     * 查询门禁设备列表v2:根据条件查询目录下有权限的门禁设备列表。当返回字段对应的值为空时,该字段不返回。
     *@param jsonBody  pageNo与pageSize必传
     *       {
     *     "name": "test",
     *     "regionIndexCodes": [
     *         "8fyc8qw8280y0y43"
     *     ],
     *     "isSubRegion": true,
     *     "pageNo": 1,
     *     "pageSize": 1,
     *     "authCodes": [
     *         "view"
     *     ],
     *     "expressions": [
     *         {
     *             "key": "indexCode",
     *             "operator": 0,
     *             "values": [
     *                 "ayd8y80y1y082ye01y2e8"
     *             ]
     *         }
     *     ],
     *     "orderBy": "name",
     *     "orderType": "desc"
     * }
     * @return
     */
    public String getSearchAcsDeviceApi(String jsonBody){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), searchAcsDeviceApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("查询门禁设备列表v2出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 获取门禁设备在线状态:根据条件获取门禁设备在线状态接口
     * @param jsonBody
     * {
     *     "regionId": "root000000",
     *     "ip": "10.33.43.135",
     *     "indexCodes": [
     *         "f98y8c28y85y7y213c082yu95yu"
     *     ],
     *     "status": "1",
     *     "pageNo": 1,
     *     "pageSize": 20,
     *     "includeSubNode": "1"
     * }
     * @return
     */
    public String getDeviceStatusApi(String jsonBody){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), getDeviceStatusApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("获取门禁设备在线状态出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 查询门禁点事件v2:
     * @param jsonBody  pageNo与pageSize必填
     * {
     *     "pageNo": 1,
     *     "pageSize": 10,
     *     "doorIndexCodes": [
     *         "1f276203e5234bdca08f7d99e1097bba"
     *     ],
     *     "doorName": "11",
     *     "readerDevIndexCodes": [
     *         "1f2762v4523547374"
     *     ],
     *     "startTime": "2018-05-21T12:00:00+08:00",
     *     "endTime": "2018-05-21T12:00:00+08:00",
     *     "receiveStartTime": "2018-05-21T12:00:00+08:00",
     *     "receiveEndTime": "2018-05-21T12:00:00+08:00",
     *     "doorRegionIndexCodes": [
     *         "c654234f-61d4-4dcd-9d21-e7a45e0f1334",
     *     ],
     *
     *     "eventTypes": [
     *         10
     *     ],
     *     "personName": "xx",
     *     "sort": "personName",
     *     "order": "asc"
     * }
     * @return
     */
    public String getDoorEvents(String jsonBody){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), getDoorEvents);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("查询门禁点事件出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 获取门禁事件的图片
     * @param svrIndexCode  图片存储服务的唯一标识
     * @param picUri  图片相对地址
     * @return
     */
    public String getEventPictures(String svrIndexCode,String picUri){
        Map<String, Object> map = new HashMap<>();
        map.put(SVRINDEXCODE,svrIndexCode);
        map.put(PICURI,picUri);
        String jsonBody = JSON.toJSONString(map);
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), getEventPictures);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonBody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("获取门禁设备在线状态出现异常:{}",e.getMessage());
        }
        return null;
    }




}

2.2.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 static com.hikvision.sdk.constant.HikvisionOpenAPIComstant.*;
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 org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;


/**
 * 海康威视(摄像头)视屏监控通用
 * @Author ZhaoShuHao
 * @Date 2024/4/18 9:55
 */
@Component
public class CameraCommonService {
    private static Logger logger = LoggerFactory.getLogger(CameraCommonService.class);

    @Autowired
    private NacosDataConfig nacosDataConfig;
    @Autowired
    private HikvisionArtemisConfig hikvisionArtemisConfig;

    /**
     * 分页获取监控点资源:https://ip:port/artemis/api/resource/v1/cameras
     * @param pageNo 范围 ( 0 , ~ ),若是范围内数字超过实际最大页码值,返回最后一页记录 注:0 < pageNo
     * @param pageSize 范围 ( 0 , 1000 ] 注:0 < pageSize≤1000
     * @return
     */
    public String getCamerasByPageApi(Integer pageNo,Integer pageSize){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        if(pageNo == null){pageNo = pageNoNum;}
        if(pageSize == null){pageSize = pageSizeNum;}
        Map<String, Integer> map = new HashMap<>();
        map.put(PAGENO,pageNo);
        map.put(PAGESIZE,pageSize);
        String body = JSONObject.toJSONString(map);
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), camerasByPageApi);
            }
        };
        //接口调用超时时间设置(单位毫秒),以下示例10s
        //Constants.DEFAULT_TIMEOUT = 10000;
        try {
           return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
        } catch (Exception e) {
            logger.error("分页获取监控点资源出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 查询监控点列表v2:根据条件查询目录下有权限的监控点列表。当返回字段对应的值为空时,该字段不返回。
     * @param json  查询条件,json格式,需转化成字符串
     *           {
     *     "name": "test",
     *     "regionIndexCodes": [
     *         "8fyc8qw8280y0y43"
     *     ],
     *     "isSubRegion": true,
     *     "pageNo": 1,
     *     "pageSize": 1,
     *     "authCodes": [
     *         "view"
     *     ],
     *     "expressions": [
     *         {
     *             "key": "indexCode",
     *             "operator": 0,
     *             "values": [
     *                 "ayd8y80y1y082ye01y2e8"
     *             ]
     *         }
     *     ],
     *     "orderBy": "name",
     *     "orderType": "desc"
     * }
     * @return
     */
    public String getSearchCameraApi(String json){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), searchCameraApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, json, null, null, "application/json");
        } catch (Exception e) {
            logger.error("查询监控点列表v2出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 根据编号获取监控点详细信息:获取单个监控点信息是指根据监控点唯一标识来获取指定的监控点信息。
     * @param cameraIndexCode  监控点编号,可通过分页获取监控点资源获取
     * @return
     */
    public String getIndexCodeCamerasApi(String cameraIndexCode){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> map = new HashMap<>();
        map.put(CAMERAINDEXCODE,cameraIndexCode);
        String body = JSONObject.toJSONString(map);
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), indexCodeCamerasApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
        } catch (Exception e) {
            logger.error("根据编号获取监控点详细信息出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 获取监控点预览取流URLv2:
     * 1.平台正常运行;平台已经添加过设备和监控点信息。
     * 2.平台需要安装mgc取流服务。
     * 3.通过openAPI获取到监控点数据,依据自身业务开发监控点导航界面。
     * 4.根据监控点编号调用本接口获取预览取流URL,协议类型包括:hik、rtsp、rtmp、hls、ws。
     * 5.通过开放平台的开发包进行实时预览或者使用标准的GUI播放工具进行实时预览。
     * 6.为保证数据的安全性,取流URL设有有效时间,有效时间为5分钟。
     * @param jsonbody
     *       {
     *     "cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
     *     "streamType": 0,
     *     "protocol": "rtsp",
     *     "transmode": 1,
     *     "expand": "transcode=0",
     *     "streamform": "ps"
     *      }
     * @return
     */
    public String getPreviewURLsCamerasApi(String jsonbody){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();

        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), previewURLsCamerasApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonbody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("获取监控点预览取流URLv2出现异常:{}",e.getMessage());
        }
        return null;
    }

    /**
     * 获取监控点在线状态:根据条件获取监控点在线状态接口
     * 级联场景下, 如需调用需要在 "系统配置–>网络管理配置–>下级平台管理” 中进行配置
     * @param jsonbody
     *      {
     *     "regionId": "root000000",
     *     "includeSubNode": "1",
     *     "indexCodes": [
     *         "f98y8c28y85y7y213c082yu95yu"
     *     ],
     *     "status": "1",
     *     "pageNo": 1,
     *     "pageSize": 20
     *      }
     * @return
     */
    public String getCameraStatusApi(String jsonbody){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), getCameraStatusApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, jsonbody, null, null, "application/json");
        } catch (Exception e) {
            logger.error("获取监控点在线状态出现异常:{}",e.getMessage());
        }
        return null;
    }
}

2.2.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;
import static com.hikvision.sdk.constant.HikvisionOpenAPIComstant.*;

/**
 * 海康威视,设备资源通用
 * @Author ZhaoShuHao
 * @Date 2024/4/18 14:00
 */
@Component
public class DeviceResourceCommonService {
    private static Logger logger = LoggerFactory.getLogger(DeviceResourceCommonService.class);

    @Autowired
    private NacosDataConfig nacosDataConfig;
    @Autowired
    private HikvisionArtemisConfig hikvisionArtemisConfig;
    /**
     * 获取资源列表v2(设备通用):根据资源类型分页获取资源列表,主要用于资源信息的全量同步。
     * @param pageNo    范围 ( 0 , ~ ),若是范围内数字超过实际最大页码值,返回最后一页记录 注:0 < pageNo
     * @param pageSize 范围 ( 0 , 1000 ] 注:0 < pageSize≤1000
     * @param resourceType
     * @return
     */
    public String getDeviceResourceApi(Integer pageNo,Integer pageSize,String resourceType){
        ArtemisConfig config = hikvisionArtemisConfig.setArtemisConfig();
        if(pageNo == null){pageNo = pageNoNum;}
        if(pageSize == null){pageSize = pageSizeNum;}
        Map<String, Object> map = new HashMap<>();
        map.put(PAGENO,pageNo);
        map.put(PAGESIZE,pageSize);
        map.put(RESOURCETYPE,resourceType);
        String body = JSONObject.toJSONString(map);
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put(nacosDataConfig.getProtocol(), deviceResourceApi);
            }
        };
        try {
            return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json");
        } catch (Exception e) {
            logger.error("获取资源列表出现异常:{}",e.getMessage());
        }
        return null;
    }
}

3. 扩展

3.1 视音频播放

官网上提供了4个方案,在取流成功后,进行视频播放操作:

3.2 工具下载

可在网页底部,点击工具下载,跳转到下载页面

下载主要分为:综合安防管理平台和硬件产品:

硬件产品,又可以进行详细分类,总能满足要求:

  • 25
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值