package com.ld.igds.protocol.hikmedia.infovisionIoT.v161; import com.alibaba.fastjson.JSONObject; import com.ld.igds.camera.ApiCameraService; import com.ld.igds.camera.CameraUtil; import com.ld.igds.camera.data.ApiCameraData; import com.ld.igds.camera.data.ApiCameraResp; import com.ld.igds.camera.data.ApiSnapReq; import com.ld.igds.data.ConfigHikMedia; import com.ld.igds.data.HikMediaProp; import com.ld.igds.protocol.hikmedia.*; import com.ld.igds.protocol.hikmedia.data.*; import com.ld.igds.protocol.snap.SnapPluginService; import com.ld.igds.sec.dto.SecCameraDto; import com.ld.igds.util.RedisUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; /** * 海康流媒体服务接口 */ @Slf4j @Component public class HikMediaServiceV161 implements ApiCameraService { @Autowired private SnapPluginService snapPluginService; @Autowired private ConfigHikMedia configHikMedia; @Autowired private RedisUtil redisUtil; @Override public String getPlayType() { return CameraUtil.PLAY_TYPE_MEDIA_HIK_INFOVISION_IOT_161; } @Override public ApiCameraResp getPlayAddr(ApiCameraData apiCameraDto) { if(StringUtils.isEmpty(apiCameraDto.getCompanyId()) || StringUtils.isEmpty(apiCameraDto.getSn())){ return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } HikMediaProp prop = configHikMedia.getHikProp(apiCameraDto.getCompanyId()); try { ApiCameraPreview apiCameraPreview = ApiCameraPreview.getInstance(); ApiHikParam param = new ApiHikParam(); param.setIp(prop.getIp()); param.setWanIp(prop.getWanIp()); param.setPort(prop.getPort() + ""); param.setAppKey(prop.getAppKey()); param.setAppSecret(prop.getAppSecret()); param.setArtemisPath(prop.getContextPath()); param.setDeviceCode(apiCameraDto.getSn()); HikRespData result = apiCameraPreview.apiPreview(param); log.info("-------获取多媒体播放信息--------{}-", result); if (HikUtil.RESP_CODE_0.equals(result.getCode())) { CameraPlay cameraPlay = JSONObject.parseObject(JSONObject.toJSONString(result.getData()), CameraPlay.class); String url = cameraPlay.getUrl(); url = url.replace(param.getIp(), param.getWanIp()); log.info("-------获取播放url------={}", url); return new ApiCameraResp(ApiCameraResp.CODE_SUCCESS, url, result.getMsg()); } return new ApiCameraResp(ApiCameraResp.CODE_ERROR, null, result.getMsg()); } 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 下转 * ZOOM_IN 焦距变大 * ZOOM_OUT 焦距变小 * LEFT_UP 左上 * LEFT_DOWN 左下 * RIGHT_UP 右上 * RIGHT_DOWN 右下 * FOCUS_NEAR 焦点前移 * FOCUS_FAR 焦点后移 * IRIS_ENLARGE 光圈扩大 * IRIS_REDUCE 光圈缩小 * WIPER_SWITCH 接通雨刷开关 * START_RECORD_TRACK 开始记录轨迹 * STOP_RECORD_TRACK 停止记录轨迹 * START_TRACK 开始轨迹 * STOP_TRACK 停止轨迹; * 以下命令presetIndex不可为空: * GOTO_PRESET到预置点 * * @param dto * @return */ @Override public ApiCameraResp ptzMedia(ApiCameraData dto) { if(StringUtils.isEmpty(dto.getCompanyId()) || StringUtils.isEmpty(dto.getSn())){ return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } HikMediaProp prop = configHikMedia.getHikProp(dto.getCompanyId()); try { 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("LEFT_UP"); } if ("6".equals(dto.getCommand())) { dto.setCommand("LEFT_DOWN"); } if ("7".equals(dto.getCommand())) { dto.setCommand("RIGHT_UP"); } if ("8".equals(dto.getCommand())) { dto.setCommand("RIGHT_DOWN"); } if ("9".equals(dto.getCommand())) { dto.setCommand("ZOOM_IN"); } if ("10".equals(dto.getCommand())) { dto.setCommand("ZOOM_OUT"); } int action = 0; if ("0".equals(dto.getCommand())) { action = 1; //当命令为0时,表示停止,传递action为1,并获取上次开始执行的命令,赋值到command String str = (String) redisUtil.get(dto.getSn()); if(StringUtils.isEmpty(str)){ str = "UP"; } dto.setCommand(str); //清除缓存 redisUtil.del(dto.getSn()); }else { //将执行开始的命令存入缓存,方便下次停止使用 redisUtil.set(dto.getSn(), dto.getCommand()); } ApiHikParam param = new ApiHikParam(); param.setIp(prop.getIp()); param.setWanIp(prop.getWanIp()); param.setPort(prop.getPort() + ""); param.setAppKey(prop.getAppKey()); param.setAppSecret(prop.getAppSecret()); param.setArtemisPath(prop.getContextPath()); param.setDeviceCode(dto.getSn()); param.setAction(action); param.setCommand(dto.getCommand()); //预置位 if (param.getPresetIndex() > 0) { param.setPresetIndex(param.getPresetIndex()); param.setCommand("GOTO_PRESET"); } ApiCameraControl apiCameraControl = ApiCameraControl.getInstance(); HikRespData result = apiCameraControl.ptz(param); if (HikUtil.RESP_CODE_0.equals(result.getCode())) { return new ApiCameraResp(ApiCameraResp.CODE_SUCCESS, "执行成功"); } else { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, result.getMsg()); } } catch (Exception e) { log.error("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } } @Override public ApiCameraResp ptzPreset(ApiCameraData apiCameraDto) { //TODO return null; } @Override public ApiCameraResp keepAlive(ApiCameraData apiCameraDto) { //TODO return null; } @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; } }