版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE基于ARM9的智能家居網(wǎng)關(guān)設(shè)計(jì)與實(shí)現(xiàn)摘要隨著芯片技術(shù)和計(jì)算機(jī)軟件技術(shù)的飛速發(fā)展、人們生活水平的不斷提高,家居智能化控制被越來(lái)越多的人關(guān)注,人們希望通過(guò)該技術(shù)能夠更加方便簡(jiǎn)潔的對(duì)家居環(huán)境進(jìn)行控制,由此智能家居便應(yīng)運(yùn)而生,本次設(shè)計(jì)便是根據(jù)智能家居的基本功能,通過(guò)對(duì)嵌入式ARM系統(tǒng)平臺(tái)搭建和服務(wù)器的實(shí)現(xiàn),設(shè)計(jì)并實(shí)現(xiàn)了智能家居網(wǎng)關(guān)的設(shè)計(jì)。本文主要研究基于ARM9內(nèi)核的S3C2440芯片的嵌入式智能家居網(wǎng)關(guān)的設(shè)計(jì)與實(shí)現(xiàn)。文章首先介紹了嵌入式智能家居的當(dāng)前應(yīng)用背景和發(fā)展情況,整體論述了系統(tǒng)的軟硬件開(kāi)發(fā)平臺(tái),主要詳細(xì)的介紹了系統(tǒng)軟硬件平臺(tái)的整體搭建過(guò)程,其中包括了交叉編譯環(huán)境的建立、Bootloader啟動(dòng)引導(dǎo)程序的移植、linux-2.6.35內(nèi)核的移植以及簡(jiǎn)易yaffs文件系統(tǒng)的制作;接著探討了Web服務(wù)程序Boa和嵌入式數(shù)據(jù)庫(kù)SQLite的移植;最后設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)嵌入式智能家居服務(wù)器,主要通過(guò)編寫(xiě)CGI程序來(lái)實(shí)現(xiàn)客戶端和服務(wù)器端的動(dòng)態(tài)頁(yè)面交互。整個(gè)系統(tǒng)完成了家居環(huán)境的簡(jiǎn)單信息檢測(cè),遠(yuǎn)程Web服務(wù)器的訪問(wèn),同時(shí)實(shí)現(xiàn)了通過(guò)Internet和本地對(duì)信息的檢測(cè)以及對(duì)設(shè)備的簡(jiǎn)單控制功能。經(jīng)過(guò)測(cè)試表明,本系統(tǒng)具有良好的通用性、實(shí)用性和擴(kuò)展性,可以應(yīng)用到具體的嵌入式智能家居系統(tǒng)的開(kāi)發(fā)中。關(guān)鍵詞:嵌入式智能家居ARM9Web服務(wù)器
TheARM9-basedImbeddedIntelligentHomeGatewayDesignandImplementedAbstractWithchiptechnologyandtherapiddevelopmentofcomputersoftwaretechnology,continuousimprovementofpeople'slivingstandard,intelligenthomecontrolareconcernedbymoreandmorepeople.Peoplewanttocontrolmoresimplyandconvenientlytothehomeenvironment,sothesmarthomehavecomeintobeing.Basedonthebasicfunctionsofsmarthome,throughtheplatformtobuildembeddedARMsystemsandserverimplementation,designandimplementationofintelligenthomegatewayisrealized.Inthispaper,theARM9-basedembeddedintelligenthomegatewayisdesignedandimplemented.Inthisarticle,firstly,theembeddedintelligenthomeapplicationbackgroundanddevelopmentofthecurrentsituationareintroduced,thewholeprocessofthesystemincludinghardwareandsoftwaredevelopmentplatformmainlydiscussed,andthehardwareandsoftwareplatformincludingtheestablishmentofcross-compilerenvironment,thetransplantationofthebootloaderandlinux-2.6.35kernel,themadeofthesimpleyaffsfilesystemareintroducedindetail;Seconendly,theBoaWebserverprogramexploresandembeddedSQLitedatabasemigrationisdebated;Finally,anembeddedintelligenthomeserverwhichmainlyachieveclientandserver-sidedynamicpagesinteractiveisdesignedandimplementedbywritingCGIprograms.Inthiswholesystem,asimplehomeenvironmentinformationdetectionandtheaccessofremoteWebserverarecompleted,asimplecontrolfunctionanddevicedetectionswhichisachievedbytheInternetandlocalaccessareallrealized.Aftertesting,thesystemshowsthegoodversatility,practicalityandscalabilityandcanbeappliedtospecificembeddedintelligenthomesystemdevelopment.Keywords:EmbeddedIntelligenthomeARM9Webserver
目錄1引言 11.1研究背景及現(xiàn)狀 11.2研究目的 11.3內(nèi)容大綱 22嵌入式系統(tǒng)平臺(tái)的搭建 32.1設(shè)計(jì)平臺(tái)簡(jiǎn)介 32.2嵌入式開(kāi)發(fā)環(huán)境的搭建 32.2.1交叉編譯環(huán)境的構(gòu)建 32.2.2配置NFS文件傳輸方式 42.3嵌入式系統(tǒng)平臺(tái)的建立 42.3.1BootLoader的移植 42.3.2Linux內(nèi)核的移植 52.3.3yaffs文件系統(tǒng)移植 82.4make工具簡(jiǎn)介 92.5本章小結(jié) 103下位機(jī)Zigbee配置 123.1Zigbee簡(jiǎn)介 123.2Zigbee協(xié)議棧簡(jiǎn)介 123.3Zigbee協(xié)議的消息格式及幀格式 133.4節(jié)點(diǎn)簡(jiǎn)介 133.5本章小結(jié) 154服務(wù)器的搭建 164.1Boa服務(wù)器的移植 164.1.1Boa服務(wù)器簡(jiǎn)介 164.1.2Boa的移植 174.2HTML網(wǎng)頁(yè)制作 184.2.1HTML簡(jiǎn)述 184.2.2HTML效果 204.3CGI交互程序的編寫(xiě) 204.3.1CGI簡(jiǎn)介 214.3.2CGI程序的接口規(guī)范 214.3.3CGI程序設(shè)計(jì) 234.4嵌入式SQLite數(shù)據(jù)庫(kù) 254.4.1SQLite數(shù)據(jù)庫(kù)簡(jiǎn)介 254.4.2SQLite數(shù)據(jù)庫(kù)的接口(API)函數(shù) 264.4.3SQLite數(shù)據(jù)庫(kù)的移植 264.5本章小結(jié) 275上位機(jī)QtGui設(shè)計(jì) 285.1Qt/Embedded簡(jiǎn)介 285.2Qt開(kāi)發(fā)環(huán)境的搭建 295.3Qt程序設(shè)計(jì) 295.4QtCreator設(shè)計(jì)簡(jiǎn)介 305.4.1QtCreator開(kāi)發(fā)環(huán)境 305.4.2QtCreator工程創(chuàng)建過(guò)程簡(jiǎn)介 305.4.2工程文件分析 315.5本章小結(jié) 336功能測(cè)試 346.1服務(wù)器測(cè)試 346.2Zigbee測(cè)試 356.3QtGui測(cè)試 356.4整體測(cè)試 356.5本章小結(jié) 367總結(jié) 37謝辭 38參考文獻(xiàn) 39附錄 40XXXX畢業(yè)設(shè)計(jì)PAGE11引言1.1研究背景及現(xiàn)狀隨著芯片技術(shù)和計(jì)算機(jī)系統(tǒng)的發(fā)展,如何更加簡(jiǎn)潔方便的提高家居生活的質(zhì)量成為當(dāng)今社會(huì)的熱門(mén)話題,相對(duì)應(yīng)的家具智能化即智能家居的理念便應(yīng)運(yùn)而生。當(dāng)下無(wú)線傳感器網(wǎng)絡(luò)技術(shù)的理論突破,及支持相關(guān)無(wú)線協(xié)議的芯片的成功研制,利用無(wú)線技術(shù)組建局域網(wǎng)將變的越來(lái)越容易。信息化的時(shí)代對(duì)傳統(tǒng)住宅的智能化、無(wú)線化、舒適性和安全性提出了新的挑戰(zhàn),隨著人們生活水平地提高,對(duì)家居環(huán)境的要求從以前單純的物理空間,到現(xiàn)在的延伸為一個(gè)安全、方便、舒適的居住環(huán)境。智能家居系統(tǒng)正是在這樣的情形下,成為新世紀(jì)的熱門(mén)話題。智能家居實(shí)際上就是一個(gè)先進(jìn)的計(jì)算機(jī)系統(tǒng),通過(guò)各種有線無(wú)線通信技術(shù)、計(jì)算機(jī)技術(shù)、布線技術(shù)以及傳感技術(shù),將家庭內(nèi)部進(jìn)行合理的規(guī)劃從而劃分為相關(guān)的子系統(tǒng),并組建為一個(gè)有機(jī)的整體,通過(guò)統(tǒng)一的管理,讓家居生活變得更加舒適、安全、高效。其一,智能家居系統(tǒng)可以實(shí)現(xiàn)主人采用更先進(jìn)的方法來(lái)控制家電設(shè)備,比如通過(guò)手機(jī)、Internet網(wǎng)絡(luò)、語(yǔ)音識(shí)別等遠(yuǎn)程控制家用電器;其二,家居系統(tǒng)內(nèi)部各個(gè)設(shè)備彼此可以通信,無(wú)需手動(dòng)操作即可實(shí)現(xiàn)自動(dòng)控制。嵌入式系統(tǒng)接入Internet也成為了嵌入式應(yīng)用領(lǐng)域的熱點(diǎn)之一。將嵌入式Web服務(wù)器移植到目標(biāo)嵌入式系統(tǒng)后接入Internet,從而使該嵌入式系統(tǒng)成為一個(gè)功能齊全的小型Web服務(wù)器,在遠(yuǎn)程即可通過(guò)瀏覽器(比如IE)獲取該Web服務(wù)器發(fā)布的信息,進(jìn)而實(shí)現(xiàn)遠(yuǎn)程的實(shí)時(shí)監(jiān)控和維護(hù)。嵌入式Web服務(wù)器接入Intemet后,面臨著處理來(lái)自遠(yuǎn)程客戶端的連接請(qǐng)求和傳輸大量的數(shù)據(jù)的任務(wù),這就要求一方面嵌入式硬件的處理能力要更強(qiáng);另一方面隨著傳輸數(shù)據(jù)的增多,并且數(shù)據(jù)類型的復(fù)雜化,在嵌入式系統(tǒng)中單純的以文件存儲(chǔ)數(shù)據(jù)的傳統(tǒng)存儲(chǔ)形式遠(yuǎn)遠(yuǎn)滿足不了需求,解決辦法是使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)并且管理數(shù)據(jù)。在搭建嵌入式網(wǎng)關(guān)時(shí)使用數(shù)據(jù)庫(kù)將極大的提高系統(tǒng)的整體性能,縮短系統(tǒng)的開(kāi)發(fā)周期,同時(shí)通過(guò)數(shù)據(jù)庫(kù)自帶的安全性檢查可以提高系統(tǒng)的整體安全性。正是基于以上背景,本論文搭建了ARM9+嵌入式Linux的嵌入式軟硬件平臺(tái),在此軟硬件平臺(tái)之上實(shí)現(xiàn)了對(duì)Web服務(wù)器Boa和數(shù)據(jù)庫(kù)Sqlite的移植,采用C語(yǔ)言和Qt設(shè)計(jì)了一個(gè)從下位機(jī)獲取相關(guān)數(shù)據(jù)并進(jìn)行處理和顯示的平臺(tái)。1.2研究目的本論文主要是通過(guò)對(duì)Linux內(nèi)核的移植為服務(wù)器的實(shí)現(xiàn)搭建基礎(chǔ)平臺(tái),進(jìn)而完成智能家居服務(wù)器網(wǎng)關(guān)的實(shí)現(xiàn)。本論文在智能家居局嵌入式網(wǎng)關(guān)的經(jīng)典架構(gòu)的基礎(chǔ)上根據(jù)本課題的特點(diǎn)做出了適當(dāng)修改以適應(yīng)本次設(shè)計(jì)的需求從而分成下位機(jī)Zigbee串口通信模塊、上位機(jī)Gui模塊、上位機(jī)Boa服務(wù)器的搭建、服務(wù)器交互html模塊等,各個(gè)模塊采用C、Html、Qt等語(yǔ)言編程,并編譯連接生成目標(biāo)平臺(tái)的二進(jìn)制的可執(zhí)行文件,然后燒錄至目標(biāo)板NANDflash,配置目標(biāo)板的啟動(dòng)加載文檔以實(shí)現(xiàn)程序的開(kāi)機(jī)啟動(dòng)從而使其脫離開(kāi)發(fā)人員的管理仍可以正常工作。1.3內(nèi)容大綱本文共分為七章,第一章為引言,包括研究目的,研究背景及現(xiàn)狀等;第二章為嵌入式系統(tǒng)平臺(tái)的搭建,主要包括交叉編譯環(huán)境的構(gòu)建,u-boot、linux內(nèi)核的移植和yaffs文件系統(tǒng)的制作;第三章主要闡述了Zigbee下位機(jī)的設(shè)計(jì)思路;第四章主要為嵌入式網(wǎng)關(guān)服務(wù)器的整體搭建;第五章為QtGui的整體設(shè)計(jì)。
2嵌入式系統(tǒng)平臺(tái)的搭建2.1設(shè)計(jì)平臺(tái)簡(jiǎn)介在電子硬件設(shè)計(jì)技術(shù)領(lǐng)域,ARM是AdvancedRISCMachines的縮寫(xiě),是嵌入式微處理器行業(yè)的一家知名企業(yè),該企業(yè)設(shè)計(jì)了大量廉價(jià)、高性能、低功耗的RISC處理器相關(guān)技術(shù)及軟件。本論文的硬件平臺(tái)中央處理器(CPU)為三星公司基于ARM920T內(nèi)核開(kāi)發(fā)的S3C2440。S3C2440適用于POS機(jī)、手持PDA設(shè)備、數(shù)字多媒體設(shè)備等,具有低價(jià)位、低功耗、高性能等優(yōu)點(diǎn)。平臺(tái)主要由微處理器、存儲(chǔ)模塊、控制模塊、以太網(wǎng)接口模塊、USB接口模塊、液晶顯示模塊、仿真調(diào)試模塊組成。下面重點(diǎn)介紹與嵌入式Web服務(wù)器應(yīng)用相關(guān)的幾個(gè)模塊:微處理器S3C2440、存儲(chǔ)模塊、以太網(wǎng)接口模塊。S3C2440采用了ARM公司設(shè)計(jì)的ARM92OT內(nèi)核。S3C2440既支持NANDFlash啟動(dòng),又支持NORFlash啟動(dòng),可以通過(guò)OMO引腳進(jìn)行選擇,當(dāng)OMO為低電平時(shí),系統(tǒng)將從NANDFlash啟動(dòng)系統(tǒng);當(dāng)OMO為高電平或者是處于懸空狀態(tài)時(shí),系統(tǒng)從將NORFlash啟動(dòng)[1]。本此設(shè)計(jì)的網(wǎng)絡(luò)控制器使用的是DAVICOM公司的DM9000芯片,該控制器攜帶有有標(biāo)準(zhǔn)的10M/100M以太網(wǎng)自適應(yīng),16K的大容量FIFO,4路的多功能輸入輸出總線,采用全雙工工作模式等。本次設(shè)計(jì)的硬件平臺(tái)使用了16位總線控制的DM9000以太網(wǎng)控制器芯片,數(shù)據(jù)總線DATA0~DATA15分別與DM9000的數(shù)據(jù)總線SD0~SD15連接,地址線SA4~SA4進(jìn)行了相應(yīng)的連接,片選線nGCG3與芯片的AEN相連。DM9000芯片的工作基址為0X300。2.2嵌入式開(kāi)發(fā)環(huán)境的搭建由于嵌入式系統(tǒng)資源的相對(duì)缺乏從而不能在本機(jī)上(目標(biāo)機(jī))直接進(jìn)行開(kāi)發(fā)調(diào)試,因此嵌入式開(kāi)發(fā)形成了獨(dú)特的交叉開(kāi)發(fā)調(diào)試方式。即完成軟件的編寫(xiě)工作以后,先在宿主機(jī)上采用適合目標(biāo)機(jī)的編譯器對(duì)軟件進(jìn)行編譯,然后將編譯后的二進(jìn)制可執(zhí)行程序下載到目標(biāo)機(jī)上相應(yīng)的交叉調(diào)試。2.2.1交叉編譯環(huán)境的構(gòu)建本次設(shè)計(jì)采用的是arm-linux-gcc交叉編譯工具的4.3.2版本,1、下載arm-linux-gcc-4.3.2.tar.gz到虛擬機(jī)的用戶目錄下并進(jìn)入該目錄,然后執(zhí)行下列命令解壓編譯鏈到目標(biāo)目錄下#mkdir/usr/local/arm#tarzxvfarm-linux-gcc-4.3.2.tar.gz/usr/local/arm2、完成后會(huì)在/usr/local/arm下生成4.3.2目錄,然后執(zhí)行一下命令以配置當(dāng)前環(huán)境變量#exportPATH=$PATH:/usr/local/arm/4.3.2/bin3、執(zhí)行下列命令查看交叉編譯環(huán)境是否成功搭建#whicharm-linux-gcc2.2.2配置NFS文件傳輸方式NFS(NetworkFileSystem)最初由SUN公司開(kāi)發(fā),目的就是讓不同體系結(jié)構(gòu)的硬件,不同的操作系統(tǒng)系統(tǒng)通過(guò)網(wǎng)絡(luò)可以彼此之間共享文件。在本次設(shè)計(jì)中,NFS服務(wù)器可以讓目標(biāo)機(jī)通過(guò)網(wǎng)絡(luò)將宿主機(jī)所共享的文件掛載在本地目錄上,在宿主機(jī)看來(lái),訪問(wèn)共享的文件就相當(dāng)于訪問(wèn)自己的磁盤(pán)分區(qū)一樣,十分方便快捷[3]。針對(duì)宿主機(jī)的環(huán)境,具體的配置如下:安裝NFS服務(wù)器,執(zhí)行#apt-getinstallnfs-kernel-servernfs-common配置NFS服務(wù)器的工作位置,執(zhí)行#vi/etc/exports在文件尾加上/*(rw,sync,no_root_squash)重啟服務(wù)生效,執(zhí)行#servicenfs-kernel-serverrestart2.3嵌入式系統(tǒng)平臺(tái)的建立平臺(tái)的搭建分為三部分分別是BootLoader的移植、Linux內(nèi)核的移植和yaffs文件系統(tǒng)的移植。2.3.1BootLoader的移植BootLoader在嵌入式系統(tǒng)中的作用相當(dāng)于PC機(jī)中BIOS啟動(dòng)引導(dǎo)設(shè)備,其主要作用是為系統(tǒng)的啟動(dòng)做相關(guān)的引導(dǎo)和加載準(zhǔn)備。CPU上電后運(yùn)行的第一段代碼是從存儲(chǔ)設(shè)備的0x0地址開(kāi)始運(yùn)行的也就是BootLoader,它首先會(huì)對(duì)嵌入式平臺(tái)的硬件資源進(jìn)行相對(duì)簡(jiǎn)單的初始化,并設(shè)置好函數(shù)堆棧指針,然后加載系統(tǒng)內(nèi)核到內(nèi)存中,最后設(shè)置PC值跳轉(zhuǎn)到內(nèi)核的內(nèi)存入口地址,將系統(tǒng)的控制權(quán)交給操作系統(tǒng)的內(nèi)核函數(shù)。在嵌入式領(lǐng)域中,BootLoader是依賴于所處硬件環(huán)境的,對(duì)于不同的處理器體系結(jié)構(gòu)和外圍資源來(lái)說(shuō)決定著將使用不同的BootLoader。在本次設(shè)計(jì)采用的ARM9體系的處理器中,系統(tǒng)上電后執(zhí)行的第一條指令在內(nèi)存中的地址是0x0,在這個(gè)地址里應(yīng)該存放的是系統(tǒng)的引導(dǎo)程序,以使得系統(tǒng)在上電啟動(dòng)的后,CPU首先執(zhí)行的就是Bootloader程序。BootLoader一般包括兩種工作模式:命令和加載模式[2]。嵌入式系統(tǒng)工作在正常的時(shí)候都是采用的加載模式,BootLoader把操作系統(tǒng)內(nèi)核由系統(tǒng)的NANDFlash存儲(chǔ)器中直接拷貝加載到RAM中并運(yùn)行。這是由于RAM存儲(chǔ)器的存取速度要比NANDFlash存儲(chǔ)器快的多,而且NANDFlash不支持內(nèi)存的隨機(jī)存取,采用這種工作方式會(huì)大大提高代碼的執(zhí)行效率,提高了系統(tǒng)的實(shí)時(shí)性。在第一次燒錄BootLoader、系統(tǒng)內(nèi)核和根文件系統(tǒng)以及其他應(yīng)用軟件的時(shí)候,采用的應(yīng)該是命令模式。在該模式下,從宿主機(jī)上下載的文件將被BootLoader保存到目標(biāo)機(jī)的RAM中,然后再被燒寫(xiě)到NANDFlash的對(duì)應(yīng)地址中。開(kāi)發(fā)完成后,以后也會(huì)采用命令模式對(duì)系統(tǒng)的底層軟件進(jìn)行更新。這兩種工作模式,只是在嵌入式系統(tǒng)的開(kāi)發(fā)初期中有區(qū)別。系統(tǒng)開(kāi)發(fā)完成后,從用戶的角度來(lái)看,BootLoader是工作在加載模式的,只起到加載系統(tǒng)的作用。本次設(shè)計(jì)采用對(duì)Linux支持完善的開(kāi)源的啟動(dòng)加載程序U-boot,其具有強(qiáng)大的代碼可移植性和良好的運(yùn)行效率。U-boot的源文件由上千個(gè)文件組成,其主要文件結(jié)構(gòu)和功能如下:board:開(kāi)發(fā)板相關(guān)的文件目錄,根據(jù)廠商進(jìn)行分類,如當(dāng)前平臺(tái)屬于三星則其平臺(tái)相關(guān)文件在board/samsung/下。cpu:體系結(jié)構(gòu)相關(guān)的文件目錄,按架構(gòu)進(jìn)行分類,當(dāng)前平臺(tái)采用S3C2440則其相關(guān)文件在cpu/s3c2440下,包括第一階段啟動(dòng)代碼start.S。common:包含所有的U-boot下載模式下各種命令的實(shí)現(xiàn)源碼,通常每一個(gè).c都對(duì)應(yīng)著一條命令的實(shí)現(xiàn)。include:包含編譯過(guò)程中需要的頭文件和開(kāi)發(fā)板的配置信息。doc:開(kāi)發(fā)使用文檔,主要介紹不同平臺(tái)的配置編譯方法。drivers:設(shè)備的驅(qū)動(dòng)文件,如SD卡,網(wǎng)卡,顯示屏等。fs:所支持的文件系統(tǒng),如fat等,用于訪問(wèn)帶文件系統(tǒng)的存儲(chǔ)設(shè)備tools:工具軟件,如mkimage用于制作內(nèi)核鏡像,scripts用于生成指定的config.mk配置文件,還有支持GDB的調(diào)試工具等移植步驟如下:將下載的u-boot.tar.bz2拷貝到虛擬機(jī)中,解壓縮并進(jìn)入目錄中#tarjxvfu-boot.tar.bz2#cdu-boot2、自動(dòng)配置當(dāng)前平臺(tái)環(huán)境,執(zhí)行#makes3c2440_config3、編譯#make完成后會(huì)在當(dāng)前目錄下生成u-boot.bin二進(jìn)制鏡像文件,經(jīng)該文件燒寫(xiě)到NANDFlash的0x0地址處即可完成u-boot的全部移植工作。2.3.2Linux內(nèi)核的移植嵌入式硬件系統(tǒng)為嵌入式軟件系統(tǒng)運(yùn)行提供了可供其運(yùn)行的物理平臺(tái),是整個(gè)嵌入式設(shè)備的基礎(chǔ),而嵌入式系統(tǒng)內(nèi)核則是整個(gè)嵌入式系統(tǒng)平臺(tái)的核心部分。因此嵌入式操作系統(tǒng)與嵌入式硬件設(shè)備,特別是處理器及其外部設(shè)備是緊緊相關(guān)的。對(duì)不同的硬件平臺(tái)上運(yùn)行的嵌入式操作系統(tǒng)內(nèi)核通常是不相關(guān)的,必須依據(jù)具體的硬件設(shè)備平臺(tái)進(jìn)行相應(yīng)的配置和編譯。由于Linux操作系統(tǒng)的內(nèi)核源代碼全部使用C語(yǔ)言編寫(xiě),使得其具有良好的可移植性,只需要一些簡(jiǎn)單的修改就能移植到不同的處理器平臺(tái)上。同時(shí)Linux是一款符合GNU標(biāo)準(zhǔn)的開(kāi)源操作系統(tǒng),用戶可以免費(fèi)下載和使用,并能夠根據(jù)需要對(duì)其進(jìn)行定制[4]。因此Linux操作系統(tǒng)成為了嵌入式系統(tǒng)開(kāi)發(fā)首選的操作系統(tǒng)。Linux內(nèi)核的源文件的文件數(shù)目多達(dá)上萬(wàn)個(gè),共有十七個(gè)子目錄,下面列舉其中的主要文件目錄:arch:與處理器體系結(jié)構(gòu)相關(guān)的代碼,對(duì)應(yīng)于每個(gè)支持的體系結(jié)構(gòu),都有一個(gè)對(duì)應(yīng)的子目錄,如i386、arm等,相應(yīng)的目錄下有處理器相關(guān)的硬件匯編啟動(dòng)代碼。driveres:存放設(shè)備驅(qū)動(dòng)代碼的目錄,如block塊設(shè)備驅(qū)動(dòng)、char字符設(shè)備驅(qū)動(dòng)、mtd存儲(chǔ)類設(shè)備驅(qū)動(dòng)等。fs:存放文件系統(tǒng)對(duì)應(yīng)的代碼,如cramfs、yaffs、jffs2等。include:包含編譯內(nèi)核所需的絕大部分頭文件和配置信息。lib:于處理器體系結(jié)構(gòu)無(wú)關(guān)的內(nèi)核庫(kù)代碼,對(duì)應(yīng)的與體系結(jié)構(gòu)相關(guān)的內(nèi)核庫(kù)代碼存放在arch/arm/lib下init:內(nèi)核初始化代碼,其中的main.c中的start_kernel函數(shù)式系統(tǒng)引導(dǎo)起來(lái)后運(yùn)行的第一個(gè)函數(shù),是內(nèi)核開(kāi)始工作的起點(diǎn)。ipc:提供進(jìn)程間通信的相關(guān)代碼。mm:存放與處理器體系結(jié)構(gòu)無(wú)關(guān)的內(nèi)存管理代碼,對(duì)應(yīng)的與處理器體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼放于arch/arm/mm下。kernel:內(nèi)核管理的核心代碼。net:存放網(wǎng)絡(luò)相關(guān)的不封代碼,其每個(gè)子目錄都對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。scripts:存放腳本文件,如配置內(nèi)核時(shí)用到的makemenuconfig命令等。Documentation:內(nèi)核的相關(guān)文檔,如版本說(shuō)明,結(jié)構(gòu)說(shuō)明等Linux內(nèi)核2.6版本對(duì)S3C2440處理器的支持十分完善,在S3C2440處理器上移植Linux只需要要較少的修改。本論文采用Linux~2.6.35內(nèi)核進(jìn)行移植,并且采用S3C2440的默認(rèn)配置文件,步驟如下:下載linux-2.6.35.tar.gz到用戶目錄下并解壓,執(zhí)行#tarzxvflinux-2.6.35.tar.gz#cdlinux-2.6.35配置內(nèi)核的編譯環(huán)境以適應(yīng)嵌入式硬件平臺(tái),執(zhí)行#viMakefile修改ARCH=armCROSS_COMPILE=arm-linux-將S3C2440的默認(rèn)配置文件拷貝到當(dāng)前目錄,并配置內(nèi)核加載該配置文件,執(zhí)行#cparch/arm/configs/s3c2440_defconfig./#makemenuconfig如圖2.1所示圖2.1內(nèi)核配置選項(xiàng)選擇LoadanAlternateConfigurationfile選項(xiàng)載入配置文件,如圖2.2圖2.2加載內(nèi)核配置文件然后選擇Bootoptions選項(xiàng),配置內(nèi)核的啟動(dòng)參數(shù),如圖2.3和圖2.4圖2.3設(shè)置啟動(dòng)參數(shù)選項(xiàng)圖2.4配置內(nèi)核的啟動(dòng)參數(shù)值完成后保存退出,執(zhí)行#makezImage在arch/arm/boot下生成目標(biāo)內(nèi)核鏡像文件zImage,然后通過(guò)USB下載線將內(nèi)核燒進(jìn)開(kāi)發(fā)板,重新啟動(dòng)開(kāi)發(fā)板后將能夠看到內(nèi)核的啟動(dòng)畫(huà)面。2.3.3yaffs文件系統(tǒng)移植yaffs(YetAnotherFlashFileSystem)文件系統(tǒng)是針對(duì)于NANDFlash專門(mén)設(shè)計(jì)得出的嵌入式文件系統(tǒng),目前共有yaffs和yaffs2兩個(gè)不同的版本,它們的區(qū)別在于yaffs2能夠支持容量更大的NANDFlash芯片。yaffs文件系統(tǒng)在某些方面類似于JFFS文件系統(tǒng),但不同的是JFFS文件系統(tǒng)的設(shè)計(jì)目標(biāo)是主要針對(duì)的是NORFlash的應(yīng)用場(chǎng)合,但是NORFlash和NANDFlash在本質(zhì)上有著很大的區(qū)別,即NANDFlash不支持內(nèi)存的隨機(jī)讀取,所以盡管JFFS1文件系統(tǒng)也可以被應(yīng)用到NANDFlash,但是由于其對(duì)內(nèi)存的操作和啟動(dòng)方式方面針對(duì)于NORFlash的特性做了一些優(yōu)化,所以對(duì)NANDFlash來(lái)說(shuō)通常并不是好的方案,又因?yàn)楸敬卧O(shè)計(jì)涉及到Qt的動(dòng)態(tài)連接庫(kù),因此本次設(shè)計(jì)采用帶Qt庫(kù)的yaffs文件系統(tǒng)[5]。將yaffs文件系統(tǒng)的源碼拷貝至某一目錄下,并進(jìn)入該目錄,執(zhí)行#tarzxvfrootfs_qt210_QT4.7.0_20121210.tar.gz#mvrootfs_qt210_QT4.7.0_20121210rootfs安裝制作工具busybox,拷貝busybox-1.13.3.tar.gz到當(dāng)前目錄,執(zhí)行#tarzxvfbusybox-1.13.3.tar.gz#cdbusybox-1.13.3#viMakefile修改CROSS_COMPILE
?=arm-linux-ARCH?=arm3、編譯busybox,執(zhí)行#make
CONFIG_PREFIX=rootfs
install#cpbin/mkyaffs2image../拷貝/etc下相應(yīng)文件到../rootfs/etc/制作yaffs鏡像文件#cd../#./mkyaffs2imagerootfsrootfs.yaffs在當(dāng)前目錄下生成目標(biāo)內(nèi)核鏡像文件rootfs.yaffs,然后通過(guò)USB下載線將文件燒進(jìn)開(kāi)發(fā)板,重新啟動(dòng)開(kāi)發(fā)板后通過(guò)串口終端可以看到命令提示符,證明燒錄成功,如下圖所示。圖2.3文件系統(tǒng)成功移植效果圖2.4make工具簡(jiǎn)介大型工程中的源文件數(shù)量龐大,make工具提供了方便的管理和編譯這些文件的方案,按其類型、功能和模塊的不同分別放在若干個(gè)子目錄中,在makefile定義通過(guò)定義出一系列的規(guī)則來(lái)進(jìn)行指定,哪些文件是需要被先編譯的,哪些文件是需要被后編譯的,而哪些文件則是需要重新被編譯,而那些文件則需要被忽略,而且能夠進(jìn)行某些更為復(fù)雜的操作[6]。makefile所實(shí)現(xiàn)的好處是能夠?qū)崿F(xiàn)自動(dòng)化編譯,一旦寫(xiě)好makefile文件,只需要執(zhí)行make命令,整個(gè)的工程將能夠?qū)崿F(xiàn)自動(dòng)編譯,極大的提高了大型軟件開(kāi)發(fā)工程的效率。make命令是一個(gè)工具,是被用來(lái)解釋makefile文件中所指定的命令并執(zhí)行,一般來(lái)說(shuō),集成開(kāi)發(fā)環(huán)境(IDE)都包含有這個(gè)命令,比如:Delphi中的make,VisualC++下的nmake,Linux上GNU工具下的make。由此可見(jiàn),make工具成為了一種在工程管理方面的有效編譯方法。make工具最為主要的功能就是通過(guò)解析makefile文件來(lái)描述各源程序之間的依賴關(guān)系并能夠自動(dòng)的維護(hù)和選擇性編譯。而makefile文件則需要按照某種特定語(yǔ)法規(guī)則進(jìn)行編寫(xiě),文件中必須要說(shuō)明如何編譯具有相關(guān)性的源文件并最終連接生成可執(zhí)行文件,并要求定義各源文件間依賴的關(guān)系。makefile文件的基本規(guī)則如下:target...:prerequisites...command目標(biāo)文件:所有依賴文件執(zhí)行指令...target也就是目標(biāo)文件,可以是工程文件,也可以是可執(zhí)行的單個(gè)文件。也可以是一個(gè)標(biāo)簽。prerequisites是要生成目標(biāo)文件所需要的所有文件或是目標(biāo)。而command也就是make需要執(zhí)行的命令部分。這是一個(gè)簡(jiǎn)單的文件依賴關(guān)系,也就是說(shuō),target這一個(gè)或多個(gè)目標(biāo)文件依賴于prerequisites列表中的所有文件,其生成的規(guī)則被定義在command中。也就是說(shuō)只要prerequisites中有一個(gè)或以上的文件比目標(biāo)文件的時(shí)間標(biāo)簽要新的話,command所定義的命令就會(huì)被執(zhí)行(注:每個(gè)command必須要以Tab鍵開(kāi)始,否者編譯器將無(wú)法識(shí)別該command,能夠大量的減少重復(fù)編譯,提高了工程的管理和編譯效率[7]。2.5本章小結(jié)本章主要論述了實(shí)現(xiàn)PC交叉開(kāi)發(fā)和嵌入式底層平臺(tái)的搭建工作,其中包括了宿主機(jī)GNU交叉編譯鏈的安裝、NFS文件共享和目的主機(jī)U-boot的編譯移植、Linux內(nèi)核的移植、yaffs文件系統(tǒng)的制作等,為嵌入式服務(wù)器的搭建建立起底層的平臺(tái)支持,最后介紹了make工具的用法和makefile編寫(xiě)文檔基本的語(yǔ)法規(guī)則,方便了大型工程的管理編譯或有大量文件需要被編譯的情況。
3下位機(jī)Zigbee配置3.1Zigbee簡(jiǎn)介ZigBee是一種低速率的適用于短距離傳輸?shù)臒o(wú)線網(wǎng)絡(luò)協(xié)議。ZigBee協(xié)議從下到上分為物理層、媒體訪問(wèn)控制層、傳輸層、網(wǎng)絡(luò)層、應(yīng)用層等[8]。其中物理層和媒體訪問(wèn)控制層均遵循IEEE802.15.4標(biāo)準(zhǔn)的規(guī)定。ZigBee網(wǎng)絡(luò)的主要特點(diǎn)是功耗低、成本低、速率低、支持大量節(jié)點(diǎn)、支持多種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、復(fù)雜度低、快速、安全、可靠。ZigBee網(wǎng)絡(luò)設(shè)備可分為協(xié)調(diào)器、路由器、傳感器節(jié)點(diǎn)等。Zigbee作為一種短距離無(wú)線通信技術(shù),由于其網(wǎng)絡(luò)可以便捷的為用戶提供無(wú)線數(shù)據(jù)傳輸功能,因此在物聯(lián)網(wǎng)領(lǐng)域具有非常強(qiáng)的可應(yīng)用性。以美國(guó)TI公司CC2430芯片為代表的ZigbeeSOC解決方案在國(guó)內(nèi)高校企業(yè)掀起了一股Zigbee技術(shù)應(yīng)用的熱潮。因?yàn)镃C2430集成了51單片機(jī)核,用C51語(yǔ)言編寫(xiě)程序,所以相比于眾多的Zigbee芯片,CC2430頗受青睞。開(kāi)發(fā)套件包括由專業(yè)人士精心設(shè)計(jì)的Zigbee產(chǎn)品開(kāi)發(fā)模板、完整的原理圖、協(xié)議棧及例程源碼。Zigbee的開(kāi)發(fā)基于Z-Stack協(xié)議棧,開(kāi)發(fā)軟件使用IAREmbeddedWorkbench,成都無(wú)線龍公司的Zigbee開(kāi)發(fā)套件可與IARforMCS-51集成開(kāi)發(fā)環(huán)境無(wú)縫連接,操作方便、連接方便、簡(jiǎn)單易學(xué),是學(xué)習(xí)開(kāi)發(fā)Zigbee終端最好最實(shí)用的開(kāi)發(fā)工具。3.2Zigbee協(xié)議棧簡(jiǎn)介如圖3.1所示,Zigbee的協(xié)議棧的各層與802.15.4MAC層是通過(guò)服務(wù)接入點(diǎn)實(shí)現(xiàn)通信的,服務(wù)接入點(diǎn)是某一個(gè)特定介質(zhì)層所提供服務(wù)的與其上層的通信接口,Zigbee協(xié)議棧的部分層有兩個(gè)接口分別是數(shù)據(jù)和管理實(shí)體接口。數(shù)據(jù)接口的目標(biāo)是為其上層提供所需要的數(shù)據(jù)服務(wù),管理實(shí)體接口的目標(biāo)是向上層提供訪問(wèn)內(nèi)部參、置信息和數(shù)據(jù)管理的服務(wù)。圖3.1Zigbee堆棧結(jié)構(gòu)3.3Zigbee協(xié)議的消息格式及幀格式Zigbee協(xié)議的消息格式組成及幀格式類型描述如下:1、消息格式Zigbee的消息是由127個(gè)字節(jié)組成的,它主要包括以下幾個(gè)部分:MAC報(bào)頭:該報(bào)頭包含當(dāng)前被傳輸消息的源物理地址及目的地址.若消息被路由轉(zhuǎn)發(fā),則該地址有可能不是實(shí)際地址,產(chǎn)生及使用該報(bào)頭對(duì)于應(yīng)用代碼是不可見(jiàn)的。NWK報(bào)頭:該報(bào)頭中包含了消息的實(shí)際源地址及最終的目的地址,該報(bào)頭的產(chǎn)生以及使用對(duì)應(yīng)用代碼來(lái)說(shuō)是不可見(jiàn)的。APS報(bào)頭:該報(bào)頭中包含了當(dāng)前的配置ID,簇ID以及當(dāng)前消息的目的地址,同樣的,報(bào)頭的產(chǎn)生及使用過(guò)程是不可見(jiàn)的。有效載荷:該域中包含了需要被應(yīng)用層處理的Zigbee協(xié)議幀。2、ZigBee協(xié)議幀格式Zigbee協(xié)議共定義了兩種幀格式分別是KVP及MSG。KVP是ZigBee協(xié)議規(guī)范定義的特殊的數(shù)據(jù)傳輸機(jī)制,通過(guò)該規(guī)定來(lái)將數(shù)據(jù)傳輸格式和內(nèi)容標(biāo)準(zhǔn)化,主要用于傳輸較簡(jiǎn)單的變量值格式。MSG是ZigBee協(xié)議規(guī)范中定義的特殊的數(shù)據(jù)傳輸機(jī)制,其在數(shù)據(jù)傳輸所采用的格式和內(nèi)容上并不作任何的特殊規(guī)定,主要用于傳輸專用的例如數(shù)據(jù)流和文件數(shù)據(jù)等數(shù)據(jù)量相對(duì)較大的數(shù)據(jù)。KVP幀專用于相對(duì)較規(guī)范的信息傳輸格式,采用鍵值對(duì)的數(shù)據(jù)形式,按某種特殊規(guī)定的數(shù)據(jù)格式進(jìn)行數(shù)據(jù)傳輸,通常用來(lái)傳輸一個(gè)或幾個(gè)簡(jiǎn)單的屬性變量值;MSG幀沒(méi)有具體數(shù)據(jù)格式上的規(guī)定,通常用于復(fù)雜信息的傳輸。KVP、MSG是通訊中的常用的兩種數(shù)據(jù)格式。如果將幀比作一封電子郵件,那么目的郵箱和源郵箱等信息都存于幀頭、幀尾,里面的信息內(nèi)容就是特定的數(shù)據(jù)格式KVP或MSG。根據(jù)具體的配置文件(Porfile),KVP一般用于簡(jiǎn)單屬性數(shù)據(jù),MSG用于較復(fù)雜的,數(shù)據(jù)量較大信息。3.4節(jié)點(diǎn)簡(jiǎn)介本次設(shè)計(jì)中所采用的Zigbee芯片是Chipcon
推出的CC2430,是世界首款完全符合2.4GHz的
IEEE制定的802.15.4標(biāo)準(zhǔn)的一款射頻收發(fā)器。包括眾多新功能,是一款完全適用于Zigbee芯片產(chǎn)品的RF器件。它基于是Chipcon的SmartRF
03技術(shù),以0.18um
的CMOS工藝制成的僅僅需極少的外部器件,性能相對(duì)更為穩(wěn)定且功耗更低。CC2430的可選擇和敏感指數(shù)均超過(guò)了IEEE制定的802.15.4標(biāo)準(zhǔn)的要求,可以確保短距離通信過(guò)程的有效和可靠性。利用該芯片實(shí)現(xiàn)的通信設(shè)備能夠支持的數(shù)據(jù)傳輸率高達(dá)250kbps可以實(shí)現(xiàn)快速組網(wǎng)技術(shù)。CC2430芯片內(nèi)置了模數(shù)轉(zhuǎn)換模塊,這就極大地方便了實(shí)現(xiàn)溫濕度、光強(qiáng)的模擬信號(hào)的采集與處理工作。對(duì)協(xié)議棧的main函數(shù)部分修改部分,實(shí)現(xiàn)對(duì)部分寄存器的讀寫(xiě)操作即可實(shí)現(xiàn)外部信息的采集,然后調(diào)用發(fā)送和串口操作函數(shù)即可實(shí)現(xiàn)信息的傳輸[9]。1、溫度傳感器簡(jiǎn)介采用DS18B20芯片,DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場(chǎng)合,其具有獨(dú)特的串行數(shù)據(jù)接口,只需要一條數(shù)據(jù)線線通信實(shí)現(xiàn)數(shù)據(jù)的傳輸,簡(jiǎn)化了分布式溫度傳感器的應(yīng)用范圍,無(wú)需外部其他元件,可以使用用數(shù)據(jù)總線供電,電壓有效范圍為3.0V至5.5V,測(cè)量溫度范圍為-55°C至+125℃。范圍內(nèi)精度能夠達(dá)到±0.5°C描述該DS18B20的數(shù)字溫度計(jì)提供9至12位(可編程設(shè)備溫度讀數(shù)。信息被發(fā)送到/從DS18B20通過(guò)一條數(shù)據(jù)線接口,所以中央微處理器與DS18B20只需有一條數(shù)據(jù)線連接。不需要外接電源,因?yàn)槊恳粋€(gè)DS18B20都包含一個(gè)獨(dú)特的序號(hào),多個(gè)DS18B20芯片可以同時(shí)存在于一條數(shù)據(jù)總線。這使得多個(gè)溫度傳感器能夠放置在許多不同的地方。2、光敏傳感器簡(jiǎn)介光敏傳感器的工作原理主要是利用光敏元件將光信號(hào)轉(zhuǎn)換為電信號(hào),其最為0敏感的波長(zhǎng)在可見(jiàn)光波長(zhǎng)附近,還包括紅外線和紫外線。光敏傳感器不僅僅局限于對(duì)光的探測(cè),還可以作為特定的探測(cè)元件組成其他特殊傳感器,對(duì)許多非電量進(jìn)行有效的檢測(cè),只要通過(guò)將這些非電量轉(zhuǎn)換為光信號(hào)并采用光敏傳感器監(jiān)測(cè)的機(jī)制即可得到其數(shù)據(jù)。光敏傳感器中最為簡(jiǎn)單常用的電子器件就是光敏電阻,它能感應(yīng)出光線的明暗變化,輸出微弱的電流,通過(guò)簡(jiǎn)單的電子線路放大的處理便能夠得到光強(qiáng)信號(hào)值。3、紅外線傳感器簡(jiǎn)介一般的生命體會(huì)釋放紅外線,紅外線傳感器通過(guò)對(duì)周?chē)t外線強(qiáng)度的探測(cè),可以得到紅外線強(qiáng)度值,通過(guò)數(shù)據(jù)管教上傳數(shù)據(jù)值。4、可燃?xì)怏w傳感器可燃?xì)怏w傳感器是能夠?qū)我换蚨喾N可燃?xì)怏w濃度產(chǎn)生響應(yīng)的探測(cè)器??扇?xì)怏w傳感器包括催化型、紅外光學(xué)型。催化型的可燃?xì)怏w傳感器是采用相對(duì)難熔對(duì)金屬鉑絲加熱后其電阻的波動(dòng)來(lái)測(cè)定可燃?xì)怏w的濃度。當(dāng)可燃?xì)怏w進(jìn)入該型探測(cè)器有效范圍時(shí)時(shí),鉑絲的表面會(huì)產(chǎn)生氧化反應(yīng)(無(wú)焰燃燒),其反應(yīng)所產(chǎn)生的熱量會(huì)使鉑絲的表面溫度變換,而鉑絲的電阻率會(huì)隨著溫度產(chǎn)生變化,從而得到環(huán)境數(shù)據(jù)。紅外光學(xué)型可燃?xì)怏w傳感器則是利用紅外線傳感器通過(guò)對(duì)紅外線光源的吸收率來(lái)檢測(cè)環(huán)境內(nèi)的碳?xì)漕惪扇細(xì)怏w。效果如圖3.2所示:圖3.2節(jié)點(diǎn)效果圖3.5本章小結(jié)本章主要介紹了基于Zigbee的下位機(jī)通過(guò)溫度、光敏、紅外、可燃?xì)怏w等傳感器數(shù)據(jù)采集模塊,實(shí)現(xiàn)了對(duì)環(huán)境數(shù)據(jù)的基本采集、發(fā)送和接收功能,為上位機(jī)的數(shù)據(jù)處理模塊提供底層支持。
4服務(wù)器的搭建4.1Boa服務(wù)器的移植4.1.1Boa服務(wù)器簡(jiǎn)介在Linux系統(tǒng)中最常用的支持http協(xié)議的服務(wù)程序有三個(gè):Boa、httpd和Tttpd。其中httpd功能最弱,只能夠支持靜態(tài)頁(yè)面,不支持認(rèn)證,不支持cgi,Thttpd和Boa所提供的功能基本一樣,都支持認(rèn)證、cgi等。但是Thttpd在運(yùn)行過(guò)程中所占用的資源要遠(yuǎn)遠(yuǎn)大于Boa服務(wù)器??梢?jiàn)Boa更適合作為嵌入式領(lǐng)域的web服務(wù)器。所以本次設(shè)計(jì)選擇Boa服務(wù)器。Boa是1991年由PaulPhillips開(kāi)發(fā)的一個(gè)運(yùn)行于類unix計(jì)算機(jī)系統(tǒng)的高性能網(wǎng)絡(luò)服務(wù)器。Boa的設(shè)計(jì)目標(biāo)是速度和安全性,它的安全性體現(xiàn)于服務(wù)器不會(huì)被未通過(guò)認(rèn)證的用戶訪問(wèn),并且能對(duì)信息進(jìn)行加密處理。Boa服務(wù)器可以處理來(lái)自客戶端瀏覽器的數(shù)據(jù)請(qǐng)求方式包括post方式和get方式,并且支持cgi后臺(tái)服務(wù)程序[10]。Boa服務(wù)程序的執(zhí)行流程如圖4.1所示。圖4.1Boa服務(wù)器流程圖傳統(tǒng)的web服務(wù)器會(huì)為每一次訪問(wèn)都單獨(dú)創(chuàng)建一個(gè)進(jìn)程,十分耗費(fèi)系統(tǒng)資源。而B(niǎo)oa是一個(gè)單任務(wù)的http服務(wù)器。這也就是說(shuō),Boa既不為每一個(gè)連接單獨(dú)創(chuàng)建新的進(jìn)程,又不復(fù)制自身進(jìn)程,只有在完成一個(gè)用戶的請(qǐng)求之后才會(huì)響應(yīng)另一個(gè)用戶的請(qǐng)求,因此它無(wú)法并發(fā)響應(yīng)多個(gè)連接請(qǐng)求,但是在資源相對(duì)緊張的嵌入式設(shè)備中,Boa服務(wù)器的這一特點(diǎn)卻十分符合嵌入式對(duì)應(yīng)用程序的要求。又Boa是通過(guò)建立http請(qǐng)求列表然后順序的方式來(lái)處理多路http請(qǐng)求的,它只會(huì)為cgi程序創(chuàng)建出新的進(jìn)程,這樣就能夠在最大程度上節(jié)約系統(tǒng)資源。除此之外,Boa服務(wù)器還能夠自動(dòng)的生成目錄和自解壓文件。Boa服務(wù)器在處理http請(qǐng)求過(guò)程中,具有較高的處理速度和效率。因此Boa服務(wù)器在嵌入式領(lǐng)域具有相當(dāng)廣泛的應(yīng)用。4.1.2Boa的移植Boa服務(wù)器的移植工作,主要完成了對(duì)Boa程序的移植和Boa配置文件的修改。其具體移植步驟如下:1、下載Boa源碼登錄網(wǎng)站,下載源碼文件名為boa-0.94.13-src.tar.gz的源碼包。并將下載到的文件放入用戶目錄中并解壓,然后執(zhí)行如下命令:#tarzxvfboa-0.94.13-src.tar完成后,將會(huì)生成一個(gè)名為boa-0.94.13-src的文件目錄。將該目錄名修改為boa。#mvboa-0.94.13-srcboa2、修改Boa服務(wù)器的根目錄Boa服務(wù)器程序可以對(duì)通過(guò)SERVER_ROOT的定義來(lái)制定Boa服務(wù)器的文件根目錄。在本次設(shè)計(jì)當(dāng)中,將boa/sre/defines.h文件中的“#defineSERVER_ROOT/ete/boa”語(yǔ)句,修改為“#defineSERVER_ROOT/usr/bin”。即把服務(wù)器的根目錄修改為嵌入式平臺(tái)的/usr/bin目錄下。3、生成Makefile文件運(yùn)行boa/src/configure,執(zhí)行以下命令:#cdboa/src#./configure執(zhí)行成功后即可生成Makefile文件4、修改生成Makefile文件由于本此設(shè)計(jì)使用的交叉編譯工具為arm-linux-gcc,必須要對(duì)Makefile文件作如下修改:CC=arm-11nux-gccCPP=arm-11nux-g++-E5、編譯進(jìn)入boa/src目錄執(zhí)行以下命令:#make執(zhí)行完成功后,將在boa/src目錄下產(chǎn)生編譯后的二進(jìn)制可執(zhí)行文件boa。去掉其調(diào)試信息:#arm-1inux-stripboa6、將編譯好的boa文件放入yaffs根文件系統(tǒng)的/bin目錄下#cpboa~/rootfs/bin/7、Boa服務(wù)器的配置以上幾個(gè)步驟就可以完成Boa服務(wù)器程序的移植,為了保證服務(wù)器的正常運(yùn)行還需要對(duì)Boa進(jìn)行配置。配置主要就是修改boa目錄下已有的一個(gè)示例配置文件boa.conf,可以在其基礎(chǔ)上進(jìn)行簡(jiǎn)單修改即可。主要內(nèi)容如下:Port80 //設(shè)置Boa程序的監(jiān)聽(tīng)端口為80User0 //設(shè)置運(yùn)行Boa的用戶名,0為所有用戶都可以運(yùn)行Group0 //設(shè)置運(yùn)行Boa的用戶所在的組,0為所有用戶組ErrorLog/var/log/boa/error_log //錯(cuò)誤日志DocumentRoot/var/log/boa/log //普通日志DocumentRoot/var/www //定義HTML文檔的目錄DirectoryIndexindex.html //站點(diǎn)的首頁(yè)文件名KeepAliveMax1000 //設(shè)置最多響應(yīng)1000個(gè)連接請(qǐng)求KeepAliveTimeout15 //設(shè)置15秒后未向服務(wù)器發(fā)送請(qǐng)求為超時(shí)CGIPath/bin:/usr/bin:/usr/local/bin //設(shè)置服務(wù)器的CGI程序存放目錄ScriptAlias/cgi-bin//var/www/cgi-bin //相當(dāng)于建立軟連接8、建立相應(yīng)的文件目錄在嵌入式文件系統(tǒng)中創(chuàng)建相關(guān)的目錄如下,日志文件所處的目錄var/log/boa,HTML文檔所處的位置/var/www,CGI腳本程序所在目錄/var/www/cgi-bin,目錄全部設(shè)置完畢后,將靜態(tài)頁(yè)面文件主頁(yè)index.html拷貝放到/var/www目錄下。9、修改文件系統(tǒng)為了讓系統(tǒng)啟動(dòng)時(shí)能夠自動(dòng)啟動(dòng)嵌入式Boa服務(wù)器,需要通過(guò)修改系統(tǒng)的啟動(dòng)腳本rootfs/etc/init.d/rcS實(shí)現(xiàn),在該文件末尾中加入一行內(nèi)容如下:/usr/bin/boa&完成后,重新燒錄文件系統(tǒng),重啟開(kāi)發(fā)板,即完成Boa程序的移植。4.2HTML網(wǎng)頁(yè)制作4.2.1HTML簡(jiǎn)述超級(jí)文本標(biāo)記語(yǔ)言(英文縮寫(xiě):HTML)是標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的應(yīng)用、規(guī)范、標(biāo)準(zhǔn),它通過(guò)某些特定的標(biāo)記符來(lái)標(biāo)記要顯示的網(wǎng)頁(yè)中的各個(gè)部分。網(wǎng)頁(yè)文件本身是一種文本文件,可以通過(guò)在該文本文件中添加某些特定的標(biāo)記符,控制瀏覽器顯示的內(nèi)容(例如:文字效果,畫(huà)面布局,圖片樣式等)。瀏覽器凈按順序讀取和分析網(wǎng)頁(yè)文件,然后根據(jù)對(duì)標(biāo)記符的解釋,顯示其標(biāo)記對(duì)應(yīng)的內(nèi)容,但對(duì)出錯(cuò)的標(biāo)記符并不會(huì)做出錯(cuò)處理,且不停止其解釋執(zhí)行過(guò)程,編制者只能通過(guò)顯示效果來(lái)分析出錯(cuò)原因和出錯(cuò)位置。但需要注意的是,對(duì)于不同的瀏覽器,由于其對(duì)同一標(biāo)記符可能會(huì)存在不完全相同的解釋方式,因而會(huì)有不同的顯示效果。一個(gè)網(wǎng)頁(yè)對(duì)應(yīng)一個(gè)HTML文件,超文本標(biāo)記語(yǔ)言文件以.htm(磁盤(pán)操作系統(tǒng)DOS限制的英語(yǔ)縮寫(xiě)為擴(kuò)展名)或.html(英語(yǔ)縮寫(xiě)為擴(kuò)展名)。能夠使用任何可以生成TXT類型源文件的文本編輯器來(lái)設(shè)計(jì)超文本標(biāo)記語(yǔ)言文件,只需修改文件后綴即可。標(biāo)準(zhǔn)的超文本標(biāo)記語(yǔ)言文件都會(huì)具有一個(gè)基本的結(jié)構(gòu),大部分標(biāo)記一般都是成對(duì)出現(xiàn)(部分特殊標(biāo)記除外例如:<br/>),包括超文本標(biāo)記語(yǔ)言文件的開(kāi)頭標(biāo)志與結(jié)尾標(biāo)志和超文本標(biāo)記語(yǔ)言的頭部與實(shí)體兩大部分。用三個(gè)雙標(biāo)記符來(lái)確認(rèn)頁(yè)面的整體結(jié)構(gòu)。標(biāo)記符<HTML>;說(shuō)明該文件是采用用超文本標(biāo)記語(yǔ)言(本標(biāo)簽的中文全稱)來(lái)編寫(xiě)的。它是文件的開(kāi)頭部分,而</HTML>;則是該文件的結(jié)尾,它們分別是超文本標(biāo)記語(yǔ)言文件的開(kāi)始標(biāo)記符和結(jié)尾標(biāo)記符。標(biāo)記符<head></head>,這兩個(gè)標(biāo)記符分別標(biāo)示了超文本標(biāo)記語(yǔ)言頭部信息的開(kāi)始和結(jié)束。頭部中所包含的標(biāo)記分別有頁(yè)面的標(biāo)題、文字編碼和文件格式等內(nèi)容,它本身并不作為顯示的內(nèi)容,但會(huì)影響網(wǎng)頁(yè)顯示的效果。頭部中最常用的標(biāo)記符是title標(biāo)記符和meta標(biāo)記符,其中的title標(biāo)記符用于定義該網(wǎng)頁(yè)的標(biāo)題,它的內(nèi)容顯示在瀏覽器網(wǎng)頁(yè)窗口的標(biāo)題欄中,網(wǎng)頁(yè)標(biāo)題可被瀏覽器用作書(shū)簽或收藏清單。設(shè)置文檔標(biāo)題和其它在網(wǎng)頁(yè)中不顯示的信息,比如direction方向、語(yǔ)言編碼格式LanguageCode等。標(biāo)記符<body></body>,網(wǎng)頁(yè)中顯示的實(shí)際內(nèi)容全部包含在這兩個(gè)正文標(biāo)記符間,正文標(biāo)記符又被稱之為實(shí)體標(biāo)記符。HTML網(wǎng)頁(yè)文檔的標(biāo)準(zhǔn)格式一般如下:<html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/><title>標(biāo)題</title></head><body><p><h1>正文</h1></p></body></html>其中<html></html>之間為網(wǎng)頁(yè)的全部?jī)?nèi)容,<head></head>之間為網(wǎng)頁(yè)的頭信息,指定了網(wǎng)頁(yè)的格式,文本編碼格式等,<body></body>間為網(wǎng)頁(yè)的可顯示部分。4.2.2HTML效果本次設(shè)計(jì)的簡(jiǎn)單網(wǎng)頁(yè)效果圖如下:圖4.2html登陸頁(yè)圖4.3html選項(xiàng)頁(yè)圖4.4htmlLED控制頁(yè)4.3CGI交互程序的編寫(xiě)4.3.1CGI簡(jiǎn)介CGI的全稱是公共網(wǎng)關(guān)接口,是HTTP服務(wù)器與發(fā)送請(qǐng)求機(jī)器上的程序進(jìn)行信息交互的工具,其程序是運(yùn)行與服務(wù)器上的。在物理上,CGI是一段可執(zhí)行的二進(jìn)制程序,它運(yùn)行于服務(wù)器之上,是服務(wù)器提供給客戶端瀏覽器交互的接口。CGI程序用來(lái)解釋處理來(lái)自用戶表單的輸入信息,并同時(shí)在服務(wù)器產(chǎn)生響應(yīng),將所請(qǐng)求信息的反饋結(jié)果發(fā)送給客戶端瀏覽器[11]。CGI程序是得服務(wù)器的網(wǎng)頁(yè)具有較強(qiáng)的交互功能。CGI程序的處理過(guò)程如下:用戶通過(guò)Internet把請(qǐng)求信息送至服務(wù)器。
2、服務(wù)器接收用戶的請(qǐng)求并交給相應(yīng)的CGI程序處理。應(yīng)用程序執(zhí)行所需要的操作,通常是基于瀏覽者輸人的內(nèi)容。CGI應(yīng)用程序把結(jié)果格式化為網(wǎng)絡(luò)服務(wù)器和瀏覽器能夠理解的文檔(通常是HTML網(wǎng)頁(yè))。
5、CGI程序把處理結(jié)果傳送給服務(wù)器。
6、服務(wù)器把結(jié)果回返給用戶。CGI可以用任何一種語(yǔ)言編寫(xiě),只要這種語(yǔ)言具有標(biāo)準(zhǔn)的輸入、輸出和環(huán)境變量。對(duì)于初學(xué)者來(lái)說(shuō),最好選用易于歸檔和能有效表示大量數(shù)據(jù)結(jié)構(gòu)的語(yǔ)言,例如UNIX環(huán)境中Perl(PracticalExtractionandReportLanguage)、BourneShel、Tcl(ToolCommandLanguage),由于C語(yǔ)言有較強(qiáng)的平臺(tái)無(wú)關(guān)性,所以也是編寫(xiě)CGI程序的首選。Windows環(huán)境中C和C++。由于Internet上絕大部分服務(wù)器使用的是類UNIX操作系統(tǒng),且?guī)缀跛械念怳NIX操作系統(tǒng)都支持ANSIC標(biāo)準(zhǔn),因而實(shí)際應(yīng)用中大部分是用C編寫(xiě)的。
C由于其良好的跨平臺(tái)、易于修改、效率高等特性被選為本次設(shè)計(jì)的CGI編寫(xiě)語(yǔ)言。4.3.2CGI程序的接口規(guī)范CGI接口協(xié)議規(guī)范包括標(biāo)準(zhǔn)輸入(STDIN)、環(huán)境變量和標(biāo)準(zhǔn)輸出(STDOUT)。(1)標(biāo)準(zhǔn)輸入當(dāng)用戶才用POST的方式提交數(shù)據(jù)是,CGI程序?qū)⒛軌蛲ㄟ^(guò)標(biāo)準(zhǔn)輸入從Web服務(wù)器中獲取用戶的輸入信息。CGI程序可以通過(guò)如下的兩種方式獲取到用戶的輸入信息:URL的直接傳遞②表單中的數(shù)據(jù)傳遞(2)環(huán)境變量在客戶端瀏覽器和Web服務(wù)器之間的數(shù)據(jù)交互過(guò)程中,CGI程序?qū)⒛軌蛲ㄟ^(guò)對(duì)環(huán)境變量的解析來(lái)獲取Web服務(wù)器所傳遞過(guò)來(lái)的用戶數(shù)據(jù)。環(huán)境變量是服務(wù)器和CGI程序間的一種數(shù)據(jù)傳遞的途徑,CGI程序中主要的涉及到的環(huán)境變量如下:REQUEST-METHOD:數(shù)據(jù)發(fā)送方式SERVER-NAME:運(yùn)行CGI程序的主機(jī)名。SERVER-INTERFACE:Web服務(wù)器的類型。SERVER-PROTOCOL:通信采用的協(xié)議,應(yīng)為HTTP/1.0。SERVER-PORT:綁定的TCP協(xié)議端口,一般說(shuō)來(lái)Web端口均為80。HTTP-ACCEPT:HTTP定義的瀏覽器所能夠識(shí)別的數(shù)據(jù)格式。HTTP-REFERER:發(fā)送表單的文件的URL。HTTP-USER-AGENT:發(fā)送表單數(shù)據(jù)的瀏覽器相關(guān)信息。GETWAY-INTERFACE:CGI程序所采用的版本,在UNIX系統(tǒng)下為CGI/1.1。PATH-TRANSLATED:PATH-INFO參數(shù)中所包含的路徑名。PATH-INFO:瀏覽器采用GET方式發(fā)送數(shù)據(jù)過(guò)程的附加路徑。SCRIPT-NAME:實(shí)際CGI程序的絕對(duì)路徑名。QUERY-STRING:表單中用戶輸入的數(shù)據(jù),即URL中間號(hào)后分割的內(nèi)容。REMOTE-HOST:發(fā)送執(zhí)行程序的主機(jī)名。REMOTE-ADDR:執(zhí)行程序機(jī)器的IP地址。REMOTE-USER:發(fā)送程序的用戶名。CONTENT-TYPE:采用的數(shù)據(jù)類型。CONTENT-LENGTH:POST方式用戶輸入數(shù)據(jù)的字節(jié)數(shù)。下面詳細(xì)介紹一下編寫(xiě)CGI程序時(shí),經(jīng)常用的四個(gè)變量。1、REQUEST-METHOD該變量定義了CGI程序接收Web服務(wù)器數(shù)據(jù)的方式,分為GET方式和POST方式兩種。GET方式是把數(shù)據(jù)插入U(xiǎn)RL中發(fā)送的。而POST方式則是直接從服務(wù)器標(biāo)準(zhǔn)輸入中讀取并發(fā)送數(shù)據(jù),POST方式比GET方式能夠更加安全的傳輸數(shù)據(jù)到服務(wù)器的CGI程序。QUERY-STRING當(dāng)客戶端瀏覽器采用的是GET方式發(fā)送數(shù)據(jù)時(shí),環(huán)境變量QUERY-STRING值表示的是CGI程序中URL的“?”所對(duì)應(yīng)的的后邊的參數(shù),如?vl=al&v2=a2。如果使用POST方式,該值將為空。3、CONTENT-TYPE表示的用戶給服務(wù)器傳遞的消息的數(shù)據(jù)類型。當(dāng)客戶端瀏覽器采用的是POST的方式遞交表單內(nèi)容時(shí),這個(gè)值將是服務(wù)器調(diào)用CGI程序過(guò)程所傳送MIME類型的數(shù)據(jù)。當(dāng)客戶端瀏覽器采用的是GET方式時(shí),該變量的將值為空。4、CONTENT-LENGTH當(dāng)客戶端瀏覽器采用的是POST方式時(shí),變量值表示的是傳遞給標(biāo)準(zhǔn)輸入的數(shù)據(jù)長(zhǎng)度。當(dāng)客戶端瀏覽器采用的是GET方式,其值將為空。(3)標(biāo)準(zhǔn)輸出CGI程序通過(guò)標(biāo)準(zhǔn)輸出給Web服務(wù)器傳輸某些數(shù)據(jù)信息。CGI的標(biāo)準(zhǔn)輸入也就是服務(wù)器的標(biāo)準(zhǔn)輸出,而相對(duì)應(yīng)的CGI的標(biāo)準(zhǔn)輸出就是服務(wù)器程序的標(biāo)準(zhǔn)輸入。CGI傳遞給Web服務(wù)器的數(shù)據(jù)格式包含有多個(gè)頭部信息和一個(gè)數(shù)據(jù)信息,兩者之間必須用空行相隔。CGI的標(biāo)準(zhǔn)輸出中必須要帶有至少一個(gè)頭部信息,而數(shù)據(jù)體則無(wú)要求。如果帶有數(shù)據(jù)體,那么就必須要設(shè)置環(huán)境變量中的CONTENT-TYPE,即MIME類型。MIME類型信息通過(guò)標(biāo)準(zhǔn)輸入輸出傳遞給Web服務(wù)器后,Web服務(wù)器再把該數(shù)據(jù)全部返回給客戶端瀏覽器,客戶端瀏覽器就會(huì)通過(guò)解析從服務(wù)器接受到的文本信息做出相應(yīng)的顯示。在HTML的源碼中能夠使用任何的HTML標(biāo)記符,如超鏈接、圖像、表單以及調(diào)用其他CGI程序等。4.3.3CGI程序設(shè)計(jì)通過(guò)CGI程序?qū)崿F(xiàn)服務(wù)器與客戶端瀏覽器之間的動(dòng)態(tài)數(shù)據(jù)交互,其執(zhí)行過(guò)程主要步驟詳解:(l)獲取用戶通過(guò)瀏覽器的提交數(shù)據(jù)如果客戶端采用數(shù)據(jù)傳遞方式的是GET方式,數(shù)據(jù)將被保存在系統(tǒng)環(huán)境變量的QUERY_STRING中,CGI程序中就可以通過(guò)調(diào)用函數(shù)getevn(“QUERY_STRING”)來(lái)或得到相應(yīng)的數(shù)據(jù)。如果客戶端瀏覽器的數(shù)據(jù)提交的方式采用的是POST方式,那么發(fā)送的數(shù)據(jù)就沒(méi)有結(jié)束標(biāo)識(shí),因此CGI程序就必須先要從系統(tǒng)對(duì)應(yīng)的環(huán)境變量CONTENT_LENGTH中獲取數(shù)據(jù)的長(zhǎng)度,然后再?gòu)南到y(tǒng)的標(biāo)準(zhǔn)輸入中讀取對(duì)應(yīng)該長(zhǎng)度的字符串,即可獲取到用戶所提交的數(shù)據(jù)信息。為了避免隱系統(tǒng)環(huán)境變量中CONTENT_LENGTH異常而引起CGI程序出現(xiàn)錯(cuò)誤,解決方法就是通過(guò)在CGI編程中采用判斷getevn函數(shù)返回值的辦法檢測(cè)信息是否具有合法性,函數(shù)的一般調(diào)用格式如下:if(getevn(CONTENT_LENGTH)!=NULL)length=atoi(getenv(CONTENT_LENGTH))第一次調(diào)用getevn()函數(shù)通過(guò)其返回值了判斷環(huán)境變量CONTENT_LENGTH是否存在,第二次的函數(shù)調(diào)用才是真正讀取該環(huán)境變量值。如果函數(shù)返回值為NULL說(shuō)明該環(huán)境變量不存在,CGI程序?qū)⒉粫?huì)讀取該環(huán)境變量值,避免了因調(diào)用出錯(cuò)而引發(fā)的程序段錯(cuò)誤。(2)提取并解析用戶數(shù)據(jù)如果客戶端瀏覽器是通過(guò)POST方式向服務(wù)器提交用戶表單數(shù)據(jù)的,那么表單數(shù)據(jù)一定是采用特定編碼格式進(jìn)行編碼的,這種編碼格式稱為URL編碼。其編碼格式的主要是對(duì)表單域的名字和其對(duì)應(yīng)值進(jìn)行轉(zhuǎn)義。即表單信息將按照在用戶表單中出現(xiàn)的先后順序,其中的空格將被替換為加號(hào);除字母或者數(shù)字的其他字符以十六進(jìn)制的ASCII碼形式表示,格式為%HH;換行符<br>標(biāo)簽被替換為%0D%0A;數(shù)據(jù)域中的變量名和其對(duì)應(yīng)值使用等號(hào)(=)符相對(duì)應(yīng)。變量名及其值是通過(guò)字符&分割的。當(dāng)用戶填寫(xiě)完表單,并點(diǎn)擊“提交”按鈕后,將向服務(wù)器提交HTTP請(qǐng)求,Content字段中所包含的信息就成為經(jīng)過(guò)URL編碼的編碼信息,其格式如下:namel=valuel&name2=value2&name3=value3&name4=value4&…name是表單中定義的INPUT、SELECT或TEXTAREA等HTML表單域?qū)?yīng)的變量名,value則是對(duì)應(yīng)表單域的用戶輸入或選擇值。因?yàn)槠錇榫幋a數(shù)據(jù)所以CGI程序在使用這些數(shù)據(jù)前,首先要對(duì)其進(jìn)行解碼操作。即把這些數(shù)據(jù)流分解為一組組的變量名和其對(duì)應(yīng)的值,并還原為用戶在瀏覽器網(wǎng)頁(yè)上的輸入形式[12],其流程如圖4.5所示。圖4.5URL解碼流程圖(3)向用戶返回結(jié)果CGI程序處理后的結(jié)果數(shù)據(jù),通過(guò)標(biāo)準(zhǔn)輸出傳給Web服務(wù)器。Web服務(wù)器根據(jù)頭信息的內(nèi)容,對(duì)CGI程序傳送過(guò)來(lái)的結(jié)果數(shù)據(jù)可用printf()、puts等標(biāo)準(zhǔn)I/O函數(shù)來(lái)產(chǎn)生HTML源碼,再通過(guò)HTTP封裝把執(zhí)行的結(jié)果返回給客戶端。4.4嵌入式SQLite數(shù)據(jù)庫(kù)4.4.1SQLite數(shù)據(jù)庫(kù)簡(jiǎn)介SQLite數(shù)據(jù)庫(kù)跟一般的關(guān)系數(shù)據(jù)庫(kù)具有很大的不同之處,它具有以下幾個(gè)特點(diǎn):(1)可以嵌入到應(yīng)用程序當(dāng)中,不需要配置可以直接使用;(2)不需要獨(dú)立的數(shù)據(jù)引擎,對(duì)數(shù)據(jù)庫(kù)的存取操作由應(yīng)用程序可以直接采用調(diào)用相應(yīng)的API實(shí)現(xiàn);(3)使用及其精簡(jiǎn)的代碼編寫(xiě)而成,只需要很少的內(nèi)存空間即可運(yùn)行。SQLite數(shù)據(jù)庫(kù)所具有的這些特點(diǎn),讓其較為適合在資源有限的嵌入式設(shè)備中運(yùn)行,其運(yùn)行速度更快,效果較為理想。SQLite是由D.RichardHip全部采用C語(yǔ)言開(kāi)發(fā)出的一個(gè)完全開(kāi)源的嵌入式數(shù)據(jù)庫(kù)系統(tǒng)。SQLite數(shù)據(jù)庫(kù)只與文件系統(tǒng)有關(guān),因此它對(duì)操作系統(tǒng)內(nèi)核上并無(wú)太大的限制,并且支持目前常用的計(jì)算機(jī)編程語(yǔ)言。SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)了SQL92的標(biāo)準(zhǔn),其中共包括表、索引、事務(wù)、視圖、觸發(fā)器和一系列用戶接口API等[13]。SQLite的主要特征如下:1、靈活性SQLite數(shù)據(jù)庫(kù)在使用前不需要任何的配置,程序編譯完成后就可以直接運(yùn)行。SQLite數(shù)據(jù)庫(kù)程序的打開(kāi)和關(guān)閉不需要?jiǎng)?chuàng)建新的單獨(dú)的進(jìn)程來(lái)運(yùn)行,涉及的用戶權(quán)限不需要由管理員記性專門(mén)的創(chuàng)建分配,在系統(tǒng)崩潰或掉電重啟后能夠自行恢復(fù)。2、精簡(jiǎn)性SQLite數(shù)據(jù)庫(kù)的規(guī)模非常小。而且由于其在磁盤(pán)上移動(dòng)的信息量很少,也大大的加快了數(shù)據(jù)訪問(wèn)速度。SQLite數(shù)據(jù)庫(kù)經(jīng)過(guò)精簡(jiǎn)編譯之后,在不減少其基本功能的前提下,整個(gè)運(yùn)行的靜態(tài)庫(kù)文件大小將小于225KB。如果在編譯時(shí)去掉不需要的功能函數(shù),則可以被縮減到17OKB以內(nèi)。3、無(wú)服務(wù)器目前其他的非嵌入式系統(tǒng)上的數(shù)據(jù)庫(kù)軟件都需要預(yù)先安裝一個(gè)數(shù)據(jù)庫(kù)引擎,并作為一個(gè)單獨(dú)的服務(wù)器進(jìn)程執(zhí)行。應(yīng)用程序要通過(guò)發(fā)送請(qǐng)求到該服務(wù)器的方式進(jìn)行數(shù)據(jù)庫(kù)查詢和其他操作,這需要通過(guò)采用進(jìn)程間通信的機(jī)制(如命名管道、共享內(nèi)存、信息鏈表等)的方式來(lái)實(shí)現(xiàn),這就額外的增加了系統(tǒng)開(kāi)銷。而對(duì)SQLite數(shù)據(jù)庫(kù)來(lái)說(shuō),其應(yīng)用程序如果要訪問(wèn)某些數(shù)據(jù),可以直接通過(guò)對(duì)磁盤(pán)上的數(shù)據(jù)庫(kù)文件進(jìn)行讀寫(xiě)操作來(lái)實(shí)現(xiàn)。4.4.2SQLite數(shù)據(jù)庫(kù)的接口(API)函數(shù)SQLite數(shù)據(jù)庫(kù)共定義了83個(gè)API接口函數(shù)和一些數(shù)據(jù)結(jié)構(gòu)的預(yù)定義。在對(duì)SQLite服務(wù)器的應(yīng)用中,最為簡(jiǎn)單的數(shù)據(jù)庫(kù)存取操作只需要通過(guò)四個(gè)函數(shù)就能夠?qū)崿F(xiàn),它們分別是:打開(kāi)數(shù)據(jù)庫(kù)函數(shù)sqlite3_open()、關(guān)閉數(shù)據(jù)庫(kù)函數(shù)sqlite3_close()和SQL語(yǔ)句執(zhí)行函數(shù)sqlite3_exec()以及查詢操作函數(shù)sqlite3_gettable()。(1)打開(kāi)數(shù)據(jù)庫(kù)intsqlite3_open(constchar*filename,intmode,sqlite3**p_sqlite)應(yīng)用程序統(tǒng)調(diào)用該函數(shù)可以實(shí)現(xiàn)打開(kāi)一個(gè)數(shù)據(jù)庫(kù)操作,如果該數(shù)據(jù)庫(kù)文件不存在將會(huì)以該文件名自動(dòng)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)文件。參數(shù)filename即為數(shù)據(jù)庫(kù)的文件名。參數(shù)mode指定了當(dāng)前數(shù)據(jù)庫(kù)的讀寫(xiě)模式,例如設(shè)置為0666表示為可讀寫(xiě),0444為只讀,0222為只寫(xiě)。參數(shù)sqlite3**p_sqlite是一個(gè)結(jié)構(gòu)體的指針,為打開(kāi)的數(shù)據(jù)庫(kù)句柄。(2)關(guān)閉數(shù)據(jù)庫(kù)intsqlite3_close(sqlite3*p_sqlite)應(yīng)用程序統(tǒng)調(diào)用該函數(shù),參數(shù)為所打開(kāi)數(shù)據(jù)庫(kù)時(shí)的句柄,關(guān)閉給數(shù)據(jù)庫(kù)。(3)執(zhí)行SQL語(yǔ)句intsqlite3_exec(sqlite3*p_sqlite,constchar**sql,sqlite3_callback,void*parg,char**errmsg)應(yīng)用程序統(tǒng)調(diào)用此函數(shù)可以實(shí)現(xiàn)執(zhí)行一條或者多條SQL語(yǔ)句的操作,每條SQL語(yǔ)句之間使用分號(hào)分隔開(kāi)。該函數(shù)在執(zhí)行SQL語(yǔ)句的時(shí)候可以通過(guò)指定參數(shù)sqlite3_callback為回調(diào)函數(shù),實(shí)現(xiàn)對(duì)SQL語(yǔ)句執(zhí)行返回值的處理。如果該函數(shù)的返回值為0,就表示所有的SQL語(yǔ)句都被成功執(zhí)行完畢。返回值為其他時(shí),則說(shuō)明SQL語(yǔ)句沒(méi)有被成功執(zhí)行,可以通過(guò)字符串指針errmsg查看錯(cuò)誤信息。(4)查詢數(shù)據(jù)intsqlite3_gettable(sqlite3*p_sqlite,constchar*sql,char***result,int*nrow,int*column,char**errmsg)這個(gè)函數(shù)被專門(mén)被用來(lái)對(duì)數(shù)據(jù)庫(kù)執(zhí)行查詢語(yǔ)句。result是一個(gè)二維數(shù)組,用于存放查詢所得的數(shù)據(jù)的結(jié)果。二維數(shù)組內(nèi)存放的內(nèi)容先是列名,然后是各項(xiàng)的數(shù)據(jù)值。而nrown和column分別被用來(lái)存儲(chǔ)執(zhí)行查詢語(yǔ)句的返回結(jié)果集的行數(shù)和列數(shù)。如果沒(méi)有查到結(jié)果,其值為0。4.4.3SQLite數(shù)據(jù)庫(kù)的移植SQLite數(shù)據(jù)庫(kù)的移植過(guò)程如下:1、下載源碼包登錄到/download.html上,下載其中源文件的文件名為sqlite3-3.7.17的源碼包。完成后將下載到的源碼解壓,要在生成的Sqlite目錄外新建出一個(gè)目錄,并命名為Sqlite3-arm-linux。2、修改makefile文件通過(guò)修改makefile文件讓SQLite數(shù)據(jù)庫(kù)能在嵌入式系統(tǒng)上正確運(yùn)行。首先把根目錄下的Makefile.Linux-gcc文件拷貝出一份并重命名為Makefile,然后修改Makefile文件中:TOP=./sqlite;TCC=arm-1inux-gcc-O6;AR=arm-11nux-arcr;RANLIB=arm-linux-ranlib;MKSHIB=arm-1inux-gee-shared。TLIBS=ldl。#TCL_FLAGS=-I/home/drh/tcltk/8.41inux#LIBTCL=/home/drh/tcltk/8.41inux/libte18.4g.a-lm-ldl3、修改main.mk文件在LIBOBJ選項(xiàng)中刪除tclsqlite3.o選項(xiàng)。在編譯生成數(shù)據(jù)庫(kù)候?qū)⒉粫?huì)編譯SQLite的Tcl語(yǔ)言綁定選項(xiàng)。4、編譯使用make命令工具執(zhí)行編譯完畢后,將會(huì)在/1ibs目錄下生成文件如下Sqlite3、libsqlite3.so.0.8.6和libsqlite3.a。將后兩個(gè)庫(kù)文件拷貝到嵌入式文件系統(tǒng)上的/lib和/usr/lib目錄下,Sqlite3文件拷貝到/bin目錄下,便可以正常運(yùn)行和使用SQLite數(shù)據(jù)庫(kù)。4.5本章小結(jié)本章主要介紹了嵌入式服務(wù)器的搭建過(guò)程,主要涉及到Boa服務(wù)器的移植、HTML網(wǎng)頁(yè)文檔的編寫(xiě)、交互程序CGI的設(shè)計(jì)和SQLite數(shù)據(jù)庫(kù)的移植。為后續(xù)的程序設(shè)計(jì)提供了整體的運(yùn)行和測(cè)試環(huán)境。
5上位機(jī)QtGui設(shè)計(jì)5.1Qt/Embedded簡(jiǎn)介GUI是圖形用戶接口,一般被用來(lái)設(shè)計(jì)PC機(jī)上人機(jī)交互界面。而對(duì)于嵌入式GUI來(lái)說(shuō),由于嵌入式設(shè)備對(duì)資源的嚴(yán)格要求,不同的嵌入式軟硬件環(huán)境就需要定制相應(yīng)的嵌入式系統(tǒng),那么對(duì)于GUI的要求也就會(huì)產(chǎn)生區(qū)別,因此嵌入式相關(guān)的GUI也必須要是可以進(jìn)行配置和定制的。由于嵌入式的硬件資源對(duì)系統(tǒng)和應(yīng)用程序限制,要求嵌入式GUI必須要具有輕量、高效、耗費(fèi)資源少、可靠等特點(diǎn)。由于本次設(shè)計(jì)采用的操作系統(tǒng)其源碼公開(kāi),有很好的移植性和裁剪性而且具有很高的靈活性的優(yōu)點(diǎn),因此在嵌入式行業(yè)的GUI開(kāi)發(fā)通常選擇在Linux下用GNU工具進(jìn)行開(kāi)發(fā)。Qt/Embedded下的Qt庫(kù)相關(guān)開(kāi)發(fā)商目前正在進(jìn)行的全面面向嵌入式系統(tǒng)的Qt版本。它是專門(mén)對(duì)去嵌入式系統(tǒng)設(shè)計(jì)圖形用戶界面而開(kāi)發(fā)的工具包,其中包括一個(gè)完整的窗口系統(tǒng)。其特點(diǎn)是可移植性好,設(shè)計(jì)者能夠輕易的向其中加入各種顯示模塊和硬件設(shè)備掃描模塊,許多的基于Qt的XWindow均可以通過(guò)簡(jiǎn)單的編譯移植到嵌入式系統(tǒng)上。Qt/Embedded還為開(kāi)發(fā)者提供了相當(dāng)豐富的API接口調(diào)用功能,并公開(kāi)了其源代碼。Qt/Embedded提供了豐富的窗口組件,還支持窗口部件的自定義,因此它可以向用戶提供一個(gè)簡(jiǎn)易并且優(yōu)異的圖形界面,同時(shí)其豐富的窗口對(duì)象的實(shí)現(xiàn)也增大了其軟件的體積,因此Qt/Embedded常用在對(duì)系統(tǒng)資源的要求不十分苛刻的環(huán)境中。圖5.1QtCreator的組成由于Qt的可移植性的特點(diǎn),本次設(shè)計(jì)采用PC下的Win系統(tǒng)開(kāi)發(fā),Linux系統(tǒng)編譯的交叉開(kāi)發(fā)方式。5.2Qt開(kāi)發(fā)環(huán)境的搭建首先安裝PC版的QtCreator,然后將下載好的QtEmbedded-4.7.0-arm.tar.gz拷貝到虛擬機(jī)中,執(zhí)行如下步驟:創(chuàng)建相應(yīng)目錄,并將文件解壓到該目錄,執(zhí)行#mkdir/usr/local/Trolltech#tarzxvfQtEmbedded-4.7.0-arm.tar.gz修改環(huán)境變量,執(zhí)行如下命令:#exportPATH=/usr/local/Trolltech/QtEmbedded-4.7.0-arm/bin:$PATH3、確認(rèn)安裝是否成功,執(zhí)行#whichqmake執(zhí)行完畢后,若打印相關(guān)信息則說(shuō)明安裝成功。4、配置開(kāi)發(fā)板Qt環(huán)境,拷貝/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib下的所有文件到y(tǒng)affs文件系統(tǒng)的對(duì)應(yīng)目錄下,#cp/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib \./rootfs/usr/local/Trolltech/QtEmbedded-4.7.0-arm/-R執(zhí)行成功后重新制作文件系統(tǒng)鏡像并燒至開(kāi)發(fā)板NAND中即可完成Qt應(yīng)用環(huán)境的搭建工作。5.3Qt程序設(shè)計(jì)本次設(shè)計(jì)的Qt程序流程圖如圖5.2所示:圖5.2程序流程圖1、Qt中生命一個(gè)QWidget類對(duì)象,并調(diào)用顯示函數(shù)show(),即可完成對(duì)屏幕的顯示初始化工作。2、在Linux系統(tǒng)中所有的設(shè)備均被鏈接為/dev目錄下的文件,因此對(duì)串口的操作就變?yōu)閷?duì)該文件的讀寫(xiě)操作,調(diào)用系統(tǒng)調(diào)用open()、write()、read()即可完成串口的今本操作。3、當(dāng)從串口中讀出數(shù)據(jù)后,調(diào)用數(shù)據(jù)口接口函數(shù)將內(nèi)容寫(xiě)入數(shù)據(jù)庫(kù),同事更新顯示設(shè)備。4、繼續(xù)掃描串口。5.4QtCreator設(shè)計(jì)簡(jiǎn)介5.4.1QtCreator開(kāi)發(fā)環(huán)境QtCreator是Qt的集成開(kāi)發(fā)環(huán)境(IDE),QtCreator包括項(xiàng)目生成向?qū)?、高?jí)的C++代碼編輯器、瀏覽文件及類的工具、集成了QtDesigner、QtAssistant、QtLinguist、圖形化的GDB調(diào)試前端,集成qmake構(gòu)建工具等,主要是為了幫助新
Qt
用戶更快速入門(mén)并運(yùn)行項(xiàng)目,并且以圖形界面的方式開(kāi)發(fā)Qt程序,極大的方便了程序開(kāi)發(fā)人員、提高了程序開(kāi)發(fā)的效率。QtCreator的Windows下軟件環(huán)境如圖5.3所示:圖5.3Qt可視化環(huán)境5.4.2QtCreator工程創(chuàng)建過(guò)程簡(jiǎn)介1、選擇文件->新建文件或工程,彈出如下圖所示對(duì)話框圖5.4創(chuàng)建Qt工程選擇默認(rèn)選項(xiàng),點(diǎn)擊choose,輸入工程名,點(diǎn)擊下一步彈出如下對(duì)話框圖5.5選擇對(duì)話框基類基類選擇QWidget,點(diǎn)擊下一步選擇結(jié)束,這樣就建立好了一個(gè)Gui模板。5.4.2工程文件分析ProjectN:工程文件,包含工程的配置信息,如下圖所示圖5.6工程配置文件源碼分析:Qt +=coregui,添加Qt窗口基本模塊TARGET=untitled,目標(biāo)文件名SOURCES+=main.cppwidget.cpp,源文件列表,包含工程涉及到的所有源文件HEADS+=widget.h,頭問(wèn)價(jià)列表,包含涉及到的所有頭文件FORMS+=widget.ui,designer設(shè)計(jì)器的Xml文件widget.ui:designer設(shè)計(jì)器文件,語(yǔ)法格式遵循Xml,designer如下圖所示圖5.7designer設(shè)計(jì)器widget.h:自定義窗口類的頭文件widget.cpp:自定義窗口類的實(shí)現(xiàn)文檔main.cpp:定義程序入口函數(shù),源碼如下圖5.8main.cpp源碼源碼分析:第一、二行:頭文件包含,QApplication內(nèi)主要聲明了Qt程序的控制流函數(shù)、widget.h為用戶自定義的窗口類頭文件。第四行:程序的入口函數(shù)第五行:創(chuàng)建一個(gè)QApplication對(duì)象并將用戶在控制臺(tái)輸入的參數(shù)傳遞給該應(yīng)用程序?qū)ο?。QApplication對(duì)象管理QtGui應(yīng)用程序的控制流程和主要的設(shè)置選項(xiàng)。使用Qt設(shè)計(jì)的任何Gui應(yīng)用程序,都必須包含一個(gè)QApplication對(duì)象。而對(duì)于非Gui的Qt應(yīng)用程序,可以不依賴于QtGui庫(kù)的QCoreApplication。第七行:創(chuàng)建一個(gè)自定義的Widget窗口類對(duì)象。第八行:顯示該窗口第十行:將程序的控制流權(quán)限交給QtApplication。這是一個(gè)Qt的Gui應(yīng)用程序的最小架構(gòu),幾乎所有的基于QtDesigner開(kāi)發(fā)的QtGui都是在此基礎(chǔ)上創(chuàng)建出來(lái)的。5.5本章小結(jié)本章主要做了Qt的簡(jiǎn)介,闡述了本次設(shè)計(jì)過(guò)程中Qt程序的設(shè)計(jì)流程,對(duì)以個(gè)基礎(chǔ)的Qt圖形化應(yīng)用程序源碼做了簡(jiǎn)單的分析
6功能測(cè)試6.1服務(wù)器測(cè)試1、將編寫(xiě)好的HTML(超文本文檔)拷貝至/var/www下,執(zhí)行如下命令:#cp*.html~/rootfs/var/www/2、進(jìn)入CGI程序目錄,編寫(xiě)makefile文檔,內(nèi)容格式如下:src+=name1.csrc+=name2.c...obj=$(src:%.c=%.cgi)CC=ar
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)體工商戶飯店財(cái)務(wù)制度
- 應(yīng)收應(yīng)付款財(cái)務(wù)制度
- 體育公司財(cái)務(wù)制度范本
- 農(nóng)民合同工制度
- 公司食堂報(bào)銷制度
- 小學(xué)春節(jié)活動(dòng)策劃方案(3篇)
- 珠促銷活動(dòng)策劃方案(3篇)
- 樓盤(pán)工人施工方案(3篇)
- 景區(qū)門(mén)票實(shí)名制管理制度
- 罕見(jiàn)腫瘤耐藥機(jī)制及應(yīng)對(duì)策略
- 【四年級(jí)】【數(shù)學(xué)】【秋季上】期末家長(zhǎng)會(huì):數(shù)海引航愛(ài)伴成長(zhǎng)【課件】
- DBJ50-T-078-2016重慶市城市道路工程施工質(zhì)量驗(yàn)收規(guī)范
- 湖北省十堰市城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末質(zhì)量檢測(cè)道德與法治試題 (含答案)
- 2025年中國(guó)船舶集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 辦公樓物業(yè)服務(wù)的品質(zhì)提升策略
- 養(yǎng)殖場(chǎng)土地租賃合同
- JBT 8200-2024 煤礦防爆特殊型電源裝置用鉛酸蓄電池(正式版)
- (正式版)SHT 3078-2024 立式圓筒形料倉(cāng)工程設(shè)計(jì)規(guī)范
- 計(jì)算機(jī)就業(yè)能力展示
- 設(shè)備維修團(tuán)隊(duì)的協(xié)作與溝通
- 華為三支柱運(yùn)作之HRBP實(shí)踐分享概要課件
評(píng)論
0/150
提交評(píng)論