package com.ld.igds.protocol.hikmedia; import com.alibaba.fastjson.JSONObject; 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.data.*; import com.ld.igds.protocol.snap.SnapPluginService; import com.ld.igds.sec.dto.SecCameraDto; import com.ld.igds.camera.ApiCameraService; import com.ld.igds.sec.service.CoreSecCameraService; 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.ArrayList; import java.util.List; /** * 海康流媒体服务接口 */ @Slf4j @Component public class HikMediaService implements ApiCameraService { @Autowired private SnapPluginService snapPluginService; @Autowired private CoreSecCameraService cameraService; @Autowired private ConfigHikMedia configHikMedia; @Override public String getPlayType() { return CameraUtil.PLAY_TYPE_MEDIA_HIK; } @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; } 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) { if(StringUtils.isEmpty(apiCameraDto.getCompanyId())){ return null; } HikMediaProp prop = configHikMedia.getHikProp(apiCameraDto.getCompanyId()); ApiCameraSearch apiCameraSearch = ApiCameraSearch.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.setRegionIndexCodes(prop.getRegionIndexCodes().split(",")); HikRespData result = apiCameraSearch.apiSearchDevice(param); if (!HikUtil.RESP_CODE_0.equals(result.getCode())) { log.error("---------同步远程摄像头配置列表失败------{}", result.getMsg()); return null; } log.info("-------同步远程摄像头配置信息-----{}", result.getData()); CameraMainDto data = JSONObject.parseObject(JSONObject.toJSONString(result.getData()), CameraMainDto.class); List list = data.getList(); if (list != null && list.size() > 0) { SecCameraDto dto; for (CameraDto cameraDto : list) { dto = new SecCameraDto(); dto.setId(cameraDto.getIndexCode()); dto.setSn(cameraDto.getIndexCode()); dto.setCompanyId(apiCameraDto.getCompanyId()); dto.setDeptId(apiCameraDto.getDeptId()); dto.setType(HikUtil.getCameraType(cameraDto.getCameraType())); dto.setPlayType(CameraUtil.PLAY_TYPE_MEDIA_HIK); dto.setName(cameraDto.getName()); dto.setChanNum(cameraDto.getChanNum()); dto.setBrand("海康"); cameraService.updateCamera(dto); } } return new ArrayList(); } @Override public ApiCameraResp snapImg(ApiSnapReq apiCameraDto) { if (CameraUtil.SNAP_TYPE_FZZY_PLUGIN.equals(apiCameraDto.getSnapType())) { return snapPluginService.snapImg(apiCameraDto); } return null; } }