




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第3章 嵌入式遠程監(jiān)控系統(tǒng)設(shè)計與實現(xiàn)1.1 課程設(shè)計目的通過本課程設(shè)計,要對嵌入式系統(tǒng)的開發(fā)有比較深入的學習和分析。通過對WEB編程、服務(wù)器的架設(shè)、驅(qū)動程序的開發(fā)這些步驟的深入研究,掌握構(gòu)建一個完備的嵌入式系統(tǒng)的開發(fā)流程。1.2 課程設(shè)計要求通過本課程設(shè)計,熟練前面幾章的內(nèi)容。在此基礎(chǔ)上,編寫相關(guān)驅(qū)動程序,以及CGI和數(shù)據(jù)處理程序完成基于WEB的嵌入式遠程控制系統(tǒng)。通過本章的課程設(shè)計,可以初步了解一個嵌入式系統(tǒng)的基本構(gòu)建過程,學習如何在ARM系統(tǒng)上搭建嵌入式服務(wù)器,并通過CGI控制外部設(shè)備的一般方法。1.3 系統(tǒng)簡介嵌入式WEB 服務(wù)器及遠程測控總的思想就是網(wǎng)絡(luò)化儀器。完成的目標就是設(shè)計基于Linux 操作系統(tǒng)的遠程測控系統(tǒng),并且討論實踐中的可行性,我們通過普通的瀏覽器就可以對遠端現(xiàn)場的控制和測量以及獲取遠端現(xiàn)場的圖像信息。使用嵌入式WEB 服務(wù)器的好處有這樣幾點:(1) 遠程監(jiān)控終端僅需要安裝瀏覽器即可,無需開發(fā)專門的應(yīng)用軟件,降低系統(tǒng)成本。(2)瀏覽器所在的監(jiān)控終端平臺與WEB 所在的服務(wù)器平臺無關(guān),監(jiān)控終端可以采用多種操作系統(tǒng),真正實現(xiàn)了跨平臺。(3)操作界面簡單統(tǒng)一,表達直觀生動,用戶無需經(jīng)過專門培訓(xùn)。(4)易于擴展新的功能,系統(tǒng)升級僅需在Web 服務(wù)器一端添加相應(yīng)模塊,與遠程監(jiān)控終端無關(guān),降低系統(tǒng)升級維護費用。系統(tǒng)整體結(jié)構(gòu)如下:圖3.1 系統(tǒng)整體結(jié)構(gòu)遠程監(jiān)控系統(tǒng)所涉及的知識點很多,主要包括Linux 操作系統(tǒng),內(nèi)核移植,文件系統(tǒng)的移植,服務(wù)器的移植,CGI 程序的移植,CGI 腳本的編寫,設(shè)備驅(qū)動的調(diào)試和JavaScript 腳本,TCP 服務(wù)器與客戶端,UDP 服務(wù)器與客戶端,Java 中的多線程技術(shù),Java 畫圖板及各種控件的添加。下面提供幾張已經(jīng)做好的測控服務(wù)器的圖片,先達到一個感性的認識。圖3.2 是一個實時視頻及溫度測量遠程監(jiān)控系統(tǒng),它將采集到的圖像以及溫度參數(shù)在網(wǎng)頁中顯示出來。圖3.2 ARM9 遠程實時視頻及溫度測量在這一章中我們將學習一個基本的嵌入式遠程監(jiān)控系統(tǒng)的搭建,由于涉及到的知識點較多,我們只能把其中最主要的知識簡要地描述,更多更詳細的設(shè)計可以參考手冊后面的參考文獻。通過對本章的學習,讀者可以了解架設(shè)一個嵌入式WEB服務(wù)器的全過程及其要點。1.4 嵌入式WEB服務(wù)器移植1.4.1 BOA的移植1、下載BOA源碼下載地址: / 或者/。最新發(fā)行版本: 0.94.13 下載 boa-0.94.13.tar.gz,注意:從boa 上下載的是boa-0.94.13.tar.gz,按照一般解壓步驟進行解壓:# tar xzf boa-0.94.13.tar.gz 2、生成Makefile文件生成Makefile 文件直接運行src/configure 文件。 3、修改Makefile文件修改Makefile 文件修改 CC = gcc 為 CC = arm-linux-gcc 修改 CPP = gcc - E 為 CPP = arm-linux-gcc -E4、編譯# make 生成boa 文件 # arm-linux-strip boa 去掉文本信息,使boa 變小# make 生成boa 文件 # arm-linux-strip boa 去掉文本信息,使boa 變小5、BOA的配置BOA 需要在/etc目錄下建立一個boa 目錄,里面放入BOA的主要配置文件boa.conf。在BOA源碼目錄下已有一個示例boa.conf,可以在其基礎(chǔ)上進行修改。 (a)、Group 的修改修改 Group nogroup 為 Group 0 由于在/etc/group文件中沒有nogroup組,所以設(shè)成0。另外在/etc/passwd 中有nobody用戶,所以User nobody不用修改。(注意如果沒有nobody 用戶,也需要將User設(shè)成0)(b)、ScriptAlias 的修改指示CGI 腳本的存放位置。修改 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 為 ScriptAlias /cgi-bin/ /var/www/cgi-bin/ ScriptAlias /index.html /var/www/index.html 指示網(wǎng)頁存放的位置。(c)、ServerName 的設(shè)置修改 ServerName .here/ 為 ServerName .here/ 注意:該項默認為未打開,執(zhí)行BOA會異常退出,提示“gethostbyname:No such file ordirectory”,所以必須打開。其它默認設(shè)置即可。 6、BOA 的運行成功配置以后,還需要創(chuàng)建日志文件所在目錄/var/log/boa ,創(chuàng)建HTML 文檔的主目錄/var/www,將靜態(tài)網(wǎng)頁存入該目錄下(可以將主機 /usr/share/doc/HTML/ 目錄下的index.html 文件和img 目錄復(fù)制到/var/www 目錄下),創(chuàng)建CGI 腳本所在錄 /var/www/cgi-bin ,將cgi 的腳本存放在該目錄下。另外還要將mime.types 文件復(fù)制/etc 目錄下,通常可以從linux 主機的 /etc 目錄下直接復(fù)制即可。實際運行時,可以將index.html文件、img目錄和mime.types文件放到CF 卡目錄下,建立目錄后,拷貝至相應(yīng)目錄。制作run.sh:mkdir /etc/boacp /cf/boa/boa.conf /etc/boa/mkdir /var/logmkdir /var/log/boamkdir /var/wwwcp /cf/boa/index.html /var/www/cp -r /cf/boa/img /var/www/mkdir /var/www/cgi-bincp /cf/boa/mime.types /etc/cp /cf/boa/boa /./boa &啟動瀏覽器,直接在瀏覽器中輸入07/,出現(xiàn)BOA TEST的歡迎網(wǎng)頁。靜態(tài)HTML調(diào)試成功。1.4.2 CGI 腳本測試為了測試剛才建立的BOA服務(wù)器是否正確,我們可以編寫一個簡單例程進行測試。helloworld.c 程序就起這個作用,其內(nèi)容如下:#includeint main() printf(Content-type: text/htmlnn);printf(n); printf(BOA CGI TESTn);printf(n); printf(BOA CGI TESTn);printf(n);printf(n);exit(0); 編寫完后進行交叉編譯,得到的helloworld 拷貝到var/www/cgi-bin 目錄下。# arm-linux-gcc -o helloworld.cgi helloworld.c在瀏覽器中輸入22/cgi-bin/helloworld 可以看到BOA測試頁面,表示CGI 測試通過。1.5 HTML 網(wǎng)頁設(shè)計普通的HTML 頁面只能提供靜態(tài)的信息給用戶,如果要實現(xiàn)網(wǎng)頁的交互僅靠HTML 是無能為力的。在一個完整的系統(tǒng)中,用戶提交信息輸入界面的好壞將影響到系統(tǒng)的成敗。好的輸入界面可以彌補系統(tǒng)設(shè)計上的某些缺陷,但如何才能設(shè)計一個好的輸入界面呢?HTML 中表單(FORM)在CGI 中是常見使用的輸入界面,雖然并不十分完美,但它的確是目前www中最強大的輸入工具。FORM是由一組相關(guān)聯(lián)的標簽所組成,使用方法就像HTML 中的其他標簽一樣。在FORM 中提供了多種輸入資料的工具,如文字輸入?yún)^(qū)(Text)、下拉式菜單(select)、復(fù)選框(CheckBox)、單選框(RadioButton)等等。就目前所定義的標準種,F(xiàn)ORM 的標簽可以分為、以及三個大類。我們來看看具體的程序?qū)崿F(xiàn),下面是一段HTML 表單:CGI LED test基于S3C2440 的Web 服務(wù)器的設(shè)計程序系統(tǒng)資源:s3c2440,16M Flash,32M SDRM,IP:0輸入要點亮的LED:輸入LED 狀態(tài):網(wǎng)頁中表單由字頭開始,結(jié)束。其中action=/cgi-bin/cgi_led.cgi指明使用的CGI 程序名為cgi_led.cgi;method 屬性指定提交數(shù)據(jù)的方法(POST 還是GET),這里使用的是GET 方法。我們要實現(xiàn)的功能很簡單,就是采集現(xiàn)場的LED的狀態(tài),并在網(wǎng)頁上輸出結(jié)果。在這個實例中我們提交了兩個數(shù)據(jù),一個是數(shù)據(jù)的名字是led,另一個數(shù)據(jù)的名字是status,它們的值由用戶在網(wǎng)頁中輸入。這里首先了解一下CGI 編碼的規(guī)則。其規(guī)則如下:不同域(變量值對)之間用“&”分開;變量與值之間用“”連接;空格符用“”代替;任何特殊字符用“”接相應(yīng)的十六進制ASCII 碼代替,最后形成的格式為:name1=value1&name2=value2%name3=value3 .1.6 CGI 程序設(shè)計CGI(Common Gateway Interface) 通用網(wǎng)關(guān)接口的簡稱。其主要的功能是在WWW環(huán)境下,從客戶端傳遞一些信息給WEB服務(wù)器,再由WEB服務(wù)器去啟動所指定的程序來完成特定的工作。所以簡單點說,CGI是一種通用的接口標準。CGI可以為我們提供許多HTML(HyperText Markup Language,超文本標記語言)無法做到的功能。比如一個計算器、顧客表格的提交以及統(tǒng)計、搜索引擎、WEB 數(shù)據(jù)庫等等。用HTML是沒有辦法記住客戶的任何信息的。要把顧客的信息記錄在服務(wù)器的硬盤上,就要用到CGI。CGI是一種通用的接口標準。CGI程序就是符合這種接口標準的,運行在WEB服務(wù)器上的程序。它的工作就是控制信息要求,產(chǎn)生并傳回所需的文件。CGI 由瀏覽器的輸入觸發(fā)這個程序。先看看瀏覽器瀏覽網(wǎng)頁是怎樣實現(xiàn)的。作為一個用戶首先在瀏覽器的地址欄中添加上要訪問的主頁地址并回車觸發(fā)這個申請。瀏覽器將申請發(fā)送到服務(wù)器上。WEB服務(wù)器接收這些申請并根據(jù).htm 或.html 的后綴并認識到這是HTML 文件。WEB服務(wù)器從當前硬盤或內(nèi)存中讀取正確的HTML 文件,然后將它送回瀏覽器。HTML文件將被用戶的瀏覽器解釋并將結(jié)果顯示在用戶瀏覽器上。CGI程序可以用來在WEB內(nèi)加入動態(tài)的內(nèi)容。通過接口,瀏覽器能夠發(fā)送一個可執(zhí)行應(yīng)用程序的HTTP請求,而不僅僅只是靜態(tài)的HTML文件。服務(wù)器運行指定的應(yīng)用程序,這個應(yīng)用程序讀取與請求相關(guān)的信息,獲得請求傳過來的數(shù)值。例如使用者填寫HTML表單提交了數(shù)據(jù),瀏覽器將這些數(shù)據(jù)發(fā)送到WEB服務(wù)器上。WEB服務(wù)器接收這些數(shù)據(jù)并根據(jù)客戶機指定的CGI程序把這些數(shù)據(jù)遞交給指定的CGI程序,并使CGI在服務(wù)器上運行。CGI程序運行結(jié)束,生成HTML頁面,WEB服務(wù)器把CGI程序運行的結(jié)果送回用戶瀏覽器。HTML文件將會被用戶的瀏覽器解釋并將結(jié)果顯示在用戶瀏覽器上。CGI的基本工作情況如下圖所示:圖3.3 CGI工作流程示意圖WEB服務(wù)器與CGI 程序之間通過四種途徑進行通信: 環(huán)境變量、命令行、標準輸入和標準輸出。其中負責輸入的有環(huán)境變量、命令行和標準輸入。命令行只用于ISINDEX 查詢,較少使用。環(huán)境變量存放服務(wù)器向CGI程序傳遞的一些運行參數(shù), 比如REQUEST_METHOD表示用戶提出請求或提交數(shù)據(jù)的方法是GET 還是POST。方法(METHOD) 是HTTP中對命令的稱呼。GET方法通過環(huán)境變量QUERY-STRING傳遞用戶提交的數(shù)據(jù)。經(jīng)過編碼的數(shù)據(jù)以問號打頭追加在標識CGI腳本地址的URL后一起傳給WEB服務(wù)器。服務(wù)器將其存于QUERYSTRING中,CGI 程序可以通過getenv( )函數(shù)來讀取。編碼數(shù)據(jù)除了表單數(shù)據(jù),還可以是直接調(diào)用CGI腳本時追加在URL 地址后面的參數(shù)。POST 方法則通過標準輸入( stdin) 傳遞提交數(shù)據(jù)。編碼了的表單數(shù)據(jù)獨立地傳送給WEB 服務(wù)器, CGI 程序從標準輸入中獲得,可以用getchar( ), sscanf( ) , fread( ) 等函數(shù)。要注意的是數(shù)據(jù)的長度是通過讀取環(huán)境變量CONTENT_LENGTH 獲得的, 而不是通過文件尾標識符來判斷。一般而言,要使用CGI 程序就必須在WEB網(wǎng)頁中遷入調(diào)用CGI 程序的代碼。通常的做法有三種,一是通過表單調(diào)用,二是通過超鏈接調(diào)用,三是通過SSI 調(diào)用。在3.5節(jié)中我們已經(jīng)闡述了網(wǎng)頁的設(shè)計,在這里重點說明使用表單調(diào)用CGI 程序的辦法。 我們來看看到底如何從GET表單收集數(shù)據(jù)到CGI 程序,下面給出了一個比較簡單的C 源代碼:#include #include #include #include #include #include #include #include #define DEVICE_GPIODRV /dev/gpiosint main() int fd; int led; int status; char *data; if(fd=open(DEVICE_GPIODRV,O_RDONLY | O_NONBLOCK)0) printf(open device: %sn,DEVICE_GPIODRV); perror(can not open device); exit(1); printf(Content-type:ext/html;charset=gb2312nn);printf(n); printf(CGI LED DEMOn); printf(n); printf(CGI LED DEMO 1:0 led1 on 1:1 led1 offn); printf(n); data=getenv(QUERY_STRING); if(sscanf(data,led=%ld&status=%ld,&led,&status)!=2) printf( 請正確輸入); printf(); if(led3) printf(Please input 0=led=3!); printf(); if(status1) printf(Please input 0=status=1!); printf(); ioctl(fd,status,led); close(fd); printf(n); exit(0); 對于CGI程序來講,當采用GET方式提交數(shù)據(jù)時,用戶提交的數(shù)據(jù)放在環(huán)境變量QUERY_STRING中。CGI程序從環(huán)境變量QUERY_STRING獲得數(shù)據(jù)。為了解釋和執(zhí)行程序,CGI必須要分析(處理)這個字符串。當你想從服務(wù)器獲得數(shù)據(jù)并且不改變服務(wù)器上的數(shù)據(jù)時,應(yīng)該選用GET。但是用GET 方式提交時,數(shù)據(jù)不經(jīng)過CGI編碼,而且數(shù)據(jù)長度不能超過1K字節(jié)。否則只能用POST方式了。CGI 程序的任務(wù)大概有兩部分,輸入任務(wù)和輸出任務(wù)。輸入任務(wù)就是指獲取用戶提交數(shù)據(jù)的過程。輸入任務(wù)大概分以下幾個步驟:(1)首先從CGI 環(huán)境變量REQUESR_METHOD中獲取CGI程序的提交方式;(2)根據(jù)提交方式的不同取出變量名和變量值。如果是Get方式,從環(huán)境變量QUERY_STRING 中取出編碼數(shù)據(jù);如果是POST 方式,從標準輸入輸出中讀取相應(yīng)的字符串,讀取長度有環(huán)境變量CONTENT_LENGTH 決定。(3)根據(jù)CGI 編碼規(guī)則取出字符串中的數(shù)據(jù)(變量名和變量值對)。在輸入任務(wù)完成后,我們得到所有的變量名和變量值對,而后就是輸出任務(wù)。輸出任務(wù)主要有三個:(1)輸出HTTP 響應(yīng)的頭標志。如printf(“Content-type:ext/htmlnn”);它告訴Web 服務(wù)器隨后的輸出是以HTML 文本形式輸出的。注意這個頭信息中有兩個換行符,這是因為WEB服務(wù)器需要在實際的文本信息開始之前先看見一個空行。(2)調(diào)用其它程序(如遠的測量程序、設(shè)置參數(shù)的程序、或者查詢數(shù)據(jù)庫的程序)。(3)輸出CGI 程序執(zhí)行結(jié)果。表單提交數(shù)據(jù)測試了解了POST 和GET 兩種表單提交數(shù)據(jù)方式以及步驟后,下面進行測試。GET方式:對于那些使用了屬性“METHOD=GET”的表單(或者沒有METHOD 屬性,這時候GET 是其缺省值),CGI 定義為:當表單被發(fā)送到服務(wù)器端后,表單中的數(shù)據(jù)被保存在服務(wù)器上一個叫做QUERY_STRING的環(huán)境變量中。這種表單的處理相對簡單,只要讀取環(huán)境變量就可以了。這一點對不同的語言有不同的做法。在C語言中,你可以用庫函數(shù)getenv(定義在標準庫函數(shù)stdlib中)來把環(huán)境變量的值作為一個字符串來存取。你可以在取得了字符串中的數(shù)據(jù)后,運用一些小技巧進行類型的轉(zhuǎn)換,這都是比較簡單的了。在CGI 程序中的標準輸出(output)(比如在C中的stdout文件流)也是經(jīng)過重定義了的。它并沒有在服務(wù)器上產(chǎn)生任何的輸出內(nèi)容,而是被重定向到客戶瀏覽器。這樣,如果編寫一個C 的CGI 程序的時候,把一個HTML 文檔輸出到它的stdout 上,這個HTML 文檔會被在客戶端的瀏覽器中顯示出來。這也是CGI 程序的一個基本原理。上例中具體的C 語法就不多講了,我們來看看它作為CGI 程序所特殊的地方。前面已經(jīng)提到標準輸出的內(nèi)容就是要被顯示在瀏覽器中的內(nèi)容。第一行的輸出內(nèi)容是必須的,也是一個CGI 程序所特有的:printf(Content-type: ext/html;charset=gb2312nn),這個輸出是作為HTML 的文件頭。因為CGI 不僅可以像瀏覽器輸出HTML 文本,而且可以輸出圖像,聲音之類的東西。這一行告訴瀏覽器如何處理接受到的內(nèi)容。在Content-Type 的定義后面跟有兩行的空行,這也是不可缺少的。因為所有CGI 程序的頭部輸出都是相近的,因而可以為其定義一個函數(shù),來節(jié)省編程的時間。這是CGI 編程常用的一個技巧。程序在后面調(diào)用了用了庫函數(shù)getevn 來得到QUERY_STRING 的內(nèi)容,然后使用sscanf 函數(shù)把每個參數(shù)值取出來,要注意的是sscanf 函數(shù)的用法。其他的就沒有什么了,和一般的C 程序沒有區(qū)別。把程序編譯后,改名為cgi_led.cgi 放在/cgi-bin/目錄下面,就可以被表單調(diào)用了。這樣,一個處理GET 方式表單的CGI 程序就大功告成了。POST方式:下面我們來考慮另外一種表單傳送方法。假設(shè)我們要實現(xiàn)的任務(wù)是這樣的:把表單中客戶輸入的一段文本內(nèi)容添加到服務(wù)器上的一個文本文件的后面。這可以看作是一個留言版程序的雛形。顯然,這個工作是無法用java script 這種客戶端腳本來實現(xiàn),也算得上真正意義上的CGI 程序了。看起來這個問題和上面講的內(nèi)容很相近,僅僅是用不同的表單和不同的腳本(程序)而已。但實際上,這中間是有一些區(qū)別的。在上面的例子中,GET 的處理方法可以看作是“純查詢(pure query)”類型的,也就是說,它與狀態(tài)無關(guān)。同樣的數(shù)據(jù)可以被提交任意的次數(shù),而不會引起任何的問題(除了服務(wù)器的一些小小的開銷)。但是現(xiàn)在的任務(wù)就不同了,至少它要改變一個文件的內(nèi)容。因而,可以說它是與狀態(tài)有關(guān)的。這也算是POST 和GET 的區(qū)別之一。而且,GET 對于表單的長度是有限制的,而POST 則不然,這也是在這個任務(wù)中選用POST 方法的主要原因。但相對的,對GET 的處理速度就要比POST 快一些。在CGI 的定義中,對于POST 類型的表單,其內(nèi)容被送到CGI 程序的標準輸入(在C 語言中是stdin),而被傳送的長度被放在環(huán)境變量CONTENT_LENGTH 中。因而我們要做的就是,在標準輸入中讀入CONTENT_LENGTH 長度的字符串。從標準輸出讀入數(shù)據(jù)聽起來似乎要比從環(huán)境變量中讀數(shù)據(jù)來的要容易一些,其實則不然,有一些細節(jié)地方要注意,這在下面的程序中可以看到。特別要注意的一點就是:CGI 程序和一般的程序有所不同,一般的程序在讀完了一個文件流的內(nèi)容之后,會得到一個EOF 的標志。但在CGI 程序的表單處理過程中,EOF 是永遠不會出現(xiàn)的,所以千萬不要讀多于CONTENT_LENGTH 長度的字符,否這會有什么后果,誰也不知道(CGI 規(guī)范中沒有定義,一般根據(jù)服務(wù)器不同而有不同得處理方法)。我們來看看到底如何從POST 表單收集數(shù)據(jù)到CGI 程序,下面給出了一個比較簡單的C 源代碼。#include #define MAXLEN 80 #define EXTRA 5 /* 4 個字節(jié)留給字段的名字data, 1 個字節(jié)留給= */ #define MAXINPUT MAXLEN+EXTRA+2 /* 1 個字節(jié)留給換行符,還有一個留給后面的NULL */ #define DATAFILE data.txt /* 要被添加數(shù)據(jù)的文件 */ void unencode(char *src, char *last, char *dest) for(; src != last; src+, dest+) if(*src = +) *dest = ; else if(*src = %) int code; if(sscanf(src+1, %2x, &code) != 1) code = ?; *dest = code; src +=2; else *dest = *src; *dest = ; *+dest = ; int main(void) char *lenstr;char inputMAXINPUT, dataMAXINPUT;long len; FILE *f;printf(Content-type: text/html;charset=gb2312nn);printf(n); printf(Responsen);printf(n); printf(Responsen);printf(n);lenstr = getenv(CONTENT_LENGTH);if(lenstr = NULL | sscanf(lenstr,%ld,&len)!=1 | len MAXLEN) printf(表單提交錯誤); printf(); else fgets(input, len+1, stdin);unencode(input+EXTRA, input+len, data);f = fopen(DATAFILE, a);if(f = NULL)printf(對不起,意外錯誤,不能夠保存你的數(shù)據(jù) ); printf(); else fputs(data, f); fclose(f); printf(非常感謝,您的數(shù)據(jù)已經(jīng)被保存%s,data); printf(); printf(n); exit(0); 從本質(zhì)上來看,程序先從CONTENT_LENGTH 環(huán)境變量中得到數(shù)據(jù)的字長,然后讀取相應(yīng)長度的字符串。因為數(shù)據(jù)內(nèi)容在傳輸?shù)倪^程中是經(jīng)過了編碼的,所以必須進行相應(yīng)的解碼。編碼的規(guī)則很簡單,主要的有這幾條:1、 表單中每個每個字段用字段名后跟等號,再接上上這個字段的值來表示,每個字段之間的內(nèi)容用&連結(jié);2、 所有的空格符號用加號代替,所以在編碼碼段中出現(xiàn)空格是非法的;3、 特殊的字符比如標點符號,和一些有特定意義的字符如“+”,用百分號后跟其對應(yīng)的ACSII 碼值來表示。例如:如果用戶輸入的是:Hello there!那么數(shù)據(jù)傳送到服務(wù)器的時候經(jīng)過編碼,就變成了data=Hello+there%21 上面的unencode()函數(shù)就是用來把編碼后的數(shù)據(jù)進行解碼的。在解碼完成后,數(shù)據(jù)被添加到data.txt 文件的尾部,并在瀏覽其中回顯出來。把文件編譯完成后,把它改名為collect.cgi 后放在CGI 目錄中就可以被表單調(diào)用了。下面給出了其相應(yīng)的表單: CGI POST test CGI POST test 請輸入您的留言(最多80 個字符): 事實上,這個程序只能作為例子,是不能夠正式的使用的。它漏掉了很關(guān)鍵的一個問題:當有多個用戶同時像文件寫入數(shù)據(jù)是,肯定會有錯誤發(fā)生。而對于一個這樣的程序而言,文件被同時寫入的幾率是很大的。因此,在比較正式的留言版程序中,都需要做一些更多的考慮,比如加入一個信號量,或者是借助于一個鑰匙文件等。因為那只是編程的技巧問題,在這兒就不多說了。最后,我們來寫一個瀏覽data.txt 文件的的CGI 程序,這只需要把內(nèi)容輸出到stdout 就可以了: #include #include #define DATAFILE ./data/data.txt int main(void) FILE *f = fopen(DATAFILE,r); int ch; if(f = NULL) printf(%s%c%c , Content-Type:text/html;charset=gb2312,13,10); printf(錯誤 ); printf(意外錯誤,無法打開文件); else printf(%s%c%c , Content-Type:text/plain,13,10); while(ch=getc(f) != EOF) putchar(ch); fclose(f); return 0; 這個程序唯一要注意的是:它并沒有把data.txt 包裝成HTML 格式后再輸出,而是直接作為簡單文本(plain text)輸出,這只要在輸出的頭部用text/plain 類型代替text/html 就可以了,瀏覽器會根據(jù)Content-Type 的類型自動的選擇相應(yīng)的處理方法。1.7 設(shè)備驅(qū)動程序設(shè)計現(xiàn)在設(shè)計一個簡單的LED 控制頁面。當輸入1 /0時對應(yīng)的LED燈亮滅。LED 驅(qū)動程序使用insmod命令加載,CGI 程序編譯后放在var/www/cgi-bin 目錄下。#include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME gpios#define GPIO_MAJOR 215static unsigned long gpio_table = S3C2410_GPD0, S3C2410_GPD1, S3C2410_GPD2, S3C2410_GPD3, ; static unsigned int gpio_cfg_table = S3C2410_GPD0_OUTP, S3C2410_GPD1_OUTP, S3C2410_GPD2_OUTP, S3C2410_GPD3_OUTP, ; static int sbc2440_gpios_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) switch(cmd) case 0: case 1: if (arg 4) return -EINVAL; s3c2410_gpio_setpin(gpio_tablearg, !cmd); return 0; default: return -EINVAL; static struct file_operations sbc2440_gpios_fops = .owner = THIS_MODULE, .ioctl = sbc2440_gpios_ioctl, ; static int
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國奧運毛絨玩具數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國臺式真空充氣包裝機數(shù)據(jù)監(jiān)測研究報告
- 新疆維吾爾自治區(qū)喀什地區(qū)莎車縣2024-2025學年高二上學期1月期末考試物理試題(含答案)
- 2024-2025學年重慶市酉陽縣八年級(上)期末歷史試卷(含答案)
- 2019-2025年消防設(shè)施操作員之消防設(shè)備中級技能考前沖刺模擬試卷B卷含答案
- 2020年中考生物試題(含答案)
- 遺產(chǎn)繼承遺囑代辦合同(2篇)
- 采購與供應(yīng)鏈分包合同(2篇)
- 2025年大學英語四級考試模擬試卷一
- 艾滋病相關(guān)知識培訓(xùn)課件
- 中華人民共和國文物保護法
- 小學五年級體育教案全冊(人教版)
- 20以內(nèi)加減法口算題(10000道)(A4直接打印-每頁100題)
- 理性與感性議論文900字(通用范文3篇)
- 【小學語文 】魯濱遜漂流記導(dǎo)讀課(課件)六年級下冊語文部編版
- GB/T 7999-2007鋁及鋁合金光電直讀發(fā)射光譜分析方法
- 收支管理內(nèi)部控制流程圖
- 《企業(yè)員工培訓(xùn)國內(nèi)外文獻綜述》4800字
- 華中科技大學復(fù)變函數(shù)試題(一)
- 三年級下冊數(shù)學教案-速度、時間和路程 滬教版
- 徽派建筑PPT江西婺源
評論
0/150
提交評論