|
1 簡介
廉價的硬件,功能強大的32操作系統,以及無處不在的因特網,它們一起促成了網絡應用和設備的飛速增長。大量的設備連接到網絡上,于是人們希望通過一種通用、熟悉、快捷的方式來訪問和控制它們。嵌入式web服務器正好迎合了這種需求,它們嵌入在網絡設備之中,使用標準的瀏覽器就可以遠程訪問和控制它們。
然而,并不是所有的web服務器都可以擔當如此重任,我們需要的是一個強大,安全,標準的,而且最好是久經考驗的嵌入式web服務器。這里將要介紹的GoAhead嵌入式web服務器能夠滿足所有這些需求,包括西門子,霍尼韋爾,惠普等大型企業都在使用GoAhead。
2 嵌入式web服務器的要求
2.1 易于與設備集成
易于與設備集成包含兩個方面的意思,其一是將Web應用程序集成到實時操作系統,其二是可以在Web應用中輕松訪問硬件功能。由于GoAhead是開放源代碼的,因此這一點不難做到。
2.2 支持將Web頁面存儲在ROM中
許多嵌入式系統并沒有文件系統,因此有必要將web頁面保存到ROM中。GoAhead支持對web頁面進行編譯并將它們鏈接到最終的可執行文件中。
2.3 加密和用戶管理
GoAhead服務器支持使用SSL進行數據加密和認證。同時,它也支持摘要認證機制,一種總是加密密碼的更安全的認證機制。用戶管理功能允許不同的用戶具有不同級別的訪問權限。
除了上述要求之外,是否能夠快速、方便的生成動態頁面是衡量一個嵌入式web服務器的重要指標。GoAhead提供了多種方法編寫動態頁面,包括ASP過程、GoForms過程和embedded JavaScript。GoAhead主要利用ASP過程動態獲取系統信息然后顯示在頁面上,GoForms過程則主要用來處理用戶指令,例如控制設備和修改配置等。下面以一個動態顯示系統當前正在運行的進程信息的小型web應用程序為例,闡述如何利用GoAhead構建嵌入式web應用程序,特別是ASP和GoForms過程的使用方法。
3 動態頁面支持
在嵌入式設備中,大部分web頁面都是動態生成的。生成動態頁面的方法主要有兩種,通過C代碼生成HTML標簽和在HTML頁面中嵌入表達式標簽。直接通過C代碼生成頁面的優點是靈活,但是卻犧牲了友好性,因為不到開始運行程序的最后一刻,你不可能知道這個頁面看起來會是個什么樣子。相比之下,第二種方法更加直觀,你可以使用你所喜歡的工具以所見即所得的方式編輯頁面,在必要的地方添加占位符,運行時它們會被動態產生的數據代替。GoAhead完全支持這兩種方式。
為了方便的創建具有高度交互性的動態網頁,GoAhead提供了ASP過程和GoForms過程兩種武器。它們實際上都與定義在服務器端的某個C函數綁定在一起,只是分工不同,ASP過程用來生成顯示在頁面中的動態數據,而GoForms過程則用來處理用戶輸入和修改設置,它們一起構成了GoAhead的核心。
3.1 ASP過程
ASP最初用于IIS中,它是微軟開發的生成動態Web頁面的服務器端技術?,F在已經被移植到包括GoAhead的各種平臺中,使用ASP的網頁的后綴一般為“.ASP”。為了在Web頁面中嵌入ASP腳本,只需使用特殊的標簽“<%” 和 “%>”將腳本包裹起來。之所以使用ASP標簽目的是為了向用戶顯示動態內容,例如系統進程信息等。因為動態內容實際上是在執行特定的C函數生成的,所以需要將web頁面中的ASP標簽與特定的C函數聯系在一起。一般,整個過程大致可以分成以下三個步驟:
1. 設計web頁面,動態內容使用特定的ASP過程名替代,也稱其為一個占位符。
2. 在某個.c文件中定義與ASP過程對應的C函數
3. 在main.c文件中的initWebs函數中使用websASPDefine注冊ASP過程
以清單1中的<% UpdateProcInfor(); %>標簽為例,此標簽的目的是為了顯示系統當前正在運行的進程的信息。獲取進程信息實際上是由位于ui.c中的UpdateProcInfo函數完成的,詳見清單2,它負責獲取系統進程信息,并格式化為HTML輸出。清單3中的websASPDefine函數將<% UpdateProcInfor(); %>標簽與UpdateProcInfo函數關聯起來,這樣當GoAhead解析home.ASP頁面遇到<% UpdateProcInfor(); %>標簽時,控制權就會跳轉到UpdateProcInfor()函數,在輸出以HTML格式表示的進程信息后,控制權轉交給GoAhead繼續解析home.ASP頁面。
注意:ASP過程必須符合原型:int ASPProcName (int ejid, webs_t wp, int argc, chart_t **argv);
其中,ejid參數作為JavaScript解釋器句柄可以用來調用JavaScript相關函數,例如ejGetVar和ejSetResult。wp參數作為瀏覽器連接的句柄,可以用來調用很多有用的GoAhead服務器函數,例如用來輸出HTML語句的websWrite等。argc和argv包含傳遞給ASP過程的實參的個數和內容。
//清單1:home.ASP(省略了其它無關的部分,細節請參考附帶源代碼)
<html>
<head>
<% WriteMetaElement(); %>
</head>
…
<form action="/goform/UpdateConfig" method="post">
<input type="text" name="interval" value="" size="7" />
<input type="submit" name="ok" value="Update" />
<input type="reset" name="cancel" value="Reset" />
</form>
<% UpdateProcInfo(); %>
</html>
//清單2:ui.c
#include "ui.h"
#include "../webs.h"
//以HTML格式輸出系統當前進程信息
int UpdateProcInfo(int ejid, webs_t wp, int argc, char_t *argv)
{
return WriteProcPage(wp);
}
//根據用戶輸入改變刷新間隔時間設置
void UpdateConfig(webs_t wp, char_t *path, char_t *query)
{
int tmpInterval=_ttoi(websGetVar(wp, L"interval", L"-1"));
if(tmpInterval>3)
{
s_interval=tmpInterval;
}
websRedirect(wp, L"home.ASP");
}
//清單3:main.c文件中的initWebs()函數
#include "ui.h"
//關聯ASP標簽和C函數名字
websASPDefine(T("UpdateProcInfo"), UpdateProcInfo);
websASPDefine(T("WriteMetaElement"), WriteMetaElement);
//關聯GoForms標簽和C函數名字
websFormDefine(T("UpdateConfig"), UpdateConfig);
it知識庫:利用GoAhead構建嵌入式web應用,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。