package com.ycl.util; import cn.hutool.json.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; 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; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.web.client.DefaultResponseErrorHandler; 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 { @Value("${videoPoint.url}") private String url; @Value("${videoPoint.userName}") private String userName; @Value("${videoPoint.passWord}") private String passWord; @Value("${videoPoint.ip}") private String ip; /* * @Description subType:类型int,选填。码流类型,0:主码流、1:辅流1、2:辅流2。默认为0主码流。scheme:类型string,选填。协议类型,支持RTSP、FLV_HTTP、HLS三种,默认RTSP。 * @Param [code, scheme, subType] * @return java.lang.String **/ @SneakyThrows public String getVideo(String code, String scheme, Integer subType) { // 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=®ionId=&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 firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders); ResponseEntity 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 secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders); ResponseEntity 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 deviceEntity = new HttpEntity<>(deviceHeaders); // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code); ResponseEntity 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 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值"; } } 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 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 path = new HashMap(2) { { put("https://", getSecurityApi); } }; Map head = new HashMap(2) { //get请求的head参数 { put("headpost", "sky-test"); } }; 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 ls = com.alibaba.fastjson.JSONObject.parseArray(strList, Camera.class); PageResult pageResult = new PageResult<>(total, resultPageSize, resultPageNo, ls); return pageResult; } } catch (Exception e) { e.printStackTrace(); } return null; } public String getKHVideo(String code) throws Exception { 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 path = new HashMap(2) { { put("https://", getSecurityApi); } }; Map head = new HashMap(2) { //get请求的head参数 { put("headpost", "sky-test"); } }; Map query = new HashMap(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 ""; } }