1、jar包直接导入

从官网下载的jar包有3个,把他们导入到resources/lib目录下去。

在pom.xml里面配置本地jar的依赖。

<!--   引入本地resources/lib下的jar包     -->
<dependency>
    <groupId>local</groupId>
    <artifactId>hik</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/artemis-http-client-1.1.13.RELEASE.jar</systemPath>
</dependency>

2、maven依赖

<!-- https://mvnrepository.com/artifact/com.hikvision.ga/artemis-http-client -->
<dependency>
    <groupId>com.hikvision.ga</groupId>
    <artifactId>artemis-http-client</artifactId>
    <version>1.1.3</version>
</dependency>

3、参考测试类

import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 海康视频流获取
 * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=%E5%AF%B9%E6%8E%A5%E6%8C%87%E5%8D%97">...</a>
 *
 * @author llmoe
 * @date 2024/7/28 10:43
 * @since 1.0.0
 */
@Slf4j
public class HikvisionUtil {

    /**
     * 能力开放平台的网站路径
     */
    private static final String ARTEMIS_PATH = "/artemis";

    /**
     * 分页获取监控点资源
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%B5%84%E6%BA%90#ef459f4b">...</a>
     */
    private static final String CAMERAS = "/api/resource/v1/cameras";

    /**
     * 获取监控点预览取流URL
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%83%BD%E5%8A%9B">...</a>
     */
    private static final String PREVIEW_URLS = "/api/video/v2/cameras/previewURLs";

    /**
     * 获取监控点回放取流URL
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%83%BD%E5%8A%9B">...</a>
     */
    private static final String PLAYBACK_URLS = "/api/video/v2/cameras/playbackURLs";

    /**
     * 请求类型
     */
    private static final String CONTENT_TYPE = "application/json";

    /**
     * 成功返回码
     */
    private static final String SUCCESS = "0";


    /**
     * 分页获取监控点资源
     *
     * @param appKey    访问密钥ID
     * @param appSecret 与访问密钥ID结合使用的密钥
     * @param host      平台门户/nginx的IP和端口(必须https)
     */
    public static JSONArray getCameras(String host, String appKey, String appSecret) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + CAMERAS).build();

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        JSONObject jsonBody = new JSONObject();
        jsonBody.set("pageSize", 10000);
        jsonBody.set("pageNo", 1);
        // 调用接口
        String result = ArtemisHttpUtil.doPostStringArtemis(path, jsonBody.toString(), null, null, CONTENT_TYPE, null);
        // 获取返回结果
        JSONObject data = getData(result);
        return data.getJSONArray("list");
    }


    /**
     * 校验结果并且获取data
     *
     * @param result 返回参数
     */
    private static JSONObject getData(String result) {
        // 获取返回结果
        JSONObject object = JSONUtil.parseObj(result);
        //返回码,0 – 成功,其他- 失败,参考附录E.1.1 视频应用错误码
        if (!SUCCESS.equals(object.getStr("code"))) {
            throw new RuntimeException("海康平台返回失败:" + object.getStr("msg"));
        }
        return object.getJSONObject("data");
    }


    /**
     * 获取海康视频流URL(取流URL设有有效时间,有效时间为5分钟。)
     *
     * @param appKey          访问密钥ID
     * @param appSecret       与访问密钥ID结合使用的密钥
     * @param host            平台门户/nginx的IP和端口(必须https)
     * @param cameraIndexCode 监控点唯一标识,分页获取监控点资源接口获取返回参数cameraIndexCode
     */
    public String getVideoPreviewUrl(String cameraIndexCode, String host, String appKey, String appSecret) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + PREVIEW_URLS).build();

        JSONObject parameter = new JSONObject();
        // 监控点唯一标识
        parameter.set("cameraIndexCode", cameraIndexCode);
        // 码流类型,0:主码流 1:子码流 2:第三码流 参数不填,默认为主码流
        parameter.set("streamType", 0);
        // 取流协议(应用层协议
        parameter.set("protocol", "rtsp");
        // 传输协议(传输层协议),0:UDP 1:TCP
        parameter.set("transmode", 1);
        // 输出码流转封装格式,“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效,且不传值时默认为RTP封装协议。
        parameter.set("streamform", "rtp");

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        String result = ArtemisHttpUtil.doPostStringArtemis(path, parameter.toString(), null, null, CONTENT_TYPE, null);

        JSONObject info = getData(result);

        return info.getStr("url");
    }

    /**
     * 获取监控点回放取流URL
     *
     * @param appKey          访问密钥ID
     * @param appSecret       与访问密钥ID结合使用的密钥
     * @param host            平台门户/nginx的IP和端口(必须https)
     * @param cameraIndexCode 监控点唯一标识,分页获取监控点资源接口获取返回参数cameraIndexCode
     **/
    public JSONObject getVideoHistoryUrl(String cameraIndexCode, String host, String appKey, String appSecret,
                                         String beginTime,//"2022-07-22T09:58:58.000+08:00"
                                         String endTime//"2022-07-22T10:00:00.000+08:00"
    ) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + PLAYBACK_URLS).build();

        JSONObject parameter = new JSONObject();
        // 监控点唯一标识
        parameter.set("cameraIndexCode", cameraIndexCode);
        // 取流协议(应用层协议)
        parameter.set("protocol", "rtsp");
        //传输协议(传输层协议)0:UDP 1:TCP 默认为TCP,在protocol设置为rtsp或者rtmp时有效
        parameter.set("transmode", 1);
        // 查询录像的锁定类型,0-查询全部录像;1-查询未锁定录像;2-查询已锁定录像,不传默认值为0。
        parameter.set("lockType", 0);
        // 开始查询时间(IOS8601格式:yyyy-MM-dd’T’HH:mm:ss.SSSXXX)
        parameter.set("beginTime", beginTime);
        // 结束查询时间,开始时间和结束时间相差不超过三天;(IOS8601格式:yyyy-MM-dd’T’HH:mm:ss.SSSXXX)
        parameter.set("endTime", endTime);

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        String result = ArtemisHttpUtil.doPostStringArtemis(path, parameter.toString(), null, null, CONTENT_TYPE, null);

        return getData(result);
    }
}

4、实际操作

package com.hm.manage.utils;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hm.common.constant.Constants;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.util.UriComponentsBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class XMLParserExample {

    // 获取配置文件里的参数
    @Value("${hikvision.baseurl}")
    private String baseurl;

    @Value("${hikvision.appKey}")
    private String appKey;

    @Value("${hikvision.appSecret}")
    private String appSecret;

    private static final String ARTEMIS_PATH = "/artemis";

    public static void main(String[] args) {
        // 创建ArtemisConfig对象,并设置相关参数
        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost("172.18.16.170:8443");
        artemisConfig.setAppKey("21447931");
        artemisConfig.setAppSecret("7DhXWntBQcajDpI8v9jz");
        //log.info("baseurl:{},appKey:{},appSecret:{}", baseurl, appKey, appSecret);
        final String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/cameras/indexCode";
        Map<String, String> path = new HashMap<>();
        path.put("https://", getCamsApi);
        // 构造请求体
        Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
        paramMap.put("cameraIndexCode", "a183125d2c7440d4af2d9091c2087afd");
        String body = JSON.toJSON(paramMap).toString();
        //发送请求
        String s = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json",null);
        JSONObject data = getData(s);

        log.info("返回结果:{}", data.get("name"));



    }


    /**
     * 校验结果并且获取data
     *
     * @param result 返回参数
     */
    private static JSONObject getData(String result) {
        // 把结果解析为JSON对象
        JSONObject object = JSON.parseObject(result);
        // 获取json中的code
        Object code = object.get("code");
        if (code.equals("0")) {
            Object data = object.get("data");
            log.info("getData返回结果data:{}", data);
            return JSON.parseObject(JSON.toJSONString(data));
        } else {
            return null;
        }

    }




}

可以看到返回的结果