嵌入式Web服务器如何控制其硬件?

时间:2011-03-29 20:35:56

标签: embedded

我看到允许通过http访问的应用程序(比如我的路由器)。这究竟是如何工作的?我猜有一个嵌入式网络服务器接受http,但之后它是如何工作的?是否有某种应用服务器可以解析命令并配置传入端口等?我在哪里可以了解更多关于这种事情是如何运作的? 谢谢你的时间。

4 个答案:

答案 0 :(得分: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 :(得分:0)

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

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

答案 2 :(得分:0)

您可以找到以几乎任何语言编写的极其基本的Web服务器的源代码。您甚至可以在awk和netcat之类的东西中实现一个非常基本的Web服务器。 :)

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

答案 3 :(得分:-1)

Webserver解析请求,获取请求参数并传递给其他软件进行处理。在某些小型系统中,并发请求的数量很少,webserver也可以作为请求处理程序。

实施例: 假设您想要更换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_callhandle_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移出网络服务器源代码并创建单独的应用程序,或CGI script