張?zhí)稀」盘覐?qiáng) 曹子成 賀紹存 黃志敏
摘要:基于ARM S3C6410平臺(tái),研究人員結(jié)合HR-S501人體熱感紅外模塊和攝像頭模塊,運(yùn)用H264視頻壓縮技術(shù)和百度云后臺(tái)上傳技術(shù),設(shè)計(jì)開(kāi)發(fā)了基于ARM的實(shí)驗(yàn)室紅外監(jiān)控視頻報(bào)警系統(tǒng)。實(shí)現(xiàn)了由紅外模塊實(shí)現(xiàn)監(jiān)控,攝像頭輔助進(jìn)行報(bào)警,傳輸視頻到移動(dòng)客戶端等的功能。
關(guān)鍵詞: ARM;視頻壓縮;紅外感應(yīng);百度云
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)30-7085-05
計(jì)算機(jī)、通信、網(wǎng)絡(luò)控制及嵌入式等技術(shù)的飛速發(fā)展, 信息交換溝通領(lǐng)域的不斷擴(kuò)大, 覆蓋了從現(xiàn)場(chǎng)設(shè)備到控制、管理的各個(gè)層次。嵌人式系統(tǒng)因其穩(wěn)定性、實(shí)時(shí)性高的特點(diǎn),已在工業(yè)、國(guó)防、運(yùn)輸及航天等領(lǐng)域被廣泛地應(yīng)用。如果將嵌人式系統(tǒng)連接到應(yīng)用廣泛的網(wǎng)絡(luò)上, 則幾乎可以方便、低廉地將信息傳到世界的任何一個(gè)地方來(lái)進(jìn)行遠(yuǎn)程監(jiān)控。嵌人式遠(yuǎn)程監(jiān)控系統(tǒng)現(xiàn)已成為工業(yè)控制網(wǎng)絡(luò)重要的發(fā)展方向之一。基于的遠(yuǎn)程監(jiān)控系統(tǒng)是信息網(wǎng)絡(luò)與控制結(jié)合的產(chǎn)物,它借助網(wǎng)絡(luò)完成監(jiān)視控制任務(wù), 將監(jiān)視范圍擴(kuò)大到更大的空間, 進(jìn)一步推進(jìn)了控制技術(shù)向網(wǎng)絡(luò)化、分散化和開(kāi)放化的發(fā)展[1]。
目前,在高等院校中的實(shí)驗(yàn)室監(jiān)控系統(tǒng)都是采用傳統(tǒng)的安防系統(tǒng)設(shè)計(jì)的24H攝像頭錄像進(jìn)行監(jiān)控。這種方式不僅大大浪費(fèi)了攝像頭的有效工作時(shí)間,而且不間斷地工作也會(huì)縮短攝像頭的使用壽命。基于實(shí)驗(yàn)室等高校教室的監(jiān)控我們?cè)O(shè)計(jì)了一種更高效的監(jiān)控方式,此方案相比于傳統(tǒng)監(jiān)控系統(tǒng)不僅大大縮短了攝像頭的工作時(shí)間,而且大大提高了了攝像頭采集信息的有效性。同時(shí)此方案也將移動(dòng)技術(shù)融合到設(shè)計(jì)中來(lái),將適用范圍從傳統(tǒng)的實(shí)驗(yàn)室擴(kuò)展到家庭安防監(jiān)控的隊(duì)列,而移動(dòng)技術(shù)的加入更是將實(shí)時(shí)監(jiān)控信息反饋到目標(biāo)客戶端上,并且更加精準(zhǔn),更加方便。
本方案通過(guò)利用ARM S3C6410主板強(qiáng)大的硬件資源和LINUX系統(tǒng)設(shè)計(jì)了一套基于ARM的紅外感應(yīng)的視頻報(bào)警系統(tǒng)。本方案主要由紅外模塊完成全天候的監(jiān)控工作,攝像頭進(jìn)行輔助監(jiān)控,H264視頻壓縮技術(shù)進(jìn)行視頻壓縮,百度云實(shí)現(xiàn)視頻的移動(dòng)端對(duì)接。由于工業(yè)標(biāo)準(zhǔn)的紅外模塊不僅在強(qiáng)度上大大超過(guò)了傳統(tǒng)攝像頭的質(zhì)量,而人體熱感的立體監(jiān)控在監(jiān)控效果上面也大大超過(guò)了傳統(tǒng)攝像頭的監(jiān)控系統(tǒng)。而紅外探頭的小巧隱蔽的特點(diǎn)使得此監(jiān)控系統(tǒng)更容易布置和監(jiān)控[2]。
1 總體框架設(shè)計(jì)
整體技術(shù)方案由前端用戶端和后臺(tái)硬件端組成。前端軟件端主要是方便用戶對(duì)日常監(jiān)控的一些簡(jiǎn)單功能修改操作,主要的功能是登陸、修改信息、更改用戶權(quán)限。后臺(tái)硬件控制端主要包括了以下內(nèi)容:1) 視頻控制端:主要實(shí)現(xiàn)對(duì)已錄制視頻的壓縮截取與后臺(tái)轉(zhuǎn)發(fā); 2) 錄像控制:主要實(shí)現(xiàn)信號(hào)感應(yīng)還有錄像的控制; 3) 傳輸控制:主要實(shí)現(xiàn)選擇網(wǎng)絡(luò)環(huán)境與百度云存儲(chǔ); 4) 監(jiān)控管理:主要實(shí)現(xiàn)后臺(tái)數(shù)據(jù)的用戶存儲(chǔ)推送.
整個(gè)系統(tǒng)的主體設(shè)計(jì)框架圖如圖1所示。
2 硬件設(shè)計(jì)
對(duì)于整個(gè)硬件端的設(shè)計(jì)我們進(jìn)行了如下構(gòu)思,根據(jù)設(shè)計(jì)要求,我們將整個(gè)監(jiān)控端系統(tǒng)分成了以下幾個(gè)部分:
1) 監(jiān)控設(shè)備層,該部分主要包含了紅外模塊和攝像頭模塊,將此核心監(jiān)控部分獨(dú)立出來(lái)不僅便于設(shè)備的布線,也便于設(shè)備的正常運(yùn)轉(zhuǎn),一旦系統(tǒng)出問(wèn)題,這種分區(qū)式的結(jié)構(gòu)將大大減少查錯(cuò)的時(shí)間。
2) 網(wǎng)絡(luò)設(shè)備層,該部分主要包含了3G無(wú)線網(wǎng)卡,WIFI模塊等通信設(shè)備,該層主要負(fù)責(zé)監(jiān)控設(shè)備端的視頻信息的轉(zhuǎn)移,正是通過(guò)此層才得以實(shí)現(xiàn)監(jiān)控視頻直接到移動(dòng)端的目的。
3) 內(nèi)部控制管理層,主要以整個(gè)以太網(wǎng)、ARM11主控控制器組成。主要完成整個(gè)系統(tǒng)的信息搜集、處理和發(fā)布,同時(shí)承擔(dān)著對(duì)整個(gè)系統(tǒng)的統(tǒng)一管理和監(jiān)控。
硬件部分的ARM控制部分核心如下圖所示:
圖2 ARM硬件結(jié)構(gòu)圖
由ARM11核心微處理器連接各種輸入,通過(guò)CPLD(Complex Programmable Logic Device)復(fù)雜可編程邏輯器件實(shí)現(xiàn)諸如紅外,攝像頭,3G,WLAN等各種模塊的編程。有了ARM11處理器和CPLD的連接,從而全面實(shí)現(xiàn)了從信號(hào)輸入輸出,編程實(shí)現(xiàn)上來(lái)完成真正的ARM控制層[3]。
作為驅(qū)動(dòng)監(jiān)控設(shè)備的觸發(fā)點(diǎn),人體紅外的探測(cè)距離、靈敏度和穩(wěn)定性都是需要考慮的。在此我們選擇了HC-SR501人體紅外感應(yīng)模塊,它是基于紅外線技術(shù)的自動(dòng)控制模塊,采用德國(guó)原裝進(jìn)口LHI778探頭設(shè)計(jì),基于人體測(cè)量的設(shè)計(jì),適合用于實(shí)驗(yàn)室等安防報(bào)警的設(shè)計(jì),同時(shí)它的高精度探測(cè)距離較遠(yuǎn),靈敏度高,可靠性強(qiáng),軍工品質(zhì)也保證了所選模塊的使用壽命;攝像頭作為整個(gè)系統(tǒng)的核心輔助,作用在于當(dāng)紅外探測(cè)發(fā)現(xiàn)系統(tǒng)異常需要報(bào)警的時(shí)候,攝像頭能夠完成拍攝而且對(duì)拍攝的清晰度有一定的要求,由于我們使用了云技術(shù)將視頻同步到云端用移動(dòng)設(shè)備查看。所以攝像頭所拍視頻的大小要有一定的限制,因此我們選擇了主流130W像素的OV9650作為整個(gè)系統(tǒng)的攝像工具。不僅保證了其攝像的清晰度,也能保證在H264壓縮模式下視頻所占內(nèi)存的最小化。
3 軟件設(shè)計(jì)
程序主要是應(yīng)用嵌入式技術(shù)的后臺(tái)監(jiān)控,軟件起著輔助操作的作用,所以對(duì)于軟件的考慮僅僅是輔助用戶使用,為此設(shè)計(jì)軟件的第一層是用戶登陸關(guān)卡,第二層主要是常用的一些功能的融合。
3.1 常用功能融合
首先是常用的身份驗(yàn)證,除去常用的身份驗(yàn)證流程。
主要采用以下模式進(jìn)行常用功能模塊的嵌入,原理如4圖所示。
圖4采用了五個(gè)主要方式去實(shí)現(xiàn)整個(gè)軟件界面:其中開(kāi)啟監(jiān)控與開(kāi)啟3G,wifi、為用戶主動(dòng)開(kāi)啟裝置,不僅可以檢驗(yàn)設(shè)備狀態(tài),也可以隨意切換網(wǎng)絡(luò)模式進(jìn)行監(jiān)控的調(diào)試。
其余三種功能主要是為了方便用戶更好的使用本軟件。其中添加百度云賬號(hào)方便了用戶直接更改移動(dòng)端的賬號(hào),即使用戶變更賬號(hào)也不用通過(guò)后臺(tái)去修改。控制錄制時(shí)間主要是方便用戶的視頻監(jiān)控的時(shí)間間隔,便于用戶使用自己喜歡的時(shí)間間隔進(jìn)行收集,程序默認(rèn)的錄制時(shí)間為3S。監(jiān)控管理部分主要便于用戶進(jìn)行前臺(tái)的日常維護(hù),即不通過(guò)后臺(tái)也能完成軟件功能檢查,可用性維護(hù)等功能的實(shí)現(xiàn)。
其中我們是用的百度云上傳技術(shù),其中部分代碼為:
int main(int argc, char **argv) {
int ret = 0;
if (argc < 2) {
usage();
return 1;}
char *command = argv[1];
argc —;
argv ++;
curl_global_init(CURL_GLOBAL_ALL);
if (strcmp(command, "info") == 0) {
ret = command_info(argc, argv);
} else if (strcmp(command, "ls") == 0) {
ret = command_ls(argc, argv);
} else if (strcmp(command, "upload") == 0 || strcmp(command, "up") == 0) {
ret = command_upload(argc, argv);
} else if (strcmp(command, "download") == 0 || strcmp(command, "down") == 0) {
ret = command_download(argc, argv);
} else if (strcmp(command, "mv") == 0) {
ret = command_move_or_copy(argc, argv, "mv");
} else if (strcmp(command, "cp") == 0) {
ret = command_move_or_copy(argc, argv, "cp");
} else if (strcmp(command, "rm") == 0) {
ret = command_remove(argc, argv);
} else {
color_log(COLOR_LOG_ERROR, "未知命令?。躰");
usage();
ret = 1;
}if (api != NULL) {
BaiduPCS_Free(api);
}curl_global_cleanup();
return ret;
}
百度云主要使用了CURL技術(shù),這是一種命令行方式下工作的開(kāi)源文件傳輸工具,然后使用一種輕量級(jí)數(shù)據(jù)交換個(gè)格式JSON(JavaScript Object Notation),使用它與百度的PCS接口交互,從而在開(kāi)發(fā)板上直接用對(duì)存儲(chǔ)在百度網(wǎng)盤(pán)里的東西進(jìn)行操作[4]。
以下來(lái)是H264即錄像時(shí)間控制和壓縮的部分代碼:
int main(int argc, char **argv)
{int mytime;
if(argv[1] == NULL)
mytime=3;
else
mytime=atoi(argv[1]);
FBOpen();
system("clear");
fflush(stdin);
int fd =open("/dev/adc", 0);
if (fd < 0) return 0;
int value = -1;
while(1)
{while(value<400)
{ value = -1;
char buffer[30] = "";
int len = read(fd, buffer, sizeof buffer -1);
if (len > 0)
{buffer[len] = '\0';
sscanf(buffer, "%d", &value);
//printf("%d\n",value);
}}
try
{struct timeval start,end;
// TFrameBuffer FrameBuffer;
TVideo Video;
int timeuse = 0;
int oldTimeUse = 0;
TH264Encoder Encoder;
gettimeofday( &start, NULL );
for (;;)
{Video.FetchPicture();
Encoder.Encode(Video);
//FrameBuffer.DrawRect(Video);
gettimeofday( &end, NULL );
timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
timeuse /= 1000000;
if (oldTimeUse != timeuse)
{//printf(".\n");endprint