① BOA伺服器與CGI
BOA伺服器與CGI是嵌入式設備管理與交互中基於Web方式應用的關鍵組件。本文深入探討了BOA伺服器與CGI的工作原理,包括其功能、通信機制以及如何在HTML中實現與伺服器的交互。
BOA伺服器是一款輕量級、高性能的單任務Unix/linux嵌入式Web伺服器,體積小巧,僅執行代碼約60KB。它支持CGI功能,能夠為CGI程序創建新的進程以執行特定請求。在互聯嵌入式設備之間進行信息交互時,BOA伺服器作為橋梁,通過HTTP超文本傳輸協議將Web網頁作為基本傳輸單元,實現信息的接收、處理和反饋。瀏覽器通過SOCKET連接與BOA伺服器建立通信,以GET或POST參數提交請求,伺服器根據請求類型處理事務,返回HTML文件或調用外部應用程序,通過CGI介面實現與外部腳本或程序的交互。CGI程序接收請求數據,處理信息後返回結果,伺服器分析結果並將其呈現給客戶端。
伺服器與CGI程序之間的通信基於標准輸入輸出進行,需要環境變數的協作。伺服器接收請求,准備執行CGI程序,CGI程序讀取標准輸入輸出和環境變數,執行處理任務後返回結果。對於Windows系統,可以通過profile文件進行數據傳遞。
HTML中的表單元素用於數據採集,包含處理表單數據的CGI程序URL、數據提交方法、表單域(如文本框、密碼框等)以及表單按鈕。用戶在網頁中填寫表單,按下提交按鈕後,數據通過HTTP協議發送到伺服器端CGI腳本,實現與伺服器的交互。表單元素將用戶輸入的信息提交給伺服器,伺服器執行相應操作。
網頁是HTML文件,包含超文本和超媒體技術,使用HTML、CSS、XML等語言描述元素。網頁內容通過客戶端瀏覽器解析顯示,伺服器將指定網頁發送給瀏覽器。
CGI程序解釋處理來自表單的輸入信息,執行伺服器端操作或返回結果給客戶端。CGI使網頁具有交互功能,用戶與伺服器之間實現雙向通信。CGI程序位於伺服器的www/cgi-bin文件夾內,執行時繼承系統環境變數,用於傳遞Web伺服器、客戶端和CGI傳輸過程等信息。
表單提交方式主要有GET和POST。GET方式將數據保存在QUERY_STRING環境變數中,處理相對簡單;POST方式將數據發送到CGI程序的標准輸入,並通過CONTENT_LENGTH環境變數指示長度。POST方式無長度限制,適用於大量數據傳輸。GET方式數據長度有限制,並可通過URL直接發送。
② 在linux中移植嵌入式Boa伺服器時出錯
第一步完成Boa程序的移植。從www.boa.org下載Boa源碼,當前最新版本為0.94.13,將其解壓並進入源碼目錄的src子目錄
# tar xzf boa-0.94.13.tar.gz
# cd boa-0.94.13/src
生成Makefile文件
# ./configure
修改Makefile文件,找到CC=gcc,將其改成CC = arm-linux-gcc,再找到CPP = gcc –E,將其改成CPP = arm-linux-gcc –E,並保存退出。
然後運行make進行編譯,得到的可執行程序為boa,將調試信息剝去,得到的最後程序只有約60KB大小。
# make
# arm-linux-strip boa
第二步完成Boa的配置,使其能夠支持CGI程序的執行。Boa需要在/etc目錄下建立一個boa目錄,裡面放入Boa的主要配置文件boa.conf。在Boa源碼目錄下已有一個示例boa.conf,可以在其基礎上進行修改,下面解釋一下該文件的含義:
#監聽的埠號,預設都是80,一般無需修改
Port 80
# bind調用的IP地址,一般注釋掉,表明綁定到INADDR_ANY,通配於伺服器的所有IP地址
#Listen 192.68.0.5
#作為哪個用戶運行,即它擁有該用戶的許可權,一般都是nobody,需要/etc/passwd中有
#nobody用戶
User nobody
#作為哪個用戶組運行,即它擁有該用戶組的許可權,一般都是nogroup,需要在/etc/group文
#件中有nogroup組
Group nogroup
#當伺服器發生問題時發送報警的email地址,目前未用,注釋掉
#ServerAdmin root@localhost
#錯誤日誌文件。如果沒有以/開始,則表示從伺服器的根路徑開始。如果不需要錯誤日誌,則用#/dev/null。在下面設置時,注意一定要建立/var/log/boa目錄
ErrorLog /var/log/boa/error_log
#訪問日誌文件。如果沒有以/開始,則表示從伺服器的根路徑開始。如果不需要錯誤日誌,則用#/dev/null或直接注釋掉。在下面設置時,注意一定要建立/var/log/boa目錄
#AccessLog /var/log/boa/access_log
#是否使用本地時間。如果沒有注釋掉,則使用本地時間。注釋掉則使用UTC時間
#UseLocaltime
#是否記錄CGI運行信息,如果沒有注釋掉,則記錄,注釋掉則不記錄
#VerboseCGILogs
#伺服器名字
ServerName www.hyesco.com
#是否啟動虛擬主機功能,即設備可以有多個網路介面,每個介面都可以擁有一個虛擬的Web服
#務器。一般注釋掉,即不需要啟動
#VirtualHost
#非常重要,HTML文檔的主目錄。如果沒有以/開始,則表示從伺服器的根路徑開始。
DocumentRoot /var/www
#如果收到一個用戶請求的話,在用戶主目錄後再增加的目錄名
UserDir public_html
#HTML目錄索引的文件名,也是沒有用戶只指明訪問目錄時返回的文件名
DirectoryIndex index.html
#當HTML目錄沒有索引文件時,用戶只指明訪問目錄時,boa會調用該程序生成索引文件然後
#返回給用戶,因為該過程比較慢最好不執行,可以注釋掉或者給每個HTML目錄加上#DirectoryIndex指明的文件
#DirectoryMaker /usr/lib/boa/boa_indexer
#如果DirectoryIndex不存在,並且DirectoryMaker被注釋,那麼就用Boa自帶的索引
#生成程序來生成目錄的索引文件並輸出到下面目錄,該目錄必須是Boa能讀寫
# DirectoryCache /var/spool/boa/dircache
#一個連接所允許的HTTP持續作用請求最大數目,注釋或設為0都將關閉HTTP持續作用
KeepAliveMax 1000
#HTTP持續作用中伺服器在兩次請求之間等待的時間數,以秒為單位,超時將關閉連接
KeepAliveTimeout 10
#指明mime.types文件位置。如果沒有以/開始,則表示從伺服器的根路徑開始。可以注釋掉
#避免使用mime.types文件,此時需要用AddType在本文件里指明
MimeTypes /etc/mime.types
#文件擴展名沒有或未知的話,使用的預設MIME類型
DefaultType text/plain
#提供CGI程序的PATH環境變數值
CGIPath /bin:/usr/bin:/usr/local/bin
#將文件擴展名和MIME類型關聯起來,和mime.types文件作用一樣。如果用mime.types
#文件,則注釋掉,如果不使用mime.types文件,則必須使用
#AddType application/x-httpd-cgi cgi
#指明文檔重定向路徑
#Redirect /bar http://elsewhere/feh/bar
#為路徑加上別名
Alias /doc /usr/doc
#非常重要,指明CGI腳本的虛擬路徑對應的實際路徑。一般所有的CGI腳本都要放在實際路徑
#里,用戶訪問執行時輸入站點+虛擬路徑+CGI腳本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
用戶可以根據自己需要,對boa.conf進行修改,但必須要保證其他的輔助文件和設置必須和boa.conf里的配置相符,不然Boa就不能正常工作。 在上面的例子中,我們還需要創建日誌文件所在目錄/var/log/boa,創建HTML文檔的主目錄/var/www,將mime.types文件拷貝 到/etc目錄,創建CGI腳本所在目錄/var/www/cgi-bin/。mime.types文件用來指明不同文件擴展名對應的MIME類型,一般 可以直接從Linux主機上拷貝一個,大部分也都是在主機的/etc目錄下。