物聯網之boa伺服器
一、移植boa伺服器
原始碼下載:boa-0.94.13.tar.gz 連結:https://pan.baidu.com/s/13pSIqRU47xkjInVfFDMorQ 密碼:m7eg
解壓原始碼:tar -xvf boa-0.94.13.tar.gz
安裝需要工具bison,flex:sudo apt-get install bison flex
修改 src/compat.h:
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
否則會出現錯誤:
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 錯誤 1
修改 src/log.c:
註釋掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
為:
/*if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}*/
否則會出現錯誤:
log.c:73 unable to dup2 the error log:bad file descriptor
修改src/boa.c:
註釋掉下面兩句話:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
為
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif
否則會出現錯誤:boa.c:211 - getpwuid: No such file or directory
註釋掉下面語句:
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
為
#if 0
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
否則會出現問題:boa.c:228 - icky Linux kernel bug!: No such file or directory
修改src/defines.h
將 #define SERVER_ROOT "/etc/boa"
修改為: #define SERVER_ROOT "/boa" //此處為boa伺服器位置,根據自己設定的位置填寫正確
(這樣boa程式啟動時會在/boa目錄下尋找boa.conf配置檔案,並且將/boa資料夾作為伺服器的根目錄)。
執行./configure:
cd boa-0.94.13/src/
執行./configure
這是根據configure.in檔案進行一系列的配置,生成config.status,configure,和Makefile檔案。
如果無法執行,考慮許可權,修改該目錄下的configure的屬性為可執行 chmod 755 configure
修改Makefile:
修改CC = gcc 為 CC = arm-linux-gcc
修改CPP = gcc -E 為 CC = arm-linux-gcc -E
make編譯:
為生成的二進位制檔案boa瘦身:
arm-linux-strip boa
ls -l boa
-rwxr-xr-x 1 david david 61052 2009-05-31 13:51 boa
可以發現boa的大小前後差距很大這為我們節省了很大的空間
Boa的配置(修改boa.conf檔案):
vi boa.conf, //幾乎全部指定到boa的目錄下,這樣方便我們進行管理
重新指定一些檔案的生成路徑,因為重新指定這些路徑後會幫助我們深刻的理解關於boa伺服器的工作機制
Port 80
User 0
Group 0
# bind呼叫的IP地址,一般註釋掉,表明繫結到INADDR_ANY,通配於伺服器的所有IP地址
#Listen 192.68.0.5
##### error_log和access_log會自動生成,只要指定生成路徑就可以了。
ErrorLog /boa/log/error_log
AccessLog /boa/log/access_log
##### 存放HTML檔案的根路徑
DocumentRoot /boa/www
UserDir public_html
##### 預設頁面,若輸入http://127.0.0.1/則會自動返回給瀏覽器預設頁面index.html
DirectoryIndex index.html
##### 保持預設
DirectoryMaker /boa/boa_indexer //被修改
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /boa/mime.types //被修改
DefaultType text/plain
#####指定傳給cgi程式的PATH環境變數
CGIPath /bin:/usr/bin:/usr/local/bin
#####保持預設
Alias /doc /usr/doc
#####如果輸入http://127.0.0.1/cgi-bin/test.cgi, 則boa伺服器會到/boa/cgi-bin中尋找test.cgi程式。
ScriptAlias /cgi-bin/ /boa/cgi-bin/
建立安裝目錄:
mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
將需要的檔案複製到安裝目錄中
將boa-0.94.13/src目錄下生成的boa、boa_indexer二進位制檔案複製到/boa下
將boa-0.04.13目錄下的boa.conf檔案複製到/boa下
將/etc/mime.types複製到/boa目錄下
此時整個boa伺服器移植完成,但是還需要測試boa伺服器是否移植成功
測試boa伺服器移植是否成功:
需要用到cgi檔案 和 html檔案(都是測試檔案,可以自己寫);也可以網上下載。
cgi檔案下載:連結:https://pan.baidu.com/s/1k_tYw1D3alir_X-uCN9Jeg 密碼:cksr
html檔案下載:連結:https://pan.baidu.com/s/1bwRGrI8JjKrTILX8nwbSLg 密碼:3bx5
將解壓得到的cgi-bin目錄(存放cgi相關的檔案)和www目錄(存放html相關的檔案)直接覆蓋boa伺服器中的cgi-bin和www目錄
板子上電,啟動boa伺服器
在虛擬機器的瀏覽器中輸入板子的ip地址,可以看到測試網頁正常開啟,此時boa伺服器才真正的移植成功
二、在板子和網頁上實現自己想要的功能
將自己編寫的html檔案新增到boa伺服器的www目錄中
html檔案下載地址:連結:https://pan.baidu.com/s/15djVWst0fvbTLMeWC1i-Fg 密碼:suho
解壓得到的www目錄可以直接覆蓋boa伺服器中的www目錄,也可以一個一個的複製過去:
下載CGIC庫(CGIC是一個功能比較強大的支援CGI開發的標準C庫,並支援Linux, Unix 和Windows等多作業系統)
連結:https://pan.baidu.com/s/1ZH7ErIzbi0UXGsb0tMTmpA 密碼:rorq
# tar xzf cgic205.tar.gz
# cd cgic205
搭建交叉編譯環境(預設x86平臺)
修改Makefile檔案,找到CC=gcc,將其改成CC=arm-linux-gcc,
找到AR=ar,將其改成AR=arm-linux-ar,
找到RANLIB=ranlib,將其改成RANLIB=arm-linux-ranlib。
找到gcc cgictest.o -o cgictest.cgi ${LIBS},將其改成$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},
找到gcc capture.o -o capture ${LIBS},將其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS},
儲存退出。
修改後的Makefile
CFLAGS=-g -Wall
#CROSS_COMPILE=
CROSS_COMPILE=arm-linux-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
RANLIB=$(CROSS_COMPILE)ranlib
LIBS=-L./ -lcgic
all: libcgic.a cgictest.cgi capture
install: libcgic.a //可以執行 make install 命令 目標
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 //libcgic.a 依賴於 cgic.c 和 cgic.h
rm -f libcgic.a
$(AR) rc libcgic.a cgic.o //一個歸檔命令 ar rc libcgic.a
$(RANLIB) libcgic.a //“ranlib”來對靜態庫的符號索引表進行更新。
#mingw32 and cygwin users: replace .cgi with .exe
cgictest.cgi: cgictest.o libcgic.a
$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}
#gcc cgictest.o -o cgictest.cgi ${LIBS}
capture: capture.o libcgic.a
$(CC) $(CFLAGS) capture.o -o capture ${LIBS}
#gcc capture.o -o capture ${LIBS}
clean:
rm -f *.o *.a cgictest.cgi capture
根據Makefile編譯可以看出,有兩個拷貝的過程: cp libcgic.a /usr/local/lib cp cgic.h /usr/local/include
兩個命令的學習:
ar命令可以用來建立、修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,
裡面包含了按照特定的結構組織起來的其它的一些檔案(稱做此庫檔案的member)。
原始檔案的內容、模式、時間戳、屬主、組等屬性都保留在庫檔案中。
cgi檔案分析
cd cgic205-arm
裡面有大約10個檔案:
cgic.h:標頭檔案;
cgic.c:CGIC的原始碼檔案;
cgictest.c:CGIC庫的作者提供的一個CGI程式例子;
capture.c:用於除錯CGI程式的工具;
Makefile:安裝CGIC的指令碼檔案;
可以看到,整個庫實際上就是cgic.c一個檔案,可以說是非常的精煉。
可以把CGIC安裝為作業系統的一個動態連結庫,這樣我們每次編譯的時候,就不需要有cgic.c這個原始檔了。
但是由於需要(以後將會看到),我們將修改cgic.c程式碼,所以我們不把它安裝進系統。每次編譯的時候,只要把cgic.c和cgic.h放到當前資料夾就好了。
make編譯cgi原始碼
make得到的CGIC庫libcgic.a,我們通過除錯輔助程式capture和測試程式cgictest.cgi,來驗證生成CGIC庫的正確性。
將capture和cgictest.cgi拷貝到主機的/nfs/rootfs/boa/cgi-bin目錄下。
cp capture cgictest.cgi /nfs/rootfs/boa/cgi-bin
注:本人實際測試時的目錄為 /nfs/rootfs/boa/cgi-bin,可根據自己的實際 情況更改目錄。
測試安裝:
在開始編寫你自己的CGI程式之前,一定要先走通他的例子程式,免得後來程式出錯的時候還不知道是配置有問題,還是你的程式程式碼有問題。
我們用他自帶cgictest.c來實現自己的第一個C語言CGI程式。
先執行boa伺服器
再虛擬機器的瀏覽器位址列輸入http://192.168.31.66/cgi-bin/cgictest.cgi
測試地址為板子的實際ip地址。
可以看到頁面,表示CGIC庫和測試指令碼都移植成功。cgictest.cgi比較完整的展現了CGIC庫的功能,
在開發基於CGIC庫的CGI程式前最好先掌握cgictest.cgi程式,這個應用程式是十分重要的參考範例。
將自己編寫的C語言CGI程式拷貝到CGIC庫中
連結:https://pan.baidu.com/s/1Y4m7aOHnOAcylmEO4xOtMg 密碼:wkgr
其中Makefile檔案直接覆蓋即可
修改Makefile檔案的拷貝路徑(改為自己的路徑)
make編譯,如果CGIC庫中沒有out目錄,則新建
make install將生成的cgi檔案移動到out目錄,然後再將out目錄下的cgi檔案拷貝到boa伺服器的cgi-bin檔案中
將自己編寫的c程式編譯生成板子可執行的檔案:
編寫的c程式下載連結:https://pan.baidu.com/s/1SUctszfKDrvWdrqPi0tFCQ 密碼:kz78
make
將生成的可執行檔案smart_storage拷貝到 /nfs/rootfs/目錄下
板子上電,後臺執行可執行檔案smart_storage 和 boa 伺服器
虛擬機器的瀏覽器中輸入板子的ip地址,網頁正常彈出,但是點選登入不能進入登入之後的頁面
修改login.c檔案中的ip地址,將ip地址改為板子的實際ip地址
重新拷貝cgi相關檔案到cgi-bin目錄下
再次點選登入,即可正常跳轉