利用GoAhead构建嵌入式web应用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 需求背景
• 廉价的硬件,功能强大的32操作系统,以及无处不在的因特网, 它们一起促成了网络应用和设备的飞速增长。大量的设备连接到 网络上,于是人们希望通过一种通用、熟悉、快捷的方式来访问 和控制它们。嵌入式web服务器正好迎合了这种需求,它们嵌入 在网络设备之中,使用标准的浏览器就可以远程访问和控制它们。
为了方便的创建具有高度交互性的动态网页goahead提供了asp过程和goforms函数绑定在一起只是分工不同asp过程用来生成显示在页面中的动态数据而goforms过程则用来处理用户输入和修改设置它们一起构成了goahead的核心
利用GoAhead构建嵌入 式web应用
培训的目的和要求
• 1、能够使用goahead构建嵌入式web服 务器 • 2、掌握和网页通信的方法 • 3、能把goahead的使用封装成一个类
• //清单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>
• • • •
//清单3:main.c文件中的initWebs()函数 #include "ui.h" //关联asp标签和C函数名字 websAspDefine(T("UpdateProcInfo"), UpdateProcInfo); • websAspDefine(T("WriteMetaElement"), WriteMetaElement); • //关联GoForms标签和C函数名字 • websFormDefine(T("UpdateConfig"), UpdateConfig);
• 然而,并不是所有的web服务器都可以担当如此重任,我们需要 的是一个强大,安全,标准的,而且最好是久经考验的嵌入式 web服务器。这里将要介绍的GoAhead嵌入式web服务器能够满 足所有这些需求,包括西门子,霍尼韦尔,惠普等大型企业都在 使用GoAhead。
2 嵌入式web服务器的要求
• 2.1 易于与设备集成 • 易于与设备集成包含两个方面的意思,其一是将Web 应用程序集成到实时操作系统,其二是可以在Web应 用中轻松访问硬件功能。由于GoAhead是开放源代码 的,因此这一点不难做到。
• 3.3 ROM化网页
• 对于具有文件系统的嵌入式操作系统来说,可 以将web应用中用到的各种资源,例如html文 件、图片、css文件以及exe文件直接以文件 的形式保存起来。除此以外还存在大量的不具 备文件系统的嵌入式操作系统,此时可以利用 GoAhead的ROM化功能将所有资源集成到可 执行文件中。首先在E:\GoAhead目录下创建 一个files.txt文件,将web应用中使用到的所 有资源及其路径都保存在这个文件中,如清单 4所示:
• • • • • • • • • • • • • • • • • •
//清单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=atoi(websGetVar(wp, "interval", "-1")); if(tmpInterval>3) { s_interval=tmpInterval; } websRedirect(wp, L"home.asp"); }
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过程的实参的个数和内容。
5 源码分析和例子
• 1、goahead2.5.pdf • 2、myGoahead
• 3.4 测试web应用程序 • 运行webs.exe启动GoAhead web服务 器,打开浏览器在地址栏输入 http://localhost。默认情况下会自动 打开home.asp页面,如图1所示。
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技术。
• 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过程。
• 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过程的使用方法。