四種嵌入式web服務(wù)器介紹.ppt_第1頁
四種嵌入式web服務(wù)器介紹.ppt_第2頁
四種嵌入式web服務(wù)器介紹.ppt_第3頁
四種嵌入式web服務(wù)器介紹.ppt_第4頁
四種嵌入式web服務(wù)器介紹.ppt_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第12章 嵌入式BOA服務(wù)器的構(gòu)建,隨著Internet技術(shù)的興起,在嵌入式設(shè)備的管理與交互中,基于Web方式的應(yīng)用成為目前的主流,這種程序結(jié)構(gòu)也就是大家非常熟悉的C/S結(jié)構(gòu),即在嵌入式設(shè)備上運(yùn)行一個支持腳本或CGI功能的Web服務(wù)器,能夠生成動態(tài)頁面,在用戶端只需要通過Web瀏覽器就可以對嵌入式設(shè)備進(jìn)行管理和監(jiān)控,非常方便實用。本章主要介紹這種應(yīng)用的開發(fā)和移植工作。,第12章 嵌入式BOA服務(wù)器的構(gòu)建,12.1 概述,下面簡介下嵌入式web服務(wù)器。由于嵌入式設(shè)備資源一般都比較有限,并且也不需要能同時處理很多用戶的請求,因此不會使用Linux下最常用的如Apache等服務(wù)器,而需要使用一些專門為嵌入式設(shè)備設(shè)計的Web服務(wù)器,這些Web服務(wù)器在存貯空間和運(yùn)行時所占有的內(nèi)存空間上都會非常適合于嵌入式應(yīng)用場合。常見的嵌入式Web服務(wù)器主要有:lighttpd、thttpd、shttpd和BOA等等。,1.lighttpd lighttpd是一個德國人領(lǐng)導(dǎo)的開源軟件,其根本的目的是提供一個專門針對高性能網(wǎng)站,安全、快速、兼容性好并且靈活的web server環(huán)境,具有非常低的內(nèi)存開銷,CPU占用率低,效能好,以及豐富的模塊等特點(diǎn)。 lighttpd是眾多OpenSource輕量級的web server中較為優(yōu)秀的一個。支持FastCGI、CGI、 Auth、輸出壓縮 (output compress)、URL重寫、Alias等重要功能,而Apache之所以流行,很大程度也是因為功能豐富,在lighttpd 上很多功能都有相應(yīng)的實現(xiàn)了,這點(diǎn)對于apache的用戶是非常重要的, 因為遷移到lighttpd就必須面對這些問題。,2.thttpd thttpd是一個非常小巧的輕量級web server,它非常簡單,僅僅提供了HTTP/1.1和簡單的CGI支持,在其官方網(wǎng)站上有一個與其他 web server(如Apache, Zeus等)的對比圖+Benchmark可以參考。此外,thttpd 也類似于lighttpd,對于并發(fā)請求不使用fork()來派生子進(jìn)程處理,而是采用多路復(fù)用(Multiplex)技術(shù)來實現(xiàn),因此效能很好。 thttpd支持多種平臺,如FreeBSD、SunOS、Solaris、BSD、Linux、OSF等。對于小型web server而言,速度快似乎是一個代名詞,通過官方站提供的Benchmark,可以這樣認(rèn)為:thttpd至少和主流的web server一樣快,在高負(fù)載下更快,因為其資源占用小的緣故。 thttpd還有一個較為引人注目的特點(diǎn):基于URL的文件流量限制,這對于下載的流量控制而言是非常方便的。像Apache就必須使用插件實現(xiàn),效率較thttpd低。,3.shttpd shttpd 是另一個輕量級的web server,具有比thttpd更豐富的功能特性,支持CGI、SSL、 cookie、MD5認(rèn)證,還能嵌入(embedded)到現(xiàn)有的軟件里,而且不需要配置文件。由于shttpd可以嵌入其他軟件,因此可以非常容易的開發(fā)嵌入式系統(tǒng)的web server,官方網(wǎng)站上稱shttpd如果使用uclibc/dielibc(libc的簡化子集)則開銷將非常非常低。,4.BOA BOA是一個非常小巧的Web服務(wù)器,可執(zhí)行代碼只有約60KB。它是一個單任務(wù)Web服務(wù)器,只能依次完成用戶的請求,而不會fork出新的進(jìn)程來處理并發(fā)連接請求。但BOA支持CGI,能夠為CGI程序fork出一個進(jìn)程來執(zhí)行。BOA的設(shè)計目標(biāo)是速度和安全,在其站點(diǎn)公布的性能測試中,BOA的性能要好于Apache服務(wù)器。,12.2 嵌入式Linux系統(tǒng)移植,12.2.1 開發(fā)環(huán)境的構(gòu)建 12.2.2 Boot Loader分析移植 12.2.3 Linux內(nèi)核移植 12.2.4 構(gòu)建根文件系統(tǒng),嵌入式應(yīng)用程序的開發(fā)流程不同于普通的PC機(jī)。相比于普通的PC機(jī),嵌入式的硬件資源相當(dāng)?shù)挠邢蓿豢赡苓M(jìn)行本地的開發(fā)。因而,嵌入式的軟件開發(fā)和調(diào)試過程通常是在PC機(jī)上實現(xiàn)的。這樣就形成了一套在PC機(jī)上交叉編譯,然后生成目標(biāo)機(jī)平臺的格式,最后在目標(biāo)機(jī)上執(zhí)行的開發(fā)流程,也就是所謂的交叉編譯環(huán)境。 本文使用的是Debian GNU/Linux的操作系統(tǒng)作為開發(fā)平臺。首先可以從獲取Debian最新的穩(wěn)定版。正確安裝好Debian以后,下一步就要建立一套跨平臺的交叉編譯工具鏈。,12.2.1 開發(fā)環(huán)境的構(gòu)建,制作一個支持softfloat的交叉編譯工具鏈: (1)解壓縮crosstool-0.43.tar.gz,把補(bǔ)丁文件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,大約12個小時就編譯好了。此時將交叉編譯工具鏈加入PATH環(huán)境變量中就可以使用了。,對于計算機(jī)系統(tǒng)來說,從開機(jī)上電到操作系統(tǒng)啟動需要一個引導(dǎo)過程。嵌入式Linux系統(tǒng)同樣離不開引導(dǎo)程序,這個引導(dǎo)程序就叫作Boot Loader。Boot Loader是在操作系統(tǒng)運(yùn)行之前執(zhí)行的一段小程序。通過這段小程序可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做準(zhǔn)備。Boot Loader的實現(xiàn)非常依賴于具體的硬件。正因如此,幾乎不可能為所有的嵌入式系統(tǒng)建立一個通用的Boot Loader。,12.2.2 Boot Loader分析移植,Boot Loader主要分為兩種操作模式: 啟動加載(Boot loading)模式:這種模式也稱為自主模式,即Boot Loader從目標(biāo)機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個過程并沒有用戶的介入。這種模式是Boot Loader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,Boot Loader顯然必須工作在這種模式下。 下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的Boot Loader將通過串口連接或者網(wǎng)絡(luò)連接等通信手段從主機(jī)下載文件。從主機(jī)下載的文件通常首先被Boot Loader保存到目標(biāo)機(jī)的RAM中,然后再被Boot Loader寫到目標(biāo)機(jī)上的Flash存儲設(shè)備中。,12.2.3 Linux內(nèi)核移植,表12-1 Linux內(nèi)核子目錄結(jié)構(gòu),內(nèi)核的源代碼可以從獲取: 1. 首先解壓縮內(nèi)核源代碼,修改頂層的Makefile文件 ARCH?= arm CROSS_COMPILE ?= arm-linux- 這里需要指定目標(biāo)平臺的體系結(jié)構(gòu)和交叉編譯工具鏈的路徑。 2. 修改linux-/arch/arm/mach-s3c2440/mach-smdk2440.c文件 s3c24xx_init_clocks(16934400)修改為s3c24xx_init_clocks(12000000) 指定開發(fā)板的晶振頻率為12MHz。,3. 修改linux-/arch/arm/plat-s3c24xx/common-smdk.c文件,static struct mtd_partition smdk_default_nand_part = 0 = .name = “kernel“, .size = 0x00200000, .offset = 0, , 1 = .name = “rootfs“, .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, ;,下一步,就是進(jìn)行內(nèi)核的配置了。這里可以參考S3C2410的開發(fā)板來進(jìn)行配置和調(diào)整,內(nèi)核自帶了S3C2410開發(fā)板的配置文件。在內(nèi)核源代碼根目錄下,執(zhí)行make s3c2410_defconfig,生成一個基于S3C2410的開發(fā)板的默認(rèn)配置文件。然后再執(zhí)行make menuconfig會生成一個基于S3C2410開發(fā)板的內(nèi)核配置菜單。這里需要保留S3C2410/S3C2440 CPU的相關(guān)配置選項、TCP/IP協(xié)議、NAND Flash驅(qū)動、USB驅(qū)動以及適合的文件系統(tǒng)類型。,本文中采用的是JFFS2的文件系統(tǒng)類型。內(nèi)核默認(rèn)已經(jīng)對JFFS2有著非常良好的支持,只需要在配置內(nèi)核的時候加入相應(yīng)的配置選項就可以了。 JFFS2文件系統(tǒng)配置如下:,File systems - Miscellaneous filesystems - Journalling Flash File System v2 (JFFS2) support (0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy) (NEW) * JFFS2 write-buffering support (NEW) Verify JFFS2 write-buffer reads (NEW) JFFS2 summary support (EXPERIMENTAL) (NEW) JFFS2 XATTR support (EXPERIMENTAL) (NEW) Advanced compression options for JFFS2 (NEW),Linux遵守文件系統(tǒng)科學(xué)分類標(biāo)準(zhǔn)(Filesystem Hierarchy Standard,F(xiàn)HS),一個定義許多文件和目錄的名字和位置的標(biāo)準(zhǔn),該標(biāo)準(zhǔn)可以在,12.2.4 構(gòu)建根文件系統(tǒng),構(gòu)建Linux根文件系統(tǒng),就是按照FHS標(biāo)準(zhǔn),創(chuàng)建各種目錄、工具和配置文件。這里首先通過Busybox來創(chuàng)建可執(zhí)行文件。 Busybox最初是由Bruce Perens在1996年為Debian GNU/Linux安裝盤編寫的。其目標(biāo)是在一張軟盤上創(chuàng)建一個可引導(dǎo)的GNU/Linux系統(tǒng),這可以用作安裝盤和急救盤。一張軟盤可以保存大約1.41.7MB的內(nèi)容,因此這里沒有多少空間留給Linux內(nèi)核以及相關(guān)的用戶應(yīng)用程序使用。,1、首先解壓縮源代碼,修改頂層Makefile 2、執(zhí)行make menuconfig生成一個配置菜單。這里,只需選擇默認(rèn)配置就可以了。 3、最后執(zhí)行make進(jìn)行編譯,執(zhí)行make install進(jìn)行安裝。這樣會在當(dāng)前目錄下生成一個_install目錄。,可執(zhí)行文件創(chuàng)建好以后,接下來需要建立lib目錄,并且復(fù)制所需要的共享庫。可以通過arm-linux-readelf -a busybox | grep Shared命令來查看Busybox調(diào)用了哪些共享庫,然后將其中對應(yīng)的共享庫復(fù)制到lib目錄中就可以了。 下面根據(jù)FHS標(biāo)準(zhǔn),構(gòu)建etc配置目錄。,1. 創(chuàng)建inittab文件,# System initialization. :sysinit:/etc/init.d/rcS :ctrlaltdel:/sbin/reboot :shutdown:/sbin/swapoff -a :shutdown:/bin/umount -a :restart:/sbin/init :askfirst:-/bin/sh,2. 創(chuàng)建init.d/rcS文件,#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH umask 022 /bin/mount -a /bin/mount -t tmpfs mdev /dev /bin/mkdir /dev/pts /bin/mount -t devpts devpts /dev/pts,/bin/mount -t sysfs sysfs /sys echo /sbin/mdev /proc/sys/kernel/hotplug /sbin/mdev -s /bin/mount -t ramfs ramfs /var /bin/mkdir -p /var/run /bin/mkdir -p /var/log /bin/hostname hrbeu06ws /sbin/syslogd,3. 創(chuàng)建fstab文件,#device mount-point type options dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0,4.建立dev目錄下必備的設(shè)備節(jié)點(diǎn),sudo mknod console c 5 1 sudo mknod null c 1 3,5.創(chuàng)建passwd文件,root:*:0:0:root:/root:/bin/sh,6.創(chuàng)建shadow文件,root:$1$5qCxLMsr$jJgsPqDW8ZJOS8LE4c5n50:0:0:99999:7:1:,7.創(chuàng)建group文件,root:0:,8.創(chuàng)建profile文件,# /etc/profile: system-wide .profile file for the Bourne shell if “$PS1“ ;then if “$(id -u)“ -eq 0 ;then PS1=uh:w# else PS1=uh:w$ fi fi HOME=/root export HOME,9.創(chuàng)建resolv.conf文件,nameserver ,10.復(fù)制主機(jī)的inetd.conf、protocols、mime.types和services文件,其中定義了常見的網(wǎng)絡(luò)服務(wù)的端口和協(xié)議。,11.最后,創(chuàng)建一些必要的空目錄,mkdir mnt proc root sys tmp var,12.3嵌入式Linux的BOA服務(wù)器移植,12.3.1 CGI簡介 12.3.2 BOA服務(wù)器 12.3.3 CGIC庫的移植 12.3.4 HTML模板的制作 12.3.5 CGI程序的開發(fā),目前Web技術(shù)中生成動態(tài)Web頁面的方法有CGI和服務(wù)器腳本,如JSP、ASP等,但后者需要Web服務(wù)器具有這些腳本的運(yùn)行支持模塊。在嵌入式Web服務(wù)器中,考慮到資源限制問題,一般都只提供CGI支持,因此在嵌入式設(shè)備中Web方式應(yīng)用實際上就是基于CGI的程序開發(fā)。,12.3.1 CGI簡介,CGI(Common Gate Intergace)是一段運(yùn)行在Web服務(wù)器上的程序,提供同客戶端Html頁面的接口。例如,常見的個人主頁上大都有一個留言本,留言本的工作方式是先由用戶輸入一些信息,如名字之類的東西,接著用戶按一下“留言”(到目前為止工作都在客戶端),瀏覽器就把這些信息傳送到服務(wù)器的CGI程序中,于是CGI程序在服務(wù)器上按照預(yù)定的方法進(jìn)行處理,在本例中就是把用戶提交的信息存入指定的文件中,最后CGI程序給客戶端發(fā)回一個“留言結(jié)束”字樣的頁面,用戶可以在瀏覽器里看到。,BOA服務(wù)器對CGI的表現(xiàn)非常的出色,其應(yīng)用十分廣泛。BOA的源代碼可以從http:/www.BOA.org下載。本文使用的是BOA-0.94.14rc21.tar.gz。 首先解壓縮源代碼tar xvf BOA-0.94.14rc21.tar.gz。查看其中的目錄結(jié)構(gòu),包括src、docs、examples、debian等等。這里src是BOA的源代碼目錄,其中包含了編譯過程中所需要的一些文件。進(jìn)入src目錄以后,目錄下有一個configure腳本文件,其檢測本機(jī)的開發(fā)環(huán)境用來生成Makefile文件。,12.3.2 BOA服務(wù)器,通過執(zhí)行./configure h來查看一些常用的幫助選項: 其中比較主要的有: -prefix,指定了安裝時的路徑。 -host指定了生成的平臺類型。 CC指定了編譯器的類型等等。,這里,首先通過configure生成一個Makefile文件,如下:./configure host=arm-linux CC=arm-linux-gcc。接下來,查看生成的Makefile文件,修改其中的CC=arm-linux-gcc,CPP=arm-linux-g+等。下一步,只需要執(zhí)行make命令就可以調(diào)用Makefile來生成所需要的BOA。這里,可以去除BOA的調(diào)試信息,以減小它的體積,輸入arm-linux-strip BOA就可以了。 接著把生成的BOA復(fù)制到nfs共享目錄中,啟動主機(jī)的nfs服務(wù),啟動開發(fā)板,設(shè)置內(nèi)核自動掛載nfs網(wǎng)絡(luò)文件系統(tǒng)。啟動開發(fā)板以后,在終端下輸入BOA,還需要建立一個BOA的配置文件。,在BOA源碼目錄下已有一個示例BOA.conf,可以在其基礎(chǔ)上進(jìn)行修改,下面解釋一下該文件的含義: 監(jiān)聽的端口號,缺省都是80,一般無需修改:,Port 80,bind調(diào)用的IP地址,一般注釋掉,表明綁定到INADDR_ANY,通配于服務(wù)器的所有IP地址:,#Listen ,作為哪個用戶運(yùn)行,即它擁有該用戶的權(quán)限,一般都是nobody,需要/etc/passwd中有#nobody用戶:,User nobody,作為哪個用戶組運(yùn)行,即它擁有該用戶組的權(quán)限,一般都是nogroup,需要在/etc/group文件中有nogroup組:,Group nogroup,當(dāng)服務(wù)器發(fā)生問題時發(fā)送報警的email地址,目前未用,注釋掉:,ServerAdmin rootlocalhost,錯誤日志文件,如果沒有以/開始,則表示從服務(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_log,是否使用本地時間。如果沒有注釋掉,則使用本地時間。注釋掉則使用UTC 時間:,#UseLocaltime,是否記錄CGI運(yùn)行信息,如果沒有注釋掉,則記錄,注釋掉則不記錄:,#VerboseCGILogs,服務(wù)器名字:,ServerName ,是否啟動虛擬主機(jī)功能,即設(shè)備可以有多個網(wǎng)絡(luò)接口,每個接口都可以擁有一個虛擬的Web服務(wù)器。一般注釋掉,即不需要啟動:,#VirtualHost,HTML文檔的主目錄,如果沒有以/開始,則表示從服務(wù)器的根路徑開始:,DocumentRoot /var/www,如果收到一個用戶請求的話,在用戶主目錄后再增加的目錄名:,UserDir public_html,HTML目錄索引的文件名,也是沒有用戶只指明訪問目錄時返回的文件名:,DirectoryIndex index.html,當(dāng)HTML目錄沒有索引文件時,用戶只指明訪問目錄時,BOA會調(diào)用該程序生成索引文件然后返回給用戶,因為該過程比較慢最好不執(zhí)行,可以注釋掉或者給每個HTML目錄加上DirectoryIndex指明的文件:,#DirectoryMaker /usr/lib/BOA/BOA_indexer,如果DirectoryIndex不存在,并且DirectoryMaker被注釋,那么就用BOA自帶的索引生成程序來生成目錄的索引文件并輸出到下面目錄,該目錄必須是BOA能讀寫:,# DirectoryCache /var/spool/BOA/dircache,一個連接所允許的HTTP持續(xù)作用請求最大數(shù)目,注釋或設(shè)為0都將關(guān)閉HTTP持續(xù)作用,KeepAliveMax 1000,HTTP持續(xù)作用中服務(wù)器在兩次請求之間等待的時間數(shù),以秒為單位,超時將關(guān)閉連接:,KeepAliveTimeout 10,指明mime.types文件位置。如果沒有以/開始,則表示從服務(wù)器的根路徑開始。可以注釋掉,避免使用mime.types文件,此時需要用AddType在本文件里指明:,MimeTypes /etc/mime.types,文件擴(kuò)展名沒有或未知的話,使用的缺省MIME類型:,DefaultType text/plain,提供CGI程序的PATH環(huán)境變量值:,CGIPath /bin:/usr/bin:/usr/local/bin,將文件擴(kuò)展名和MIME類型關(guān)聯(lián)起來,和mime.types文件作用一樣。如果用mime.types,文件,則注釋掉,如果不使用mime.types文件,則必須使用:,#AddType application/x-httpd-cgi cgi,指明文檔重定向路徑:,#Redirect /bar http:/elsewhere/feh/bar,為路徑加上別名:,Alias /doc /usr/doc,指明CGI腳本的虛擬路徑對應(yīng)的實際路徑。一般所有的CGI腳本都要放在實際路徑里,用戶訪問執(zhí)行時輸入站點(diǎn)+虛擬路徑+CGI腳本名:,ScriptAlias /cgi-bin/ /var/www/cgi-bin/,用戶可以根據(jù)自己需要,對BOA.conf進(jìn)行修改,但必須要保證其他的輔助文件和設(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文件用來指明不同文件擴(kuò)展名對應(yīng)的MIME類型,一般可以直接從Linux主機(jī)上拷貝一個,大部分也都是在主機(jī)的/etc目錄下。,還要修改一下BOA的啟動腳本,以方便控制BOA的運(yùn)行。修改debian目錄下BOA.init文件,#! /bin/sh # # Written by Miquel van Smoorenburg . # Modified for Debian GNU/Linux # by Ian Murdock . # Modified for BOA by Bill Allombert . # BEGIN INIT INFO # Provides: BOA # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network,# Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: BOA: lightweight and high performance web server # END INIT INFO PATH=/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/BOA NAME=BOA DESC=“HTTP server“ test -x $DAEMON | exit 0 set -e case “$1“ in start),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 -signal HUP -quiet -oknodo -exec $DAEMON echo “done.“ ;,reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # If the daemon responds to changes in its config file # directly anyway, make this a do-nothing entry. # echo -n “Reloading $DESC configuration. “ start-stop-daemon -stop -signal 1 -quiet -oknodo -exec $DAEMON echo “done.“ ; *),N=/etc/rc.d/init.d/$NAME # echo “Usage: $N start|stop|restart|reload|force-reload“ esac exit 0,第三步就是測試BOA能否正常工作,靜態(tài)HTML頁面能否正常訪問,CGI腳本能否正常運(yùn)行,一般采用NFS方式來進(jìn)行測試工作,可以將嵌入式目標(biāo)系統(tǒng)上的/etc目錄拷貝到主機(jī)的NFS共享目錄下,然后將NFS共享目錄下的etc目錄重新NFS mount為目標(biāo)系統(tǒng)上的/etc目錄。這樣就可以在主機(jī)上對etc目錄下的各種配置文件進(jìn)行修改而立刻在目標(biāo)系統(tǒng)上生效。,接下來進(jìn)行CGI腳本的測試,需要一個測試用的CGI腳本。可以寫個最簡單的Hello World程序,示例代碼如下:,#include void main() printf(“Content-type: text/htmlnn“) ; printf(“n“) ; printf(“n“) ; printf(“n“) ; printf(“ Hello, world.n“) ; printf(“n“) ; printf(“n“) ; exit(0) ; ,然后進(jìn)行交叉編譯,將得到的helloworld.cgi拷貝到主機(jī)的/nfs/www/cgi-bin目錄下。,#arm-linux-gcc -o helloworld.cgi helloworld.c #cp helloworld.cgi /nfs/www/cgi-bin,在瀏覽器地址欄輸入/cgi-bin/helloworld.cgi,可以看到相關(guān)頁面,表示CGI腳本測試通過。,在進(jìn)行CGI編程之前,先了解HTML的一些知識。CGI可以使用多種編程語言來實現(xiàn),包括C、 C+、Perl等,但在嵌入式設(shè)備的開發(fā)中,一般都不會采用Perl等解釋性語言,因為這種語言還需要有解釋執(zhí)行的支撐模塊,會占用存貯空間和內(nèi)存,最常用的方法當(dāng)然是用C來編寫,但C并不是很適合開發(fā)象CGI這種需要大量進(jìn)行字符串操作的程序,編程比較煩瑣,因此,對于一個專業(yè)的開發(fā)人員來說,首先想到的應(yīng)該是有沒有可復(fù)用的庫來支持快速高效的開發(fā)CGI程序。幸運(yùn)的是目前就有不少開放源碼的支持CGI開發(fā)的 C庫。在此只介紹CGIC,有興趣的讀者可以自己在Internet上搜索其他的C庫。,12.3.3 CGIC庫的移植,CGIC是一個支持CGI開發(fā)的開放源碼的標(biāo)準(zhǔn)C庫,可以免費(fèi)使用,只需要在開發(fā)的站點(diǎn)和程序文檔中有個公開聲明即可,表明程序使用了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ù)、浮點(diǎn)數(shù)、單選或多選功能來接收數(shù)據(jù); 7.提供數(shù)字字段的邊界檢查; 8.能夠?qū)GI環(huán)境變量轉(zhuǎn)化成C中的非空字符串; 9.提供CGI程序的調(diào)試手段,能夠回放CGI程序執(zhí)行時的CGI狀態(tài);,下載后,解壓到“/opt/EmbedSky/”目錄下,會生成目錄cgic205: #tar xvfz cgic205.tar.gz 配置編譯條件,進(jìn)入cgic205目錄,修改Makefile 文件。下面是修改后的文件內(nèi)容:,CFLAGS=-g -Wall CC=arm-linux-gcc/原來是CC = gcc AR=arm-linux-ar/原來是AR = ar RANLIB=arm-linux-ranlib/原來是RANLIB = ranlib LIBS=-L./ -lcgic all: libcgic.a cgictest.cgi capture install: libcgic.a cp libcgic.a /usr/local/lib cp cgic.h /usr/local/include,echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include. libcgic.a: cgic.o cgic.h rm -f libcgic.a $(AR) rc libcgic.a cgic.o $(RANLIB) libcgic.a #mingw32 and cygwin users: replace .cgi with .exe cgictest.cgi: cgictest.o libcgic.a $(CC) $(CFLAGS) cgictest.o -o cgictest.cgi $LIBS/ 由gcc改成了:$(CC) $(CFLAGS) capture: capture.o libcgic.a $(CC) $(CFLAGS) capture.o -o capture $LIBS / 由gcc改成了:$(CC) $(CFLAGS) clean: rm -f *.o *.a cgictest.cgi capture,修改后保存退出,下面編譯并優(yōu)化。 編譯,會在目錄下生成capture 的可執(zhí)行文件和測試用的cgictest.cgi 文件:,#make,優(yōu)化:,#arm-linux-strip capture,會把 capture 由原來的100K 左右變成現(xiàn)在的29K左右。,Web方式的應(yīng)用開發(fā)一般都會將界面和程序邏輯脫離開來,允許在一定程度下更改界面,如改變界面文本的屬性,建立多語言版本等,而無需改動程序邏輯。界面一般由美工來進(jìn)行制作,而程序員負(fù)責(zé)具體功能的實現(xiàn)。在 HTML中,表單 (FORM)是最主要的傳遞信息的手段,它適用于任何瀏覽器。表單中有很多元素,包括輸入文本框、單選框、多選框、按鈕等等,可以提供信息的交互。具體對象說明和語法請參見其他HTML書籍,在這里不作介紹。根據(jù)應(yīng)用需求,美工或其他設(shè)計人員將最后的Web頁面設(shè)計出來,作為程序員進(jìn)行開發(fā)的模板。,12.3.4 HTML模板的制作,HTML模板還需要關(guān)注的是輸入的檢查。根據(jù)輸入檢查越早越好的原則,需要在用戶界面上就對用戶提交的數(shù)據(jù)進(jìn)行檢查。目前一般是采用javascript腳本的方式。當(dāng)用戶提交數(shù)據(jù)時,表單對象的onSubmit 方法就會被調(diào)用,在該方法里就可以對用戶的輸入進(jìn)行檢查。常用的檢查有是否必需、最大/小長度、是否字符、是否數(shù)字、email地址、IP地址是否正確、是否匹配一個正則表達(dá)式等。,CGI程序一般邏輯為: 1安全性檢查,是否允許運(yùn)行腳本; 2處理用戶提交的數(shù)據(jù),根據(jù)元素名字/值中的元素名字來區(qū)分?jǐn)?shù)據(jù),然后根據(jù)應(yīng)用需求進(jìn)行數(shù)據(jù)處理; 3將處理結(jié)果填充表單,根據(jù)注釋標(biāo)記將對應(yīng)的數(shù)據(jù)填充到HTML文本中去,生成最后的頁面返回給瀏覽器。,12.3.5 CGI程序的開發(fā),下面介紹幾個有關(guān)CGI的源碼:,/*此程序可以測試web 服務(wù)上傳的字符串信息*/ #include #include #include #include void main() /*LINUX 下必須返回值類型為int,并且相應(yīng)的返回處應(yīng)該添加上相*/ if(getenv(“CONTENT-LENGTH“) char *s = getenv(“CONTENT-LENGTH“); printf(s); printf(“Contenttype:text/htmlnn“);,printf(“n“); printf(“這是測試POST 方法n“); printf(“n“); printf(“ 這是測試POST 方法n“); printf(s); printf(“n“); printf(“ Go back to out put.html page n“); printf(“n“); printf(“n“); fflush(stdout); /* convert hex string to int */ /*主要轉(zhuǎn)換漢字編碼的格式*/ int htoi(char *s) ,char *digits=“0123456789ABCDEF“; if (islower(s0) s0=toupper(s0); if (islower(s1) s1=toupper(s1); return 16 * (strchr(digits, s0) -strchr (digits,0)+(strchr(digits,s1)-strchr(digits,0); void main() printf (“Contenttype: text/plainnn“); printf(“n“); printf(“這是測試POST 方法n“); printf(“n“); printf(“); printf(“img border=0 src=/winter.gif width= 700,height=120“); printf(“); printf(“ 這是測試POST 方法n“); printf(“); /*/ /*取出的數(shù)值在nValue中*/ int i,n; char c; int nSum = 1; /*總共幾個變量*/ char nStr1000; /*存放整個上傳的數(shù)據(jù)串,最多 1000 個*/ memset(nStr,0,1000); /*將 10個變量清零*/ char nCurrentValue200; /*當(dāng)前取出的值*/ char nValueName1050; /*變量名稱*/ memset(nValueName,0,500); /*將 10個變量名稱清零*/,char nValue10100; /*最多10個變量,每個變量最大 100 個字符*/ memset(nValue,0,1000); /*將10個變量清零*/ int nIndex = 0; /*當(dāng)前變量索引*/ int nPosion = 0; /*當(dāng)前操作的變量的第幾個字符*/ int iseq=0; /*每個變量開始標(biāo)志*/ 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“,n);,for (i=0;in;i+) c=getchar(); /*從標(biāo)準(zhǔn)輸入取一個字符*/ nStri=c; /*下面主要是對URL編碼的解碼*/ switch (c) case case +: /*空格變換*/,c= ; if(iseq = 1) nValuenIndexnPosion = ; nPosion +; break; case %: /*非數(shù)字和字母,例如漢字編碼轉(zhuǎn)換*/ char s3; s0 = getchar(); s1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論