1. API
java
String rootRegionApi = "/api/resource/v1/regions/root";
String subRegionApi = "/api/resource/v2/regions/subRegions";
String cameraByRegionApi = "/api/resource/v1/regions/regionIndexCode/cameras";
String preUrlByCameraApi = "/api/video/v2/cameras/previewURLs";
1. 获取 region 根节点
java
public IscRegionDO getTopTreeList() {
String body = getRootJsonBody();
String listResult = getHKDataByAPI(rootRegionApi, body);
if (StringUtils.isNotEmpty(listResult)) {
IscRegionDO obj = JSON.parseObject(listResult, IscRegionDO.class);
return obj;
}
return null;
}
private static String getRootJsonBody() {
JSONObject jsonBody = new JSONObject();
jsonBody.put("treeCode", "0");
String body = jsonBody.toJSONString();
return body;
}
private String getHKDataByAPI(String api, String body) {
JSONObject jsonObject = queryHK(api, body);
return jsonObject.getString("data");
}
海康util 方法
java
private static JSONObject queryHK(String api, String body) {
ArtemisConfig.host = Constant.HK_HOST;//服务器ip端口
ArtemisConfig.appKey = Constant.HK_KEY;// 秘钥appkey
ArtemisConfig.appSecret = Constant.HK_SECRET;// 秘钥appSecret
HashMap<String, String> path = new HashMap<String, String>(8);
path.put("https://", "/artemis" + api);
String url = "https://" + Constant.HK_HOST + "/artemis" + api;
log.info("IscRegionServiceImpl: appKey->{},appSecret->{},host->{},url->{},body->{}", ArtemisConfig.appKey, ArtemisConfig.appSecret, ArtemisConfig.host, url, body);
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null,
null, "application/json", null);
System.out.println(api + " ====== 请求返回结果:【{" + result + "}】");
JSONObject jsonObject = JSONObject.parseObject(result);
return jsonObject;
}
海康maven依赖包
xml
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.3</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
2. 获取 region 中间节点
java
@Override
public List<IscRegionDO> getSubTreeList(String indexCode) {
String body = getSubRegionJsonBody(indexCode);
String listResult = getHKListByAPI(subRegionApi, body);
log.info("getSubTreeList listResult {}", listResult);
if (StringUtils.isEmpty(listResult) || "[]".equals(listResult)) {
List<IscCameraDO> camerasList = getCamerasByRegionIndexCode(indexCode);
log.info("getSubTreeList camerasList {}", camerasList);
List<IscRegionDO> resultList = transferyy(camerasList, indexCode);
return resultList;
} else {
List<IscRegionDO> resultList = JSON.parseArray(listResult, IscRegionDO.class);
resultList.forEach(o -> o.setLeaf(false));
return resultList;
}
}
private static String getSubRegionJsonBody(String parentIndexCode) {
JSONObject jsonBody = new JSONObject();
int pageNo = 1, pageSize = 500;
jsonBody.put("parentIndexCode", parentIndexCode);
jsonBody.put("resourceType", "region");
jsonBody.put("pageNo", pageNo);
jsonBody.put("pageSize", pageSize);
jsonBody.put("cascadeFlag", "0");
String body = jsonBody.toJSONString();
return body;
}
private String getHKListByAPI(String api, String body) {
JSONObject jsonObject = queryHK(api, body);
String code = jsonObject.getString("code");// 操作成功
JSONObject dataObject = jsonObject.getJSONObject("data");// 操作成功
if (dataObject != null && "0".equals(code)) {// 查询成功
String listResult = dataObject.getString("list");
return listResult;
}
return null;
}
private List<IscRegionDO> transferyy(List<IscCameraDO> camerasList, String parentIndexCode) {
List<IscRegionDO> resultList = new ArrayList<>();
for (IscCameraDO iscCameraDO : camerasList) {
IscRegionDO iscRegionDO = new IscRegionDO();
iscRegionDO.setIndexCode(iscCameraDO.getCameraIndexCode()); // vv
iscRegionDO.setParentIndexCode(parentIndexCode); // vv
iscRegionDO.setName(iscCameraDO.getCameraName());//
iscRegionDO.setStatus(iscCameraDO.getStatus());//
iscRegionDO.setStatusName(iscCameraDO.getStatusName());//
iscRegionDO.setLeaf(true); // vv
resultList.add(iscRegionDO);
}
return resultList;
}
3. 获取 region 叶子下的摄像头
java
@Override
public List<IscCameraDO> getCamerasByRegionIndexCode(String regionIndexCode) {
String body = getCameraJsonBody(regionIndexCode);
String listResult = getHKListByAPI(cameraByRegionApi, body);
if (StringUtils.isNotEmpty(listResult)) {
List<IscCameraDO> resultList = JSON.parseArray(listResult, IscCameraDO.class);
return resultList;
}
return Collections.emptyList();
}
private static String getCameraJsonBody(String parentIndexCode) {
JSONObject jsonBody = new JSONObject();
int pageNo = 1, pageSize = 500;
jsonBody.put("regionIndexCode", parentIndexCode);
jsonBody.put("pageNo", pageNo);
jsonBody.put("pageSize", pageSize);
String body = jsonBody.toJSONString();
return body;
}
4. 获取摄像头的视频预览连接
java
@Override
public String getPreUrlByCameraIndexCode(String cameraIndexCode, String protocol) {
String body = getPreUrlBody(cameraIndexCode, protocol);
String listResult = getHKDataByAPI(preUrlByCameraApi, body);
if (StringUtils.isNotEmpty(listResult)) {
JSONObject obj = JSON.parseObject(listResult, JSONObject.class);
String originStr = obj.getString("url");
log.info("origin url :{}",originStr);
String replaced = originStr.replace(Constant.HK_ORIGIN_URL, Constant.HK_REPLACE_URL);
log.info("replaced url :{}",replaced);
return replaced;
}
return null;
}
private static String getPreUrlBody(String cameraIndexCode, String protocol) {
JSONObject jsonBody = new JSONObject();
int pageNo = 1, pageSize = 500;
jsonBody.put("cameraIndexCode", cameraIndexCode);
if (StringUtils.isNotEmpty(protocol)) {
jsonBody.put("protocol", protocol);
} else {
jsonBody.put("protocol", "hls");
}
jsonBody.put("pageNo", pageNo);
jsonBody.put("pageSize", pageSize);
String body = jsonBody.toJSONString();
return body;
}
其他配置
java
public static final String HK_HOST = "10.10.0.0";
public static final String HK_KEY = "HK_KEY";
public static final String HK_SECRET = "HK_SECRET";
public static final String HK_ORIGIN_URL = "http://HK_HOST:83/openUrl";
public static final String HK_REPLACE_URL = "https://xxx.company.com:7443/proxy-video";