gohead 嵌入式服务器

来源:互联网 发布:java 高德地图api 编辑:程序博客网 时间:2024/06/09 18:01
GOHEAD
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过程的使用方法。

GoAhead WebServer采用开放源代码方式,任何人都可以下载、评估并修改代码,目的是为了使GoAhead WebServer成为市场上最领先的嵌入式Web服务器。

支持的平台定制的平台Windows NT/98/95ChorusOSWindows CEpSOSEmbedd LinuxuCOSLinuxIRIXVxWorksHP-UXQNXRTEMSLynx

3、Goahead Web Server 主要特性:
(1)支持ASP;
(2)支持嵌入式JavaScript;
(3)标准的CGI执行;
(4)内存中的CGI处理GoFrom;
(5)扩展的API;
(6)快速响应,每秒可处理差超过50个请求;
(7)完全和标准兼容;
(8)如果不包含SSI,仅要求60K的内存,包含SSI,要求500K内存;
(9)Web页面可以存在ROM或文件系统中;
(10)支持多种操作系统,包括eCos 、Linux 、LynxOS 、QNX 、VxWorks 、WinCE、  pSOS等。

4、ASP技术介绍
    ASP是Microsoft开发的代替CGI脚本的动态服务网页程序,可以实现与数据库和其他程序的交互。ASP程序允许用户使用包括VBScript,javascript等在内的许多已有的脚本语言写ASP应用程序,ASP程序的编制更方便,更灵活。除此之外ASP还具有无编译即可运行,良好的安全性,丰富的内置对象,提供和支持组建功能,瘦客户端等特点。ASP应用程序是在Web服务器上进行解析执行的,而浏览器只是接收和处理HTML流。ASP文件是以“.asp”为扩展名,在传送到浏览器之前用嵌入式脚本插入动态内容。Goahead Web Server支持一个运行时选择脚本引擎的开放式脚本结构。
要创建一个ASP脚本可以使用“<%”和“%>”定界符,例如,下面的JavaScript将在ASP定界符出现的地方,输出“Hello World”。
<h1>Today is <% write("Hello World"); %></h1>当用户浏览器要读取ASP文件时,默认的URL程序通过检查文件的扩展名确定页面是否是ASP文件。出现“ .asp” 为扩展名的文件表示需要ASP处理程序来处理,它通过操作从文件系统或ROM读出。在定界符前的内容被直接复制到发出请求的浏览器,当出现ASP定界符时,定界符之间的内容被传送的相关的脚本引擎执行,执行的结果立刻发送的浏览器,这种处理不断重复直到文件结束。

5、嵌入式JavaScript介绍
    Goahead 开发了一个嵌入式版本的JavaScript叫做 Ejscript 。JavaScript 是一个非常庞大的语言,它的大小不适用于大部分嵌入式设备。Goahead设计了嵌入式JavaScript解决了这个问题。Ejscript 是JavaScript 的一个严格子集,执行了它基本的语言要素。Ejscript 可应用在ASP中更轻易的建立动态网页。
    当JavaScript 用在ASP网页中时,它包含在ASP定界符内,基本格式是:    <% function(arguments, ...); %>
JavaScript脚本能跨过多个“\”字符,用在ASP页面中时,函数参数包含了任何查询变量包括在URL查询串或者是标准变量中定义的。URL 查询串自动解码,JavaScript变量被定义了解码查询值。例如,用下面的代码解析名字和地址编码为一个在URL的查询串:
http://localhost/mypage?name=smith&age=35
int myAspProcedure(webs_t wp, int argc, char_t **argv)
{
   char_t *name = websGetVar(wp, "name", "undefined");
   char_t *age = websGetVar(wp, "age", "undefined");
   websWrite(wp, "Name %s, Age", args);
}
JavaScript 程序用websAspDefine API 注册。这样发布了C程序作为JavaScript的全局变量。例如:
extern int outputMyTable(int ejid, webs_t wp, int argc, char_t **argv);
websAspDefine("outputTable", outputMyTable);
websAspDefine连接了JavaScript的命令“outputTable”和c程序“outputMyTable”。当一个ASP页面被浏览器请求时,任何在ASP脚本中出现的outputTable将调用outputMyTable函数。

6、标准的CGI执行介绍
    CGI(Common Gate Interface)外部应用程序与信息服务器的标准接口,如HTTP或Web服务器。一个纯HTML是静态的只能检索web不能做改变。一个CGI 程序却可是实时的执行输出的动态内容。
CGI脚本可以用任何语言编写,这种语言能够读STDIN,写STDOUT和读环境变量。这意味着可以使用任何脚本语言,包括C,Perl,甚至shell 脚本。
当URL以/cgi-bin开始时,一个新的程序被调用。CGI可执行程序必须放在Web Server cgi-bin子目录里,每一个CGI请求建立一个独立的进程。

 

GoForms™

The GoAhead WebServer implements the standard Common Gateway Interface (CGI) as an in-memory forms processor called GoForms™. Old style CGI processing results in the creation of a new process for every request to a CGI URL. As CGI is often the primary means of implementing user input, this is slow and cumbersome. GoForms is a more suitable solution for embedded systems that demand compact, high performance solutions.

GoAhead WebServer 提供一个标准的普通网管接口作为内存表格处理,我们称之为GoForms.。老版本的CGI处理会导致在对于每一个CGIURL的请求产生一个新的进程。因为CGI通常作为执行用户输入的首要方式,同时它也是缓慢和额繁琐的。嵌入式系统需要一个结构紧凑高性能的的解决方案,而GoForms 就是一个最佳选择。

GoForm procedures run in-memory without creating a new process for each browser connection. By sharing the address space with the GoAhead WebServer, GoForms procedures can directly access the full request context. The GoForm handler also automatically decodes and parses all POST and query data for easy access. A convenient API (see websGetVar) permits easy access to CGI variables.

GoForms 运行在内存中无需给每一个浏览器链接创建一个新的进程。通过与GoAhead WebServer分享地址空间,GoForms 可以直接访问全部请求内容。GoForms 处理程序也会自动的进行解码,继续所有的POST以及查询每一个访问数据。一个合适的API允许简易的访问CGI变量。

GoForms is implemented as a URL Handler which interprets URLs that begin with "/goform". The URL segment following "goform" defines the form name with query details appended to the URL. For example:

/goform/myForm?name=John&age=30          

convenient 用作URL Handler去解释以/goform开头的URLURL段紧跟着goform会定义表格名字附加查询细节。例如:

/goform/myForm?name=John&age=30

This will call the GoForm procedure "myForm" and automatically decode the query string "name=John&age=30" and define GoForm variables called "name" and "age". In addition to POST and query data, the standard CGI variables are also defined.

它将会调用GoForm处理myForm以及动态的解码来查询字符串"name=John&age=30",同时定义GoForm 变量name和age。另外POST、查询数据以及标准的CGI变量也会被定义。

GoForm procedures are defined by the websFormDefine API call and conform to the following prototype:

GoForm 处理过程在websFormDefine  API里被定义。

void myForm(webs_t wp, char_t *path, char_t *query)

{

    websHeader(wp);

    websWrite(wp, "Name %s", websGetVar(wp, "name", ""));

    websWrite(wp,  "Age %s", websGetVar(wp, "age", ""));

    websFooter(wp);

    websDone(wp, 200);

}

The GoForm procedure is responsible for writing the HTTP header and HTML document content back to the user's browser. websHeader creates a standard HTTP header with initial HTML tags. websFooter closes the document with a closing HTML tag. Inside the GoForm procedure, websGetVar, websRedirect, websWrite, and websWriteBlock are some of the most useful API calls.

GoForm 负责写HTTP头和HTML文档的内容,然后返回给用户浏览器。websHeader创建一个标准的HTTP头,附带初始化HTML标志。websFooter 用一个HTML标志来关闭文档。在GoForm 处理过程中,websGetVar,websRedirect, websWrite, and websWriteBlock是非常有用的几个API

 

boa的功能比较齐全, 便对嵌入式应用很多功能就是冗余(如virtual host), 内存使用量较大些.
thttpd 功能较少, 实现简单. 内存使用量较少. 同时比较方便扩展.
shttpd 功能功能算是比较全的, 但在处理二进制数据时不够稳定, 时有异常. 有待观察.
light-httpd, apache 属重量级服务器, 成熟稳定, 体积较大, 在复杂的嵌入式应用上可选用.
goAhead 是个比较专用的 webserver, 大部分功能都在服务它自己提供的 goform 功能和 
      ASP/javascript 功能. 最后的 2.1.8 版仍有不少bug. (见下)
mini-httpd 与 thttpd 是同一家, 功能几乎完全一样.

boa 缺陷: 
(1) 未提供 CGI 解析头处理.
       可按这个地址方便修改. http://bbs.chinaunix.NET/viewthread.PHP?tid=824840
(2) 对 POST 数据使用临时文件缓冲, 对无法创临时文件的小系统系统, 需要手工改下这部代码.
       很多人报告在移植时不能POST 数据, 都是这个原因.
(3) ...

thttpd 缺陷:
(1)   CGI1.1 标准支持不完整(不般影响不大), 未提供对协议要求的其它HTTP头处理, 
      如:If-Modified-Since, Accept-Language等应用程序就收不到.
(2) 直接使用 socket 到 CGI 应用的重定, 会导致提供大量 POST 数据时(如上传文件), 
       CGI应用不读完全部 POST 数据就无法向浏览器应答 bug
(3) ...

goAhead 缺陷:
(1) 专用, 如喜欢它提供的 goform和 asp 令论.
(2) CGI 对二进制输出有很多 bug.
(3) 为实现单一任务处理, 在很平台采用延时轮询接收队列, 处理效率不高.
(4) 其它 bug 有不一罗列了, 移植时要一个个订下.


个人观点, 仅供参考.

uClinux下,主要有三个Web Server:HTTPD、THTTPD和BOA。HTTPD是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI。THTTPD和BOA都支持认证、CGI等,功能都比较全

原创粉丝点击