HTTP(Hyper Text Transfer Protocol超文本傳輸協(xié)議)是用于從萬維網(wǎng)服務器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它基于TCP/IP協(xié)議通信,因此也是基于<客戶端-服務器>模型運作的。HTTP屬于應用層協(xié)議,我們可以用它來傳輸服務器的各種資源,如文本、圖片、音頻等,具有簡單、快捷、靈活、無連接、無狀態(tài)等優(yōu)點。
在一次完整的HTTP通信過程中,瀏覽器與服務器之間大致可以分為七個步驟:
01、建立TCP連接
HTTP工作前,瀏覽器首先要通過網(wǎng)絡與服務器建立連接,該連接通過TCP完成。HTTP屬于應用層協(xié)議,根據(jù)規(guī)則只有低層協(xié)議建立之后才能進行更深層協(xié)議的連接。因此,首先要建立TCP連接,端口號為80。
02、瀏覽器向服務器發(fā)送請求命令
TCP連接成功建立后,瀏覽器就會向服務器發(fā)送請求命令。例如:GET/sample/hello.jsp HTTP/1.1
03、瀏覽器發(fā)送請求頭信息
瀏覽器發(fā)送請求命令后,還要以頭信息的形式向服務器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務器,它已經(jīng)結束了該頭信息的發(fā)送。
04、服務器應答
客戶機向服務器發(fā)出請求后,服務器會客戶機回送應答,例如:HTTP/1.1 200 OK
應答的第一部分是協(xié)議的版本號和應答狀態(tài)碼。
05、服務器發(fā)送應答頭信息
正像客戶端會隨同請求發(fā)送關于自身的信息一樣,服務器也會隨同應答向用戶發(fā)送關于它自己的數(shù)據(jù)及被請求的文檔。
06、服務器向瀏覽器發(fā)送數(shù)據(jù)
服務器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結束,接著會按照應答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)。
07、服務器關閉TCP連接
一般情況下,一旦服務器完成了數(shù)據(jù),就會關閉TCP連接。
在創(chuàng)建工程前我們還需要了解HTTP請求格式,HTTP請求由三部分構成:請求方法URI協(xié)議、請求頭、請求正文。
請求方法URI(URL相當于URI的子集)協(xié)議
我們使用前文中的例子“GET/sample.jsp HTTP/1.1”?!癎ET“代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協(xié)議和協(xié)議的版本。
請求頭
請求頭包含許多有關的客戶端環(huán)境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經(jīng)結束,接下來的是請求正文,請求正文中可以包含客戶提交的查詢字符串信息。
實驗使用MB-039開發(fā)板,在工程中使用LwIP+FreeRTOS,實驗展示如何實現(xiàn)HTTP服務器,實驗使用到的硬件如下:
如圖是MB-039(完整原理圖可以通過MM32官網(wǎng)下載)的ETH部分。
各個信號引腳對應如下:
我們創(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é)判斷是否為請求方法,我們只是為例簡單的功能展示不需要去關注正文部分
05、發(fā)送應答頭信息
06、發(fā)送網(wǎng)頁信息(html)
07、關閉連接
到這里已經(jīng)完成了工程的創(chuàng)建,看一下PC的IP地址,設備需要處于同一網(wǎng)段方便測試。打開命令行窗口輸入:ipconfig
PC的地址為:192.168.105.34,在sys_arch.h文件中對DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_ADDR2、DEST_IP_ADDR3進行修改,DEST_PORT 隨意修改。
#define LOCAL_PORT 2021 #define IP_ADDR0 192 #define IP_ADDR1 168 #define IP_ADDR2 105 #define IP_ADDR3 35
將程序下載入開發(fā)板中,打開瀏覽器,輸入設備地址:192.168.105.35
(1)點擊靈動微電子即可跳轉到我們的官網(wǎng)
(2)我們按F12來查看網(wǎng)頁的信息
關注畫圈部分,點擊靈動微電子可以執(zhí)行跳轉的原因是他的href屬性指向的超鏈接目標的URL為我們的官網(wǎng)地址。同樣,使圖片顯示的方式是類似的,我們先找到一張圖片,將他的地址填入img src中,此時圖片并非存儲在MCU中,是通過網(wǎng)絡訪問讀取的。
我們也可以使用Wireshark進行監(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)更復雜的功能。
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關注
關注
147文章
18387瀏覽量
378925 -
以太網(wǎng)
+關注
關注
41文章
5866瀏覽量
178610 -
服務器
+關注
關注
13文章
10000瀏覽量
90128 -
HTTP
+關注
關注
0文章
530瀏覽量
34446
發(fā)布評論請先 登錄
靈動微課堂 (第186講) | 基于MM32F3270 以太網(wǎng) Server使用
靈動微課堂 (第187講) | 基于MM32F3270 以太網(wǎng) HTTP使用
MM32F3270系列32位MCU的特點有哪些
靈動微電子MM32F3270系列MCU的特點介紹
基于MM32F3270 以太網(wǎng) Client使用

評論