package com.ycl.controller.platformApi; 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.dto.video.AlarmParam; import com.ycl.enums.common.ResultCode; import com.ycl.service.video.IVideoAlarmReportService; import com.ycl.utils.MD5Util; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; 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.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.RestTemplate; import java.net.URI; /** * @author admin */ @Api(tags = "第三方接口-报警") @RestController @RequestMapping("/API") public class AlarmController { @Value("${videoPoint.url}") private String url; @Value("${videoPoint.userName}") private String userName; @Value("${videoPoint.passWord}") private String passWord; @Value("${videoPoint.ip}") private String ip; private IVideoAlarmReportService videoAlarmReportService; @Autowired public void setVideoAlarmReportService(IVideoAlarmReportService videoAlarmReportService) { this.videoAlarmReportService = videoAlarmReportService; } @ApiOperation("视频报警推送API") @PostMapping("/AlarmReport") public CommonResult alarmReport(@RequestBody @Validated AlarmParam alarmParam) { videoAlarmReportService.save(alarmParam); return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage()); } @GetMapping("/Video/{code}/{subType}") @ApiOperation(value = "设备获取监控地址") @SneakyThrows public CommonResult getMonitorAddress(@PathVariable String code, @PathVariable Integer subType, @RequestParam(required = false) String scheme) { String clientType = "winpc"; String reqUrl = "/videoService/accounts/authorize"; String deviceUrl = "/videoService/devicesManager/devices"; if (subType == null) { subType = 1; } if (!StringUtils.isNotBlank(scheme)) { scheme = "RTSP"; } 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 CommonResult.successApi(objectMapper.readTree(monitorReq.getBody()).get("url")); } }