【发布时间】:2015-09-29 18:07:24
【问题描述】:
我正在使用 FreeRTOS 启动一个新的嵌入式系统设计。我的最后一个使用的是 eCos,它有一个非常轻量级的内置 HTTP 服务器,特别是因为我没有文件系统。简而言之,它的工作方式是每个页面都是一个类似 CGI 的 C 函数,在 HTTP 守护进程需要时调用它。具体来说,您将编写以下形式的函数:
int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
page 是 url 的页面部分,params 是任何表单参数(仅支持 GET,不支持 POST,这会阻止文件上传,从而使烧录 flash 变得很痛苦),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 魔术字符,我会使用另外几个函数来拆分参数并从中生成一个 <ul>,但我把它留给了清晰度。)
服务器本身只是作为一个任务(即线程)运行,只要它的优先级低于关键任务,就不会妨碍它。
不用说,事实证明这对于测试和调试非常宝贵。 (嵌入式工作的一个问题是您通常不能将 XTerm 用作日志。)因此,当 Supreme Programmer 反射性地责备我某些事情不工作时(我猜是阻力最小的路径),我可以拉起网页并显示他向我发送了错误的参数。在集成中节省了大量的调试时间。
所以无论如何......我想知道,有没有类似的东西可以作为一个独立的库使用?我可以链接的东西,注册我的回调,产卵一个线程,让它发挥作用?还是我需要自己动手?我更喜欢 C++,但也可以使用 C 库。
编辑:由于我要对其进行赏金,因此我需要澄清该库需要在开源许可下。
【问题讨论】: