利用GoAhead構建嵌入式web應用

來源:互聯網
上載者:User
利用GoAhead構建嵌入式web應用關鍵字:GoAhead, 嵌入式web伺服器, web應用

摘要:詳細介紹了開源嵌入式web伺服器GoAhead的原理,並結合具體執行個體說明如何利用它構建嵌入式web應用。

Key words: GoAhead, embedded web server, web application

Abstract: This paper introduces the principle of open source embedded web server GoAhead, and explains how to build embedded web application using GoAhead combined with practical examples.

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代碼產生頁面的優點是靈活,但是卻犧牲了友好性,因為不到開始運行程式的最後一刻,你不可能知道這個頁面看起來會是個什麼樣子。相比之下,第二種方法更加直觀,你可以使用你所喜歡的工具以所見即所得 (WYSIWYG)的方式編輯頁面,在必要的地方添加預留位置,運行時它們會被動態產生的資料代替。GoAhead完全支援這兩種方式。

為了方便的建立具有高度互動性的動態網頁,GoAhead提供了asp過程和GoForms過程兩種武器。它們實際上都與定義在伺服器端的某個C函數綁定在一起,只是分工不同,asp過程用來產生顯示在頁面中的動態資料,而GoForms過程則用來處理使用者輸入和修改設定,它們一起構成了GoAhead的核心。

3.1 ASP過程

ASP最初用於IIS中,它是微軟開發的產生動態Web頁面的伺服器端技術。現在已經被移植到包括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);

3.2 GoForms過程

GoAhead實現了稱為GoForms的標準的通用閘道介面(CGI)處理使用者提交的表單。與傳統的CGI方法不同,GoForms過程不是為每個瀏覽器串連都建立一個新的進程,而是通過與GoAhead伺服器共用地址空間,於是可以直接存取全部的請求上下文。GoForms處理器可以自動解析和訪問所有的POST和查詢資料,它也提供了一組API可以輕鬆訪問CGI變數。

GoForms過程與ASP過程不同,它主要用來響應使用者輸入以更新系統設定或者執行特定的動作。在GoAhead中,GoForms實現為一個URL處理器,它會解釋以"/goform"開始的URLs。緊跟著"goform"之後的字串定義了表單名字和使用者請求的細節。例如:“/goform/ UpdateConfig?interval=5”這個請求表示調用GoForms過程" UpdateConfig ",GoForms變數interval表示使用者佈建的新重新整理間隔時間。GoAhead對ASP過程和GoForms過程的處理十分類似,只是GoForms過程通過websFormDefine函數調用進行關聯,並且必須遵守原型“void GoFormsProcName(webs_t wp, char_t *path, char_t *query);”。完整的GoForms過程樣本請參考列表1-3中的用來處理使用者請求的UpdateConfig過程。

3.3 ROM化網頁

對於具有檔案系統的嵌入式作業系統來說,可以將web應用中用到的各種資源,例如html檔案、圖片、css檔案以及exe檔案直接以檔案的形式儲存起來。除此以外還存在大量的不具備檔案系統的嵌入式作業系統,此時可以利用GoAhead的ROM化功能將所有資源整合到可執行檔中。首先在E:\GoAhead目錄下建立一個files.txt檔案,將web應用中使用到的所有資源及其路徑都儲存在這個檔案中,如清單4所示:

//清單4:files.txt檔案

E:\GoAhead\home.asp

E:\GoAhead\graphics\topbar.gif

E:\GoAhead\style\base.css

然後構建webcomp工程產生webcomp.exe。在命令列中輸入命令“webcomp E:\GoAhead files.txt >webrom.c”,此命令的目的是依次將files.txt中的每個資源檔都轉換為一個unsigned char數組,並將這些數組添加到自動產生的webrom.c源檔案中。最後,只需在webs工程中定義宏WEBS_PAGE_ROM以使能ROM化網頁功能,同時使用產生的webrom.c替換webs工程中的原始webrom.c,重新構建webs工程,這樣在產生的webs.exe中就包含了運行web應用所需的全部資源,大大簡化了部署過程。

3.4 測試web應用程式

運行webs.exe啟動GoAhead web伺服器,開啟瀏覽器在地址欄輸入http://localhost。預設情況下會自動開啟home.asp頁面,1所示。

圖1 GoAhead伺服器測試頁面

4 結語

GoAhead已經被成功的移植到HP-UX, Windows CE, pSOS, QNX, IRIX, uCOS, eCOS, chorus 和 RTEMS等眾多作業系統中。本文之所以使用Windows平台上GoAhead移植為例進行說明,一方面每個讀者都可以運行附帶的原始碼親自進行實驗以加深印象,另一方面也可以省略複雜的平台介紹,從而重點掌握GoAhead本身的功能與特點。

筆者在利用GoAhead構建遠程監控等嵌入式web應用的過程中,發現有必要對GoAhead特有的一些編程技巧加以說明以少走彎路。GoAhead定義了宏T(x),可以根據是否定義了宏UNICODE使字串在Unicode和ANSI之間自由切換。當使用websWrite函數輸出HTML語句時,請使用<br />而不是\n輸出分行符號。GoAhead中的一些選項,例如預設頁、連接埠號碼和重試次數等,都可以進行配置以適應自己的應用程式。另外如果希望為使用者提供更加豐富的使用者體驗,可以考慮使用Java Applet技術。

5 參考文獻

1. Anthony J. Massa. Integrating GoAhead WebServer & eCos: Web-based remote management for small systems, http://www.ddj.com/mobile/184405201.

2. GoAhead Overview. http://www.goahead.com/products/webserver/default.aspx

3. Functionality Overview of an Open Source Embedded Web Server. http://data.goahead.com/webserver/WebServer2.1wp5-00.doc

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.