<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式Linux的機(jī)房遠(yuǎn)程監(jiān)測(cè)系統(tǒng)研究

          基于嵌入式Linux的機(jī)房遠(yuǎn)程監(jiān)測(cè)系統(tǒng)研究

          作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò) 收藏

          3. 2 ZC0301 攝像頭視頻采集程序設(shè)計(jì)

          Video4linux 是 內(nèi)核里支持影像設(shè)備的一組API,配合適當(dāng)?shù)牟杉ㄅc相關(guān)驅(qū)動(dòng)程序,可以實(shí)現(xiàn)視頻采集。驅(qū)動(dòng)視頻采集設(shè)備完成視頻采集和處理,需要相應(yīng)的驅(qū)動(dòng)程序和視頻流采集程序。視頻采集程序的內(nèi)容主要包括攝像頭的初始化、打開(kāi)、關(guān)閉、參數(shù)設(shè)置以及數(shù)據(jù)讀取等。

          Video4linux 視頻采集的實(shí)現(xiàn)過(guò)程如下:

          ( 1) 初始化程序,包括打開(kāi)視頻設(shè)備文件,讀取視頻采集設(shè)備信息以及設(shè)備緩沖區(qū)信息等; 初始化攝像頭參數(shù)主要通過(guò)init_videoIn 函數(shù)來(lái)完成。

          ( 2) 打開(kāi)視頻采集設(shè)備。初始化工作完成后,通過(guò)V4L_open 函數(shù)檢查攝像頭設(shè)備是否加載,如能夠檢測(cè)到攝像頭設(shè)備,使用open 調(diào)用以只讀的方式打開(kāi)視頻設(shè)備。

          ( 3) 獲取視頻設(shè)備信息和圖像信息。通過(guò)調(diào)用設(shè)備I /O 通道管理函數(shù)ioctl 中的VIDIOCGCAP 參數(shù)獲取視頻采集設(shè)備的名稱、類(lèi)型、通道數(shù)、圖像寬度和高度等信息參數(shù),調(diào)用ioctl 函數(shù)中的VIDIOCGPICT 參數(shù)讀取視頻采集設(shè)備緩沖video_picture 信息。

          ( 4) 視頻采集。在V4L 體系下,采用內(nèi)存映射方式采集視頻。內(nèi)存映射方式視頻讀取的具體操作如下:

          ①首先使用ioctl 調(diào)用VIDOOCGMBUF 命令獲取攝像頭存儲(chǔ)緩沖區(qū)的幀信息,之后初始化video_mbuf,修改video_mmbuf 設(shè)置。

          ②映射設(shè)備文件到內(nèi)存。

          ③截取圖像,有單幀截取和連續(xù)幀截取兩種方式。進(jìn)行單幀截取需先準(zhǔn)備內(nèi)存空間; 然后調(diào)用ioctl 函數(shù)的VIDIOCMCAPTURE 命令,以非阻塞形式開(kāi)始一幀圖像截?。?接著調(diào)用ioctl( fd,VIDIOCSYNC,&frame)函數(shù)判斷該幀是否截取完畢; 最后就可將圖像數(shù)據(jù)寫(xiě)入到Frame Buffer 中。若進(jìn)行連續(xù)幀截取,則需通過(guò)循環(huán)語(yǔ)句中,使用VIDIOCMCAPTURE 和VIDIOCSYNC 函數(shù)判斷是否完成截取,并給采集到的每幀圖像賦地址。

          ( 5) 關(guān)閉攝像頭。視頻采集完成以后,最后的工作是關(guān)閉視頻采集設(shè)備。以內(nèi)存映射的方法獲取視頻數(shù)據(jù),需要在視頻采集任務(wù)完成之后關(guān)閉內(nèi)存映射,然后調(diào)用close_v4l 函數(shù)關(guān)閉視頻設(shè)備。關(guān)閉視頻設(shè)備需要判斷視頻獲取方式: 如是內(nèi)存映射方式,則通過(guò)munmap 函數(shù)。

          4 Web 監(jiān)控的實(shí)現(xiàn)

          Web 監(jiān)控的實(shí)現(xiàn)包括了Boa 服務(wù)器移植、CGI 網(wǎng)頁(yè)交互程序設(shè)計(jì)兩個(gè)部分。

          4. 1 Boa 服務(wù)器移植

          監(jiān)控中,Web 服務(wù)器的性能對(duì)系統(tǒng)的整體性能具有直接影響,因此Web 服務(wù)器的選擇和設(shè)計(jì)尤為重要。高效率的Web 服務(wù)器,才能使監(jiān)控系統(tǒng)的能得到充分的發(fā)揮。

          Boa 是一款單任務(wù)的HTTP 服務(wù)器,它支持CGI 技術(shù),且具有自動(dòng)生成目錄和解壓文件等功能。在運(yùn)行效率方面,由于其只為CGI 程序創(chuàng)建新的進(jìn)程,因此具有很高的HTTP 請(qǐng)求處理速度。故選用Boa 來(lái)構(gòu)建嵌入式服務(wù)器。

          服務(wù)器主要作用是為整個(gè)系統(tǒng)提供了一種網(wǎng)絡(luò)接入和信息服務(wù)方式。系統(tǒng)通過(guò)應(yīng)用HTTP 協(xié)議聯(lián)網(wǎng),調(diào)用具有數(shù)據(jù)請(qǐng)求和控制功能的CGI 程序,實(shí)現(xiàn)服務(wù)器對(duì)客戶端瀏覽器請(qǐng)求的處理,最終實(shí)現(xiàn)信息在瀏覽器的動(dòng)態(tài)顯示,達(dá)到監(jiān)控的目的。

          4. 2 CGI 網(wǎng)頁(yè)交互程序設(shè)計(jì)

          CGI 技術(shù)即通用網(wǎng)關(guān)接口( Common Network Interface) 技術(shù),它支持WEB 數(shù)據(jù)動(dòng)態(tài)刷新、轉(zhuǎn)換和顯示。

          CGI 接口設(shè)計(jì)的程序運(yùn)行在WEB 服務(wù)器端,像其他類(lèi)型程序設(shè)計(jì)一樣,其必須通過(guò)CGI 標(biāo)準(zhǔn)格式進(jìn)行編寫(xiě)。CGI 程序的運(yùn)行由瀏覽器端的輸入觸發(fā),它的任務(wù)就是執(zhí)行指令,將所需數(shù)據(jù)轉(zhuǎn)換為環(huán)境變量進(jìn)行處理,并回傳處理結(jié)果。WEB 服務(wù)器與CGI 程序之間通過(guò)四種途徑進(jìn)行通信: 環(huán)境變量、命令行、標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。

          CGI 的基本工作過(guò)程為: 根據(jù)瀏覽器的請(qǐng)求,CGI 程序通過(guò)執(zhí)行Boa 服務(wù)器指令,調(diào)用其它應(yīng)用程序進(jìn)行處理,最后將處理結(jié)果以HTML 形式反饋給瀏覽器顯示。CGI 工作流程示意圖如圖3 所示。

          圖3 CGI 工作流程示意圖
          圖3 CGI 工作流程示意圖

          4. 3 系統(tǒng)測(cè)試

          本系統(tǒng)的測(cè)試工作主要是在實(shí)驗(yàn)室的局域網(wǎng)環(huán)境下進(jìn)行的。

          其中下位機(jī)為以S3C2440 處理器為核心的嵌入式目標(biāo)板,配合ZC0301 攝像頭和數(shù)字溫度傳感器DS18B20,通過(guò)構(gòu)建 操作系統(tǒng)并移植Boa,將其配置成為嵌入式服務(wù)器; 下位機(jī)采用通用的PC 機(jī),通過(guò)瀏覽器與服務(wù)器進(jìn)行交互。上位機(jī)監(jiān)控端和下位機(jī)嵌入式服務(wù)器通過(guò)網(wǎng)線和上位機(jī)相連接,構(gòu)建成為局域網(wǎng)開(kāi)發(fā)環(huán)境。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();