zhanghua
2023-09-08 7ef4892f9f24f941aca37e6b3991b808a0aca619
ycl-platform/src/main/java/com/ycl/util/VideoUtil.java
@@ -1,13 +1,19 @@
package com.ycl.util;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycl.api.CommonResult;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.ycl.dto.v1.Req.FirstReq;
import com.ycl.dto.v1.Req.SecondReq;
import com.ycl.dto.v1.Res.FirstRes;
import com.ycl.dto.video.Camera;
import com.ycl.dto.video.HttpResponseResult;
import com.ycl.dto.video.PageResult;
import com.ycl.utils.MD5Util;
import lombok.SneakyThrows;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.http.client.ClientHttpResponse;
@@ -17,6 +23,9 @@
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class VideoUtil {
@@ -40,74 +49,178 @@
     **/
    @SneakyThrows
    public String getVideo(String code, String scheme, Integer subType) {
        System.out.println("开始视频请求:" + code);
        String clientType = "winpc";
        String reqUrl = "/videoService/accounts/authorize";
        String deviceUrl = "/videoService/devicesManager/devices";
        // System.out.println("开始视频请求:" + code);
        try {
            String clientType = "winpc";
            String reqUrl = "/videoService/accounts/authorize";
            String deviceUrl = "/videoService/devicesManager/devices";
//        String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
        String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=&regionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId=";
        if (!"RTSP".equals(scheme)) {
            monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
            String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=&regionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId=";
            if (!"RTSP".equals(scheme)) {
                monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
            }
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
                @Override
                public boolean hasError(HttpStatus status) {
                    return super.hasError(status);
                }
                @Override
                public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
                }
            });
            SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
            simpleClientHttpRequestFactory.setOutputStreaming(false);
            restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
            //请求头
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_JSON);
            //第一次权限请求体
            FirstReq firstReq = new FirstReq();
            firstReq.setIpAddress(ip);
            firstReq.setUserName(userName);
            firstReq.setClientType(clientType);
            ObjectMapper objectMapper = new ObjectMapper();
            HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
            FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
            String signature = MD5Util.md5Encrypt(passWord);
            signature = MD5Util.md5Encrypt(userName + signature);
            signature = MD5Util.md5Encrypt(signature);
            signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
            signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
            SecondReq secondReq = new SecondReq();
            secondReq.setIpAddress(ip);
            secondReq.setEncryptType(firstRes.getEncryptType());
            secondReq.setSignature(signature);
            secondReq.setRandomKey(firstRes.getRandomKey());
            secondReq.setClientType(clientType);
            secondReq.setUserName(userName);
            HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
            ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
            HttpHeaders deviceHeaders = new HttpHeaders();
            deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
            HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
            // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code);
            ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
            // System.out.println("开始视频身份请求结果:" + exchange.getBody());
            String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
            // System.out.println("视频请求地址:" + url + monitorUrl + channelId);
            ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
            // System.out.println("视频请求返回参数:" + monitorReq.getBody());
            return objectMapper.readTree(monitorReq.getBody()).get("url").textValue();
        } catch (Exception ex) {
            System.out.println("获取视频异常:" + ex.getMessage());
            return "获取地址失败,请检查code值";
        }
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            public boolean hasError(HttpStatus status) {
                return super.hasError(status);
    }
    private final String ARTEMIS_PATH = "/artemis";
    private final String HOST = "10.53.133.82:1443";
    private final String APP_KEY = "29967737";
    private final String APP_SECRET = "LElVf9Ct3ykStZHCmFNZ";
    public PageResult<Camera> callPostCameras(Integer pageNo, Integer pageSize, String treeCode) throws Exception {
        System.out.println("海康视频-callPostCameras");
        ArtemisConfig config = new ArtemisConfig();
        config.setHost(HOST); // 代理API网关nginx服务器ip端口
        config.setAppKey(APP_KEY);  // 秘钥appkey
        config.setAppSecret(APP_SECRET);// 秘钥appSecret
        System.out.println("海康视频-初始化config");
        final String getSecurityApi = ARTEMIS_PATH + "/api/resource/v1/cameras"; // 接口路径
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getSecurityApi);
            }
            @Override
            public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
        };
        Map<String, String> head = new HashMap<String, String>(2) {  //get请求的head参数
            {
                put("headpost", "sky-test");
            }
        });
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setOutputStreaming(false);
        restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
        };
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("pageNo", pageNo);
        jsonBody.put("pageSize", pageSize);
        jsonBody.put("treeCode", treeCode);
        String body = jsonBody.toString();
        System.out.println("海康视频开始请求:");
        //参数根据接口实际情况设置
        HttpResponse result = ArtemisHttpUtil.doPostStringImgArtemis(config, path, body, null, null, "application/json", head);
        try {
            String strResult = EntityUtils.toString(result.getEntity());
            HttpResponseResult responseResult = com.alibaba.fastjson.JSONObject.parseObject(strResult, HttpResponseResult.class);
            System.out.println("海康视频结果:" + responseResult.toString());
            if ("0".equals(responseResult.getCode())) {
                com.alibaba.fastjson.JSONObject jsonObject = responseResult.getData();
                String strList = jsonObject.getString("list");
                Integer total = Integer.parseInt(jsonObject.getString("total"));
                Integer resultPageSize = Integer.parseInt(jsonObject.getString("pageSize"));
                Integer resultPageNo = Integer.parseInt(jsonObject.getString("pageNo"));
                List<Camera> ls = com.alibaba.fastjson.JSONObject.parseArray(strList, Camera.class);
                PageResult<Camera> pageResult = new PageResult<>(total, resultPageSize, resultPageNo, ls);
                return pageResult;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
        //请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    public String getKHVideo(String code) throws Exception {
        //第一次权限请求体
        FirstReq firstReq = new FirstReq();
        firstReq.setIpAddress(ip);
        firstReq.setUserName(userName);
        firstReq.setClientType(clientType);
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
        FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
        String signature = MD5Util.md5Encrypt(passWord);
        signature = MD5Util.md5Encrypt(userName + signature);
        signature = MD5Util.md5Encrypt(signature);
        signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
        signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
        SecondReq secondReq = new SecondReq();
        secondReq.setIpAddress(ip);
        secondReq.setEncryptType(firstRes.getEncryptType());
        secondReq.setSignature(signature);
        secondReq.setRandomKey(firstRes.getRandomKey());
        secondReq.setClientType(clientType);
        secondReq.setUserName(userName);
        HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
        ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
        HttpHeaders deviceHeaders = new HttpHeaders();
        deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
        HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
        // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code);
        ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
        // System.out.println("开始视频身份请求结果:" + exchange.getBody());
        String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
        // System.out.println("视频请求地址:" + url + monitorUrl + channelId);
        ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
        // System.out.println("视频请求返回参数:" + monitorReq.getBody());
        return objectMapper.readTree(monitorReq.getBody()).get("url").textValue();
        ArtemisConfig config = new ArtemisConfig();
        config.setHost(HOST); // 代理API网关nginx服务器ip端口
        config.setAppKey(APP_KEY);  // 秘钥appkey
        config.setAppSecret(APP_SECRET);// 秘钥appSecret
        final String getSecurityApi = ARTEMIS_PATH + "/api/resource/v1/cameras/previewURLs"; // 接口路径
        Map<String, String> path = new HashMap<String, String>(2) {
            {
                put("https://", getSecurityApi);
            }
        };
        Map<String, String> head = new HashMap<String, String>(2) {  //get请求的head参数
            {
                put("headpost", "sky-test");
            }
        };
        Map<String, String> query = new HashMap<String, String>(2) {  //get请求的head参数
            {
                put("domainId", "0");
            }
        };
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("cameraIndexCode", code);
        jsonBody.put("streamType", 0);
        jsonBody.put("protocol", "hls");
        jsonBody.put("transmode", 0);
        String body = jsonBody.toString();
        //参数根据接口实际情况设置
        HttpResponse result = ArtemisHttpUtil.doPostStringImgArtemis(config, path, body, query, null, "application/json", head);
        try {
            String strResult = EntityUtils.toString(result.getEntity());
            HttpResponseResult responseResult = com.alibaba.fastjson.JSONObject.parseObject(strResult, HttpResponseResult.class);
            if ("0".equals(responseResult.getCode())) {
                com.alibaba.fastjson.JSONObject jsonObject = responseResult.getData();
                String url = jsonObject.getString("url");
                return url;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}