我正在使用FreeRTOS启动新的嵌入式系统设计。我的最后一个使用了eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统。简而言之,它的工作方式是每个页面都是类似CGI的C函数,在HTTP守护程序需要时调用它。具体来说,您可以编写以下形式的函数:
int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
其中page
是网址的页面部分,params
是任何表单参数(仅支持GET,而不支持POST,这会阻止文件上传,从而使闪存变得很麻烦),{ {1}}是在注册函数时设置的标记,因此您可以使用相同的函数为多个URL或具有不同数据的范围提供服务,uData
是您编写HTTP响应的文件句柄(标题和全部)到。
然后您通过以下方式注册了该功能:
resp
其中CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
是一个宏,其中第一个参数是变量名,第二个是页面URL(允许CYG_HTTPD_TABLE_ENTRY
通配符;因此*
传递给{{1} }),第三个是函数指针,最后一个是page
值。
这是一个简单的例子:
MyWebPage()
(实际上,uData
将通过一个函数传递以逃避HTML魔术字符,并且我会使用另外几个函数来分割参数并从中创建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);
,但是我为了清楚起见,将其留下了。)
服务器本身只是作为一个任务(即线程)运行,只要它的优先级低于关键任务,就不会妨碍它。
毋庸置疑,这对于测试和调试来说非常宝贵。 (嵌入式工作的一个问题是你通常不能将XTerm作为日志使用。)因此,当Supreme Programmer反复指责我没有工作的东西时(我猜是阻力最小的路径),我可以把网页并显示他向我发送了错误的参数。在集成中节省了大量的调试时间。
所以无论如何... 我想知道,有没有这样的东西作为一个独立的库?我可以链接的东西,注册我的回调,产卵一个线程,让它做魔术?或者我需要自己动手?我更喜欢C ++,但也可以使用C库。
编辑:由于我正在为此付出代价,我需要澄清该库需要在开源许可下。答案 0 :(得分:4)
我建议您查看嵌入式Web服务器libmicrohttpd:
它小而快,具有简单的C API,支持多线程,适用于嵌入式系统,支持POST,可选支持SSL / TLS,并且可以在LGPL或eCos许可下使用(取决于)。我相信这符合您的所有要求。如果你愿意,用C ++包装它将是微不足道的。
答案 1 :(得分:2)
答案 2 :(得分:0)
我不熟悉FreeRTOS以及它如何支持TCP / IP和套接字,所以我不能肯定地说,但你可能想看一下GoAhead网络服务器。 http://embedthis.com/goahead/
答案 3 :(得分:0)
http://www.ibm.com/developerworks/systems/library/es-nweb/index.html
看来你究竟是在追求什么。我需要进行少量的重写以使其在FreeRTOS下运行,但它是一个非常小巧,非常轻量级的Web服务器。