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; @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="; 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(); } }