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

Embedded 嵌入式Web服务器如何控制其硬件?,embedded,Embedded,我看到了允许通过http访问的应用程序(比如我的路由器)。这到底是怎么回事?我猜想有一个嵌入式Web服务器可以接受http,但是在那之后它是如何工作的呢?是否有某种应用程序服务器可以解析命令并配置传入端口等?我在哪里可以更多地了解这类事情的工作原理? 谢谢您的时间。Web服务器是一个非常流行的嵌入式系统项目。大多数路由器都比你可能意识到的更强大,很多人都会攻击它们。您还可以通过编程微控制器并将其与以太网芯片(如ENC28J60)连接来构建自己的微控制器。您可以使用小型8位微控制器(如PIC和AV

我看到了允许通过http访问的应用程序(比如我的路由器)。这到底是怎么回事?我猜想有一个嵌入式Web服务器可以接受http,但是在那之后它是如何工作的呢?是否有某种应用程序服务器可以解析命令并配置传入端口等?我在哪里可以更多地了解这类事情的工作原理?
谢谢您的时间。

Web服务器是一个非常流行的嵌入式系统项目。大多数路由器都比你可能意识到的更强大,很多人都会攻击它们。您还可以通过编程微控制器并将其与以太网芯片(如ENC28J60)连接来构建自己的微控制器。您可以使用小型8位微控制器(如PIC和AVR微控制器)构建小型web服务器


所以,首先,看看爱好者们正在使用的各种微控制器,然后跳到教程中。

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

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

YouTube视频“用于硬实时系统的lwIP TCP/IP堆栈”(lwIP TCP/IP stack for hard real time systems)显示了一个基于开源lwIP TCP/IP堆栈的嵌入式HTTP服务器。您将看到从嵌入式设备提供的web页面以及嵌入式HTTP服务器的一些整洁功能,如服务器端包含(SSI)和公共网关接口(CGI)。SSI允许您动态生成网页的一部分。这样,嵌入式目标可以生成动态变化的内容。CGI允许从浏览器(HTTP客户端)到嵌入式目标的通信。这样您就可以更新或更改目标。这两项功能结合在一起,允许您将标准web浏览器用作嵌入式设备的远程用户界面。无需在浏览器中运行任何脚本,这一切都是可能的

当然,您也可以使用浏览器中的可执行内容(如JavaScript、Java小程序或其他)通过TCP/IP或UDP/IP与目标进行通信


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

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]
根据系统的规模,背光控制器可以是单独的应用程序,也可以是Web服务器的一部分

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;
  }
}
在(如下所示)中,当您请求时,例如
http://:/api/v1/sum?n1=2&n2=4
,将调用
handle\u sum\u调用
handle\u sum\u调用
作为Web服务器的一部分实现

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;
  }
}
静态void ev_处理程序(结构mg_连接*nc、int-ev、void*ev_数据){
结构http_消息*hm=(结构http_消息*)ev_数据;
开关(ev){
案例MG_EV_HTTP_请求:
如果(mg_vcmp(&hm->uri,“/api/v1/sum”)==0){
handle_sum_call(nc,hm);/*handle RESTful call*/
}否则如果(mg_vcmp(&hm->uri,“/printcontent”)==0){
char buf[100]={0};
memcpy(buf,hm->body.p,
sizeof(buf)-1body.len?sizeof(buf)-1:hm->body.len);
printf(“%s\n”,buf);
}否则{
mg_服务_http(nc、hm、s_http_服务器_选项);/*服务静态内容*/
}
打破
违约:
打破
}
}

您可以将
处理\u sum\u调用
移出web服务器源代码并创建单独的应用程序,或者。

为什么它的工作方式与非嵌入式web服务器不同?实际上,您的问题让我从一个完全不同的角度来思考这个问题。