zhangqiankun 3 éve
szülő
commit
fe1dc6c014

+ 14 - 0
src/main/java/com/persagy/cameractl/controller/HelloController.java

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import com.persagy.cameractl.conf.MyParamConfig;
 import com.persagy.cameractl.service.HkCameraExecuteApi;
+import com.persagy.cameractl.service.OpenAPIService;
 import com.persagy.cameractl.service.PtzMain;
 import com.persagy.cameractl.utils.Camera;
 import com.persagy.cameractl.utils.OtherTools;
@@ -27,8 +28,13 @@ import com.persagy.cameractl.utils.StringTools;
 @Controller
 @CrossOrigin
 public class HelloController {
+	
 	@Autowired
 	private MyParamConfig myParamConfig;
+	
+	@Autowired
+	private OpenAPIService openAPIService;
+	
 	@Autowired
 	private HkCameraExecuteApi hkCameraExecuteApi;
 
@@ -44,6 +50,14 @@ public class HelloController {
 		return ResultTools.errorResult(name);
 	}
 
+	@RequestMapping(value = "/ivms/{opertype}", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+	public @ResponseBody ResultClass ibmsOper(@PathVariable("opertype") String operType, @RequestBody Camera camera) {
+		ResultClass executeResult = operType.equals("playback") ? openAPIService.playBack(camera)
+						: operType.equals("playbackUrl") ? openAPIService.playBack(camera) 
+								: new ResultClass(false, "非法请求");
+		return executeResult;
+	}
+	
 	/*
 	 * 摄像头操作接口(底层调用SDK),包括:摄像头控制、回放。客户端回放流程为:客户端先调用该接口,成功后再调用vplayf接口播放MP4
 	 * opertype为control时,参数:command、cameraIp、cameraPort、userName、password、channel、speed

+ 145 - 25
src/main/java/com/persagy/cameractl/service/OpenAPIService.java

@@ -7,13 +7,16 @@ import org.springframework.stereotype.Service;
 
 import com.persagy.cameractl.conf.CameraApiConfig;
 import com.persagy.cameractl.utils.Camera;
+import com.persagy.cameractl.utils.ResultClass;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.MD5;
 import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 
 /**
- * 本类中的 openAPI 为 IVMS 8700,非综合安防管理平台
+ * 本类中的 openAPI 为 IVMS 8700,非综合安防管理平台,所有接口默认超时20s,且不支持配置,所以我们这里配置为30s
  * 
  * @version 1.0.0
  * @company persagy 
@@ -24,10 +27,11 @@ import cn.hutool.json.JSONObject;
 public class OpenAPIService {
 	public static final Logger logger = LoggerFactory.getLogger(OpenAPIService.class);
 	
+	public static final String URL_PARAM_TOKEN = "?token=";
 	/** 获取默认用户UUID【V2.7】 */
-	public static final String DEFAULT_USER_ID = "/openapi/service/base/user/getDefaultUserUuid";
+	public static final String GET_DEFAULT_USER_ID = "/openapi/service/base/user/getDefaultUserUuid";
 	/** 获取所有网域【V2.7】 */
-	public static final String GET_ALL_NET_ZONT = "/openapi/service/base/netZone/getNetZones";
+	public static final String GET_ALL_NET_ZONE = "/openapi/service/base/netZone/getNetZones";
 	/** 根据监控点UUID集和网域UUID分页获取录像计划【V2.7】 */
 	public static final String GET_RECORDPLANS_BY_CAMERAUUID = "/openapi/service/vss/playback/getRecordPlansByCameraUuids";
 	/** 根据录像计划UUID和网域UUID获取回放参数【V2.7】 */
@@ -36,50 +40,166 @@ public class OpenAPIService {
 	@Autowired
 	private CameraApiConfig cameraApiConfig;
 	
-	public void playBack(Camera camera) {
+	private volatile String opUserUuid;
+	private volatile String netZoneUuid;
+	
+	public ResultClass playBack(Camera camera) {
+		if (!StrUtil.isAllNotBlank(opUserUuid, netZoneUuid)) {
+			throw new RuntimeException("missing parameter[opUserUuid、netZoneUuid]");
+		}
+		ResultClass returnResult = new ResultClass();
+		
+		// 1.获取录像计划UUID
+		JSONObject recordPlansByCameraUuids = this.getRecordPlansByCameraUuids(camera);
+		if (recordPlansByCameraUuids == null) {
+			throw new RuntimeException("not exist recordPlan, cameraUUID: " + camera.cameraIndexCode);
+		}
+		
+		// 2.根据录像计划UUID,获取回放视频
+		String paramByPlanUuid = this.getPlaybackParamByPlanUuid(camera, recordPlansByCameraUuids);
+		returnResult.resultData = paramByPlanUuid;
+		returnResult.name = true;
+		returnResult.reason = "回放文件获取成功";
+		return returnResult;
+	}
+
+	/**
+	 * 获取回放文本
+	 * 
+	 * @param camera
+	 * @param recordPlansByCameraUuids
+	 * @return
+	 * @date 2022年6月20日 下午3:46:11
+	 */
+	public String getPlaybackParamByPlanUuid(Camera camera, JSONObject recordPlansByCameraUuids) {
 		// 获取录像计划UUID
+		long currentTimeMillis = System.currentTimeMillis();
 		
+		JSONObject params = new JSONObject();
+		params.set("appkey", cameraApiConfig.getHkApiKey());
+		params.set("time", currentTimeMillis);
+		params.set("planType", recordPlansByCameraUuids.getInt("planType"));
+		params.set("recordPlanUuid", recordPlansByCameraUuids.getStr("recordPlanUuid"));
+		params.set("opUserUuid", opUserUuid);
+		params.set("netZoneUuid", netZoneUuid);
+		String playBackStr = PLAY_BACK_URI + params.toString() + cameraApiConfig.getHkApiSecret();
+		logger.info("md5 playBackStr: {}", playBackStr);
+		
+		String playBackToken = MD5.create().digestHex(playBackStr).toUpperCase();
+		String playBackContent = HttpUtil.post(PLAY_BACK_URI + URL_PARAM_TOKEN + playBackToken, params.toString(), 30000);
+		logger.info("playBackContent: {}", playBackContent);
+		
+		JSONObject playBackJson = convert2Json(playBackContent);
+		JSONObject playBackData = playBackJson.getJSONObject("data");
+		if (playBackData != null) {
+			return playBackData.getStr("playBackXml");
+		}
+		return null;
 	}
 	
-	public String getRecordPlansByCameraUuids(Camera camera) {
+	/**
+	 * 获取录像计划UUID
+	 * 
+	 * @param camera
+	 * @return
+	 * @date 2022年6月20日 下午3:46:11
+	 */
+	public JSONObject getRecordPlansByCameraUuids(Camera camera) {
 		// 获取录像计划UUID
 		long currentTimeMillis = System.currentTimeMillis();
-		String requestToken = this.createDefaultRequestToken(GET_RECORDPLANS_BY_CAMERAUUID, camera.cameraIndexCode, currentTimeMillis);
 		
 		JSONObject params = new JSONObject();
 		params.set("appkey", cameraApiConfig.getHkApiKey());
 		params.set("time", currentTimeMillis);
 		params.set("pageNo", 1);
 		params.set("pageSize", 15);
-		params.set("opUserUuid", "11d0e493870d40f9b2589383cf73001f");
+		params.set("opUserUuid", opUserUuid);
 		params.set("cameraUuids", camera.cameraIndexCode);
-		params.set("netZoneUuid", "11d0e493870d40f9b2589383cf73001f");
+		params.set("netZoneUuid", netZoneUuid);
+		String recordPlanStr = GET_RECORDPLANS_BY_CAMERAUUID + params.toString() + cameraApiConfig.getHkApiSecret();
+		logger.info("md5 recordPlanStr: {}", recordPlanStr);
 		
-		HttpUtil.post(GET_RECORDPLANS_BY_CAMERAUUID + "?token=" + requestToken, params.toString(), 30000);
+		String recordPlanToken = MD5.create().digestHex(recordPlanStr).toUpperCase();
+		String recordPlanContent = HttpUtil.post(GET_RECORDPLANS_BY_CAMERAUUID + URL_PARAM_TOKEN + recordPlanToken, params.toString(), 30000);
+		logger.info("recordPlanContent: {}", recordPlanContent);
 		
+		JSONObject recordPlanJson = convert2Json(recordPlanContent);
+		JSONObject recordPlanData = recordPlanJson.getJSONObject("data");
+		if (recordPlanData != null) {
+			JSONArray jsonArray = recordPlanData.getJSONArray("list");
+			if (jsonArray == null || jsonArray.size() == 0) {
+				return null;
+			}
+			return jsonArray.getJSONObject(0);
+		}
 		return null;
 	}
 	
 	/**
-	 * 生成token值
-	 * 
-	 * @param requestUrl
-	 * @param cameraUuid
-	 * @param time 当前毫秒值
-	 * @return
-	 * @date 2022年6月16日 上午11:27:50
+	 * 获取默认的用户ID和网域ID
+	 *  
+	 * @date 2022年6月20日 下午3:18:36
 	 */
-	public String createDefaultRequestToken(String requestUrl, String cameraUuid, long time) {
+	public synchronized void queryUserIdAndNetZoneId() {
+		// 1.获取默认用户ID
+		long currentTimeMillis = System.currentTimeMillis();
+		
 		JSONObject params = new JSONObject();
 		params.set("appkey", cameraApiConfig.getHkApiKey());
-		params.set("time", time);
-		params.set("opUserUuid", "43a9a55f76474bde89ecabc1d6914a7f");
-		params.set("cameraUuid", cameraUuid);
-		params.set("netZoneUuid", "11d0e493870d40f9b2589383cf73001f");
-		
-		String oriStr = requestUrl + params.toString() + cameraApiConfig.getHkApiSecret();
-		logger.info("md5 oriStr: {}", oriStr);
-		return MD5.create().digestHex(oriStr);
+		params.set("time", currentTimeMillis);
+		String userStr = GET_DEFAULT_USER_ID + params.toString() + cameraApiConfig.getHkApiSecret();
+		logger.info("md5 userStr: {}", userStr);
+		
+		String userToken = MD5.create().digestHex(userStr).toUpperCase();
+		String userContent = HttpUtil.post(GET_DEFAULT_USER_ID + URL_PARAM_TOKEN + userToken, params.toString(), 30000);
+		logger.info("userContent: {}", userContent);
+		
+		JSONObject defaultUser = convert2Json(userContent);
+		this.opUserUuid = defaultUser.getStr("data");
+		if (StrUtil.isBlank(opUserUuid)) {
+			throw new RuntimeException("not exist default user id");
+		}
+		
+		// 2.获取网域ID
+		long currentTime = System.currentTimeMillis();
+		
+		JSONObject zoneObject = new JSONObject();
+		zoneObject.set("appkey", cameraApiConfig.getHkApiKey());
+		zoneObject.set("time", currentTime);
+		zoneObject.set("opUserUuid", opUserUuid);
+		String zoneStr = GET_ALL_NET_ZONE + zoneObject.toString() + cameraApiConfig.getHkApiSecret();
+		logger.info("md5 zoneStr: {}", zoneStr);
+		
+		String zoneToken = MD5.create().digestHex(zoneStr).toUpperCase();
+		String zoneContent = HttpUtil.post(GET_ALL_NET_ZONE + URL_PARAM_TOKEN + zoneToken, zoneObject.toString(), 30000);
+		logger.info("zoneContent: {}", zoneContent);
+		
+		JSONObject defaultZone = convert2Json(zoneContent);
+		JSONArray defaultZoneArray = defaultZone.getJSONArray("data");
+		if (defaultZoneArray != null && defaultZoneArray.size() != 0) {
+			JSONObject jsonObject = defaultZoneArray.getJSONObject(0);
+			this.netZoneUuid = jsonObject.getStr("netZoneUuid");
+			if (StrUtil.isBlank(netZoneUuid)) {
+				throw new RuntimeException("not exist default zone id");
+			}
+		}
+	}
+	
+	/**
+	 * 将响应数据转为JSON对象
+	 * 
+	 * @param responseContent
+	 * @return
+	 * @date 2022年6月20日 下午2:55:18
+	 */
+	private static JSONObject convert2Json(String responseContent) {
+		if (StrUtil.isBlank(responseContent)) {
+			logger.error("reponse is null 【】" + responseContent);
+			throw new RuntimeException("响应数据为空");
+		}
+		
+		JSONObject jsonObject = new JSONObject(responseContent, false);
+		return jsonObject;
 	}
 	
 }