利用Java實現(xiàn)對云臺和鏡頭的遠程控制
摘要:結(jié)合我國實際情況和未來的發(fā)展趨勢, 開發(fā)出基于Java的視頻監(jiān)控系統(tǒng),實現(xiàn)對云臺和鏡頭的遠程控制。系統(tǒng)包括RS-232/RS-485 的轉(zhuǎn)換,解碼器和云臺、鏡頭以及它們與計算機串口的硬件連接,通過Pelco-D協(xié)議,采用Java的擴展類庫comm.Jar庫進行串口通信。
隨著銀行、賓館、交通要道等大型場所和小區(qū)管理的發(fā)展,安全成為至關(guān)重要的問題。在此情形下,高性能的數(shù)碼監(jiān)控系統(tǒng)成為各應(yīng)用部門所關(guān)心的熱點。對于數(shù)碼監(jiān)控系統(tǒng)來說,其主要功能是將監(jiān)控現(xiàn)場的場景轉(zhuǎn)換成視頻信號傳遞給計算機進行處理。為了加大監(jiān)控范圍,提高控制效率,一方面可以增加攝像機的數(shù)目,另一方面也可以在監(jiān)控系統(tǒng)中配置具有云臺和鏡頭調(diào)節(jié)功能的高性能攝像機,以便在視頻信號的采集過程中,可以通過服務(wù)器端或客戶端對攝像機的攝像角度和鏡頭實施控制[1]。另外,在科技飛速發(fā)展的今天,各種犯罪手段也層出不窮,通過網(wǎng)絡(luò)對監(jiān)控現(xiàn)場的云臺及鏡頭進行控制和調(diào)節(jié),并進行記錄,對于警方破案尤為重要。
現(xiàn)在的許多視頻監(jiān)控系統(tǒng)是采用VC開發(fā),而基于Java開發(fā)的遠程監(jiān)控系統(tǒng)并不多見。由于Java的平臺無關(guān)性和天生完整的網(wǎng)絡(luò)支持,Java在網(wǎng)絡(luò)通信中得到廣泛應(yīng)用。本系統(tǒng)開發(fā)出基于Java的視頻監(jiān)控系統(tǒng),通過串行通信及Pelco-D協(xié)議,實現(xiàn)對云臺與鏡頭的遠程控制。憑著Java跨平臺的優(yōu)點,基于Java開發(fā)的視頻監(jiān)控系統(tǒng)有望移植到手機平臺。
一、系統(tǒng)設(shè)計
遠程視頻監(jiān)控系統(tǒng)結(jié)構(gòu)如圖1所示。
1、RS-232/RS-485轉(zhuǎn)換器
計算機的COM口采用的是RS-232 通信方式,本系統(tǒng)所采用的云臺解碼器的通訊接口為RS-485,因此需在計算機COM口接一個RS-232/RS-485轉(zhuǎn)換器。RS-232-C(又稱EIA RS-232-C)接口是目前最常用的一種串行通訊接口,是在1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標準[2]。 RS-485由RS-232發(fā)展而來,彌補了RS-232的不足。 RS-232是點對點的通信,不能實現(xiàn)多機之間相互通信,而RS-485就可以實現(xiàn)多機通信。另外,RS-232的最大傳輸距離為15m,而R-2485則可達1.2km。轉(zhuǎn)換器可使計算機與云臺解碼器之間構(gòu)成點到點、點到多點的遠程多機通信網(wǎng)絡(luò),實現(xiàn)多機應(yīng)答通信。
2、解碼器
本系統(tǒng)采用智能解碼器,具有較強抗干擾、低功耗、防死機和強驅(qū)動力等優(yōu)點,能自動識別國內(nèi)大多數(shù)常用協(xié)議,包括特殊協(xié)議,如科力矩陣協(xié)議、EE矩陣協(xié)議和曼碼矩陣協(xié)議等。在云臺解碼器中,通過跳線設(shè)置波特率、特殊協(xié)議及云臺地址,由串口與服務(wù)器端計算機進行通信。解碼器的主要作用是:通過串口接收服務(wù)器端計算機的控制碼,并對此控制碼進行地址和命令解析,將解析的命令轉(zhuǎn)換成相應(yīng)的能夠驅(qū)動云臺轉(zhuǎn)動的控制電壓,再傳遞給云臺以控制云臺的轉(zhuǎn)動、攝像機鏡頭的調(diào)節(jié)及停止操作[3]。
3、云臺和鏡頭
云臺由攝像頭支架和驅(qū)動器組成。驅(qū)動器的作用是通過步進電機來驅(qū)動攝像頭支架的轉(zhuǎn)動,從而帶動攝像頭的轉(zhuǎn)動。 一個高性能攝像機云臺可以使支架向多個方向(上、下、左、右、左上、左下、右上和右下等)轉(zhuǎn)動,并可以調(diào)節(jié)攝像頭的焦距、光圈、景深等。通過解碼器以及解碼器的控制協(xié)議,可以對云臺和鏡頭進行控制。
4、解碼器的控制協(xié)議
(1)Pelco-D協(xié)議
由于所采用的解碼器可識別大多數(shù)常用協(xié)議,本系統(tǒng)選用了Pelco-D作為控制協(xié)議。Pelco-D協(xié)議一般用于矩陣和其他設(shè)備之間的通信。PTZ在安防監(jiān)控中是"pan/t ilt/zoom "的簡寫, 代表云臺全方位(上、下、左、右)移動及鏡頭變倍和變焦控制。以普通監(jiān)控控制PTZ為例,一般采用多芯連線,控制器以開關(guān)觸點控制云臺、鏡頭各個方向的連接供電,以達到云臺移動、鏡頭變倍的目的。協(xié)議分為一般PTZ命令及擴展命令。一般PTZ命令的格式為一個含7個元素的message數(shù)組,每個元素就是一個字節(jié)(byte),byte1,byte 2,...,byte7分別對應(yīng)同步字、地址碼、命令字1、命令字2、數(shù)據(jù)1、數(shù)據(jù)2和校驗碼。每個字節(jié)不同的位(bit)設(shè)置分別代表不同的控制命令。同步字通常都是FF;地址碼是指與矩陣通信的那臺設(shè)備的邏輯地址,可以在設(shè)備中設(shè)置;命令字1和命令字2的bit0,bit1,...,bit7的不同設(shè)置分別對應(yīng)鏡頭和云臺的不同操作;數(shù)據(jù)1表示鏡頭左右平移的速度,數(shù)值從$00(停止)到$3F(高速),另外還有一個值是$FF,表示最高速;數(shù)據(jù)2表示鏡頭上下移動的速度,數(shù)值從$00(停止)到$3F(最高速);校驗碼是指byte2到byte6這5個數(shù)的和(若超過255,則除以256,然后取余數(shù))[4]。
擴展命令是由byte3至byte6這4個字節(jié)分別對應(yīng)協(xié)議中定義的各個控制指令, 例如預(yù)設(shè)、清屏、自動對焦等。
(2)用Java實現(xiàn)Pelco-D協(xié)議
PelcoD. java對命令字1、命令字2、數(shù)據(jù)1和數(shù)據(jù)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;
以左右轉(zhuǎn)動為例,寫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;
}
}
控制云臺轉(zhuǎn)動,設(shè)定云臺轉(zhuǎn)動速度:
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) ;
}
向串口傳遞數(shù)組:
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中并沒有直接提供串行通信協(xié)議的開發(fā)包,而是以獨立的jar包形式發(fā)布在java.sun. com網(wǎng)站上,即comm. jar,稱之為Java com-m un ication API,它是J2SE的標準擴展。comm.jar分別提供了對常用的RS-232串行端口和IEEE1284并行端口通訊的支持[5]。
下載了comm.jar開發(fā)包后,與之一起的還有2個重要的文件:win32com.dll和javax.comm.Prop-ert iesL comm. jar提供了通訊用的java API,win32com. dll提供了供comm. jar調(diào)用的本地驅(qū)動接口,而javax. comm. p ropert ies是這個驅(qū)動的類配置文件首先將comm. jar復(fù)制到\lib\ex t目錄,再將w in32com. dll復(fù)制到JDK 的\b in目錄下,然后將javax.comm.p ropert ies復(fù)制到\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、設(shè)定參數(shù)
設(shè)定串口的物理參數(shù):波特率、數(shù)據(jù)長度、數(shù)據(jù)的停止位長度和數(shù)據(jù)校驗類型L根據(jù)Pelco2D協(xié)議設(shè)置波特率為4 800 b it/s,1位起始位和1位停止位,8位數(shù)據(jù)位,無校驗:
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是實現(xiàn)客戶機與服務(wù)器進行通信的一種機制,它是2臺計算機進行通信的端口。在Java程序中,可以將Socket類
評論