肖令祿
(渭南師范學(xué)院物理與電氣工程學(xué)院,陜西渭南714099)
物聯(lián)網(wǎng)是信息化產(chǎn)業(yè)中繼計(jì)算機(jī)、互聯(lián)網(wǎng)和移動(dòng)通信技術(shù)之后興起的又一項(xiàng)革命性技術(shù).作為物聯(lián)網(wǎng)技術(shù)的一個(gè)典型應(yīng)用,智能家居近年來(lái)在我國(guó)得到了快速發(fā)展,它在為人們的生活帶來(lái)便捷、舒適、安全的同時(shí),也逐漸改變著人們的生活方式.隨著3G、4G網(wǎng)絡(luò)的開通運(yùn)營(yíng)以及各種手持智能移動(dòng)終端的普及,人們利用Internet隨時(shí)隨地對(duì)智能家居進(jìn)行遠(yuǎn)程監(jiān)控成為了可能.但傳統(tǒng)的Web服務(wù)器對(duì)系統(tǒng)硬件配置要求較高,不適用于資源有限的嵌入式系統(tǒng).本文設(shè)計(jì)了一種基于ARM的嵌入式Web服務(wù)器,通過(guò)將Web技術(shù)和通用網(wǎng)關(guān)接口技術(shù)CGI(Common Gateway Interface)相結(jié)合,不僅滿足了嵌入式設(shè)備接入互聯(lián)網(wǎng)的需求,而且實(shí)現(xiàn)了客戶端與服務(wù)器之間的動(dòng)態(tài)數(shù)據(jù)交互,能夠很好地適應(yīng)智能家居等嵌入式系統(tǒng)遠(yuǎn)程監(jiān)控的需要.
傳統(tǒng)的Web服務(wù)器通常是由一系列具有高運(yùn)算處理能力、海量存儲(chǔ)能力的高性能PC機(jī)組成,以非實(shí)時(shí)操作系統(tǒng)為軟件運(yùn)行平臺(tái),用來(lái)響應(yīng)眾多用戶對(duì)網(wǎng)站的并發(fā)訪問請(qǐng)求.而在嵌入式系統(tǒng)中,設(shè)備的軟硬件資源都非常有限,不支持對(duì)系統(tǒng)資源占用較多的應(yīng)用程序,也無(wú)需處理大量的數(shù)據(jù)請(qǐng)求,因此,宜采用功能相對(duì)簡(jiǎn)單、體積小、資源消耗少的嵌入式Web服務(wù)器,其體系結(jié)構(gòu)如圖1所示.
圖1 嵌入式Web服務(wù)器的體系結(jié)構(gòu)
嵌入式Web服務(wù)器通常采用B/S結(jié)構(gòu),其內(nèi)部已經(jīng)植入了TCP/IP協(xié)議.用戶通過(guò)瀏覽器向Web服務(wù)器發(fā)送連接請(qǐng)求,服務(wù)器在檢查請(qǐng)求合法后建立與瀏覽器的TCP/IP連接,偵聽瀏覽器服務(wù)請(qǐng)求并按HTTP協(xié)議規(guī)范進(jìn)行解析,根據(jù)所請(qǐng)求內(nèi)容的不同,將一個(gè)靜態(tài)頁(yè)面或CGI程序的執(zhí)行結(jié)果返回給瀏覽器.
在嵌入式Linux系統(tǒng)中,典型的Web服務(wù)器有httpd、shttpd、thttpd及Boa等.其中,Boa是一種運(yùn)行于Linux環(huán)境下的高效小巧的Web服務(wù)器,其可執(zhí)行代碼只有約60 KB左右.[1]Boa是一個(gè)單任務(wù)的Web服務(wù)器,只能依次完成用戶的請(qǐng)求,不能創(chuàng)建新的進(jìn)程處理并發(fā)連接請(qǐng)求,但Boa支持CGI,能夠創(chuàng)建出一個(gè)新的進(jìn)程來(lái)執(zhí)行CGI程序,滿足本系統(tǒng)的設(shè)計(jì)要求,因此,設(shè)計(jì)中選用Boa作為嵌入式Web服務(wù)器.
本系統(tǒng)硬件平臺(tái)選用友善之臂的Micro2440開發(fā)板,該開發(fā)板采用以ARM920T為內(nèi)核的S3C2440處理器,系統(tǒng)硬件組成主要包括微處理器、存儲(chǔ)器、外設(shè)接口及用戶接口等四個(gè)部分,如圖2所示.
圖2 系統(tǒng)硬件平臺(tái)結(jié)構(gòu)示意圖
Micro2440開發(fā)板支持兩種啟動(dòng)模式,即NorFlash啟動(dòng)和NandFlash啟動(dòng),設(shè)計(jì)中選用第二種啟動(dòng)方式.系統(tǒng)上電復(fù)位后程序?qū)?x00000000地址處開始運(yùn)行,該地址對(duì)應(yīng)于64 MB NandFlash的起始地址,存放引導(dǎo)系統(tǒng)加載程序BootLoader.BootLoader用于初始化硬件設(shè)備,建立內(nèi)存空間映射圖,從NandFlash中讀取內(nèi)核映像和根文件系統(tǒng)到RAM中,為內(nèi)核設(shè)置啟動(dòng)參數(shù),調(diào)用內(nèi)核直到最終啟動(dòng)系統(tǒng).
軟件開發(fā)環(huán)境的建立過(guò)程主要包括:BootLoader的移植、Linux內(nèi)核的移植以及根文件系統(tǒng)的制作.該環(huán)境實(shí)際上是任何嵌入式系統(tǒng)開發(fā)所需的通用環(huán)境,因本文的研究重點(diǎn)并不在于此,故只作簡(jiǎn)要介紹.
BootLoader是系統(tǒng)上電后運(yùn)行的第一段程序,用于引導(dǎo)操作系統(tǒng).S3C2440微處理器常用的BootLoader主要有vivi和u-boot,設(shè)計(jì)中選用u-boot作為引導(dǎo)加載程序.其移植過(guò)程相關(guān)參考文獻(xiàn)較多,在此不再贅述.移植完成后,將編譯生成的u-boot.bin文件下載到NandFlash的0x00000000地址處即可.
Linux內(nèi)核移植是指根據(jù)所選用的目標(biāo)平臺(tái)對(duì)Linux源代碼進(jìn)行必要修改,使其能在目標(biāo)平臺(tái)上正確運(yùn)行,包括獲取內(nèi)核源代碼,根據(jù)目標(biāo)平臺(tái)對(duì)體系結(jié)構(gòu)相關(guān)的代碼進(jìn)行修改,添加必要的硬件驅(qū)動(dòng)程序,配置并編譯內(nèi)核,以及將生成的內(nèi)核映像文件uImage燒寫到NandFlash中的指定區(qū)域等.本設(shè)計(jì)中選用Linux2.6.29.4 版本內(nèi)核,按文獻(xiàn)[2]所述方法進(jìn)行移植.
根文件系統(tǒng)是內(nèi)核啟動(dòng)后掛載的第一個(gè)文件系統(tǒng),它由一些內(nèi)核啟動(dòng)所必須的文件和目錄組成,如用戶進(jìn)程init所對(duì)應(yīng)的文件、掛載分區(qū)所需的/etc/fstab文件、shell接口、各種操作命令及應(yīng)用程序運(yùn)行所依賴的庫(kù)文件等.設(shè)計(jì)中選用BusyBox創(chuàng)建根文件系統(tǒng)目錄,同時(shí),為了便于調(diào)試并節(jié)約存儲(chǔ)資源,選用網(wǎng)絡(luò)文件系統(tǒng)NFS掛載根文件系統(tǒng).
Boa服務(wù)器的移植過(guò)程主要包括源代碼的獲取、可執(zhí)行文件的編譯、Boa.conf文件的配置等.[3]
(1)從www.boa.org上下載Boa服務(wù)器源代碼,設(shè)計(jì)中選用Boa-0.94.13版本.
(2)解壓后進(jìn)入Boa源代碼目錄下的src子目錄,生成Makefile文件并進(jìn)行修改,將CC=gcc、CPP=gcc-E分別修改為CC=arm-linux-gcc和CPP=arm-linux-gcc-E.執(zhí)行make命令進(jìn)行編譯并去除調(diào)試信息,得到大小約為60 KB的可執(zhí)行文件Boa.
(3)Boa.conf文件用于配置Boa服務(wù)器的運(yùn)行環(huán)境及參數(shù),包括用戶訪問權(quán)限、服務(wù)器偵聽端口、日志目錄、靜態(tài)頁(yè)面和CGI腳本的存儲(chǔ)目錄等.配置內(nèi)容包括:將服務(wù)器端口設(shè)置為80,將訪問權(quán)限User nobody、Group nogroup分別修改為User 0和Group 0,設(shè)置訪問日志目錄為/var/log/boa/access_log,設(shè)置靜態(tài)頁(yè)面的存放目錄為/www,設(shè)置CGI腳本的存放目錄為/cgi/cgi-bin等.
CGI定義了Web服務(wù)器和CGI腳本之間的接口標(biāo)準(zhǔn),提供了一種Web環(huán)境下的數(shù)據(jù)傳遞服務(wù)機(jī)制.[4]用戶可通過(guò)瀏覽器傳遞信息給Web服務(wù)器,服務(wù)器把接收到的信息存入環(huán)境變量,然后啟動(dòng)指定的CGI腳本完成特定的工作.CGI腳本在執(zhí)行過(guò)程中所需的參數(shù)可從環(huán)境變量中獲取,最后將執(zhí)行結(jié)果以HTML頁(yè)面的格式返回給瀏覽器端,其工作原理如圖3所示.
圖3 CGI工作原理示意圖
在Web環(huán)境下,瀏覽器與服務(wù)器之間的數(shù)據(jù)交換都是通過(guò)表單完成的,其數(shù)據(jù)傳遞方式包括GET和POST兩種.在GET方法中,表單中的數(shù)據(jù)被作為字符串附加到URL的后面,由于字符串長(zhǎng)度受環(huán)境變量QUERY_STRING的限制且只能出現(xiàn)在URL請(qǐng)求行中,故表單數(shù)據(jù)的提交大多使用POST方法.[5-6]
在智能家居控制系統(tǒng)中,遍布在室內(nèi)的各種傳感器將采集到的數(shù)據(jù)發(fā)送并以文本文件的格式保存在家居控制中心.以環(huán)境溫度檢測(cè)為例,傳感器采集到的溫度值經(jīng)格式轉(zhuǎn)換后保存在根文件系統(tǒng)中的temperature.txt文件中,CGI程序開始運(yùn)行后,將打開該文件,讀取文件中的數(shù)據(jù)并保存在數(shù)組中,用標(biāo)準(zhǔn)輸出STDOUT將查詢到的溫度信息以HTML格式返回到瀏覽器頁(yè)面中.設(shè)計(jì)中溫度查詢所對(duì)應(yīng)的CGI程序?yàn)閠emp.cgi,其主要代碼如下:
設(shè)計(jì)智能家居遠(yuǎn)程控制系統(tǒng)主頁(yè)面index.html,存放在Boa服務(wù)器的/www目錄中,將編譯后的CGI應(yīng)用程序存放在/cgi/cgi-bin目錄中,設(shè)置開發(fā)板的IP地址為192.168.0.123,啟動(dòng)Boa服務(wù)器,在任意瀏覽器地址欄中輸入開發(fā)板的IP地址,即可看到系統(tǒng)主界面,如圖4所示.點(diǎn)擊“查詢”按鈕后,相應(yīng)的CGI程序就會(huì)被執(zhí)行,同時(shí)將查詢結(jié)果返回到瀏覽器頁(yè)面中.除查詢家居環(huán)境以外,還可設(shè)計(jì)相應(yīng)的CGI程序用于智能家電的遠(yuǎn)程控制.
圖4 智能家居遠(yuǎn)程監(jiān)控界面
將嵌入式Web服務(wù)器引入到智能家居控制系統(tǒng)的設(shè)計(jì)中,使得用戶可以通過(guò)瀏覽器實(shí)現(xiàn)家居環(huán)境的遠(yuǎn)程監(jiān)測(cè)以及智能家電的遠(yuǎn)程控制,極大地方便了用戶,提高了家居的智能化水平.實(shí)驗(yàn)測(cè)試結(jié)果表明,該系統(tǒng)響應(yīng)速度快、可靠性較高,經(jīng)適當(dāng)?shù)男薷暮屯晟?,可廣泛應(yīng)用于數(shù)據(jù)采集、醫(yī)療看護(hù)、工業(yè)控制等眾多領(lǐng)域,具有一定的應(yīng)用和推廣價(jià)值.
[1]王俊,郭書軍.嵌入式Web服務(wù)器的實(shí)現(xiàn)及其CGI應(yīng)用[J].電子設(shè)計(jì)工程,2011,19(21):152-154.
[2]王劍飛,程耀瑜.基于S3C2440的嵌入式Linux系統(tǒng)移植[J].電子測(cè)試,2012,(11):84-88.
[3]謝華成,李晶.物聯(lián)網(wǎng)系統(tǒng)中嵌入式 BOA的移植與應(yīng)用[J].軟件,2011,32(5):106-108.
[4]宋凱,嚴(yán)麗平,甘嵐.嵌入式Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(4):808-810.
[5]王莉,周偉.基于ARM的嵌入式Web服務(wù)器設(shè)計(jì)[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(14):90-93.
[6]居錦武.基于嵌入式實(shí)時(shí)操作系統(tǒng)RTX51的軟件系統(tǒng)設(shè)計(jì)[J].四川理工學(xué)院學(xué)報(bào)(自然科學(xué)版),2012,25(1):74-76.