結合我國實(shí)際情況和未來(lái)的發(fā)展趨勢, 開(kāi)發(fā)出基于Java的視頻監控系統,實(shí)現對云臺和鏡頭的遠程控制。系統包括RS-232/RS-485 的轉換,解碼器和云臺、鏡頭以及它們與計算機串口的硬件連接,通過(guò)Pelco-D協(xié)議,采用Java的擴展類(lèi)庫comm.Jar庫進(jìn)行串口通信。 隨著(zhù)銀行、賓館、交通要道等大型場(chǎng)所和小區管理的發(fā)展,安全成為至關(guān)重要的問(wèn)題。在此情形下,高性能的數碼監控系統成為各應用部門(mén)所關(guān)心的熱點(diǎn)。對于數碼監控系統來(lái)說(shuō),其主要功能是將監控現場(chǎng)的場(chǎng)景轉換成視頻信號傳遞給計算機進(jìn)行處理。為了加大監控范圍,提高控制效率,一方面可以增加攝像機的數目,另一方面也可以在監控系統中配置具有云臺和鏡頭調節功能的高性能攝像機,以便在視頻信號的采集過(guò)程中,可以通過(guò)服務(wù)器端或客戶(hù)端對攝像機的攝像角度和鏡頭實(shí)施控制。另外,在科技飛速發(fā)展的今天,各種犯罪手段也層出不窮,通過(guò)網(wǎng)絡(luò )對監控現場(chǎng)的云臺及鏡頭進(jìn)行控制和調節,并進(jìn)行記錄,對于警方破案尤為重要。 現在的許多視頻監控系統是采用VC開(kāi)發(fā),而基于Java開(kāi)發(fā)的遠程監控系統并不多見(jiàn)。由于Java的平臺無(wú)關(guān)性和天生完整的網(wǎng)絡(luò )支持,Java在網(wǎng)絡(luò )通信中得到廣泛應用。本系統開(kāi)發(fā)出基于Java的視頻監控系統,通過(guò)串行通信及Pelco-D協(xié)議,實(shí)現對云臺與鏡頭的遠程控制。憑著(zhù)Java跨平臺的優(yōu)點(diǎn),基于Java開(kāi)發(fā)的視頻監控系統有望移植到手機平臺。 一、系統設計 遠程視頻監控系統結構如圖1所示。 1、RS-232/RS-485轉換器 計算機的COM口采用的是RS-232 通信方式,本系統所采用的云臺解碼器的通訊接口為RS-485,因此需在計算機COM口接一個(gè)RS-232/RS-485轉換器。RS-232-C(又稱(chēng)EIA RS-232-C)接口是目前最常用的一種串行通訊接口,是在1970年由美國電子工業(yè)協(xié)會(huì )(EIA)聯(lián)合貝爾系統、調制解調器廠(chǎng)家及計算機終端生產(chǎn)廠(chǎng)家共同制定的用于串行通訊的標準。 RS-485由RS-232發(fā)展而來(lái),彌補了RS-232的不足。 RS-232是點(diǎn)對點(diǎn)的通信,不能實(shí)現多機之間相互通信,而RS-485就可以實(shí)現多機通信。另外,RS-232的最大傳輸距離為15m,而R-2485則可達1.2km。轉換器可使計算機與云臺解碼器之間構成點(diǎn)到點(diǎn)、點(diǎn)到多點(diǎn)的遠程多機通信網(wǎng)絡(luò ),實(shí)現多機應答通信。 2、解碼器 本系統采用智能解碼器,具有較強抗干擾、低功耗、防死機和強驅動(dòng)力等優(yōu)點(diǎn),能自動(dòng)識別國內大多數常用協(xié)議,包括特殊協(xié)議,如科力矩陣協(xié)議、EE矩陣協(xié)議和曼碼矩陣協(xié)議等。在云臺解碼器中,通過(guò)跳線(xiàn)設置波特率、特殊協(xié)議及云臺地址,由串口與服務(wù)器端計算機進(jìn)行通信。解碼器的主要作用是:通過(guò)串口接收服務(wù)器端計算機的控制碼,并對此控制碼進(jìn)行地址和命令解析,將解析的命令轉換成相應的能夠驅動(dòng)云臺轉動(dòng)的控制電壓,再傳遞給云臺以控制云臺的轉動(dòng)、攝像機鏡頭的調節及停止操作。 3、云臺和鏡頭 云臺由攝像頭支架和驅動(dòng)器組成。驅動(dòng)器的作用是通過(guò)步進(jìn)電機來(lái)驅動(dòng)攝像頭支架的轉動(dòng),從而帶動(dòng)攝像頭的轉動(dòng)。 一個(gè)高性能攝像機云臺可以使支架向多個(gè)方向(上、下、左、右、左上、左下、右上和右下等)轉動(dòng),并可以調節攝像頭的焦距、光圈、景深等。通過(guò)解碼器以及解碼器的控制協(xié)議,可以對云臺和鏡頭進(jìn)行控制。 4、解碼器的控制協(xié)議 (1)Pelco-D協(xié)議 由于所采用的解碼器可識別大多數常用協(xié)議,本系統選用了Pelco-D作為控制協(xié)議。Pelco-D協(xié)議一般用于矩陣和其他設備之間的通信。PTZ在安防監控中是"pan/t ilt/zoom "的簡(jiǎn)寫(xiě), 代表云臺全方位(上、下、左、右)移動(dòng)及鏡頭變倍和變焦控制。以普通監控控制PTZ為例,一般采用多芯連線(xiàn),控制器以開(kāi)關(guān)觸點(diǎn)控制云臺、鏡頭各個(gè)方向的連接供電,以達到云臺移動(dòng)、鏡頭變倍的目的。協(xié)議分為一般PTZ命令及擴展命令。一般PTZ命令的格式為一個(gè)含7個(gè)元素的message數組,每個(gè)元素就是一個(gè)字節(byte),byte1,byte 2,...,byte7分別對應同步字、地址碼、命令字1、命令字2、數據1、數據2和校驗碼。每個(gè)字節不同的位(bit)設置分別代表不同的控制命令。同步字通常都是FF;地址碼是指與矩陣通信的那臺設備的邏輯地址,可以在設備中設置;命令字1和命令字2的bit0,bit1,...,bit7的不同設置分別對應鏡頭和云臺的不同操作;數據1表示鏡頭左右平移的速度,數值從$00(停止)到$3F(高速),另外還有一個(gè)值是$FF,表示最高速;數據2表示鏡頭上下移動(dòng)的速度,數值從$00(停止)到$3F(最高速);校驗碼是指byte2到byte6這5個(gè)數的和(若超過(guò)255,則除以256,然后取余數)。 擴展命令是由byte3至byte6這4個(gè)字節分別對應協(xié)議中定義的各個(gè)控制指令, 例如預設、清屏、自動(dòng)對焦等。 (2)用Java實(shí)現Pelco-D協(xié)議 PelcoD. java對命令字1、命令字2、數據1和數據2的定義: //command1 p rivate final byte FocusN ear = 0x01; p rivate final byte IrisOpen = 0x02; p rivate final byte IrisClo se = 0x04; p rivate final byte CameraO nO ff = 0x08; p rivate final byte A utoM anualScan = 0x10; p rivate final sho rt Sense = 0x80; //command2 p rivate final stat ic byte PanR igh t = 0x02; p rivate final stat ic byte PanL eft = 0x04; p rivate final stat ic byte T iltU p = 0x08; p rivate final stat ic byte T iltDow n = 0x10; p rivate final byte ZoomTele = 0x20; p rivate final byte ZoomW ide = 0x40; p rivate final byte FocusFar = 0x80; //data1 p rivate final byte PanSpeedM in = 0x00; p rivate final byte PanSpeedM ax = 0xFF; //data2 p rivate final byte T iltSpeedM in = 0x00; p rivate final byte T iltSpeedM ax = 0x14; 以左右轉動(dòng)為例,寫(xiě)Pan 的類(lèi): public enum Pan{ R igh t ( (byte) 0x02), L eft ( (byte) 0x04); p rivate byte value; p rivate Pan (byte intV alue) { value= intV alue; } public byte getV alue () { return value; } } 控制云臺轉動(dòng),設定云臺轉動(dòng)速度: public byte [ ] CameraPan (byte deviceA ddress, byte act ion, byte speed) { if (speed< = PanSpeedM in) Speed = PanSpeedM in; if (speed< PanSpeedM ax) speed = PanSpeedM ax; return M essage. GetM essage ( deviceA ddress, ( byte ) 0x00, act ion, (byte) speed, (byte) 0x00) ; } 向串口傳遞數組: public stat ic byte [ ] GetM essage (byte address, byte command1, byte command2, byte data1, byte data2) { A ddress = address; Data1= data1; Data2= data2; Command1= command1; Command2= command2; CheckSum= (byte) (STX&A ddress&Command1& Command2&Data1&Data2); return new byte [ ] {STX, A ddress, Command1, Com2 mand2, Data1,Data2, CheckSum}; 二、Java串口編程 Sun的J2SE中并沒(méi)有直接提供串行通信協(xié)議的開(kāi)發(fā)包,而是以獨立的jar包形式發(fā)布在java.sun. com網(wǎng)站上,即comm. jar,稱(chēng)之為Java com-m un ication API,它是J2SE的標準擴展。comm.jar分別提供了對常用的RS-232串行端口和IEEE1284并行端口通訊的支持。 下載了comm.jar開(kāi)發(fā)包后,與之一起的還有2個(gè)重要的文件:win32com.dll和javax.comm.Prop-ert iesL comm. jar提供了通訊用的java API,win32com. dll提供了供comm. jar調用的本地驅動(dòng)接口,而javax. comm. p ropert ies是這個(gè)驅動(dòng)的類(lèi)配置文件首先將comm. jar復制到\\lib\\ex t目錄,再將w in32com. dll復制到JDK 的\\b in目錄下,然后將javax.comm.p ropert ies復制到\\lib目錄。 1、打開(kāi)串口 使用串口前必先打開(kāi)串口: try{ portId = CommPort Ident ifier. getPort Identifier("COM 1" ); serialPort=(SerialPort)port Id. open ("My app", 60); }catch (Port InU seExcep t ion e) {. . . . . . } catch (NoSuchPo rtExcep t ion e) {. . . . . . } 2、設定參數 設定串口的物理參數:波特率、數據長(cháng)度、數據 的停止位長(cháng)度和數據校驗類(lèi)型L根據Pelco2D協(xié)議設置波特率為4 800 b it/s,1位起始位和1位停止位,8位數據位,無(wú)校驗: t ry{ serialPo rt. setSerialPo rtParam s(2400, SerialPo rt. DA TAB ITS- 8, SerialPo rt. STO PB ITS- 1, SerialPo rt. PAR ITY- NON E); }catch (U nsuppo rtedCommOperat ionExcep t ion e) {. . . . . . } 三、網(wǎng)絡(luò )控制 1、Socket通信 采用Socket(套接字)通信。Socket是實(shí)現客戶(hù)機與服務(wù)器進(jìn)行通信的一種機制,它是2臺計算機進(jìn)行通信的端口。在Java程序中,可以將Socket類(lèi)和ServerSocket類(lèi)分別用于客戶(hù)機和服務(wù)器中,分別創(chuàng )建獨立的Socket,將2個(gè)Socket進(jìn)行連接,實(shí)現連接后,就可以通過(guò)Socket進(jìn)行通信。 在本系統中,服務(wù)器端起一線(xiàn)程進(jìn)行監聽(tīng),一旦收到客戶(hù)端對服務(wù)器的指定端口發(fā)出的請求,即根據客戶(hù)端傳來(lái)的指令來(lái)控制云臺和鏡頭?蛻(hù)端通過(guò)發(fā)送字符串與服務(wù)器端匹配控制命令。如控制云臺向上,則客戶(hù)端: public vo id up () { t ry{ Socket mysocket= new Socket ( InetA ddress. getLocal2 Ho st () , 5678); mysocket. getO utputSt ream ( ). w rite ( " up ". getBytes () ); mysocket. clo se (); }catch ( IO Excep t ion e) { e. p rintStackT race (); } } 服務(wù)器端: if (command. equals ("up " ) ) { . . . . . . ??實(shí)現向上操作 } 用戶(hù)只需在界面中點(diǎn)擊"上"、"下"、"左"、"右"等命令按鈕,系統即向服務(wù)器發(fā)送命令。 2、控制沖突的解決 當有多個(gè)客戶(hù)端同時(shí)登陸并控制云臺,或服務(wù)器端和客戶(hù)端同時(shí)控制云臺,便會(huì )發(fā)生控制沖突。解決控制沖突的策略是設置控制狀態(tài)?蛻(hù)端對云臺或鏡頭的控制是通過(guò)服務(wù)器端進(jìn)行的。 客戶(hù)端若要發(fā)送云臺或鏡頭控制命令,必須首先向服務(wù)器端發(fā)送控制申請命令,服務(wù)器在接收到客戶(hù)端控制申請命令后,就會(huì )檢查控制狀態(tài)。 (1)當沒(méi)有控制申請的時(shí)候控制狀態(tài)為空,服務(wù)器接受控制申請;當云臺和鏡頭正在被控制,控制狀態(tài)為忙,申請控制需要等待,服務(wù)器將通知正在控制的用戶(hù)。 (2)正在控制的用戶(hù)若在15min內無(wú)控制操作,服務(wù)器端自動(dòng)解除控制,若要繼續控制則要重新申請。 (3)若申請控制的是服務(wù)器端,服務(wù)器會(huì )告知正在操作的客戶(hù)端將在1min內退出。 四、實(shí)現方法 根據Pelco-D協(xié)議,對云臺和鏡頭的控制,實(shí)質(zhì)是通過(guò)串口對解碼器輸入一個(gè)包含七位數據碼的數組,解碼器通過(guò)所輸入的數據碼對云臺及鏡頭進(jìn)行控制建立好協(xié)議的主體,就可以建立一個(gè)控制窗口界面,實(shí)現各種控制功能,使用戶(hù)在客戶(hù)端方便地進(jìn)行監控。如要建立云臺上、下、左、右的控制,則在界面中建立4個(gè)控制按鈕并分別實(shí)現對應的消息。 以下是實(shí)現控制云臺向左轉動(dòng)的程序: public stat ic vo id main (St ring[ ] args) { PelcoD pelcoD= new PelcoD (); addressin= 0x01; speeding= 0x20; //獲得數據碼流 byte [ ] messagesend= pelcoD. CameraT ilt (addressin, PelcoD. Pan. L eft. getV alue () , speedin); t ry{ //寫(xiě)入數據碼流 out. w rite (messagesend, 0, 7); }catch ( IO Excep t ion e) {. . . . . . } catch (N ullPo interExcep t ion e) {. . . . . . } //關(guān)閉串口 serialPo rt. clo se (); } 發(fā)送數據碼流的例子: 如第1 個(gè)云臺, 開(kāi)啟攝像機: FF, 01, 88, 00, 00, 00, 89; 第2 個(gè)云臺, 關(guān)閉攝像機: FF, 02, 08, 00, 00, 00, 09; 第2 個(gè)云臺, 以最大速度的一半左轉: FF, 02, 00, 04, 00, 20, 26; 第2 個(gè)云臺, 停止: FF, 02, 00, 00, 00, 00, 02; 第10 個(gè)云臺,開(kāi)啟攝像機,焦距拉遠,左轉: FF, 0A , 88, 90, 00, 40, 62。 五、結束語(yǔ) 本系統利用Java串口通信,實(shí)現了對云臺和鏡頭的控制。軟件具有工作于多種操作系統的性能,用戶(hù)可隨時(shí)隨地通過(guò)IP網(wǎng)控制監控現場(chǎng),使監控網(wǎng)絡(luò )的互通成為現實(shí),為現代視頻監控提供一種可行方案。 |