package com.ycl.controller.platformApi; import cn.hutool.json.JSONConverter; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.dto.video.AlarmParam; import com.ycl.dto.video.HKAlarmParam; import com.ycl.entity.video.VideoPoint; import com.ycl.enums.common.ResultCode; import com.ycl.service.video.IVideoAlarmReportService; import com.ycl.service.video.impl.IVideoPointService; import com.ycl.util.VideoUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; import java.util.Dictionary; import java.util.Hashtable; import java.util.List; /** * @author admin */ @Api(tags = "第三方接口-报警") @RestController @RequestMapping("/API") public class AlarmController { private IVideoPointService videoPointService; private IVideoAlarmReportService videoAlarmReportService; private static Dictionary sessionDic = new Hashtable<>(); @Autowired private VideoUtil videoUtil; @Autowired public void setVideoAlarmReportService(IVideoAlarmReportService videoAlarmReportService) { this.videoAlarmReportService = videoAlarmReportService; } @Autowired public void setVideoPointService(IVideoPointService videoPointService) { this.videoPointService = videoPointService; } @ApiOperation("视频报警推送API") @PostMapping("/AlarmReport") @LogSave(operationType = "报警管理", contain = "视频报警推送") public CommonResult alarmReport(@RequestBody @Validated AlarmParam alarmParam) { // System.out.println("保存报警数据:" + JSONObject.toJSONString(alarmParam)); videoAlarmReportService.save(alarmParam); return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage()); } @ApiOperation("海康视频报警推送API") @PostMapping("/HK/alarmReport") @LogSave(operationType = "报警管理", contain = "海康视频报警推送") public CommonResult hkAlarmReport(@RequestBody @Validated HKAlarmParam alarmParam) { // System.out.println("保存报警数据:" + JSONObject.toJSONString(alarmParam)); videoAlarmReportService.saveFromHK(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) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(VideoPoint::getPlatResourceId, code) .or().eq(VideoPoint::getCode, code); List pointList = videoPointService.list(queryWrapper); if (pointList.size() > 0) { VideoPoint videoPoint = pointList.get(0); if (videoPoint.getType() == 1) { // videoUtil.getKHPresets(code); return CommonResult.successApi(videoUtil.getKHVideo(code)); } else { if (subType == null) { subType = 1; } if (!StringUtils.isNotBlank(scheme)) { scheme = "RTSP"; } return CommonResult.successApi(videoUtil.getVideo(code, scheme, subType)); } } else { if (subType == null) { subType = 1; } if (!StringUtils.isNotBlank(scheme)) { scheme = "RTSP"; } return CommonResult.successApi(videoUtil.getVideo(code, scheme, subType)); } } @ApiOperation(value = "获取图片") @GetMapping(value = "/img", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE}) // @GetMapping(value = "/img") @ResponseBody public byte[] getImages(HttpServletRequest request, HttpServletResponse response, @RequestParam String fileUrl, @RequestParam(required = false) String OSSAccessKeyId, @RequestParam(required = false) String Signature) { String sessionId = request.getSession().getId(); sessionDic.put(sessionId, 0); return getBytes(fileUrl, OSSAccessKeyId, Signature, sessionId); } private byte[] getBytes(String fileUrl, String OSSAccessKeyId, String Signature, String sessionId) { int index = sessionDic.get(sessionId); try { if (sessionDic.get(sessionId) < 10) { sessionDic.remove(sessionId); fileUrl = fileUrl.replace("Expires", "v"); System.out.println("getImages获取图片地址:" + fileUrl + "&OSSAccessKeyId=" + OSSAccessKeyId + "&Signature=" + Signature); URL url = new URL(fileUrl + "&OSSAccessKeyId=" + OSSAccessKeyId + "&Signature=" + Signature); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(10 * 1000); conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); InputStream inputStream = conn.getInputStream();// 通过输入流获取图片数据 byte[] data = readInputStream(inputStream); System.out.println("getImages获取图片成功"); return data; } } catch (Exception e) { index++; sessionDic.put(sessionId, index); System.out.println(index + "-getImages获取图片失败:" + e.getMessage()); e.printStackTrace(); getBytes(fileUrl, OSSAccessKeyId, Signature, sessionId); } return null; } private static String inputStream2Base64(InputStream is) throws Exception { byte[] data = null; try { ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = is.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } data = swapStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { throw new Exception("输入流关闭异常"); } } } return Base64.getEncoder().encodeToString(data); } private byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while ((len = inStream.read(buffer)) != -1) { //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 return outStream.toByteArray(); } }