1.引言
Server一般有兩種含義,一種是表示硬件,通常是指那些具有較高計算能力,能夠提供給多個用戶使用的計算機。另外一種含義是表示軟件程序,這種程序主要用來對外提供某些服務,比如郵件服務、數據庫服務、域名服務、網頁服務等。
本篇介紹的是軟件層面的Server,WebServer是指能夠供 Web 服務的 Server,它的主要功能是提供網上信息瀏覽服務。嵌入式WebServer,是在嵌入式系統上運行的,可以通過瀏覽器去訪問,對硬件要求會低一點。我們常用的家用路由器,就是一個典型的應用,通過Web界面直接進行訪問和配置設備,非常便利。
嵌入式WebServer有很多中,比如BOA、shttpd、lighttpd、goahead、appweb和apache等。本篇以thttpd()為例,來進行介紹。
2.環境介紹
2.1.硬件
NUC972開發板
2.2.軟件
1) Uboot繼續使用之前文章用的,無須改動。
2) Kernel在上一篇基礎上,無須改動。
3) Rootfs在上一篇用Buildroot生成的基礎上,需要做一定的改動,用來生成thttpd。
3.Buildroot配置
Buildroot裡需要做一定的配置,用來支持thttpd,只需要把Target packages- Networking applications中的thttpd選中即可
之後保存,編譯即可。我們只需要用到下面兩個文件
/output/target/usr/sbin/thttpd
/output/build/thttpd-2.25b/contrib/redhat-rpm/thttpd.conf
我們只需要將上述生成的thttpd直接放到板子的/usr/sbin目錄裡(注意要修改它的可執行權限)即可,將thttpd.conf放到/etc目錄中。
4.thttpd基礎功能
4.1 顯示靜態界面
開啟thttpd服務器可以使用配置文件的方式,或者直接跟運行選項。我們以配置文件為例。
使用配置文件的方式如下:
使用 vi 打開 thttpd.conf 文件,並進行修改,我們將chroot註釋掉,同時將"user=httpd"改為"user=root"
dir=/home/httpd/html
#chroot
user=root# default = nobody
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
# This section _documents_ defaults in effect
# port=80
# nosymlink# default = !chroot
# novhost
# nocgipat
# nothrottles
# host=0.0.0.0
# charset=iso-8859-1
注意上述dir=/home/httpd/html 這個目錄是用來存放html文件的,所以我們需要新建這三個目錄
# cd /
# mkdir /home /home/httpd /home/httpd/html
切換到 /home/httpd/html 目錄下,並新建一個 index.html 文件,為什麼名字叫index,我也不清楚,猜測是webserver程序裡指定的,因為我試了換成其他的名字是無法正常工作的。
# cd /home/httpd/html
# vi index.html
內容為:
Hello TopSemic Friends!
保存,退出。
之後啟動thttpd
# thttpd -D -C /etc/thttpd.conf &
最後就可以在訪問了,在瀏覽器中輸入192.168.0.100,顯示如下:
index.html 中的內容簡單介紹下,
….
,表示標題, 定義最大的標題。 定義最小的標題。
Html文件中的
含義可以參考:
參數具體含義可以在這裡查詢。
4.2 CGI示例
CGI是實現web交互的一個比較早的,支持任何語言。依賴於web服務器使用。整體上的結構如圖所示:
CGI(公用網關接口)規定了Web服務器調用其他可執行程序(CGI程序)的接口協議標準。Web服務器通過調用CGI程序實現和Web瀏覽器的交互,也就是CGI程序接受Web瀏覽器發送給Web服務器的信息進行處理,將響應結果再回送給Web服務器及Web瀏覽器。CGI程序一般完成Web網頁中表單(Form)數據的處理、數據庫查詢和實現與傳統應用系統的集成等工作。CGI程序可以用任何程序設計語言編寫,如Shell腳本語言、Perl、Fortran、Pascal、C語言等。但是用C語言編寫的CGI程序具有執行速度快、安全性高(因為C語言程序是編譯執行且不可被修改)等特點。
CGI接口標準包括標準輸入、環境變量、標準輸出三部分。
CGI文件並不要求是以.cgi或.CGI為後綴的文件,只要生成它的.c文件按照下面的格式來就行了。例如test.c
<code>#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("Content-type:text/html\\n\\n");
printf("\\n");
printf("<title>An html page from a cgi/<title>\\n");
printf("\\n");
printf("TopSemic CGI Example
\\n");
printf("\\n");
printf("\\n");
fflush(stdout);
return 0;
}/<string.h>/<stdio.h>/<code>
它是以printf("Content-type:text/html\\n\\n");開始,這是必須的。然後前後分別以printf("\\n");和printf("\\n");作為開始和結束,中間可嵌入我們自己處理的代碼。
然後arm-linux-gcc test.c -o test.cgi就行了,如果編出來的test沒有可執行權限,需要執行chmod +x test.cgi,然後將此文件放到服務器的根目錄,如前面例子所示的/home/httpd/html/目錄。
另外需要在上面的配置文件基礎上,加上一句cgipat=test.cgi,重啟啟動thttpd。
dir=/home/httpd/html
#chroot
user=root# default = nobody
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
cgipat=test.cgi
這樣就可以在瀏覽器中訪問了,格式為 IP/test.cgi,如"192.168.0.100/test.cgi"。訪問這個文件的效果如下圖所示
備註:
如果無法訪問,可能需要清除瀏覽器cookie/緩存
4.3 CGI與按鈕結合
前面介紹訪問CGI文件可以通過[IP]/[CGI文件名]這種格式來實現,如果我們在主頁(index.html)上點擊某個按鈕,它能從192.168.0.100跳轉到192.168.0.100/test.cgi,即可把按鈕與用C語言生成的CGI文件貫通起來。實現這一點的關鍵在於html中form表單中的action。如下例所示,action="test"
<title>Test Page/<title>Test Button
在此頁面中,有一個名為Query的按鍵,點擊下它,頁面就會從192.168.50.10跳轉到192.168.50.10/test.cgi,並在thttpd服務器的根目錄找名為test的文件,查看它是否為cgi文件,如果是cgi文件,即執行它。
5.控制LED燈
我們要實現的功能是:
點擊ON按鈕點亮LED,點擊OFF按鈕關閉LED,具體實現方法如下:
1) 建立index.html文件
<title>Test Page/<title>TopSemic LED Example
LED D3:
2)修改配置文件
cgipat=led-on.cgi|led-off.cgi
3) cgi文件
led-on.c,交叉編譯生成led-on.cgi
<code>#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
// Operation of LED D2
#define EXPORT_GPIO "echo 37 > /sys/class/gpio/export"
#define GPIO_OUTPUT "echo out > /sys/class/gpio/gpio37/direction"
#define TURNON_LED "echo 0 > /sys/class/gpio/gpio37/value"
#define TURNOFF_LED "echo 1 > /sys/class/gpio/gpio37/value"
void InitLED()
{
system(EXPORT_GPIO);
system(GPIO_OUTPUT);
}
void TurnOnLED()
{
system(TURNON_LED);
}
void TurnOffLED()
{
system(TURNOFF_LED);
}
int main(void)
{
printf("Content-type:text/html\\n\\n");
printf("\\n");
InitLED();
TurnOnLED();
printf("\\n");
printf("/<stdlib.h>/<stdio.h>/<stdio.h>/<code>
閱讀更多 TopSemic 的文章