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