摘要:详细介绍了开源嵌入式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代码生成页面的优点是灵活,但是却牺牲了友好性,因为不到开始运行程序的最后一刻,你不可能知道这个页面看起来会是个什么样子。相比之下,第二种方法更加直观,你可以使用你所喜欢的工具以所见即所得的方式编辑页面,在必要的地方添加占位符,运行时它们会被动态产生的数据代替。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
文章摘自:
http://www.cnblogs.com/dreamliner/archive/2009/05/30/1492434.html
源码下载地址:
http://download.csdn.net/download/dreamliner/1698985
- 大小: 22.3 KB
分享到:
相关推荐
利用GoAhead构建嵌入式web应用
博文附带的示例源代码http://blog.csdn.net/dreamliner/archive/2009/05/30/4226625.aspx
利用GoAhead构建嵌入式web应用。在wince环境下的handler程序。
GoAhead Web Server构建在设备管理框架(Device Management Framework)之上,用户可以像标准的Web Services一样来部署自己的应用,不需要额外的编程。GoAhead Web Server支持SOAP客户端(Simple Object Access ...
GoAhead Webserver构建在设备管理框架(Device Management Framework)之上,用户可以像标准的Web Services一样来部署自己的应用,不需要额外的编程。GoAhead Webserver支持SOAP客户端(Simple Object Access ...
以煤矿井下电力监控系统为研究对象,在分析井下电力监控系统特点的基础上,搭建了嵌入式Web服务器的硬件平台以及嵌入式Web服务器Go Ahead技术的实现。该设计构建了以ARM和DSP为核心的数据采集系统。同时采用能够满足...
5.1 嵌入式WebServer GoAhead的移植与应用101 5.1.1 嵌入式Web服务器101 5.1.2 GoAhead介绍101 5.1.3 GoAhead在ARM平台上的移植102 5.1.4 页面操作102 实验5.1 嵌入式WebServer GoAhead实验103 5.2 ...
5.1 嵌入式WebServer GoAhead的移植与应用101 5.1.1 嵌入式Web服务器101 5.1.2 GoAhead介绍101 5.1.3 GoAhead在ARM平台上的移植102 5.1.4 页面操作102 实验5.1 嵌入式WebServer GoAhead实验103 5.2 嵌入式Web ...
5.1 嵌入式WebServer GoAhead的移植与应用101 5.1.1 嵌入式Web服务器101 5.1.2 GoAhead介绍101 5.1.3 GoAhead在ARM平台上的移植102 5.1.4 页面操作102 实验5.1 嵌入式WebServer GoAhead实验103 5.2 嵌入式Web ...
5.1 嵌入式WebServer GoAhead的移植与应用101 5.1.1 嵌入式Web服务器101 5.1.2 GoAhead介绍101 5.1.3 GoAhead在ARM平台上的移植102 5.1.4 页面操作102 实验5.1 嵌入式WebServer GoAhead实验103 5.2 嵌入式Web ...
嵌入此GoAhead 3.X 最受欢迎的小型嵌入式Web服务器。发牌有关详细信息,请参见LICENSE.md并阅读:建筑您可以使用Make或MakeMe进行构建。 MakeMe更快,更灵活。 要安装MakeMe,请从下载用make构建: make您可以传递...