package com.ld.igds.protocol.easymedia; import com.alibaba.fastjson.JSONObject; import com.ld.igds.camera.data.ApiCameraData; import com.ld.igds.camera.CameraUtil; import com.ld.igds.camera.data.ApiCameraResp; import com.ld.igds.camera.data.ApiSnapReq; import com.ld.igds.protocol.snap.SnapPluginService; import com.ld.igds.sec.dto.SecCameraDto; import com.ld.igds.camera.ApiCameraService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Component public class EasyGbsService implements ApiCameraService { public static String URL_PLAY = "http://ip:port/api/v1/stream/start"; public static String URL_PTZ = "http://ip:port/api/v1/ptz/control"; public static String URL_TOUCH = "http://ip:port/api/v1/stream/touch"; public static String URL_PRESET = "http://ip:port/api/v1/preset/control"; public static String URL_SNAP = "http://ip:port/api/v1/device/channelsnap"; public static String URL_PLAY_HTML = "http://ip:port/play.html"; /** * 设备上下线消息获取 */ public static String URL_STATUS = "http://ip:port/api/v1/news/list"; @Autowired private SnapPluginService snapPluginService; @Autowired private EasyProp prop; @Autowired private RestTemplate restTemplate; @Override public String getPlayType() { return CameraUtil.PLAY_TYPE_EASY_GBS; } @Override public ApiCameraResp getPlayAddr(ApiCameraData apiCameraDto) { try { String mediaIp = prop.getGbsIp(); String mediaWanIp = prop.getGbsWanIp(); if (StringUtils.isEmpty(mediaIp)) { log.warn("-----------没有获取到多媒体服务地址-----"); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到多媒体服务地址"); } String sn = apiCameraDto.getSn(); URL_PLAY = URL_PLAY.replace("ip", mediaIp).replace("port", prop.getGbsPort() + ""); String code = sn; if (sn.indexOf("_") > 0) { code = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); } //如果使用IFRAME播放 ApiCameraResp result1 = new ApiCameraResp(); if (StringUtils.isNotEmpty(mediaWanIp)) { URL_PLAY_HTML = URL_PLAY_HTML.replace("ip", mediaWanIp).replace("port", prop.getGbsPort() + ""); } else { URL_PLAY_HTML = URL_PLAY_HTML.replace("ip", mediaIp).replace("port", prop.getGbsPort() + ""); } String iframeUrl = URL_PLAY_HTML + "?serial=" + sn + "&code=" + code + "&iframe=yes&showConsole=yes"; result1.setPlayIframe(iframeUrl); result1.setCode("SUCCESS"); log.info("-------获取多媒体播放信息---------result-{}", result1); //默认调用播放器播放 String url = URL_PLAY + "?serial={serial}&code={code}"; log.info("-------获取多媒体播放信息---------URL-{}", url); Map map = new HashMap<>(); map.put("serial", sn); map.put("code", code); ResponseEntity responseEntity = restTemplate.getForEntity( url, String.class, map); String result = responseEntity.getBody(); log.info("-------获取多媒体播放信息---------result-{}", result); if (result.indexOf("Error") > 0) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体接口返回异常"); } JSONObject resultEntity = JSONObject.parseObject(result); String flv = (String) resultEntity.get("FLV"); if (StringUtils.isNotEmpty(mediaWanIp)) { flv = flv.replace(mediaIp, mediaWanIp); } result1.setPlayAddr(flv); result1.setCode("SUCCESS"); log.info("-------获取多媒体播放信息---------MediaResult-{}", result1); return result1; } catch (Exception e) { log.debug("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } } /** * 云台控制 *

* 执行命令 1=上,2=下,3=左,4=右,5=左上,6=左下,7=右上,8=右下,0=停止,9=变倍小,10 = 变倍加 *

* 控制指令允许值: left, right, up, down, upleft, upright, downleft, downright, * zoomin, zoomout, stop * * @param dto * @return */ @Override public ApiCameraResp ptzMedia(ApiCameraData dto) { if (StringUtils.isEmpty(dto.getSn()) && StringUtils.isEmpty(dto.getIp())) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到当前摄像机IP/SN,不支持云台控制"); } try { String mediaIp = prop.getGbsIp(); if (null == mediaIp) { log.warn("-----------没有获取到多媒体服务地址-----"); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到多媒体服务地址"); } URL_PTZ = URL_PTZ.replace("ip", mediaIp).replace("port", prop.getGbsPort() + ""); String sn = dto.getSn(); String code = sn; if (sn.indexOf("_") > 0) { code = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); } String url = URL_PTZ + "?serial={serial}&code={code}&command={command}"; log.info("-------调用流媒体PTZ路径---------URL-{},command={}", url, dto.getCommand()); // 命令进行转换 控制指令 允许值: left, right, up, down, upleft, upright, // downleft, downright, zoomin, zoomout, stop if ("1".equals(dto.getCommand())) { dto.setCommand("up"); } if ("2".equals(dto.getCommand())) { dto.setCommand("down"); } if ("3".equals(dto.getCommand())) { dto.setCommand("left"); } if ("4".equals(dto.getCommand())) { dto.setCommand("right"); } if ("5".equals(dto.getCommand())) { dto.setCommand("upleft"); } if ("6".equals(dto.getCommand())) { dto.setCommand("downleft"); } if ("7".equals(dto.getCommand())) { dto.setCommand("upright"); } if ("8".equals(dto.getCommand())) { dto.setCommand("downright"); } if ("9".equals(dto.getCommand())) { dto.setCommand("zoomin"); } if ("10".equals(dto.getCommand())) { dto.setCommand("zoomout"); } if ("0".equals(dto.getCommand())) { dto.setCommand("stop"); } Map map = new HashMap<>(); map.put("serial", sn); map.put("code", code); map.put("command", dto.getCommand()); ResponseEntity responseEntity = restTemplate.getForEntity( url, String.class, map); String result = responseEntity.getBody(); log.info("-------流媒体调用结果---执行-{}------result-{}", dto.getCommand(), result); if (HttpStatus.OK == responseEntity.getStatusCode()) { return new ApiCameraResp(ApiCameraResp.CODE_SUCCESS, "云台执行成功"); } else { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "云台执行失败"); } } catch (Exception e) { log.debug("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "异常提醒:操作过于频繁"); } } /** * 预置位置执行 *

* 允许值: set, goto, remove * * @param dto * @return */ @Override public ApiCameraResp ptzPreset(ApiCameraData dto) { if (StringUtils.isEmpty(dto.getSn()) && StringUtils.isEmpty(dto.getIp())) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到当前摄像机IP/SN,不支持云台控制"); } try { String mediaIp = prop.getGbsIp(); if (null == mediaIp) { return null; } URL_PRESET = URL_PRESET.replace("ip", mediaIp).replace("port", prop.getGbsPort()+""); String sn = dto.getSn(); String code = sn; if (sn.indexOf("_") > 0) { code = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); } String url = URL_PRESET + "?serial={serial}&code={code}&command={command}&preset={preset}"; if ("1".equals(dto.getCommand())) { dto.setCommand("set"); } if ("2".equals(dto.getCommand())) { dto.setCommand("goto"); } if ("3".equals(dto.getCommand())) { dto.setCommand("remove"); } log.info("-------获取多媒体预置位控制信息---------URL-{}", url); Map map = new HashMap<>(); map.put("serial", sn); map.put("code", code); map.put("command", dto.getCommand()); map.put("preset", dto.getPreset()); ResponseEntity responseEntity = restTemplate.getForEntity( url, String.class, map); if (HttpStatus.OK == responseEntity.getStatusCode()) { return new ApiCameraResp(ApiCameraResp.CODE_SUCCESS, "执行成功"); } else { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, responseEntity.getBody()); } } catch (Exception e) { log.error("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "后台执行异常"); } } @Override public ApiCameraResp keepAlive(ApiCameraData apiCameraDto) { if (StringUtils.isEmpty(apiCameraDto.getSn()) && StringUtils.isEmpty(apiCameraDto.getIp())) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到当前摄像机IP/SN,不支持云台控制"); } try { String mediaIp = prop.getGbsIp(); if (null == mediaIp) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "流媒体保活失败!"); } URL_TOUCH = URL_TOUCH.replace("ip", mediaIp).replace("port", prop.getGbsPort()+""); String sn = apiCameraDto.getSn(); String code = sn; if (sn.indexOf("_") > 0) { code = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); } String url = URL_TOUCH + "?serial={serial}&code={code}"; log.info("-------流媒体保活---------URL-{}", url); Map map = new HashMap<>(); map.put("serial", sn); map.put("code", code); restTemplate.getForObject(url, Object.class, map); } catch (Exception e) { log.error("调用流媒体服务器异常:{}", e); } return new ApiCameraResp(ApiCameraResp.CODE_SUCCESS, "流媒体保活!"); } @Override public List searchCamera(ApiCameraData apiCameraDto) { //TODO return null; } @Override public ApiCameraResp snapImg(ApiSnapReq apiCameraDto) { if (CameraUtil.SNAP_TYPE_FZZY_PLUGIN.equals(apiCameraDto.getSnapType())) { return snapPluginService.snapImg(apiCameraDto); } return null; } }