关键字: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代码生成页面的优点是灵活,但是却牺牲了友好性,因为不到开始运行程序的最后一刻,你不可能知道这个页面看起来会是个什么样子。相比之下,第二种方法更加直观,你可以使用你所喜欢的工具以所见即所得的方式编辑页面,在必要的地方添加占位符,运行时它们会被动态产生的数据代替。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中的标签为例,此标签的目的是为了显示系统当前正在运行的进程的信息。获取进程信息实际上是由位于ui.c中的UpdateProcInfo函数完成的,详见清单2,它负责获取系统进程信息,并格式化为HTML输出。清单3中的websAspDefine函数将标签与UpdateProcInfo函数关联起来,这样当GoAhead解析home.asp页面遇到标签时,控制权就会跳转到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(省略了其它无关的部分,细节请参考附带源代码)

//清单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语句时,请使用
而不是\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.

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

goahead如何使用cgi服务_利用GoAhead构建嵌入式web应用相关推荐

  1. goahead如何使用cgi服务_北斗导航系统现已提供全球服务!你知道如何使用这个服务吗?...

    在11月份的时候,我国传来了一个好消息,北斗导航全球组网成功!这意味着我国23年的努力没有白费,取得了圆满的成功.此项研究成果也迅速让中国的国际地位提高,很多国家都想和我们谈生意,一起参加北斗导航系统 ...

  2. goahead如何使用cgi服务_GoAhead Web Server的特性及技术

    最近一段时间,一直在搞嵌入式开发,公司一产品需要升级改造,结果发现应用的是Linux平台和GoAhead的web服务器,所以经过多方的了解,现把总结内容总结一下,大家一起和我来学习GoAhead吧. ...

  3. 密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)

    密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码) 3.    AES实验 3)    (思考题)利用Sage构建AES的S盒和逆S盒 ...

  4. 利用Yocto构建嵌入式Linux教程01--第一个Yocto项目构建

    大家好,从今日开始,计划写一个利用Yocto构建嵌入式Linux的教程,算是对个人工作和学习的一个总结. 本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 ( ...

  5. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  6. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  7. goahead如何使用cgi服务_QQ如何设置使用代理服务器?

    很多人可能会问了,QQ上可以设置代理服务器吗?答案是可以的.今天就为大家详细介绍一下,如何在QQ上设置代理服务器的. 1.双击QQ图标,打开QQ登录界面,我们就可以看到界面右上角有一个"设置 ...

  8. arcgis 散瓦片发布服务_利用已有的缓存地图文件发布ArcGIS Server瓦片服务

    1.拷贝缓存地图文件夹至ArcGIS Server缓存目录. 2.确认缓存文件夹目录结构,如果不是如下文件目录结构,可手动调整. 注意,Layers的上一级目录,建议直接以服务名来命名. 3.ArcM ...

  9. python写炒股软件_利用 Python 构建自己的股票投资系统

    前言 自从上世纪 70 年代废除金本位,完全进入法定货币时代,我们可以明确的感知到,现金是这个时代少有的 100% 确定亏损的资产.国内的物价,相比 10 年前,大致涨了 5 倍左右,相比 30 年前 ...

  10. rest web服务_在WildFly的REST Web服务中与Jackson的双向关系

    rest web服务 这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例. 假设我们在两个实体Parent和Child之间存在双向关系. 使用MySQL工作台为这两个表生成 ...

最新文章

  1. linux下查看和添加PATH环境变量
  2. oracle 前导列_通过 PL/SQL Developer (Oracle)-数据库(26)
  3. 洪嘉振 计算多体系统动力学pdf_如何在多体动力学模型中评估齿轮啮合刚度
  4. 自定义ArrayList
  5. The operation of Debian is much
  6. bs4用法实例:用Python爬取金融市场数据
  7. [导入]Asp.net页面的生命周期之通俗理解
  8. (6)Python集合
  9. vector::erase()的那些事儿
  10. 版本控制软件Git的使用(小白版)
  11. android瀑布流插件,jQuery瀑布流插件 Masonry
  12. android 调出键盘表情_Android-表情键盘的制作
  13. 第9章 保护Web应用----概念梳理
  14. java正则提取字符串中的符号汉字数字字母
  15. CAD图导入SU中一次成面的方法
  16. 一款APP,秒杀50+视频平台VIP!
  17. 华为OD机试真题 Python 实现【模拟商场优惠打折II】【2023 Q1 | 100分】
  18. Echart API
  19. 如何用matlab将彩色图片转为单通道绿色图片
  20. 《计算机系统与维护》— 计算机硬件的组成

热门文章

  1. 得物(毒)app测试开发工程师面经
  2. mysql 2037年_Correct way to store MySQL date after year 2037
  3. matlab 求反余弦,matlab中反余弦函数
  4. PHP基础PPT课件,《php基础》PPT课件.ppt
  5. 12个不容错过的Vue UI 组件库
  6. IDEA 设置 vue 支持开发
  7. QPainter详解
  8. Premiere Pro CC2018安装资料及安装教程
  9. 计算机sci论文中的图,一篇计算机sci论文的发表过程
  10. linux 怎么连接到网络打印机,如何在网络上的Windows,Mac和Linux PC之间共享打印机...