项目中需要用到海康威视的iVMS-8700综合安防管理平台,需要进行第三方接口的调用,web端实现预览和回访。从平台在服务器上的安装部署到成功实现web端预览。
这里只是做一下自己研究的过程,不涉及开发机密,不提供任何安装包。
一、准备服务器
8核CPU 32G内存
最好是在内网,或者公网可以访问,vpn的话需要配置客户端机器的ip和摄像头的ip在同一个网段。
在服务器上可以ping通摄像头,不可以ping通本机电脑,摄像头做了端口映射无需vpn(之前还想找个路由器,在里面配置vpn,然后摄像头的网线先接到路由器上再接公司内网,可惜没找到路由器),但是本机电脑登录还需要vpn。
后期在内网开发的话应该简单很多
二、海康摄像头ip地址配置修改
从海康官网下载修改ip的软件
三、服务器中心管理安装
1、初始的用户名密码在文档中,后面提示修改。
2、安装授权文件
运行管理中心》
授权激活: 系统维护》授权管理
3、API网关的获取
新建合作方,拿到key和secret
API列表可以进行在线测试,很方便。
4、综合管理平台添加设备和监控点
服务器上直接打开web
设置监控点,把监控设备添加进去
5、媒体设置》码流中转处理 (不然没法在客户端查看实时画面)
四、本地电脑 中心客户端的安装
这里选择需要的安装即可,这里只是视频开发所以只选择了视频
登录以后查看实时画面
五、后台JSON解析
1、获取区域列表,根据区域name 拿到某个区域的indexCode
2、获取某区域下的监控点列表,根据监控点name拿到监控点编号cameraIndexCode,后台传到前台web页面进行预览。
/**
* 调用POST请求类型接口,这里以分页获取区域列表为例
* https://ip:port/artemis/api/api/resource/v1/regions
*
* @return
*/
public static String callPostApiGetRegions() {
/**
* https://ip:port/artemis/api/resource/v1/regions
* 根据API文档可以看出来,这是一个POST请求的Rest接口, 而且传入的参数为JSON字符串.
* ArtemisHttpUtil工具类提供了doPostFormArtemis这个函数, 一共五个参数在文档里写明其中的意思. 因为接口是https,
* 所以第一个参数path是个hashmap类型,请put一个key-value, querys为传入的参数. body 为JSON字符串.
* query不存在,所以传入null,accept和contentType不指定按照默认传null.
*/
String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/regions";
Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
paramMap.put("pageNo", "1");
paramMap.put("pageSize", "2");
String body = JSON.toJSON(paramMap).toString();
Map<String, String> path = new HashMap<String, String>(2) {
{
put("https://", getCamsApi);
}
};
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json");
return result;
}
// -------------------监控预览------------
/**
* 解析json 拿到indexCode
* @param regionList 区域里列表
* @param regionName 区域name
* @return
*/
public static String getindexCode(String regionList, String regionName) {
String indexCode = null;
JSONObject jsonObject = JSONObject.parseObject(regionList);
JSONObject json = jsonObject.getJSONObject("data");
JSONArray jsonArray = json.getJSONArray("list");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jo = jsonArray.getJSONObject(i);
if (jo.getString("name").equals(regionName)) {
indexCode = jo.getString("indexCode");
}
}
return indexCode;
}
/**
* 根据区域编号获取下级监控点列表
* @param indexCode 区域编号
* @return
*/
public static String getCameras(String indexCode) {
String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/regions/regionIndexCode/cameras";
Map<String, String> paramMap = new HashMap<String, String>();// post请求Form表单参数
paramMap.put("regionIndexCode", indexCode);
paramMap.put("treeCode", "0");
paramMap.put("pageNo", "1");
paramMap.put("pageSize", "2");
String body = JSON.toJSON(paramMap).toString();
Map<String, String> path = new HashMap<String, String>(2) {
{
put("https://", getCamsApi);
}
};
String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json");
return result;
}
/**
* 获取监控点编号 cameraIndexCode 根据 cameraName
* @param camerasList 监控点列表
* @param cameraName 监控点name
* @return
*/
public static String getcameraIndexCode(String camerasList, String cameraName) {
String cameraIndexCode = null;
JSONObject jsonObject = JSONObject.parseObject(camerasList);
JSONObject json = jsonObject.getJSONObject("data");
JSONArray jsonArray = json.getJSONArray("list");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jo = jsonArray.getJSONObject(i);
if (jo.getString("cameraName").equals(cameraName)) {
cameraIndexCode = jo.getString("cameraIndexCode");
}
}
return cameraIndexCode;
}
main方法:
// 1、区域列表:
String VechicleDataResult = callPostApiGetRegions();
System.out.println(JSONObject.toJSONString(JSONObject.parse(VechicleDataResult), true)); //显示json格式的
// json解析 获取indexCode
String indexCode = getindexCode(VechicleDataResult, "软件部办公室");
System.out.println("indexCode:" + indexCode);
// 2、区域下的监控点
String cameras = getCameras(indexCode);
System.out.println(JSONObject.toJSONString(JSONObject.parseObject(cameras), true));
// json解析 获取cameraIndexCode
String cameraIndexCode = getcameraIndexCode(cameras, "Camera 01");
System.out.println("cameraIndexCode:" + cameraIndexCode);
//将cameraIndexCode传递到前台web页面 进行预览(调用Demo)
六、web端预览
1、因为OpenAPI-Java接口Demo中web端预览实际上是根据最终获得的预览取流url来操作的。
所以这里需要根据视频播放应用开发流程,结合运管中心提供的API接口测试一步一步来。
最终必须成功拿到预览取流url
也可以根据Demo中进行测试
2、调用”获取监控点预览取流 URL”接口,获取预览 url。
失败返回码0x02830015 一直查找原因,竟然是
摄像头的系统版本太低 需要升级 升级完成正常获取到 注册状态 和设备状态
在运管中心的设备接入框架中查看设备状态信息
其中监控点设备信息在综合管理平台中监控点查看
3、Demo中web预览
开放平台 http://open.hikvision.com/download 下载web插件
根据文档要求先下载web插件
注意:同一时刻只能在一个浏览器使用web插件,要是打开了两个浏览器,然后在关闭某个浏览器就会弹出下面提示框
API网关IP地址:服务器ip地址
API网关端口:综合管理平台中的地址 端口
实则就是综合管理平台中的地址