| | |
| | | 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; |
| | |
| | | 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; |
| | | private String url; |
| | | |
| | | @Value("${videoPoint.userName}") |
| | | private String userName; |
| | | private String userName; |
| | | |
| | | @Value("${videoPoint.passWord}") |
| | | private String passWord; |
| | | private String passWord; |
| | | |
| | | @Value("${videoPoint.ip}") |
| | | private String ip; |
| | | private String ip; |
| | | |
| | | /* |
| | | * @Description subType:类型int,选填。码流类型,0:主码流、1:辅流1、2:辅流2。默认为0主码流。scheme:类型string,选填。协议类型,支持RTSP、FLV_HTTP、HLS三种,默认RTSP。 |
| | |
| | | * @return java.lang.String |
| | | **/ |
| | | @SneakyThrows |
| | | public String getVideo(String code, String scheme,Integer subType) { |
| | | String clientType = "winpc"; |
| | | String reqUrl = "/videoService/accounts/authorize"; |
| | | String deviceUrl = "/videoService/devicesManager/devices"; |
| | | String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId="; |
| | | public String getVideo(String code, String scheme, Integer subType) { |
| | | // System.out.println("开始视频请求:" + code); |
| | | try { |
| | | |
| | | RestTemplate restTemplate = new RestTemplate(); |
| | | restTemplate.setErrorHandler(new DefaultResponseErrorHandler() { |
| | | @Override |
| | | public boolean hasError(HttpStatus status) { |
| | | return super.hasError(status); |
| | | 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) { |
| | | @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值"; |
| | | } |
| | | } |
| | | |
| | | |
| | | 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); |
| | | } |
| | | }); |
| | | SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); |
| | | simpleClientHttpRequestFactory.setOutputStreaming(false); |
| | | restTemplate.setRequestFactory(simpleClientHttpRequestFactory); |
| | | }; |
| | | Map<String, String> head = new HashMap<String, String>(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<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); |
| | | ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class); |
| | | String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue(); |
| | | ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class); |
| | | 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 ""; |
| | | } |
| | | } |