利用Java實現對云臺和鏡頭的遠程控制
摘要:結合我國實際情況和未來的發展趨勢, 開發出基于Java的視頻監控系統,實現對云臺和鏡頭的遠程控制。系統包括RS-232/RS-485 的轉換,解碼器和云臺、鏡頭以及它們與計算機串口的硬件連接,通過Pelco-D協議,采用Java的擴展類庫comm.Jar庫進行串口通信。
隨著銀行、賓館、交通要道等大型場所和小區管理的發展,安全成為至關重要的問題。在此情形下,高性能的數碼監控系統成為各應用部門所關心的熱點。對于數碼監控系統來說,其主要功能是將監控現場的場景轉換成視頻信號傳遞給計算機進行處理。為了加大監控范圍,提高控制效率,一方面可以增加攝像機的數目,另一方面也可以在監控系統中配置具有云臺和鏡頭調節功能的高性能攝像機,以便在視頻信號的采集過程中,可以通過服務器端或客戶端對攝像機的攝像角度和鏡頭實施控制[1]。另外,在科技飛速發展的今天,各種犯罪手段也層出不窮,通過網絡對監控現場的云臺及鏡頭進行控制和調節,并進行記錄,對于警方破案尤為重要。
現在的許多視頻監控系統是采用VC開發,而基于Java開發的遠程監控系統并不多見。由于Java的平臺無關性和天生完整的網絡支持,Java在網絡通信中得到廣泛應用。本系統開發出基于Java的視頻監控系統,通過串行通信及Pelco-D協議,實現對云臺與鏡頭的遠程控制。憑著Java跨平臺的優點,基于Java開發的視頻監控系統有望移植到手機平臺。
一、系統設計
遠程視頻監控系統結構如圖1所示。
1、RS-232/RS-485轉換器
計算機的COM口采用的是RS-232 通信方式,本系統所采用的云臺解碼器的通訊接口為RS-485,因此需在計算機COM口接一個RS-232/RS-485轉換器。RS-232-C(又稱EIA RS-232-C)接口是目前最常用的一種串行通訊接口,是在1970年由美國電子工業協會(EIA)聯合貝爾系統、調制解調器廠家及計算機終端生產廠家共同制定的用于串行通訊的標準[2]。 RS-485由RS-232發展而來,彌補了RS-232的不足。 RS-232是點對點的通信,不能實現多機之間相互通信,而RS-485就可以實現多機通信。另外,RS-232的最大傳輸距離為15m,而R-2485則可達1.2km。轉換器可使計算機與云臺解碼器之間構成點到點、點到多點的遠程多機通信網絡,實現多機應答通信。

2、解碼器
本系統采用智能解碼器,具有較強抗干擾、低功耗、防死機和強驅動力等優點,能自動識別國內大多數常用協議,包括特殊協議,如科力矩陣協議、EE矩陣協議和曼碼矩陣協議等。在云臺解碼器中,通過跳線設置波特率、特殊協議及云臺地址,由串口與服務器端計算機進行通信。解碼器的主要作用是:通過串口接收服務器端計算機的控制碼,并對此控制碼進行地址和命令解析,將解析的命令轉換成相應的能夠驅動云臺轉動的控制電壓,再傳遞給云臺以控制云臺的轉動、攝像機鏡頭的調節及停止操作[3]。
3、云臺和鏡頭
云臺由攝像頭支架和驅動器組成。驅動器的作用是通過步進電機來驅動攝像頭支架的轉動,從而帶動攝像頭的轉動。 一個高性能攝像機云臺可以使支架向多個方向(上、下、左、右、左上、左下、右上和右下等)轉動,并可以調節攝像頭的焦距、光圈、景深等。通過解碼器以及解碼器的控制協議,可以對云臺和鏡頭進行控制。
4、解碼器的控制協議
(1)Pelco-D協議
由于所采用的解碼器可識別大多數常用協議,本系統選用了Pelco-D作為控制協議。Pelco-D協議一般用于矩陣和其他設備之間的通信。PTZ在安防監控中是"pan/t ilt/zoom "的簡寫, 代表云臺全方位(上、下、左、右)移動及鏡頭變倍和變焦控制。以普通監控控制PTZ為例,一般采用多芯連線,控制器以開關觸點控制云臺、鏡頭各個方向的連接供電,以達到云臺移動、鏡頭變倍的目的。協議分為一般PTZ命令及擴展命令。一般PTZ命令的格式為一個含7個元素的message數組,每個元素就是一個字節(byte),byte1,byte 2,...,byte7分別對應同步字、地址碼、命令字1、命令字2、數據1、數據2和校驗碼。每個字節不同的位(bit)設置分別代表不同的控制命令。同步字通常都是FF;地址碼是指與矩陣通信的那臺設備的邏輯地址,可以在設備中設置;命令字1和命令字2的bit0,bit1,...,bit7的不同設置分別對應鏡頭和云臺的不同操作;數據1表示鏡頭左右平移的速度,數值從$00(停止)到$3F(高速),另外還有一個值是$FF,表示最高速;數據2表示鏡頭上下移動的速度,數值從$00(停止)到$3F(最高速);校驗碼是指byte2到byte6這5個數的和(若超過255,則除以256,然后取余數)[4]。
擴展命令是由byte3至byte6這4個字節分別對應協議中定義的各個控制指令, 例如預設、清屏、自動對焦等。
(2)用Java實現Pelco-D協議
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;
以左右轉動為例,寫Pan 的類:
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;
}
}
控制云臺轉動,設定云臺轉動速度:
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) (STXA ddressCommand1
Command2Data1Data2);
return new byte [ ] {STX, A ddress, Command1, Com2
mand2, Data1,Data2, CheckSum};
二、Java串口編程
Sun的J2SE中并沒有直接提供串行通信協議的開發包,而是以獨立的jar包形式發布在java.sun. com網站上,即comm. jar,稱之為Java com-m un ication API,它是J2SE的標準擴展。comm.jar分別提供了對常用的RS-232串行端口和IEEE1284并行端口通訊的支持[5]。
下載了comm.jar開發包后,與之一起的還有2個重要的文件:win32com.dll和javax.comm.Prop-ert iesL comm. jar提供了通訊用的java API,win32com. dll提供了供comm. jar調用的本地驅動接口,而javax. comm. p ropert ies是這個驅動的類配置文件首先將comm. jar復制到\lib\ex t目錄,再將w in32com. dll復制到JDK 的\b in目錄下,然后將javax.comm.p ropert ies復制到\lib目錄。
1、打開串口
使用串口前必先打開串口:
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、設定參數
設定串口的物理參數:波特率、數據長度、數據的停止位長度和數據校驗類型L根據Pelco2D協議設置波特率為4 800 b it/s,1位起始位和1位停止位,8位數據位,無校驗:
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)
{. . . . . . }
三、網絡控制
1、Socket通信
采用Socket(套接字)通信。Socket是實現客戶機與服務器進行通信的一種機制,它是2臺計算機進行通信的端口。在Java程序中,可以將Socket類
評論