2011-03-29 81 views
0

我已经看到允许通过http访问的应用程序(如我的路由器)。这个工作到底如何?我猜测那里有一个接受http的嵌入式web服务器,但是在那之后它又是如何工作的?是否有某种应用程序服务器解析命令并配置传入端口等?我在哪里可以了解更多关于这种事情的工作原理? 谢谢你的时间。嵌入式Web服务器如何控制其硬件?

+3

它为什么会与非嵌入式Web服务器有什么不同? – 2011-03-29 20:40:09

+0

其实,你的问题让我从一个完全不同的角度思考这个问题。 – Rod 2011-03-29 20:44:13

回答

0

Web服务器是一个非常流行的嵌入式系统项目。大多数路由器比你可能意识到的更强大,而且很多人破解了这些。您也可以通过编程微控制器并将其与ENC28J60等以太网芯片接口来构建您自己的微控制器。您可以使用小型8位微控制器(如PIC和AVR微控制器)构建迷你Web服务器。

因此,要开始使用,请查看业余爱好者正在使用的各种微控制器并跳转到教程。

0

您可以找到以几乎任何语言编写的非常基本的Web服务器的源代码。你甚至可以用awk和netcat来实现一个非常基本的web服务器。 :)

嵌入式系统(取决于它是什么)可能具有网络堆栈,就像任何其他网络堆栈一样,将消息传递到解析它们的服务器。许多嵌入式系统肯定没有一个功能齐全的网络服务器,包括模块等等(例如完整的Apache/PHP/mod_rewrite/SSL/etc)。但HTTP并不一定需要所有这些。 :)

2

YouTube视频“用于硬实时系统的lwIP TCP/IP堆栈”(http://www.youtube.com/watch?v=MBk5wJ_8jEc)显示了基于开源lwIP TCP/IP堆栈的嵌入式HTTP服务器。您将看到嵌入式设备提供的网页以及嵌入式HTTP服务器的一些简洁功能,如服务器端包含(SSI)和通用网关接口(CGI)。 SSI允许您即时生成网页的一部分。这样嵌入式目标就可以生成动态变化的内容。 CGI允许从浏览器(HTTP客户端)到嵌入式目标的通信。这样你可以更新或改变目标。这两个功能一起使您可以使用标准Web浏览器作为嵌入式设备的远程用户界面。没有任何脚本在浏览器中运行,这都是可能的。

当然,您还可以使用浏览器中的可执行内容(例如JavaScript,Java applet或其他)与TCP/IP或UDP/IP上的目标进行通信。

上述视频还显示了其他有用的功能,如目标动态获取来自DHCP服务器的IP地址以及与嵌入式目标之间的UDP通信。视频结尾处提供了有关嵌入式HTTP示例的完整源代码和文档的链接。

-1

Webserver解析请求,获取请求参数并传递给其他软件来处理。在一些小系统中,并发请求的数量很小,web服务器也可以作为请求处理程序工作。

例如: 假设您想更改LCD背光。

1. [Client]--(request via browser: http://:/backlight?level=20)-->[WebServer] 
2. [WebServer]--(call backlight controller application/thread with parameter: `level=20`)-->[Backlight Controller] 
3. [Backlight Controller]--(change GPIO pins)-->[HW]

这取决于系统的规模,背光控制器可以是一个单独的应用程序或网络服务器的一部分。

mongoose example(如下图所示),当您请求诸如http://<ip>:<port>/api/v1/sum?n1=2&n2=4时,handle_sum_call将被调用。 handle_sum_call是作为网络服务器的一部分实现的。

static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { 
    struct http_message *hm = (struct http_message *) ev_data; 

    switch (ev) { 
    case MG_EV_HTTP_REQUEST: 
     if (mg_vcmp(&hm->uri, "/api/v1/sum") == 0) { 
     handle_sum_call(nc, hm);     /* Handle RESTful call */ 
     } else if (mg_vcmp(&hm->uri, "/printcontent") == 0) { 
     char buf[100] = {0}; 
     memcpy(buf, hm->body.p, 
       sizeof(buf) - 1 < hm->body.len? sizeof(buf) - 1 : hm->body.len); 
     printf("%s\n", buf); 
     } else { 
     mg_serve_http(nc, hm, s_http_server_opts); /* Serve static content */ 
     } 
     break; 
    default: 
     break; 
    } 
} 

您可以将handle_sum_call出的Web服务器源代码,并建立独立的应用程序,或CGI script