HTTP(Hyper Text Transfer Protocol超文本傳輸協(xié)議)是用于從萬維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它基于TCP/IP協(xié)議通信,因此也是基于<客戶端-服務(wù)器>模型運作的。HTTP屬于應(yīng)用層協(xié)議,我們可以用它來傳輸服務(wù)器的各種資源,如文本、圖片、音頻等,具有簡單、快捷、靈活、無連接、無狀態(tài)等優(yōu)點。
在一次完整的HTTP通信過程中,瀏覽器與服務(wù)器之間大致可以分為七個步驟:
01、建立TCP連接
HTTP工作前,瀏覽器首先要通過網(wǎng)絡(luò)與服務(wù)器建立連接,該連接通過TCP完成。HTTP屬于應(yīng)用層協(xié)議,根據(jù)規(guī)則只有低層協(xié)議建立之后才能進(jìn)行更深層協(xié)議的連接。因此,首先要建立TCP連接,端口號為80。
02、瀏覽器向服務(wù)器發(fā)送請求命令
TCP連接成功建立后,瀏覽器就會向服務(wù)器發(fā)送請求命令。例如:GET/sample/hello.jsp HTTP/1.1
03、瀏覽器發(fā)送請求頭信息
瀏覽器發(fā)送請求命令后,還要以頭信息的形式向服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送。
04、服務(wù)器應(yīng)答
客戶機(jī)向服務(wù)器發(fā)出請求后,服務(wù)器會客戶機(jī)回送應(yīng)答,例如:HTTP/1.1 200 OK
應(yīng)答的第一部分是協(xié)議的版本號和應(yīng)答狀態(tài)碼。
05、服務(wù)器發(fā)送應(yīng)答頭信息
正像客戶端會隨同請求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請求的文檔。
06、服務(wù)器向瀏覽器發(fā)送數(shù)據(jù)
服務(wù)器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結(jié)束,接著會按照應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)。
07、服務(wù)器關(guān)閉TCP連接
一般情況下,一旦服務(wù)器完成了數(shù)據(jù),就會關(guān)閉TCP連接。
在創(chuàng)建工程前我們還需要了解HTTP請求格式,HTTP請求由三部分構(gòu)成:請求方法URI協(xié)議、請求頭、請求正文。
請求方法URI(URL相當(dāng)于URI的子集)協(xié)議
我們使用前文中的例子“GET/sample.jsp HTTP/1.1”。“GET“代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協(xié)議和協(xié)議的版本。
請求頭
請求頭包含許多有關(guān)的客戶端環(huán)境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經(jīng)結(jié)束,接下來的是請求正文,請求正文中可以包含客戶提交的查詢字符串信息。
實驗使用MB-039開發(fā)板,在工程中使用LwIP+FreeRTOS,實驗展示如何實現(xiàn)HTTP服務(wù)器,實驗使用到的硬件如下:
如圖是MB-039(完整原理圖可以通過MM32官網(wǎng)下載)的ETH部分。
各個信號引腳對應(yīng)如下:
我們創(chuàng)建HTTP工程:
static void http_server_netconn_thread(void* arg) { ********************************************************* do { err = netconn_accept(conn, newconn); //(1) if (err == ERR_OK) { http_server_netconn_serve(newconn); //(2) netconn_delete(newconn); } } while(err == ERR_OK); ********************************************************* } static void http_server_netconn_serve(struct netconn* conn) { struct netbuf* inbuf; char* buf; u16_t buflen; err_t err; err = netconn_recv(conn, inbuf); //(3) if (err == ERR_OK) { netbuf_data(inbuf, (void**) buf, buflen); if (buflen >= 5 buf[0] == 'G' buf[1] == 'E' buf[2] == 'T' buf[3] == ' ' buf[4] == '/' ) { //(4) netconn_write(conn, http_html_hdr, sizeof(http_html_hdr) - 1, NETCONN_NOCOPY); //(5) netconn_write(conn, http_index_html, sizeof(http_index_html) - 1, NETCONN_NOCOPY); //(6) } } netconn_close(conn); //(7) netbuf_delete(inbuf); }
01、等待連接請求
02、執(zhí)行數(shù)據(jù)發(fā)送的主要函數(shù),工程的主要部分
03、接收客戶端(瀏覽器)發(fā)送的數(shù)據(jù)
04、通過前面五個字節(jié)判斷是否為請求方法,我們只是為例簡單的功能展示不需要去關(guān)注正文部分
05、發(fā)送應(yīng)答頭信息
06、發(fā)送網(wǎng)頁信息(html)
07、關(guān)閉連接
到這里已經(jīng)完成了工程的創(chuàng)建,看一下PC的IP地址,設(shè)備需要處于同一網(wǎng)段方便測試。打開命令行窗口輸入:ipconfig
PC的地址為:192.168.105.34,在sys_arch.h文件中對DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_ADDR2、DEST_IP_ADDR3進(jìn)行修改,DEST_PORT 隨意修改。
#define LOCAL_PORT 2021 #define IP_ADDR0 192 #define IP_ADDR1 168 #define IP_ADDR2 105 #define IP_ADDR3 35
將程序下載入開發(fā)板中,打開瀏覽器,輸入設(shè)備地址:192.168.105.35
(1)點擊靈動微電子即可跳轉(zhuǎn)到我們的官網(wǎng)
(2)我們按F12來查看網(wǎng)頁的信息
關(guān)注畫圈部分,點擊靈動微電子可以執(zhí)行跳轉(zhuǎn)的原因是他的href屬性指向的超鏈接目標(biāo)的URL為我們的官網(wǎng)地址。同樣,使圖片顯示的方式是類似的,我們先找到一張圖片,將他的地址填入img src中,此時圖片并非存儲在MCU中,是通過網(wǎng)絡(luò)訪問讀取的。
我們也可以使用Wireshark進(jìn)行監(jiān)視抓取整個過程,選擇IP過濾ip.addr==192.168.105.35。
可以看到整個過程和前文介紹的步驟完全一致。
實驗程序請登錄我們的官網(wǎng)下載MM32F3270 SDK,工程路徑如下:
~MM32F3270_Lib_Samples_V0.90Demo_appEthernet_DemoETH_RTOSFreertos_http
到這里已經(jīng)完成了以太網(wǎng)專題的介紹,在樣例包中,還提供了其他的樣例工程,如:mqtt_onenet、mqtt_baidu、Freertos_dns、Freertos_dhcp、TFTP等。以太網(wǎng)協(xié)議本身非常龐大,需要用戶花費時間去研究。專題通過對六個簡單實驗的介紹,起到拋磚引玉的作用,更大的意義在于使剛接觸以太網(wǎng)的用戶有個著手點,實現(xiàn)更復(fù)雜的功能。
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17149瀏覽量
351224 -
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5426瀏覽量
171740 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9165瀏覽量
85436 -
HTTP
+關(guān)注
關(guān)注
0文章
505瀏覽量
31240
發(fā)布評論請先 登錄
相關(guān)推薦
評論