王永強(qiáng)
(唐山學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)系,河北 唐山063000)
隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,以及人們安全意識(shí)的提高,視頻監(jiān)控系統(tǒng)已被廣泛應(yīng)用到各個(gè)領(lǐng)域[1]。傳統(tǒng)的視頻監(jiān)控系統(tǒng)主要分為兩類(lèi):一類(lèi)是基于閉路電視的,監(jiān)控區(qū)域有限;另一類(lèi)是基于PC機(jī)的數(shù)字化監(jiān)控,體積大,組網(wǎng)較為死板,移動(dòng)性差。基于物聯(lián)網(wǎng)技術(shù)的視頻監(jiān)控系統(tǒng),則可以很好地解決傳統(tǒng)視頻監(jiān)控系統(tǒng)的弊端,它突破了有線網(wǎng)絡(luò)的局限性[2-3],給信息交流提供了更大的便利,具有組網(wǎng)方便、便于安裝、可靠性高、運(yùn)行穩(wěn)定等特點(diǎn),而且隨著物聯(lián)網(wǎng)技術(shù)的不斷提升,視頻監(jiān)控系統(tǒng)正向著數(shù)字化、網(wǎng)絡(luò)化、智能化的方向發(fā)展。因此,基于物聯(lián)網(wǎng)技術(shù),本研究設(shè)計(jì)了一種視頻監(jiān)控系統(tǒng)。
系統(tǒng)以嵌入式物聯(lián)網(wǎng)平臺(tái)為基礎(chǔ),對(duì)圖像進(jìn)行實(shí)時(shí)采集,并通過(guò)無(wú)線網(wǎng)絡(luò)進(jìn)行實(shí)時(shí)傳輸。系統(tǒng)的組成包括:硬件設(shè)備、USB視頻數(shù)據(jù)的采集、WIFI無(wú)線數(shù)據(jù)的傳輸、Qt平臺(tái)數(shù)據(jù)顯示及存儲(chǔ)。
硬件設(shè)備主要包括PC機(jī)和開(kāi)發(fā)板,PC機(jī)上運(yùn)行ubuntu12.04;開(kāi)發(fā)板型號(hào)為real6410,使用arm11處理器[4],運(yùn)行l(wèi)inux2.6.28版本內(nèi)核,并搭載了apm6658SDIO WIFI模塊以及zc301的USB攝像頭模塊。對(duì)于real6410來(lái)說(shuō),開(kāi)發(fā)板上集成了USB接口和SDIO接口,能夠滿足相應(yīng)要求。
USB視頻數(shù)據(jù)采集部分主要是實(shí)現(xiàn)對(duì)USB攝像頭的能力檢查,初始化,并且進(jìn)行一些相應(yīng)的格式和流設(shè)置[5-6]。由于USB攝像頭采集到的數(shù)據(jù)放在內(nèi)核緩沖區(qū),而程序需在用戶空間運(yùn)行,這就需要使用一種通訊方式來(lái)進(jìn)行用戶空間與內(nèi)核空間之間的聯(lián)絡(luò)。一般通訊方式有三種:第一種是直接讀寫(xiě)內(nèi)核緩沖區(qū),第二種是內(nèi)存映射,第三種是使用用戶空間指針。本系統(tǒng)采用的是第二種,即mmap內(nèi)存映射方式。首先,向內(nèi)核申請(qǐng)5塊幀緩沖區(qū),并將內(nèi)核實(shí)際給予的緩沖區(qū)通過(guò)mmap映射到用戶空間,這樣程序便可以在用戶空間訪問(wèn)內(nèi)核空間了。其次,開(kāi)啟視頻采集,這時(shí)設(shè)備便會(huì)將采集到的幀數(shù)據(jù)放到內(nèi)核緩沖區(qū)中,在內(nèi)核空間開(kāi)辟的緩沖區(qū)事實(shí)上是一個(gè)循環(huán)緩沖隊(duì)列,用戶空間的程序在取回一幀數(shù)據(jù)后需把該緩沖區(qū)重新放回內(nèi)核緩沖隊(duì)列中,以便內(nèi)核繼續(xù)使用它來(lái)存放接下來(lái)采集到的幀數(shù)據(jù)。
WIFI無(wú)線數(shù)據(jù)傳輸部分主要是實(shí)現(xiàn)接收客戶的連接請(qǐng)求、處理用戶的傳輸請(qǐng)求,以及判斷用戶是否退出。由于tcp傳輸會(huì)進(jìn)行一系列的差錯(cuò)檢驗(yàn),一旦報(bào)文出錯(cuò),例如亂序、亂碼等,便會(huì)請(qǐng)求進(jìn)行重發(fā),這樣當(dāng)網(wǎng)絡(luò)狀態(tài)不理想時(shí),會(huì)造成視頻不能流暢顯示,因?yàn)榇蟛糠值臅r(shí)間都被tcp的重發(fā)機(jī)制占用了。鑒于udp傳輸沒(méi)有tcp傳輸那樣的差錯(cuò)控制機(jī)制,所以本W(wǎng)IFI無(wú)線數(shù)據(jù)傳輸使用的是udp傳輸,這樣當(dāng)傳輸?shù)膱?bào)文出錯(cuò)時(shí),可以在程序中直接簡(jiǎn)單地丟棄這幀數(shù)據(jù)。另外,由于網(wǎng)絡(luò)負(fù)載問(wèn)題,每幀數(shù)據(jù)都是先進(jìn)行分包傳輸,然后在PC機(jī)上再進(jìn)行組包重新形成一幀數(shù)據(jù)。
Qt平臺(tái)部分主要是實(shí)現(xiàn)與用戶的交互,如輸入服務(wù)器的IP及端口、顯示當(dāng)前連接的狀態(tài)、實(shí)時(shí)視頻顯示、是否暫停視頻的實(shí)時(shí)顯示、是否進(jìn)行視頻的錄制等。Qt端需要對(duì)接收到的幀數(shù)據(jù)進(jìn)行顯示,顯示是通過(guò)Qtimer來(lái)控制的,將Qtimer的信號(hào)與相應(yīng)的槽函數(shù)綁定,定時(shí)器時(shí)間一到便會(huì)執(zhí)行槽函數(shù),該槽函數(shù)的功能便是向開(kāi)發(fā)板索取一幀數(shù)據(jù)并且顯示。Qtimer不斷索取視頻幀數(shù)據(jù),并且連續(xù)顯示每一幀,這樣便形成了流暢的視頻,而且如果此時(shí)用戶選擇了錄制,則會(huì)在顯示實(shí)時(shí)數(shù)據(jù)的同時(shí),調(diào)用mencoder,將接收到的數(shù)據(jù)轉(zhuǎn)換為視頻存儲(chǔ)起來(lái),以實(shí)現(xiàn)后期查看。
系統(tǒng)中,主要涉及到兩個(gè)平臺(tái):一是以real6410為基礎(chǔ)的嵌入式平臺(tái),二是以PC機(jī)為基礎(chǔ)的x86平臺(tái)。開(kāi)發(fā)板作為服務(wù)器負(fù)責(zé)幀數(shù)據(jù)的采集和傳輸,PC機(jī)作為客戶端獲取視頻數(shù)據(jù)并顯示和存儲(chǔ)。
服務(wù)器(開(kāi)發(fā)板)上電后,先啟動(dòng)服務(wù)器程序,程序啟動(dòng)后,服務(wù)器會(huì)啟用udp服務(wù),幫助提取服務(wù)器的網(wǎng)絡(luò)信息。根據(jù)客戶端發(fā)來(lái)的命令作相應(yīng)處理。如果傳輸報(bào)文錯(cuò)誤,則采用丟幀的方式進(jìn)行處理。系統(tǒng)中的無(wú)線傳輸主要傳輸幀數(shù)據(jù)以及一些PC機(jī)與開(kāi)發(fā)板交互的命令,概括來(lái)說(shuō),主要有以下幾種交互方式:
(1)客戶端發(fā)送“###?!北硎菊?qǐng)求連接,服務(wù)器收到“###?!焙髸?huì)等待接收用戶命令。
(2)客戶發(fā)送“GOON”表示請(qǐng)求服務(wù)器發(fā)送一幀數(shù)據(jù),服務(wù)器收到該指令后會(huì)采集一幀數(shù)據(jù),并且將該幀數(shù)據(jù)拆成多個(gè)包循環(huán)發(fā)送給客戶端,直到發(fā)完為止。
(3)客戶端發(fā)送“STOP”表示客戶端即將退出,收到該命令,服務(wù)器不再為該客戶服務(wù)。
服務(wù)器工作流程如圖1所示。
在PC機(jī)上使用Qt搭建客戶端。啟動(dòng)客戶端程序后,輸入服務(wù)器端口以及IP,點(diǎn)擊連接,此時(shí)狀態(tài)標(biāo)簽會(huì)顯示當(dāng)前連接的狀態(tài)。如果連上,用戶可以點(diǎn)擊“start(開(kāi)始)”按鈕進(jìn)行視頻實(shí)時(shí)顯示。如果用戶點(diǎn)擊“AVI(錄制)”,視頻則以AVI格式存儲(chǔ)在家目錄的相應(yīng)目錄下??蛻舳斯ぷ髁鞒倘鐖D2所示。
客戶端部分關(guān)鍵代碼如下:
嵌入式軟件的開(kāi)發(fā)工作一般都在PC機(jī)上完成,交叉編譯后通過(guò)串口或者網(wǎng)口燒寫(xiě)到板子上,這就涉及到交叉編譯工具鏈、串口調(diào)試工具以及nfs或tftp服務(wù)器的搭建。交叉工具鏈用于編譯uboot、內(nèi)核和應(yīng)用程序等,以便生成適合于目標(biāo)板系統(tǒng)的代碼;串口調(diào)試工具是為了在PC端登錄開(kāi)發(fā)板,以便運(yùn)行并調(diào)試程序;nfs或tftp服務(wù)器一般用于PC機(jī)與目標(biāo)板之間的文件拷貝。在開(kāi)發(fā)板上,需要燒寫(xiě)uboot、linux2.6.28版本的內(nèi)核、cramfs文件系統(tǒng)、ubitfs文件系統(tǒng)以及相關(guān)的庫(kù)和可執(zhí)行文件,以下是軟件環(huán)境的搭建步驟。
要編譯出arm平臺(tái)的可執(zhí)行代碼,需要在PC機(jī)上安裝交叉編譯工具鏈。本設(shè)計(jì)中的系統(tǒng)處理器是armv6架構(gòu)的,經(jīng)過(guò)查閱相關(guān)的資料,發(fā)現(xiàn)早期的交叉編譯器,例如,armlinux-gcc-3.4.1不支持armv6構(gòu)架,因此需要使用更新的通用的交叉編譯器,這里選用arm公司新推出的EABI編譯器,即arm-none-linux-gnueabi-4.3.2。該編譯器使用了新的glibc庫(kù)2.8,并在編譯器中預(yù)先安裝好了各種需要用到的庫(kù)文件,如編譯qtopia時(shí)需要用到的jpeg,zlib,libts,libuuid等。首先,通過(guò)windows與linux下的共享文件夾把a(bǔ)rmnone-linux-gnueabi-4.3.2.tar.gz壓縮包拷貝到linux下,解壓;其次,在家目錄下的.bashrc文件中編輯PATH路徑,PATH =/home/zhang/arm-none-linux-gnueabi-4.3.2//=bin::$PATH;最后,在家目錄下執(zhí)行source.bashrc命令更新PATH,可以使用 which arm-linux-gcc命令來(lái)查看是否配置正確。
linux2.6.28發(fā)布的內(nèi)核中沒(méi)有USB攝像頭驅(qū)動(dòng),并且WIFI模塊的驅(qū)動(dòng)部分不支持AP,需要重新編譯內(nèi)核源碼將驅(qū)動(dòng)加載進(jìn)去,并重新燒寫(xiě)到開(kāi)發(fā)板上。編譯內(nèi)核時(shí),一些庫(kù)和程序需要安裝。進(jìn)行安裝時(shí)執(zhí)行以下幾條命令:
進(jìn)行WIFI模塊的內(nèi)核相關(guān)配置。先添加固件,從網(wǎng)上下載helper_sd.bin和sd8686.bin兩個(gè)固件復(fù)制到內(nèi)核源代碼目錄下的firmware目錄下,將helper_sd.bin改名為sd8686_h(yuǎn)elper.bin。然后進(jìn)行網(wǎng)絡(luò)支持的配置和網(wǎng)卡驅(qū)動(dòng)支持的配置。
配置USB攝像頭驅(qū)動(dòng)。雖然使用的攝像頭是非UVC的,但為了實(shí)現(xiàn)攝像頭能即插即用,因此在配置USB驅(qū)動(dòng)時(shí),應(yīng)使內(nèi)核盡量支持多種攝像頭。本設(shè)計(jì)中使用的是zc301的攝像頭驅(qū)動(dòng)支持和UVC攝像頭驅(qū)動(dòng)支持。
燒寫(xiě)在windows下執(zhí)行,使用DNW進(jìn)行燒寫(xiě)。需要安裝DNW的USB驅(qū)動(dòng),可以從網(wǎng)上下載,也可以使用開(kāi)發(fā)板自帶的。
首先移植wpa_supplicant工具包。下載此工具包依賴的openssl庫(kù)和 wpa_supplicant,并解壓。進(jìn)入 wpa_supplicant目錄,將patch目錄下的補(bǔ)丁文件openssl-0.9.8e-tls-extensions.patch拷貝到openssl目錄:
cp openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/
其次進(jìn)入openssl目錄下執(zhí)行一下命令來(lái)打補(bǔ)丁:
patch-p1<o(jì)penssl-0.9.8e-tls-extensions.patch
最后執(zhí)行 make,make install,這樣就生成了openssl庫(kù),并且存放在/usr/local/ssl目錄下。
接下來(lái)交叉編譯wpa_supplicant。進(jìn)入wpa_supplicant目錄下,將該目錄下的defconfig文件拷貝為.config文件,因?yàn)閐efconfig文件只是一個(gè)模板文件,里面所有的行都是注釋,只供參考,只有將其拷貝為.config文件才能使用。對(duì)該文件進(jìn)行修改,添加如下行:
由于使用的是在PC機(jī)上開(kāi)發(fā)的編譯程序,此程序需燒寫(xiě)到開(kāi)發(fā)板上才能執(zhí)行,所以需建立nfs服務(wù)器,在目標(biāo)板上掛載進(jìn)而來(lái)傳輸文件。在PC機(jī)上下載nfs服務(wù)器,修改配置文件,將PC機(jī)上的目錄設(shè)為nfs共享目錄,并且開(kāi)放給所有能連接PC機(jī)的用戶,開(kāi)發(fā)板每次啟動(dòng)時(shí)執(zhí)行:
mount-t nfs 192.168.1.103:/home/wang/nfs/nfs-o nolock
這樣便將PC機(jī)的nfs目錄掛載到了開(kāi)發(fā)板的nfs目錄上,其優(yōu)點(diǎn)是放到PC機(jī)的nfs目錄下的文件,可以從開(kāi)發(fā)板的nfs目錄下取出,十分方便。因?yàn)槊看伍_(kāi)機(jī)都要輸入這個(gè)命令,所以把它寫(xiě)到腳本里命名為nfs.sh,每次開(kāi)機(jī)后./nfs.sh掛載即可。
通過(guò)qtcreator進(jìn)行可視化的Qt界面開(kāi)發(fā),可以減少工作量,提高開(kāi)發(fā)的效率。界面的構(gòu)成主要有:中央的視頻顯示窗口、四個(gè)按鍵(分別是“connect(連接)”“close(關(guān)閉)”“start(開(kāi)始)”“stop(暫停)”)、一個(gè)狀態(tài)標(biāo)簽(用于顯示當(dāng)前的連接狀態(tài)以及一些出錯(cuò)信息等)、兩個(gè)輸入框(分別是IP和端口,在程序中已經(jīng)用正則表達(dá)式規(guī)范了IP的書(shū)寫(xiě)方式,這樣可以避免IP輸入不合法)、一個(gè)AVI選擇按鈕(當(dāng)選中時(shí)會(huì)進(jìn)行視頻的錄制與保存)。基于Qt的界面設(shè)計(jì)顯示結(jié)果如圖3所示。
啟動(dòng)服務(wù)器,點(diǎn)擊客戶端連接按鈕,然后點(diǎn)擊“start”按鈕,進(jìn)行視頻捕獲,實(shí)現(xiàn)視頻數(shù)據(jù)的實(shí)時(shí)傳輸??蛻舳诉\(yùn)行效果如圖4所示。
設(shè)計(jì)的基于物聯(lián)網(wǎng)技術(shù)的視頻監(jiān)控系統(tǒng),通過(guò)搭載zc301的USB攝像頭和apm6658SDIO WIFI模塊,以及在PC機(jī)上使用Qt進(jìn)行圖形界面開(kāi)發(fā),可以接收和顯示采集到的每一幀圖像,實(shí)現(xiàn)可視化監(jiān)控的功能。而且根據(jù)用戶需要還可以將視頻以AVI格式進(jìn)行保存。運(yùn)行效果顯示,本視頻監(jiān)控系統(tǒng)可對(duì)現(xiàn)場(chǎng)進(jìn)行實(shí)時(shí)有效地監(jiān)控,而且設(shè)計(jì)成本較低,易于組網(wǎng),可擴(kuò)展性強(qiáng),運(yùn)行穩(wěn)定,具有較高的實(shí)用價(jià)值。
[1]婁德成,韋銀.基于B/S架構(gòu)的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)[J].微型電腦應(yīng)用,2014,30(9):51-53.
[2]陳奕舟,呂勇,許遠(yuǎn)向,等.基于ARM9構(gòu)架的熱釋電車(chē)載視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].北京信息科技大學(xué)學(xué)報(bào),2014,29(1):82-84.
[3]劉濤,呂勇,毛海波.基于 Wi-Fi技術(shù)的無(wú)線視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].現(xiàn)代計(jì)算機(jī),2015(1):49-52.
[4]江俊杰,王志明.基于X264的嵌入式視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(12):4109-4203.
[5]王溢琴,秦振吉,蘆彩林.基于嵌入式的智能家居之視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2014,22(11):3623-3626.
[6]羅金玲,劉羅仁.基于ARM+Linux的物聯(lián)網(wǎng)遠(yuǎn)程監(jiān)控終端設(shè)計(jì)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(1):189-191.