嵌入式Linux編程入門與開發(fā)實例-嵌入式BOA服務(wù)器的構(gòu)建-課件_第1頁
嵌入式Linux編程入門與開發(fā)實例-嵌入式BOA服務(wù)器的構(gòu)建-課件_第2頁
嵌入式Linux編程入門與開發(fā)實例-嵌入式BOA服務(wù)器的構(gòu)建-課件_第3頁
嵌入式Linux編程入門與開發(fā)實例-嵌入式BOA服務(wù)器的構(gòu)建-課件_第4頁
嵌入式Linux編程入門與開發(fā)實例-嵌入式BOA服務(wù)器的構(gòu)建-課件_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第12章嵌入式BOA服務(wù)器的構(gòu)建

隨著Internet技術(shù)的興起,在嵌入式設(shè)備的管理與交互中,基于Web方式的應(yīng)用成為目前的主流,這種程序結(jié)構(gòu)也就是大家非常熟悉的C/S結(jié)構(gòu),即在嵌入式設(shè)備上運行一個支持腳本或CGI功能的Web服務(wù)器,能夠生成動態(tài)頁面,在用戶端只需要通過Web瀏覽器就可以對嵌入式設(shè)備進行管理和監(jiān)控,非常方便實用。本章主要介紹這種應(yīng)用的開發(fā)和移植工作。

1ppt課件第12章嵌入式BOA服務(wù)器的構(gòu)建概述

12.1嵌入式Linux系統(tǒng)移植12.2嵌入式Linux的BOA服務(wù)器移植

12.32ppt課件12.1概述

下面簡介下嵌入式web服務(wù)器。由于嵌入式設(shè)備資源一般都比較有限,并且也不需要能同時處理很多用戶的請求,因此不會使用Linux下最常用的如Apache等服務(wù)器,而需要使用一些專門為嵌入式設(shè)備設(shè)計的Web服務(wù)器,這些Web服務(wù)器在存貯空間和運行時所占有的內(nèi)存空間上都會非常適合于嵌入式應(yīng)用場合。常見的嵌入式Web服務(wù)器主要有:lighttpd、thttpd、shttpd和BOA等等。

3ppt課件1.lighttpd

lighttpd是一個德國人領(lǐng)導(dǎo)的開源軟件,其根本的目的是提供一個專門針對高性能網(wǎng)站,安全、快速、兼容性好并且靈活的webserver環(huán)境,具有非常低的內(nèi)存開銷,CPU占用率低,效能好,以及豐富的模塊等特點。

lighttpd是眾多OpenSource輕量級的webserver中較為優(yōu)秀的一個。支持FastCGI、CGI、Auth、輸出壓縮(outputcompress)、URL重寫、Alias等重要功能,而Apache之所以流行,很大程度也是因為功能豐富,在lighttpd

上很多功能都有相應(yīng)的實現(xiàn)了,這點對于apache的用戶是非常重要的,因為遷移到lighttpd就必須面對這些問題。4ppt課件2.thttpd

thttpd是一個非常小巧的輕量級webserver,它非常簡單,僅僅提供了HTTP/1.1和簡單的CGI支持,在其官方網(wǎng)站上有一個與其他webserver(如Apache,Zeus等)的對比圖+Benchmark可以參考。此外,thttpd

也類似于lighttpd,對于并發(fā)請求不使用fork()來派生子進程處理,而是采用多路復(fù)用(Multiplex)技術(shù)來實現(xiàn),因此效能很好。

thttpd支持多種平臺,如FreeBSD、SunOS、Solaris、BSD、Linux、OSF等。對于小型webserver而言,速度快似乎是一個代名詞,通過官方站提供的Benchmark,可以這樣認為:thttpd至少和主流的webserver一樣快,在高負載下更快,因為其資源占用小的緣故。

thttpd還有一個較為引人注目的特點:基于URL的文件流量限制,這對于下載的流量控制而言是非常方便的。像Apache就必須使用插件實現(xiàn),效率較thttpd低。5ppt課件3.shttpd

shttpd是另一個輕量級的webserver,具有比thttpd更豐富的功能特性,支持CGI、SSL、cookie、MD5認證,還能嵌入(embedded)到現(xiàn)有的軟件里,而且不需要配置文件。由于shttpd可以嵌入其他軟件,因此可以非常容易的開發(fā)嵌入式系統(tǒng)的webserver,官方網(wǎng)站上稱shttpd如果使用uclibc/dielibc(libc的簡化子集)則開銷將非常非常低。6ppt課件4.BOABOA是一個非常小巧的Web服務(wù)器,可執(zhí)行代碼只有約60KB。它是一個單任務(wù)Web服務(wù)器,只能依次完成用戶的請求,而不會fork出新的進程來處理并發(fā)連接請求。但BOA支持CGI,能夠為CGI程序fork出一個進程來執(zhí)行。BOA的設(shè)計目標是速度和安全,在其站點公布的性能測試中,BOA的性能要好于Apache服務(wù)器。7ppt課件12.2嵌入式Linux系統(tǒng)移植12.2.1開發(fā)環(huán)境的構(gòu)建12.2.2BootLoader分析移植12.2.3Linux內(nèi)核移植12.2.4構(gòu)建根文件系統(tǒng)8ppt課件

嵌入式應(yīng)用程序的開發(fā)流程不同于普通的PC機。相比于普通的PC機,嵌入式的硬件資源相當?shù)挠邢蓿豢赡苓M行本地的開發(fā)。因而,嵌入式的軟件開發(fā)和調(diào)試過程通常是在PC機上實現(xiàn)的。這樣就形成了一套在PC機上交叉編譯,然后生成目標機平臺的格式,最后在目標機上執(zhí)行的開發(fā)流程,也就是所謂的交叉編譯環(huán)境。本文使用的是DebianGNU/Linux的操作系統(tǒng)作為開發(fā)平臺。首先可以從http://獲取Debian最新的穩(wěn)定版。正確安裝好Debian以后,下一步就要建立一套跨平臺的交叉編譯工具鏈。

12.2.1開發(fā)環(huán)境的構(gòu)建9ppt課件制作一個支持softfloat的交叉編譯工具鏈:(1)解壓縮crosstool-0.43.tar.gz,把補丁文件glibc-2.3.6-version-info.h_err.patch復(fù)制到crosstool-0.43/patches/glibc-2.3.6/目錄下,它修改了glibc-2.3.6/csu/Makefile里面的一個小錯誤,導(dǎo)致生成的version-info.h文件編譯出錯。(2)修改demo-arm-softfloat.sh腳本,指定編譯過程中所需軟件包的存放路徑TARBALLS_DIR=$HOME/downloads,指定交叉編譯工具鏈的存放路徑RESULT_TOP=/usr/local/crosstool,需要事先創(chuàng)建好該路徑保證其具有可寫的權(quán)限。(3)修改arm-softfloat.dat文件,指定TARGET=arm-linux,保證編譯出來的工具是常用的名字。(4)修改all.sh腳本,指定安裝路徑為PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO}。(5)最后以普通用戶身份執(zhí)行./demo-arm-softfloat.sh,大約1~2個小時就編譯好了。此時將交叉編譯工具鏈加入PATH環(huán)境變量中就可以使用了。10ppt課件對于計算機系統(tǒng)來說,從開機上電到操作系統(tǒng)啟動需要一個引導(dǎo)過程。嵌入式Linux系統(tǒng)同樣離不開引導(dǎo)程序,這個引導(dǎo)程序就叫作BootLoader。BootLoader是在操作系統(tǒng)運行之前執(zhí)行的一段小程序。通過這段小程序可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做準備。BootLoader的實現(xiàn)非常依賴于具體的硬件。正因如此,幾乎不可能為所有的嵌入式系統(tǒng)建立一個通用的BootLoader。12.2.2BootLoader分析移植11ppt課件BootLoader主要分為兩種操作模式:啟動加載(Bootloading)模式:這種模式也稱為自主模式,即BootLoader從目標機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,BootLoader顯然必須工作在這種模式下。下載(Downloading)模式:在這種模式下,目標機上的BootLoader將通過串口連接或者網(wǎng)絡(luò)連接等通信手段從主機下載文件。從主機下載的文件通常首先被BootLoader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的Flash存儲設(shè)備中。12ppt課件12.2.3Linux內(nèi)核移植目錄名描述arch體系結(jié)構(gòu)相關(guān)的代碼,對于每個架構(gòu)的CPU,arch目錄下都有一個對應(yīng)的子目錄block塊設(shè)備的通用函數(shù)crypto常用的加密和散列算法,還有一些壓縮和CRC校驗算法drivers所有的設(shè)備驅(qū)動程序,里面每個子目錄對應(yīng)著一類驅(qū)動程序表12-1

Linux內(nèi)核子目錄結(jié)構(gòu)13ppt課件fsLinux支持的文件系統(tǒng)的代碼,每個子目錄對應(yīng)一種文件系統(tǒng)include內(nèi)核頭文件,包括基本頭文件、各種驅(qū)動或功能部件的頭文件以及各種體系結(jié)構(gòu)的頭文件init內(nèi)核的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼)ipc進程間通信的代碼kernel內(nèi)核管理的核心代碼lib內(nèi)核用到的一些庫函數(shù)代碼14ppt課件mm內(nèi)存管理代碼net網(wǎng)絡(luò)支持代碼,每個子目錄對應(yīng)網(wǎng)絡(luò)的一個方面security安全、密鑰相關(guān)的代碼sound音頻設(shè)備的驅(qū)動程序usr用來制作一個壓縮的cpio歸檔文件documentation內(nèi)核文檔scripts用于配置、編譯內(nèi)核的腳本文件15ppt課件內(nèi)核的源代碼可以從http://獲?。?.首先解壓縮內(nèi)核源代碼,修改頂層的Makefile文件ARCH?=armCROSS_COMPILE ?=arm-linux-這里需要指定目標平臺的體系結(jié)構(gòu)和交叉編譯工具鏈的路徑。2.修改linux-/arch/arm/mach-s3c2440/mach-smdk2440.c文件s3c24xx_init_clocks(16934400)修改為s3c24xx_init_clocks(12000000)指定開發(fā)板的晶振頻率為12MHz。16ppt課件3.修改linux-/arch/arm/plat-s3c24xx/common-smdk.c文件staticstruct

mtd_partition

smdk_default_nand_part[]={ [0]={ .name ="kernel",

.size =0x00200000,

.offset =0,

}, [1]={ .name ="rootfs",

.offset=MTDPART_OFS_APPEND,

.size =MTDPART_SIZ_FULL,

}};17ppt課件下一步,就是進行內(nèi)核的配置了。這里可以參考S3C2410的開發(fā)板來進行配置和調(diào)整,內(nèi)核自帶了S3C2410開發(fā)板的配置文件。在內(nèi)核源代碼根目錄下,執(zhí)行makes3c2410_defconfig,生成一個基于S3C2410的開發(fā)板的默認配置文件。然后再執(zhí)行makemenuconfig會生成一個基于S3C2410開發(fā)板的內(nèi)核配置菜單。這里需要保留S3C2410/S3C2440CPU的相關(guān)配置選項、TCP/IP協(xié)議、NANDFlash驅(qū)動、USB驅(qū)動以及適合的文件系統(tǒng)類型。18ppt課件本文中采用的是JFFS2的文件系統(tǒng)類型。內(nèi)核默認已經(jīng)對JFFS2有著非常良好的支持,只需要在配置內(nèi)核的時候加入相應(yīng)的配置選項就可以了。JFFS2文件系統(tǒng)配置如下:Filesystems> Miscellaneousfilesystems> <*>JournallingFlashFileSystemv2(JFFS2)support (0)JFFS2debuggingverbosity(0=quiet,2=noisy)(NEW) [*]JFFS2write-bufferingsupport(NEW) []VerifyJFFS2write-bufferreads(NEW) []JFFS2summarysupport(EXPERIMENTAL)(NEW) []JFFS2XATTRsupport(EXPERIMENTAL)(NEW) []AdvancedcompressionoptionsforJFFS2(NEW)19ppt課件

Linux遵守文件系統(tǒng)科學分類標準(FilesystemHierarchyStandard,F(xiàn)HS),一個定義許多文件和目錄的名字和位置的標準,該標準可以在http:///fhs中找到。FHS也是用來組織Linux和Unix文件的方法,它使得Linux文件系統(tǒng)布局實現(xiàn)了標準化。12.2.4構(gòu)建根文件系統(tǒng)20ppt課件構(gòu)建Linux根文件系統(tǒng),就是按照FHS標準,創(chuàng)建各種目錄、工具和配置文件。這里首先通過Busybox來創(chuàng)建可執(zhí)行文件。

Busybox最初是由BrucePerens在1996年為DebianGNU/Linux安裝盤編寫的。其目標是在一張軟盤上創(chuàng)建一個可引導(dǎo)的GNU/Linux系統(tǒng),這可以用作安裝盤和急救盤。一張軟盤可以保存大約1.4~1.7MB的內(nèi)容,因此這里沒有多少空間留給Linux內(nèi)核以及相關(guān)的用戶應(yīng)用程序使用。21ppt課件1、首先解壓縮源代碼,修改頂層Makefile2、執(zhí)行makemenuconfig生成一個配置菜單。這里,只需選擇默認配置就可以了。3、最后執(zhí)行make進行編譯,執(zhí)行makeinstall進行安裝。這樣會在當前目錄下生成一個_install目錄。

22ppt課件可執(zhí)行文件創(chuàng)建好以后,接下來需要建立lib目錄,并且復(fù)制所需要的共享庫??梢酝ㄟ^arm-linux-readelf-abusybox|grep‘Shared’命令來查看Busybox調(diào)用了哪些共享庫,然后將其中對應(yīng)的共享庫復(fù)制到lib目錄中就可以了。下面根據(jù)FHS標準,構(gòu)建etc配置目錄。1.創(chuàng)建inittab文件#Systeminitialization.::sysinit:/etc/init.d/rcS::ctrlaltdel:/sbin/reboot::shutdown:/sbin/swapoff-a::shutdown:/bin/umount-a::restart:/sbin/init::askfirst:-/bin/sh23ppt課件2.創(chuàng)建init.d/rcS文件#!/bin/shPATH=/bin:/sbin:/usr/bin:/usr/sbinexportPATHumask022/bin/mount-a/bin/mount-ttmpfs

mdev/dev/bin/mkdir/dev/pts/bin/mount-tdevpts

devpts/dev/pts24ppt課件/bin/mount-tsysfs

sysfs/sysecho/sbin/mdev>/proc/sys/kernel/hotplug/sbin/mdev-s/bin/mount-tramfsramfs/var/bin/mkdir-p/var/run/bin/mkdir-p/var/log/bin/hostnamehrbeu06ws/sbin/syslogd25ppt課件3.創(chuàng)建fstab文件#device mount-point type options dump fsckorderproc /proc proc defaults 0 0tmpfs /tmp

tmpfs defaults 0 0tmpfs /dev tmpfs defaults 0 026ppt課件4.建立dev目錄下必備的設(shè)備節(jié)點sudo

mknodconsolec51sudo

mknodnullc135.創(chuàng)建passwd文件root:*:0:0:root:/root:/bin/sh27ppt課件6.創(chuàng)建shadow文件root:$1$5qCxLMsr$jJgsPqDW8ZJOS8LE4c5n50:0:0:99999:7::1:7.創(chuàng)建group文件root::0:28ppt課件8.創(chuàng)建profile文件#/etc/profile:system-wide.profilefilefortheBourneshellif["$PS1"];thenif["$(id-u)"-eq0];then PS1='\u@\h:\w\#'

else PS1='\u@\h:\w\$'fifiHOME=/rootexportHOME29ppt課件9.創(chuàng)建resolv.conf文件nameserver10.復(fù)制主機的inetd.conf、protocols、mime.types和services文件,其中定義了常見的網(wǎng)絡(luò)服務(wù)的端口和協(xié)議。11.最后,創(chuàng)建一些必要的空目錄mkdirmntprocrootsystmpvar30ppt課件12.3嵌入式Linux的BOA服務(wù)器移植12.3.1CGI簡介12.3.2BOA服務(wù)器12.3.3CGIC庫的移植12.3.4HTML模板的制作12.3.5CGI程序的開發(fā)31ppt課件

目前Web技術(shù)中生成動態(tài)Web頁面的方法有CGI和服務(wù)器腳本,如JSP、ASP等,但后者需要Web服務(wù)器具有這些腳本的運行支持模塊。在嵌入式Web服務(wù)器中,考慮到資源限制問題,一般都只提供CGI支持,因此在嵌入式設(shè)備中Web方式應(yīng)用實際上就是基于CGI的程序開發(fā)。12.3.1CGI簡介32ppt課件CGI(CommonGateIntergace)是一段運行在Web服務(wù)器上的程序,提供同客戶端Html頁面的接口。例如,常見的個人主頁上大都有一個留言本,留言本的工作方式是先由用戶輸入一些信息,如名字之類的東西,接著用戶按一下“留言”(到目前為止工作都在客戶端),瀏覽器就把這些信息傳送到服務(wù)器的CGI程序中,于是CGI程序在服務(wù)器上按照預(yù)定的方法進行處理,在本例中就是把用戶提交的信息存入指定的文件中,最后CGI程序給客戶端發(fā)回一個“留言結(jié)束”字樣的頁面,用戶可以在瀏覽器里看到。33ppt課件

BOA服務(wù)器對CGI的表現(xiàn)非常的出色,其應(yīng)用十分廣泛。BOA的源代碼可以從http://www.BOA.org下載。本文使用的是BOA-0.94.14rc21.tar.gz。首先解壓縮源代碼tarxvfBOA-0.94.14rc21.tar.gz。查看其中的目錄結(jié)構(gòu),包括src、docs、examples、debian等等。這里src是BOA的源代碼目錄,其中包含了編譯過程中所需要的一些文件。進入src目錄以后,目錄下有一個configure腳本文件,其檢測本機的開發(fā)環(huán)境用來生成Makefile文件。12.3.2BOA服務(wù)器34ppt課件通過執(zhí)行./configure–h來查看一些常用的幫助選項:其中比較主要的有:--prefix,指定了安裝時的路徑。--host指定了生成的平臺類型。CC指定了編譯器的類型等等。這里,首先通過configure生成一個Makefile文件,如下:./configure–host=arm-linuxCC=arm-linux-gcc。接下來,查看生成的Makefile文件,修改其中的CC=arm-linux-gcc,CPP=arm-linux-g++等。下一步,只需要執(zhí)行make命令就可以調(diào)用Makefile來生成所需要的BOA。這里,可以去除BOA的調(diào)試信息,以減小它的體積,輸入arm-linux-stripBOA就可以了。接著把生成的BOA復(fù)制到nfs共享目錄中,啟動主機的nfs服務(wù),啟動開發(fā)板,設(shè)置內(nèi)核自動掛載nfs網(wǎng)絡(luò)文件系統(tǒng)。啟動開發(fā)板以后,在終端下輸入BOA,還需要建立一個BOA的配置文件。35ppt課件在BOA源碼目錄下已有一個示例BOA.conf,可以在其基礎(chǔ)上進行修改,下面解釋一下該文件的含義:監(jiān)聽的端口號,缺省都是80,一般無需修改:Port80bind調(diào)用的IP地址,一般注釋掉,表明綁定到INADDR_ANY,通配于服務(wù)器的所有IP地址:#Listen36ppt課件作為哪個用戶運行,即它擁有該用戶的權(quán)限,一般都是nobody,需要/etc/passwd中有#nobody用戶:Usernobody作為哪個用戶組運行,即它擁有該用戶組的權(quán)限,一般都是nogroup,需要在/etc/group文件中有nogroup組:Groupnogroup當服務(wù)器發(fā)生問題時發(fā)送報警的email地址,目前未用,注釋掉:ServerAdmin

root@localhost

37ppt課件錯誤日志文件,如果沒有以/開始,則表示從服務(wù)器的根路徑開始,如果不需要錯誤日志,則用#/dev/null。在下面設(shè)置時,注意一定要建立/var/log/BOA目錄:ErrorLog/var/log/BOA/error_log訪問日志文件,如果沒有以/開始,則表示從服務(wù)器的根路徑開始,如果不需要錯誤日志,則用#/dev/null或直接注釋掉。在下面設(shè)置時,注意一定要建立/var/log/BOA目錄:#AccessLog/var/log/BOA/access_log38ppt課件是否使用本地時間。如果沒有注釋掉,則使用本地時間。注釋掉則使用UTC時間:#UseLocaltime是否記錄CGI運行信息,如果沒有注釋掉,則記錄,注釋掉則不記錄:#VerboseCGILogs服務(wù)器名字:ServerName

39ppt課件是否啟動虛擬主機功能,即設(shè)備可以有多個網(wǎng)絡(luò)接口,每個接口都可以擁有一個虛擬的Web服務(wù)器。一般注釋掉,即不需要啟動:#VirtualHostHTML文檔的主目錄,如果沒有以/開始,則表示從服務(wù)器的根路徑開始:DocumentRoot/var/www如果收到一個用戶請求的話,在用戶主目錄后再增加的目錄名:UserDir

public_html40ppt課件HTML目錄索引的文件名,也是沒有用戶只指明訪問目錄時返回的文件名:DirectoryIndex

index.html當HTML目錄沒有索引文件時,用戶只指明訪問目錄時,BOA會調(diào)用該程序生成索引文件然后返回給用戶,因為該過程比較慢最好不執(zhí)行,可以注釋掉或者給每個HTML目錄加上DirectoryIndex指明的文件:#DirectoryMaker/usr/lib/BOA/BOA_indexer41ppt課件如果DirectoryIndex不存在,并且DirectoryMaker被注釋,那么就用BOA自帶的索引生成程序來生成目錄的索引文件并輸出到下面目錄,該目錄必須是BOA能讀寫:#DirectoryCache/var/spool/BOA/dircache一個連接所允許的HTTP持續(xù)作用請求最大數(shù)目,注釋或設(shè)為0都將關(guān)閉HTTP持續(xù)作用KeepAliveMax100042ppt課件HTTP持續(xù)作用中服務(wù)器在兩次請求之間等待的時間數(shù),以秒為單位,超時將關(guān)閉連接:KeepAliveTimeout10指明mime.types文件位置。如果沒有以/開始,則表示從服務(wù)器的根路徑開始??梢宰⑨尩?,避免使用mime.types文件,此時需要用AddType在本文件里指明:MimeTypes/etc/mime.types

43ppt課件文件擴展名沒有或未知的話,使用的缺省MIME類型:DefaultTypetext/plain提供CGI程序的PATH環(huán)境變量值:CGIPath/bin:/usr/bin:/usr/local/bin將文件擴展名和MIME類型關(guān)聯(lián)起來,和mime.types文件作用一樣。如果用mime.types,文件,則注釋掉,如果不使用mime.types文件,則必須使用:#AddType

application/x-httpd-cgi

cgi44ppt課件指明文檔重定向路徑:#Redirect/barhttp://elsewhere/feh/bar為路徑加上別名:Alias/doc/usr/doc指明CGI腳本的虛擬路徑對應(yīng)的實際路徑。一般所有的CGI腳本都要放在實際路徑里,用戶訪問執(zhí)行時輸入站點+虛擬路徑+CGI腳本名:ScriptAlias/cgi-bin//var/www/cgi-bin/45ppt課件用戶可以根據(jù)自己需要,對BOA.conf進行修改,但必須要保證其他的輔助文件和設(shè)置必須和BOA.conf里的配置相符,不然BOA就不能正常工作。在上面的例子中,還需要創(chuàng)建日志文件所在目錄/var/log/BOA,創(chuàng)建HTML文檔的主目錄/var/www,將mime.types文件拷貝到/etc目錄,創(chuàng)建CGI腳本所在目錄/var/www/cgi-bin/。mime.types文件用來指明不同文件擴展名對應(yīng)的MIME類型,一般可以直接從Linux主機上拷貝一個,大部分也都是在主機的/etc目錄下。46ppt課件還要修改一下BOA的啟動腳本,以方便控制BOA的運行。修改debian目錄下BOA.init文件#!/bin/sh## WrittenbyMiquelvanSmoorenburg<miquels@cistron.nl>.# ModifiedforDebianGNU/Linux# byIanMurdock<imurdock@>.#ModifiedforBOAbyBillAllombert<ballombe@>.###BEGININITINFO#Provides:BOA#Required-Start:$local_fs$remote_fs$network#Required-Stop:$local_fs$remote_fs$network47ppt課件#Default-Start:2345#Default-Stop:016#Short-Description:BOA:lightweightandhighperformancewebserver###ENDINITINFOPATH=/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/sbin/BOANAME=BOADESC="HTTPserver"test-x$DAEMON||exit0set-ecase"$1"instart)48ppt課件 echo-n"Starting$DESC:$NAME" start-stop-daemon--start--quiet--exec$DAEMON echo"." ;;stop) echo-n"Stopping$DESC:$NAME" start-stop-daemon--stop--quiet--oknodo--exec$DAEMON echo"." ;;restart) echo-n"Restarting$DESC:$NAME..." start-stop-daemon--stop--signalHUP--quiet--oknodo--exec$DAEMON echo"done.";;

49ppt課件reload) # # Ifthedaemoncanreloaditsconfigfilesonthefly # forexamplebysendingitSIGHUP,doithere. # # Ifthedaemonrespondstochangesinitsconfigfile # directlyanyway,makethisado-nothingentry. # echo-n"Reloading$DESCconfiguration..." start-stop-daemon--stop--signal1--quiet--oknodo--exec$DAEMON echo"done.";;*)

50ppt課件N=/etc/rc.d/init.d/$NAME #echo"Usage:$N{start|stop|restart|reload|force-reload}">&2 echo"Usage:$N{start|stop|restart|reload}">&2 exit1 ;;esacexit051ppt課件第三步就是測試BOA能否正常工作,靜態(tài)HTML頁面能否正常訪問,CGI腳本能否正常運行,一般采用NFS方式來進行測試工作,可以將嵌入式目標系統(tǒng)上的/etc目錄拷貝到主機的NFS共享目錄下,然后將NFS共享目錄下的etc目錄重新NFSmount為目標系統(tǒng)上的/etc目錄。這樣就可以在主機上對etc目錄下的各種配置文件進行修改而立刻在目標系統(tǒng)上生效。52ppt課件接下來進行CGI腳本的測試,需要一個測試用的CGI腳本??梢詫憘€最簡單的HelloWorld程序,示例代碼如下:#includevoidmain(){printf("Content-type:text/html\n\n");printf("\n");printf("\n");printf("\n");printf("Hello,world.\n");printf("\n");printf("\n");exit(0);}53ppt課件然后進行交叉編譯,將得到的helloworld.cgi拷貝到主機的/nfs/www/cgi-bin目錄下。#arm-linux-gcc-ohelloworld.cgi

helloworld.c#cphelloworld.cgi/nfs/www/cgi-bin在瀏覽器地址欄輸入/cgi-bin/helloworld.cgi,可以看到相關(guān)頁面,表示CGI腳本測試通過。54ppt課件在進行CGI編程之前,先了解HTML的一些知識。CGI可以使用多種編程語言來實現(xiàn),包括C、C++、Perl等,但在嵌入式設(shè)備的開發(fā)中,一般都不會采用Perl等解釋性語言,因為這種語言還需要有解釋執(zhí)行的支撐模塊,會占用存貯空間和內(nèi)存,最常用的方法當然是用C來編寫,但C并不是很適合開發(fā)象CGI這種需要大量進行字符串操作的程序,編程比較煩瑣,因此,對于一個專業(yè)的開發(fā)人員來說,首先想到的應(yīng)該是有沒有可復(fù)用的庫來支持快速高效的開發(fā)CGI程序。幸運的是目前就有不少開放源碼的支持CGI開發(fā)的C庫。在此只介紹CGIC,有興趣的讀者可以自己在Internet上搜索其他的C庫。12.3.3CGIC庫的移植55ppt課件CGIC是一個支持CGI開發(fā)的開放源碼的標準C庫,可以免費使用,只需要在開發(fā)的站點和程序文檔中有個公開聲明即可,表明程序使用了CGIC庫,用戶也可以購買商業(yè)授權(quán)而無需公開聲明。CGIC能夠提供以下功能:1.分析數(shù)據(jù),并自動校正一些有缺陷的瀏覽器發(fā)來的數(shù)據(jù);2.透明接收用GET或POST方法發(fā)來的From數(shù)據(jù);3.能接受上傳文件;4.能夠設(shè)置和接收cookies;5.用一致的方式處理From元素里的回車;6.提供字符串、整數(shù)、浮點數(shù)、單選或多選功能來接收數(shù)據(jù);7.提供數(shù)字字段的邊界檢查;8.能夠?qū)GI環(huán)境變量轉(zhuǎn)化成C中的非空字符串;9.提供CGI程序的調(diào)試手段,能夠回放CGI程序執(zhí)行時的CGI狀態(tài);56ppt課件下載后,解壓到“/opt/EmbedSky/””目錄下,會生成目錄cgic205:#tarxvfzcgic205.tar.gz配置編譯條件,進入cgic205目錄,修改Makefile文件。下面是修改后的文件內(nèi)容:CFLAGS=-g-WallCC=arm-linux-gcc//原來是CC=gccAR=arm-linux-ar//原來是AR=arRANLIB=arm-linux-ranlib//原來是RANLIB=ranlibLIBS=-L./-lcgicall:libcgic.a

cgictest.cgicaptureinstall:libcgic.acplibcgic.a/usr/local/libcpcgic.h/usr/local/include57ppt課件@echolibcgic.aisin/usr/local/lib.cgic.hisin/usr/local/include.libcgic.a:cgic.o

cgic.h

rm-flibcgic.a

$(AR)rc

libcgic.a

cgic.o$(RANLIB)libcgic.a

#mingw32andcygwinusers:replace.cgiwith.execgictest.cgi:cgictest.o

libcgic.a

$(CC)$(CFLAGS)cgictest.o-ocgictest.cgi${LIBS}//由gcc改成了:$(CC)$(CFLAGS)capture:capture.o

libcgic.a

$(CC)$(CFLAGS)capture.o-ocapture${LIBS}//由gcc改成了:$(CC)$(CFLAGS)clean:rm-f*.o*.acgictest.cgicapture58ppt課件修改后保存退出,下面編譯并優(yōu)化。編譯,會在目錄下生成capture的可執(zhí)行文件和測試用的cgictest.cgi

文件:#make優(yōu)化:#arm-linux-stripcapture會把capture由原來的100K左右變成現(xiàn)在的29K左右。59ppt課件 Web方式的應(yīng)用開發(fā)一般都會將界面和程序邏輯脫離開來,允許在一定程度下更改界面,如改變界面文本的屬性,建立多語言版本等,而無需改動程序邏輯。界面一般由美工來進行制作,而程序員負責具體功能的實現(xiàn)。在HTML中,表單(FORM)是最主要的傳遞信息的手段,它適用于任何瀏覽器。表單中有很多元素,包括輸入文本框、單選框、多選框、按鈕等等,可以提供信息的交互。具體對象說明和語法請參見其他HTML書籍,在這里不作介紹。根據(jù)應(yīng)用需求,美工或其他設(shè)計人員將最后的Web頁面設(shè)計出來,作為程序員進行開發(fā)的模板。12.3.4HTML模板的制作60ppt課件HTML模板還需要關(guān)注的是輸入的檢查。根據(jù)輸入檢查越早越好的原則,需要在用戶界面上就對用戶提交的數(shù)據(jù)進行檢查。目前一般是采用javascript腳本的方式。當用戶提交數(shù)據(jù)時,表單對象的onSubmit

方法就會被調(diào)用,在該方法里就可以對用戶的輸入進行檢查。常用的檢查有是否必需、最大/小長度、是否字符、是否數(shù)字、email地址、IP地址是否正確、是否匹配一個正則表達式等。61ppt課件CGI程序一般邏輯為:1.安全性檢查,是否允許運行腳本;2.處理用戶提交的數(shù)據(jù),根據(jù)元素名字/值中的元素名字來區(qū)分數(shù)據(jù),然后根據(jù)應(yīng)用需求進行數(shù)據(jù)處理;3.將處理結(jié)果填充表單,根據(jù)注釋標記將對應(yīng)的數(shù)據(jù)填充到HTML文本中去,生成最后的頁面返回給瀏覽器。12.3.5CGI程序的開發(fā)62ppt課件下面介紹幾個有關(guān)CGI的源碼:/*此程序可以測試web服務(wù)上傳的字符串信息*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>voidmain()/*LINUX下必須返回值類型為int,并且相應(yīng)的返回處應(yīng)該添加上相*/{

if(getenv("CONTENT-LENGTH")){char*s=getenv("CONTENT-LENGTH");

printf(s);}

printf("Contenttype:text/html\n\n");63ppt課件

printf("<html>\n");

printf("<head><title>這是測試POST方法</title></head>\n");

printf("<body><br>\n");

printf("<h2>這是測試POST方法</h2>\n");

printf(s);

printf("<hr><p>\n");

printf("<a><b>Gobacktooutput.htmlpage</b></a>\n");

printf("</body>\n");

printf("</html>\n");

fflush(stdout);}/*converthexstringtoint*//*主要轉(zhuǎn)換漢字編碼的格式*/int

htoi(char*s){64ppt課件char*digits="0123456789ABCDEF";if(islower(s[0]))s[0]=toupper(s[0]);if(islower(s[1]))s[1]=toupper(s[1]);return16*(strchr(digits,s[0])-strchr(digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0'));}voidmain(){

printf("Contenttype:text/plain\n\n");

printf("<html>\n");

printf("<head><title>這是測試POST方法</title></head>\n");

printf("<bodybgcolor=#008080text=#FFFFFF><br>\n");printf("<palign=center><imgborder=0src=http::8080/winter.gifwidth=750height=120></p>");

printf("<palign=center><imgborder=0src=/winter.gifwidth=70065ppt課件height=120></p>");

printf("<hrnoshadecolor=#FF0000>");

printf("<h2>這是測試POST方法</h2>\n");

printf("<hrnoshadecolor=#FF0000>");/************************************************************************//*取出的數(shù)值在nValue中*/

inti,n;charc;intnSum=1;/*總共幾個變量*/charnStr[1000];/*存放整個上傳的數(shù)據(jù)串,最多1000個*/memset(nStr,0,1000);/*將10個變量清零*/charnCurrentValue[200];/*當前取出的值*/charnValueName[10][50];/*變量名稱*/memset(nValueName,0,500);/*將10個變量名稱清零*/66ppt課件charnValue[10][100];/*最多10個變量,每個變量最大100個字符*/memset(nValue,0,1000);/*將10個變量清零*/intnIndex=0;/*當前變量索引*/intnPosion=0;/*當前操作的變量的第幾個字符*/intiseq=0;/*每個變量開始標志*/n=0;if(getenv("CONTENT_LENGTH")==NULL){return;/*web服務(wù)器環(huán)境不存在*/CONTENT_LENGTH環(huán)境變量

}n=atoi(getenv("CONTENT_LENGTH"));/*將所有字符串長度變成整型值*/printf("數(shù)據(jù)長度%d<br>",n);67ppt課件for(i=0;i<n;i++){c=getchar();/*從標準輸入取一個字符*/

nStr[i]=c;/*下面主要是對URL編碼的解碼*/switch(c){case'&':

nSum+=1;/*變量總數(shù)*/

nIndex+=1;/*變量索引號*/nPosion=0;/*字符位置清零*/

c='';

iseq=0;/*清除變量開始標志*/break;case'+':/*空格變換*/68ppt課件c='';

if(iseq==1){

nValue[nIndex][nPosion]='';

nPosion++;}break;case'%':/*非數(shù)字和字母,例如漢字編碼轉(zhuǎn)換*/{chars[3];s[0]=getchar();s[1]=getchar();s[2]=0;c=htoi(s);i+=2;

if(iseq==1)69ppt課件{

nValue[nIndex][nPosion]=c;

nPosion++;}}break;case'=':/*變量開始*/c='=';

iseq=1;

nPosion=0;/*當前操作的變量的第1個字符*/break;default:/*其它字符*/{

if(iseq){

nValue[nIndex][nPosion]=c;70ppt課件

nPosion++;}}break;}

putchar(c);

fflush(stdout);}/***********************************************************************/

nStr[n]='\n';

printf("<br>");

printf("變量個數(shù)=%d",nSum);

printf("<br>");

printf("nIndex

數(shù)=%d",nIndex);

printf("<br>");71ppt課件

printf("nPosion

數(shù)=%d",nPosion);

printf("<br>");

for(i=0;i<nSum;i++){

printf("第%d個上傳的值:%s",i+1,&nValue[i][0]);

printf("<br>");}

printf(nStr);/*顯示整個POST上傳的字符串*/

printf("<hrnoshadecolor=#0000FF>");/***********************************************************************/

printf("<br>");

printf("調(diào)用該CGI程序的網(wǎng)頁的URL:%s",getenv("HTTP_REFERER"));

printf("<br>");

printf("調(diào)用該CGI程序的Web瀏覽器的機器名和域名:72ppt課件%s",getenv("REMOTE_HOST"));

printf("<br>");

printf("IP

地址和主機名:%s",getenv("REMOTE_ADDR"));

printf("<br>");

printf("服務(wù)器的IP或名字:%s",getenv("SERVER_NAME"));

printf("<br>");

printf("主機的端口號:%s",getenv("SERVER_PORT"));printf("<br>");

printf("服務(wù)器軟件的名字:%s",getenv("SERVER_SOFTWARE"));

printf("<br>");

printf("用戶和組名:%s",getenv("REMOTE_USER"));

printf("<br>");

printf("Web

服務(wù)器傳遞數(shù)據(jù)給CGI程序時所采用的方法%s",getenv("REQUEST_METHOD"));

printf("<br>");73ppt課件

printf("發(fā)送給服務(wù)器的完整URL請求:%s",getenv("REQUEST_LINE"));

printf("<br>");

printf("該CGI程序的名稱:%s",getenv("SCRIPT_NAME"));

printf("<br>");

printf("QUERY-STRING:%s",getenv("QUERY_STRING"));

printf("<br>");/**********************************************************************/

printf("<hrnoshadecolor=#00FF00>");

printf("<a><b>數(shù)據(jù)上傳測試!</b></a>\n");

printf("</body>\n");

printf("</html>\n");

fflush(stdout);}voidGetOnePostChar()74ppt課件{}首頁源碼<html><head><metahttp-equiv="Content-Language"content="zh-cn"><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"><title>CGI數(shù)據(jù)上傳測試</title></head><bodybackground="bg.jpg"style="background-attachment:fixed"><palign="center"><imgborder="0"src="water.gif"width=95%height="120"></p><hrnoshadecolor="#FF0000"><formmethod="POST"action="cgi/CGITEST.CGI"name="form"><tableborder="4"width="100%"id="tab

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論