轉載地址:https://blog.csdn.net/qq_17058993/article/details/84649394
項目中需要用到海康威視的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網關端口:綜合管理平臺中的地址 端口
實則就是綜合管理平臺中的地址