我看到允许通过http访问的应用程序(比如我的路由器)。这究竟是如何工作的?我猜有一个嵌入式网络服务器接受http,但之后它是如何工作的?是否有某种应用服务器可以解析命令并配置传入端口等?我在哪里可以了解更多关于这种事情是如何运作的? 谢谢你的时间。
答案 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_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
移出网络服务器源代码并创建单独的应用程序,或CGI script。