0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于MM32F3270以太網(wǎng)HTTP使用

jf_pJlTbmA9 ? 來源:靈動(dòng)MM32MCU ? 作者:靈動(dòng)MM32MCU ? 2023-09-27 15:48 ? 次閱讀

HTTP(Hyper Text Transfer Protocol超文本傳輸協(xié)議)是用于從萬維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它基于TCP/IP協(xié)議通信,因此也是基于<客戶端-服務(wù)器>模型運(yùn)作的。HTTP屬于應(yīng)用層協(xié)議,我們可以用它來傳輸服務(wù)器的各種資源,如文本、圖片、音頻等,具有簡單、快捷、靈活、無連接、無狀態(tài)等優(yōu)點(diǎn)。

在一次完整的HTTP通信過程中,瀏覽器與服務(wù)器之間大致可以分為七個(gè)步驟:

01、建立TCP連接

HTTP工作前,瀏覽器首先要通過網(wǎng)絡(luò)與服務(wù)器建立連接,該連接通過TCP完成。HTTP屬于應(yīng)用層協(xié)議,根據(jù)規(guī)則只有低層協(xié)議建立之后才能進(jìn)行更深層協(xié)議的連接。因此,首先要建立TCP連接,端口號(hào)為80。

02、瀏覽器向服務(wù)器發(fā)送請求命令

TCP連接成功建立后,瀏覽器就會(huì)向服務(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ù)器會(huì)客戶機(jī)回送應(yīng)答,例如:HTTP/1.1 200 OK

應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼。

05、服務(wù)器發(fā)送應(yīng)答頭信息

正像客戶端會(huì)隨同請求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會(huì)隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請求的文檔。

06、服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)

服務(wù)器向?yàn)g覽器發(fā)送頭信息后,它會(huì)發(fā)送一個(gè)空白行來表示頭信息的發(fā)送到此為結(jié)束,接著會(huì)按照應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實(shí)際數(shù)據(jù)。

07、服務(wù)器關(guān)閉TCP連接

一般情況下,一旦服務(wù)器完成了數(shù)據(jù),就會(huì)關(guān)閉TCP連接。

在創(chuàng)建工程前我們還需要了解HTTP請求格式,HTTP請求由三部分構(gòu)成:請求方法URI協(xié)議、請求頭、請求正文。

請求方法URI(URL相當(dāng)于URI的子集)協(xié)議

我們使用前文中的例子“GET/sample.jsp HTTP/1.1”?!癎ET“代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協(xié)議和協(xié)議的版本。

請求頭

請求頭包含許多有關(guān)的客戶端環(huán)境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。

請求正文

請求頭和請求正文之間是一個(gè)空行,這個(gè)行非常重要,它表示請求頭已經(jīng)結(jié)束,接下來的是請求正文,請求正文中可以包含客戶提交的查詢字符串信息。

實(shí)驗(yàn)使用MB-039開發(fā)板,在工程中使用LwIP+FreeRTOS,實(shí)驗(yàn)展示如何實(shí)現(xiàn)HTTP服務(wù)器,實(shí)驗(yàn)使用到的硬件如下:

poYBAGIB1SyAHYynAAG39uXw7q0489.png

如圖是MB-039(完整原理圖可以通過MM32官網(wǎng)下載)的ETH部分。

各個(gè)信號(hào)引腳對應(yīng)如下:

pYYBAGIB1S6AEqaVAAAOapdym_Y980.png
poYBAGIB1TGAFwREAAi12qR49zc411.png

我們創(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、通過前面五個(gè)字節(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

pYYBAGIB1TOARaWcAAEnlBhO5H8936.png

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)點(diǎn)擊靈動(dòng)微電子即可跳轉(zhuǎn)到我們的官網(wǎng)

(2)我們按F12來查看網(wǎng)頁的信息

wKgaomUT3mOAP8W5AAG4qzNVZHw033.jpg

關(guān)注畫圈部分,點(diǎn)擊靈動(dòng)微電子可以執(zhí)行跳轉(zhuǎn)的原因是他的href屬性指向的超鏈接目標(biāo)的URL為我們的官網(wǎng)地址。同樣,使圖片顯示的方式是類似的,我們先找到一張圖片,將他的地址填入img src中,此時(shí)圖片并非存儲(chǔ)在MCU中,是通過網(wǎng)絡(luò)訪問讀取的。

我們也可以使用Wireshark進(jìn)行監(jiān)視抓取整個(gè)過程,選擇IP過濾ip.addr==192.168.105.35。

wKgZomUD9lmAJVu3AAZvTMKygwE828.png

可以看到整個(gè)過程和前文介紹的步驟完全一致。

實(shí)驗(yàn)程序請登錄我們的官網(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é)議本身非常龐大,需要用戶花費(fèi)時(shí)間去研究。專題通過對六個(gè)簡單實(shí)驗(yàn)的介紹,起到拋磚引玉的作用,更大的意義在于使剛接觸以太網(wǎng)的用戶有個(gè)著手點(diǎn),實(shí)現(xiàn)更復(fù)雜的功能。

來源:靈動(dòng)MM32MCU


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349916
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5343

    瀏覽量

    170799
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8958

    瀏覽量

    85081
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    499

    瀏覽量

    30978
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    靈動(dòng)微課堂 (第186講) | 基于MM32F3270 以太網(wǎng) Server使用

    :~\MM32F3270_Lib_Samples_V0.90\Demo_app\Ethernet_Demo\ETH_RTOS\Freertos_Server。我們下章的題目為《基于MM32F3270 以太網(wǎng)
    發(fā)表于 10-18 11:28

    靈動(dòng)微課堂 (第187講) | 基于MM32F3270 以太網(wǎng) HTTP使用

    /mm32f_mainstream/mm32f3270/)下載MM32F3270 SDK,工程路徑如下:~\MM32F3270_Lib_Samples_V0.90\Demo_app\E
    發(fā)表于 10-22 18:59

    MM32F3270系列32位MCU的特點(diǎn)有哪些

    上海靈動(dòng)微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 11-03 07:20

    靈動(dòng)微電子MM32F3270系列MCU的特點(diǎn)介紹

    上海靈動(dòng)微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 03-22 16:57 ?2127次閱讀

    【國產(chǎn)MCU移植】MM32F3270 EVBoard

    【國產(chǎn)MCU移植】MM32F3270 EVBoard
    發(fā)表于 12-03 17:21 ?5次下載
    【國產(chǎn)MCU移植】<b class='flag-5'>MM32F3270</b> EVBoard

    基于MM32F3270 以太網(wǎng) Client使用

    接下來給大家介紹基于TCP包的通訊。內(nèi)容分為基于MM32F3270以太網(wǎng)Client的使用與基于MM32F3270以太網(wǎng)Server的使用。
    發(fā)表于 02-08 15:10 ?0次下載
    基于<b class='flag-5'>MM32F3270</b> <b class='flag-5'>以太網(wǎng)</b> Client使用

    MM32F3270 勘誤表(中文版)

    MM32F3270 勘誤表(中文版)
    發(fā)表于 02-23 18:42 ?0次下載
    <b class='flag-5'>MM32F3270</b> 勘誤表(中文版)

    MM32F3270 ADC注入通道

    MM32F3270 ADC注入通道
    的頭像 發(fā)表于 09-27 15:59 ?935次閱讀
    <b class='flag-5'>MM32F3270</b> ADC注入通道

    使用MM32F3270 FSMC驅(qū)動(dòng)OLED

    使用MM32F3270 FSMC驅(qū)動(dòng)OLED
    的頭像 發(fā)表于 09-27 15:30 ?879次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動(dòng)OLED

    使用MM32F3270 FSMC驅(qū)動(dòng)TFT-LCD

    使用MM32F3270 FSMC驅(qū)動(dòng)TFT-LCD
    的頭像 發(fā)表于 09-27 15:34 ?907次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動(dòng)TFT-LCD

    基于MM32F3270以太網(wǎng)Server使用

    基于MM32F3270以太網(wǎng)Server使用
    的頭像 發(fā)表于 09-27 15:46 ?459次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Server使用

    基于MM32F3270以太網(wǎng)Client使用

    基于MM32F3270以太網(wǎng)Client使用
    的頭像 發(fā)表于 09-27 15:44 ?654次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Client使用

    基于MM32F3270以太網(wǎng)UDP使用

    基于MM32F3270以太網(wǎng) UDP使用
    的頭像 發(fā)表于 09-27 15:42 ?448次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>UDP使用

    基于MM32F3270以太網(wǎng)Server_Socket使用

    基于MM32F3270以太網(wǎng)Server_Socket使用
    的頭像 發(fā)表于 09-27 15:41 ?436次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Server_Socket使用

    基于MM32F3270以太網(wǎng)Client_Socket使用

    基于MM32F3270以太網(wǎng)Client_Socket使用
    的頭像 發(fā)表于 09-27 15:37 ?505次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Client_Socket使用