2011-03-29 79 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