package com.ycl.util; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.ycl.api.CommonResult; import com.ycl.dto.v1.Req.FirstReq; import com.ycl.dto.v1.Req.SecondReq; import com.ycl.dto.v1.Res.FirstRes; import com.ycl.utils.MD5Util; import lombok.SneakyThrows; 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; @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) { 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); ResponseEntity 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 monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class); return objectMapper.readTree(monitorReq.getBody()).get("url").textValue(); } }