2010-02-26 100 views
7

我正在使用FreeRTOS启动一个新的嵌入式系统设计。我最后一个使用eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统。简而言之,它的工作方式是每个页面都是一个类似CGI的C函数,在HTTP守护程序需要时调用它。具体来说,你会写形式的函数:线程中的C或C++ HTTP守护进程?

int MyWebPage(FILE* resp, const char* page, const char* params, void* uData); 

其中page是URL的网页部分,params是任何形式的参数(只得到了支持,而不是帖子,这阻止文件上传,从而制成燃烧闪痛),uData是当你注册的功能设置通过一个道理,所以你可以有同样的功能服务于多个URL或用不同的数据范围和resp是你写的HTTP响应文件句柄(头和全部)。

然后你注册的函数:

CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0); 

其中CYG_HTTPD_TABLE_ENTRY是一个宏观的,其中第一个参数是一个变量名,第二个是页面URL(该*通配符是允许的;因此page获得通过,以MyWebPage()),第三个是函数指针,最后一个是uData值。

所以一个简单的例子:

int HelloWorldPage(FILE* resp, const char*, const char* params, void*) 
{ 
    fprintf("Content-Type: text/html;\n\n"); 
    fprintf("<html><head><title>Hello World!</title></head>\n"); 
    fprintf("<body>\n"); 
    fprintf("<h1>Hello, World!</h1>\n"); 
    fprintf("<p>You passed in: %s</p>\n", params); 
    fprintf("</body></html>\n"); 
} 
CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0); 

(实际上,params会通过函数传递逃脱魔术HTML字符,我会用另一对夫妇的功能分裂PARAMS,并作出<ul>出来这一点,但是我离开是出于对清晰度。)

本身只是跑了作为一个任务(即线程),并在方式没有得到,只要它比关键任务的优先级较低的服务器。

不用说,有这个证明是非常宝贵的测试和调试。 (内嵌工作的一个问题是,你一般不能折腾一个xterm作为日志使用。)所以,当最高法院程序员本能地指责我的东西不工作(阻力最小的路径,我猜),我能拉起网页,并显示他给我发送了糟糕的参数。在整合过程中节省了很多调试时间。

所以无论如何...我在想,是否有这样的东西可以作为一个独立的图书馆?我可以链接的东西,注册我的回调,产生一个线程,并让它做魔术?或者我需要开始自己的?我更喜欢C++,但也可以使用C库。

编辑:由于我把一个赏金就可以了,我需要澄清的是,库将需要在开放源代码许可证。

回答

4

我建议你看看libmicrohttpd,嵌入式Web服务器:

它体积小速度快,有一个简单的C API,支持多线程,是适合于嵌入式系统,支持POST,可选支持SSL/TLS,并且可以使用LGPL或eCos许可(取决于)。我相信这符合您的所有要求。如果你喜欢,用C++封装将会很简单。

0

我不熟悉FreeRTOS操作系统,以及它如何支持TCP/IP和插座,所以我不能肯定地说,但你可能想看看的GoAhead Web服务器。 http://embedthis.com/goahead/

+0

FreeRTOS不提供自己的IP堆栈,但它确实支持LwIP和uIP。基本上,我会很好的支持类似套接字API的库,或者如果库需要我编写一些“发送这些字节”和“接收这些字节”的函数。 – 2010-02-26 19:30:06

0

http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

似乎正是你所追求的。您需要做少量的重写操作才能让它在FreeRTOS下运行,但它是一个非常小巧,非常轻量级的Web服务器。

+0

从该页面:“仅限静态页面”。我正在寻找动态页面支持(GET和POST,后者需要支持智能闪存上传)。无论如何,这比从头开始要好。 – 2010-03-02 12:38:09

2

Mongoose根据GPLv2获得许可,并且是轻量级的(只有一个C文件很容易包含到新项目中)。它将在单独的线程中运行并支持回调。

+0

看起来非常接近。我需要查看源代码,看看它是否会在

中扼杀。其他缺点是它启动了你的线程(假设我假设POSIX.4a?),但这应该不是一个大问题。 – 2010-03-02 21:58:41