目前的漁政網頁版的開發已經接近尾聲,目前要做的是一個網頁版的在線視頻實時監控的功能,仿照海康的網頁版示例,整個頁面做下來有點心得體會,所以寫一篇博文記錄下,方便自己以后翻閱,也希望可以給別人提供幫助
首先搭建頁面,用css+div布局生成頁面,如何用js生成div在我前面的博客中有提過
這篇博客我准備寫兩篇,第一篇講側邊欄的生成過程,第二遍講海康視頻插件的添加和雲台的操作
因為獲取數據的原因,側邊欄的生成比我預計的多花了好幾天的時間,當然了這么幾天我也學到了很多新的知識,這更主要的是對於數組有了一個更深刻的理論
首先獲取到所有的設備,里面的數據包括所有的設備和設備編號,相當於所有數據的總框,我需要根據這個總框編寫一個字典函數,根據其其他接口獲取到得設備,得到設備名稱顯示在節點中,關於字典函數的編寫和數據的層級關系在上一篇博客里。
然后根據接口,獲取所有的IRST設備,將從接口獲取的LIST格式的數據整理成LIst{IRST,LIST{}}的格式,獲取完畢之后拼接字符串,在寫的時候出現了兩處錯誤,一處是遍歷數組添加數據的時候,后面的數據替換了之前的存儲數據,二是之前寫的字典函數沒有應用上去,該顯示站點名稱的地方寫的是未定義
我們依次解決這些問題
第一個問題,首先看一段代碼

1 //設置站點設備的索引 2 var nationindex = 0; 3 var irstindex = 0; 4 var index = 0; 5 //獲取第一個站點名稱 6 var IRSTnation = nodelist[0].szDeviceID; 7 8 //數組用來存儲所有的IRST設備信息 9 var IRSTlist = new Array(IRST); 10 11 //數組用來存儲站點名稱以及對應的IRST設備信息 12 var list = new Array(IRSTnation, IRSTlist); 13 14 15 for (var i = 0; i < nodelength; i++) { 16 if (nodelist[i].szDeviceID === IRSTnation) { 17 //數組用來存儲單個的IRST設備信息 18 var IRST = new Array(); 19 IRST[irstindex] = new Array(); 20 IRST[irstindex] = [nodelist[i].szName, nodelist[i].szIP, nodelist[i].NPort, nodelist[i].szUser, nodelist[i].szPassword, nodelist[i].NChannel, nodelist[i].szName, nodelist[i].szStation, nodelist[i].NDeviceType]; 21 IRSTlist[nationindex] = new Array(); 22 IRSTlist[nationindex].push(IRST); 23 list[index] = new Array(); 24 var copyIRSTlist = IRSTlist; 25 list[index].push(IRSTnation, copyIRSTlist[nationindex]); 26 irstindex++; 27 } 28 if (nodelist[i].szDeviceID !== IRSTnation) { 29 index++; 30 nationindex++; 31 irstindex = 0; 32 IRSTnation = nodelist[i].szDeviceID; 33 //數組用來存儲單個的IRST設備信息 34 var IRST = new Array(); 35 IRST[irstindex] = new Array(); 36 IRST[irstindex] = [nodelist[i].szName, nodelist[i].szIP, nodelist[i].NPort, nodelist[i].szUser, nodelist[i].szPassword, nodelist[i].NChannel, nodelist[i].szName, nodelist[i].szStation, nodelist[i].NDeviceType]; 37 IRSTlist[nationindex] = new Array(); 38 IRSTlist[nationindex].push(IRST); 39 list[index] = new Array(); 40 var copyIRSTlist = IRSTlist; 41 list[index].push(IRSTnation, copyIRSTlist[nationindex]); 42 irstindex++; 43 } 44 }
這段代碼看起來比較復雜,其實邏輯比較好理解,IRST存儲每個攝像頭的信息,IRSTList存儲IRST數據,list存儲站點和對應的攝像頭數據,我在第一個循環執行完之后,切換站點,重置IRSTList的索引為0時,后面生成的數據就把前面的數據覆蓋了,我試了很久沒找到一個好的解決方法,后來在網上找到一個別人用js寫的Map方法,達成了我想要的數據格式
從thrift獲取數據,用map函數變成我想要的數據格式,然后拼接字符串,代碼如下:

1 //獲取所有IRST設備 2 $.ajax({ 3 contentType: "application/x-www-form-urlencoded; charset=utf-8", 4 type: "POST", 5 url: "/getit", //servlet路徑 6 statusCode: { 7 404: function () { 8 alert('獲取IRST設備失敗,請刷新'); 9 } 10 }, 11 success: function (data) { 12 nodelist = eval(data); 13 var areas = new Map(); 14 for (var i = 0; i < nodelist.length; i++) { 15 var deviceid = nodelist[i].szDeviceID; 16 //獲取站點編號 17 var stationid = deviceid.substring(0, 6); 18 //獲取湖區編號 19 var areaid = deviceid.substring(0, 4); 20 21 //添加湖區信息 22 if (!areas.containsKey(areaid)) 23 areas.put(areaid, new Map()); 24 25 //添加站點信息 26 var area =areas.get(areaid); 27 if (!area.containsKey(stationid)) 28 area.put(stationid,new Map()); 29 30 //添加設備信息 31 var station = area.get(stationid); 32 if (!station.containsKey(deviceid)) 33 station.put(deviceid,new Map()); 34 35 station.get(deviceid).put(nodelist[i].szName,nodelist[i]); 36 37 } 38 39 var keys = areas.keys(); 40 41 var i = 0; 42 var ii = 0; 43 var iii = 0; 44 var iiii = 0; 45 var station = ""; 46 var device = ""; 47 var IRST = ""; 48 var str = ""; 49 50 //拼接字符串 51 str = "["; 52 53 for ( i = 0; i < keys.length; i++) { 54 //根據湖區名稱找站點名稱 55 var allinfo = areas.get(keys); 56 station = allinfo.elements; 57 //如果有站點信息 58 if(station.length > 0){ 59 for (ii = 0; ii < station.length; ii++) { 60 if (ii + 1 === station.length) { 61 str += "{id:'" + station[ii].key + "',text:'" + adddevide.find(station[ii].key) + "'"; 62 alldevice(); 63 break; 64 } 65 else { 66 str += "{id:'" + station[ii].key + "',text:'" + adddevide.find(station[ii].key) + "'"; 67 alldevice(); 68 str += "},"; 69 } 70 } 71 } 72 } 73 74 str += "}];"; 75 76 //獲取不同的設備 77 function alldevice() { 78 device = station[ii].value.elements; 79 if(device.length > 0){ 80 for (iii = 0; iii < device.length; iii++) { 81 if (str.charAt(str.length - 1) !== ",") { 82 str += ",nodes:["; 83 } 84 //如果是節點的最后一位 85 if (iii + 1 === device.length) { 86 str += "{id:'" + device[iii].key + "',text:'" + adddevide.find(device[iii].key)+ "'"; 87 IRSTType(); 88 str += "}]"; 89 return 0; 90 } 91 else { 92 str += "{id:'" + device[iii].key + "',text:'" + adddevide.find(device[iii].key)+ "'"; 93 IRSTType(); 94 str += "},"; 95 } 96 } 97 } 98 return 0; 99 } 100 101 //獲取設備上不同的攝像頭 102 function IRSTType() { 103 var info = new Array(); 104 var index = 0; 105 IRST = device[iii].value.elements; 106 if(IRST.length > 0){ 107 for (iiii = 0; iiii < IRST.length; iiii++) { 108 if (str.charAt(str.length - 1) !== ",") { 109 str += ",nodes:["; 110 } 111 //如果是節點的最后一位 112 if (iiii + 1 === IRST.length) { 113 //定義數組,存儲用戶登錄信息 114 info[index] = new Array(); 115 info[index].push(IRST[iiii].value.szIP,IRST[iiii].value.szUser,IRST[iiii].value.szPassword,IRST[iiii].value.NPort,IRST[iiii].value.NChannel); 116 str += "{id:'" + IRST[iiii].value.szIP + IRST[iiii].value.NChannel + "',tags:['" + info[index] + "'],text:'" + IRST[iiii].key + "'}]"; 117 index++; 118 return 0; 119 } 120 else { 121 info[index] = new Array(); 122 info[index].push(IRST[iiii].value.szIP,IRST[iiii].value.szUser,IRST[iiii].value.szPassword,IRST[iiii].value.NPort,IRST[iiii].value.NChannel); 123 str += "{id:'" + IRST[iiii].value.szIP + IRST[iiii].value.NChannel + "',tags:['" + info[index] + "'],text:'" + IRST[iiii].key + "'},"; 124 index++; 125 } 126 } 127 } 128 return 0; 129 } 130 131 var nodedata = eval(str); 132 133 $("#nationselect").treeview({ 134 //默認只顯示第一層級的數據 135 levels: 1, 136 data: nodedata 137 }); 138 139 $('#nationselect').on('nodeSelected', function (event, data) { 140 //數組轉字符串 141 var IRSTinfo = data.tags.toString(); 142 //字符串拼接數組 143 var abcArray = IRSTinfo.split(','); 144 //用戶登陸IP 145 var IRSTIP = abcArray[0]; 146 //用戶登陸名 147 var IRSTUSER = abcArray[1]; 148 //用戶登陸密碼 149 var IRSTPSW = abcArray[2]; 150 //用戶登陸端口號 151 var IRSTPort = abcArray[3]; 152 //攝像頭的通道號 153 var IRSTChannel = abcArray[4]; 154 var a = new NationInfo(IRSTIP, IRSTPort, IRSTUSER, IRSTPSW, IRSTChannel); 155 openvideo(a); 156 clickLogin(); 157 }); 158 159 } 160 });
下面就出現了第二個問題,servlet的調用順序問題,我發現有時候運行的時候,顯示的是未定義數據,說明先運行的是獲取IRST的servlet,雖然我寫的是獲取所有設備的servlet的函數在前,於是我將獲取所有站點的ajax放在了獲取所有IRST的ajax里面的success函數里,完成效果如下:
在node的click時間里添加 clickLogin()函數,點擊站點,完成登錄
好,獲取了站點信息,完成了登陸之后,下面就是安放視頻插件個控制按鈕,下一篇博客會詳細說一下這個流程