單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第八章 W55MH32 HTTP Client示例
本篇文章我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)HTTP Client功能,并通過實(shí)戰(zhàn)例程,為大家講解如何向一個(gè)指定的網(wǎng)站提交數(shù)據(jù)。為方便講解,在該例程中,我們選用了一個(gè)專門測試HTTP協(xié)議的網(wǎng)站:httpbin.org,并實(shí)現(xiàn)了GET和POST這兩種常用的HTTP提交數(shù)據(jù)的方法,供大家參考。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP和DNS,以及W55MH32的初始化過程,請參考相關(guān)章節(jié),這里不再贅述。
1 HTTP協(xié)議簡介
HTTP(超文本傳輸協(xié)議,HyperText Transfer Protocol)是一種用于分布式、協(xié)作式、超媒體信息系統(tǒng)的應(yīng)用層協(xié)議,基于 TCP/IP通信協(xié)議來傳遞數(shù)據(jù),是萬維網(wǎng)(WWW)的數(shù)據(jù)通信的基礎(chǔ)。設(shè)計(jì) HTTP最初的目的是為了提供一種發(fā)布和接收 HTML頁面的方法,通過 HTTP或者 HTTPS協(xié)議請求的資源由統(tǒng)一資源標(biāo)識符(Uniform Resource Identifiers,URI)來標(biāo)識。
以上是HTTP協(xié)議的簡介,如想深入了解該協(xié)議,請參考mozilla網(wǎng)站上的介紹:HTTP 概述 - HTTP | MDN
2 HTTP協(xié)議特點(diǎn)
基于請求-響應(yīng)模型:客戶端發(fā)起請求,服務(wù)器處理后返回響應(yīng)。例如,用戶在瀏覽器輸入網(wǎng)址時(shí),瀏覽器會向?qū)?yīng)服務(wù)器發(fā)送HTTP請求,服務(wù)器返回網(wǎng)頁內(nèi)容。
無狀態(tài)性:HTTP本身不保存請求之間的狀態(tài),每次請求獨(dú)立。但可以通過Cookie、Session等機(jī)制實(shí)現(xiàn)狀態(tài)保持。
無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求并收到客戶的應(yīng)答后,便立即斷開連接。
3 HTTP應(yīng)用場景
接下來,我們了解下在W55MH32上可以使用HTTP客戶端模式完成哪些操作及應(yīng)用呢?
數(shù)據(jù)采集與上傳:將傳感器采集到的數(shù)據(jù)上傳到服務(wù)器中。
遠(yuǎn)程配置與管理:通過向服務(wù)器上請求配置文件或者管理指令,實(shí)現(xiàn)遠(yuǎn)程管理和控制。例如工控設(shè)備獲取最新的運(yùn)行策略或指令。
固件更新(OTA):通過向服務(wù)器請求下載最新的固件包,實(shí)現(xiàn)遠(yuǎn)程升級固件的功能。
日志和錯(cuò)誤報(bào)告上傳:定時(shí)上傳系統(tǒng)運(yùn)行日志,用于分析設(shè)備狀態(tài),或在出現(xiàn)異常情況時(shí)上傳錯(cuò)誤報(bào)告,方便快速定位和解決問題。
用戶認(rèn)證與授權(quán)管理:通過服務(wù)器進(jìn)行交互,驗(yàn)證用戶或設(shè)備的身份。
4 HTTP協(xié)議的基本工作流程
HTTP的請求-響應(yīng)模型通常由以下幾個(gè)步驟組成
建立連接:客戶端與服務(wù)器之間基于TCP/IP協(xié)議建立連接。
發(fā)送請求:客戶端向服務(wù)器發(fā)送請求,請求中包含要訪問的資源的 URL、請求方法(GET、POST、PUT、DELETE 等)、請求頭(例如,Accept、User-Agent)以及可選的請求體(對于 POST或 PUT 請求)。
處理請求:服務(wù)器接收到請求后,根據(jù)請求中的信息找到相應(yīng)的資源,執(zhí)行對應(yīng)的處理操作。這可能涉及從數(shù)據(jù)庫中檢索數(shù)據(jù)、生成動(dòng)態(tài)內(nèi)容或者簡單地返回靜態(tài)文件。
發(fā)送響應(yīng):服務(wù)器將處理后的結(jié)果封裝在響應(yīng)中,并將其發(fā)送回客戶端。響應(yīng)包含狀態(tài)碼(用于指示請求的成功或失?。㈨憫?yīng)頭(例如,Content-Type、Content-Length)以及可選的響應(yīng)體(例如,HTML 頁面、圖像數(shù)據(jù))。
關(guān)閉連接:在完成請求-響應(yīng)周期后,客戶端和服務(wù)器之間的連接將被關(guān)閉,除非使用了持久連接(如 HTTP/1.1中的 keep-alive)。
5 HTTP請求方法
在HTTP協(xié)議中,GET和POST是兩種常用的請求方法,用于客戶端向服務(wù)器發(fā)送數(shù)據(jù)和獲取資源。
GET方法
GET方法通常用于從服務(wù)器獲取資源。它有以下特點(diǎn):
參數(shù)傳遞:請求參數(shù)通過URL中的查詢字符串傳遞,形如?key1=value1&key2=value2。
數(shù)據(jù)大小限制:由于參數(shù)附加在URL后,長度可能受URL長度限制(取決于瀏覽器和服務(wù)器設(shè)置)。
安全性:數(shù)據(jù)在URL中明文顯示,不適合傳遞敏感信息。
請求格式:
GET HTTP/
Request-URI:表示目標(biāo)資源的路徑,可能包含參數(shù)。
Version:HTTP協(xié)議版本。
Headers:包含元信息,例如客戶端的屬性、支持的格式等。
Blank Line:空行。
POST方法
POST方法通常用于向服務(wù)器提交數(shù)據(jù)。它有以下特點(diǎn):
參數(shù)傳遞:數(shù)據(jù)放在請求體中,而不是URL中。
數(shù)據(jù)大小限制:POST請求的體積沒有明顯限制,可以傳遞大量數(shù)據(jù)。
安全性:數(shù)據(jù)在請求體中傳輸,相對來說更安全。
請求格式:
POST HTTP/
Request-URI:目標(biāo)資源的路徑,通常是API的端點(diǎn)。
Headers:元信息,例如內(nèi)容類型和長度。
Blank Line:空行,區(qū)分頭和主體。
Body:數(shù)據(jù)的主體,包含客戶端發(fā)送到服務(wù)器的長度。
6 HTTP協(xié)議響應(yīng)內(nèi)容
HTTP協(xié)議響應(yīng)內(nèi)容包含狀態(tài)行、響應(yīng)頭以及響應(yīng)體三個(gè)部分。
狀態(tài)行
HTTP狀態(tài)行包含HTTP協(xié)議版本、狀態(tài)碼以及狀態(tài)描述。
狀態(tài)碼由三個(gè)十進(jìn)制數(shù)字組成,第一個(gè)十進(jìn)制數(shù)字定義了狀態(tài)碼的類型。
狀態(tài)碼分為五類:
1xx(信息性狀態(tài)碼):表示接收的請求正在處理。
2xx(成功狀態(tài)碼):表示請求正常處理完畢。
3xx(重定向狀態(tài)碼):需要后續(xù)操作才能完成這一請求。
4xx(客戶端錯(cuò)誤狀態(tài)碼):表示請求包含語法錯(cuò)誤或無法完成。
5xx(服務(wù)器錯(cuò)誤狀態(tài)碼):服務(wù)器在處理請求的過程中發(fā)生了錯(cuò)誤。
示例:
HTTP/1.1 200 OK
響應(yīng)頭
響應(yīng)頭則會包含內(nèi)容類型、長度、編碼等信息。
常見的響應(yīng)頭字段有:
Content-Type:響應(yīng)內(nèi)容的MIME類型,例如 text/html、application/json。
Content-Length:響應(yīng)內(nèi)容的字節(jié)長度。
Server:服務(wù)器信息。
Set-Cookie:設(shè)置客戶端的Cookie。
示例:
Content-Type: text/html; charset=UTF-8 Content-Length: 3495 Server: Apache/2.4.41 (Ubuntu)
響應(yīng)體
響應(yīng)體包含實(shí)際的數(shù)據(jù)內(nèi)容,具體形式取決于響應(yīng)的類型和請求內(nèi)容。例如:HTML頁面內(nèi)容,JSON數(shù)據(jù),文件的二進(jìn)制數(shù)據(jù)等。
如果是狀態(tài)碼為204 No Content或 304 Not Modified的響應(yīng),則通常沒有正文。
注意:響應(yīng)體和響應(yīng)頭之間會添加一個(gè)空行來分隔內(nèi)容。
7 HTTP請求及響應(yīng)實(shí)例
GET請求示例如下:
//請求
GET /get?username=admin&password=admin HTTP/1.1
Host:httpbin.org
//響應(yīng)
HTTP/1.1 200 OK
Date: Tue, 10 Dec 2024 10:41:13 GMT
Content-Type: application/json
Content-Length: 278
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {
"password": "admin",
"username": "admin"
},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-67581ac9-236349c67cb21dcc24c54215"
},
"origin": "118.99.2.9",
"url": "http://httpbin.org/get?username=admin&password=admin"
}
POST請求示例如下:
//請求
POST /post HTTP/1.1
Host:httpbin.org
Content-Type:application/x-www-form-urlencode
Content-Length:29
username=admin&password=admin
//響應(yīng)
HTTP/1.1 200 OK
Date: Tue, 10 Dec 2024 10:44:52 GMT
Content-Type: application/json
Content-Length: 374
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"data": "username=admin&password=admin",
"files": {},
"form": {},
"headers": {
"Content-Length": "29",
"Content-Type": "application/x-www-form-urlencode",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-67581ba4-744fdecf1da1bcf3180f9fa3"
},
"json": null,
"origin": "118.99.2.9",
"url": "http://httpbin.org/post"
}
8實(shí)現(xiàn)過程
接下來,我們看看如何在W55MH32上實(shí)現(xiàn)HTTP客戶端模式發(fā)送GET和POST請求示例。
注意:因?yàn)楸臼纠枰L問互聯(lián)網(wǎng),請確保W55MH32的網(wǎng)絡(luò)環(huán)境及配置能夠正常訪問互聯(lián)網(wǎng)。
例程中使用的是httpbin.org的服務(wù)器,它的get請求路徑為httpbin.org/get,post請求路徑為httpbin.org/post。
我們向httpbin.org發(fā)送請求后,它會把我們請求時(shí)提交的參數(shù)體現(xiàn)在響應(yīng)內(nèi)容中。
步驟一:通過DNS協(xié)議解析HTTP服務(wù)器的域名
在利用 HTTP向httpbin.org服務(wù)器提交數(shù)據(jù)時(shí),首先要與該服務(wù)器建立 TCP鏈接。要知道,建立 TCP鏈接是必須基于 IP地址來進(jìn)行連接操作的。而此處的 do_dns ()所承擔(dān)的任務(wù),正是借助 DNS協(xié)議對域名進(jìn)行解析,進(jìn)而獲取到相應(yīng) IP地址的過程。
if (do_dns(ethernet_buf, org_server_name, org_server_ip)) { printf("DNS request failed.rn"); while (1) { } }
步驟二:進(jìn)行HTTP GET和POST請求組包
接下來,我們需要按前面介紹的HTTP協(xié)議的規(guī)范來組包。
本例程中,我們定義了兩個(gè)函數(shù)來分別生產(chǎn)HTTP GET Header()和HTTP POST Header()。詳細(xì)代碼如下:
/**
* @brief HTTP GET : Request package combination package.
* @param pkt: Array cache for grouping packages
* @return pkt: Package length
*/
uint32_t http_get_pkt(uint8_t *pkt)
{
*pkt = 0;
// request type URL HTTP protocol version
strcat((char *)pkt, "GET /get?username=admin&password=admin HTTP/1.1rn");
// Host address, which can be a domain name or a specific IP address.
strcat((char *)pkt, "Host: httpbin.orgrn");
// end
strcat((char *)pkt, "rn");
return strlen((char *)pkt);
}
/**
* @brief HTTP POST : Request package combination package.
* @param pkt: Array cache for grouping packages
* @return pkt: Package length
*/
uint32_t http_post_pkt(uint8_t *pkt)
{
*pkt = 0;
// request type URL HTTP protocol version
strcat((char *)pkt, "POST /post HTTP/1.1rn");
// Host address, which can be a domain name or a specific IP address.
strcat((char *)pkt, "Host: httpbin.orgrn");
// Main content format
strcat((char *)pkt, "Content-Type:application/x-www-form-urlencodern");
// Main content lenght
strcat((char *)pkt, "Content-Length:29rn");
// separator
strcat((char *)pkt, "rn");
// main content
strcat((char *)pkt, "username=admin&password=admin");
return strlen((char *)pkt);
}
步驟三:發(fā)送HTTP請求以及超時(shí)和響應(yīng)內(nèi)容處理
len = http_get_pkt(ethernet_buf); do_http_request(SOCKET_ID, ethernet_buf, len, org_server_ip, org_port); // Send a POST request. len = http_post_pkt(ethernet_buf); do_http_request(SOCKET_ID, ethernet_buf, len, org_server_ip, org_port);
do_http_request()函數(shù)為發(fā)送HTTP請求并監(jiān)聽響應(yīng),具體內(nèi)容如下:
/**
* @brief HTTP Client get data stream test.
* @param sn: socket number
* @param buf: request message content
* @param len request message length
* @param destip: destion ip
* @param destport: destion port
* @return 0:timeout,1:Received response..
*/
uint8_t do_http_request(uint8_t sn, uint8_t *buf, uint16_t len, uint8_t *destip, uint16_t destport)
{
uint16_t local_port = 50000;
uint16_t recv_timeout = 0;
uint8_t send_flag = 0;
while (1)
{
switch (getSn_SR(sn))
{
case SOCK_INIT:
// Connect to http server.
connect(sn, destip, destport);
break;
case SOCK_ESTABLISHED:
if (send_flag == 0)
{
// send request
send(sn, buf, len);
send_flag = 1;
printf("send request:rn");
for (uint16_t i = 0; i < len; i++)
{
printf("%c", *(buf + i));
}
printf("rn");
}
// Response content processing
len = getSn_RX_RSR(sn);
if (len > 0)
{
printf("Receive response:rn");
while (len > 0)
{
len = recv(sn, buf, len);
for (uint16_t i = 0; i < len; i++)
{
printf("%c", *(buf + i));
}
len = getSn_RX_RSR(sn);
}
printf("rn");
disconnect(sn);
close(sn);
return 1;
}
else
{
recv_timeout++;
delay_ms(1000);
}
// timeout handling
if (recv_timeout > 10)
{
printf("request fail!rn");
disconnect(sn);
close(sn);
return 0;
}
break;
case SOCK_CLOSE_WAIT:
// If there is a request error, the server will immediately send a close request,
// so the error response content needs to be processed here.
len = getSn_RX_RSR(sn);
if (len > 0)
{
printf("Receive response:rn");
while (len > 0)
{
len = recv(sn, buf, len);
for (uint16_t i = 0; i < len; i++)
{
printf("%c", *(buf + i));
}
len = getSn_RX_RSR(sn);
}
printf("rn");
disconnect(sn);
close(sn);
return 1;
}
close(sn);
break;
case SOCK_CLOSED:
// close socket
close(sn);
// open socket
socket(sn, Sn_MR_TCP, local_port, 0x00);
break;
default:
break;
}
}
}
在該函數(shù)中,程序會執(zhí)行一個(gè)TCP Client模式的狀態(tài)機(jī),具體詳細(xì)講解請看TCP Client示例章節(jié),當(dāng)程序處于SOCK_ESTABLISHED狀態(tài)時(shí),會發(fā)送1次請求內(nèi)容到服務(wù)器。接著就是監(jiān)聽服務(wù)器響應(yīng)數(shù)據(jù)以及超時(shí)處理。
如果服務(wù)器返回異常響應(yīng),則會立即關(guān)閉鏈接,因此我們需要在SOCK_CLOSE_WAIT狀態(tài)中處理服務(wù)器異常響應(yīng)的內(nèi)容。
9運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先可以看到打印了PHY鏈路檢測和DHCP獲取網(wǎng)絡(luò)信息,然后是DNS解析HTTP服務(wù)器域名結(jié)果,如下圖所示:

接著我們發(fā)送了一次GET請求報(bào)文,然后HTTP服務(wù)器返回了響應(yīng)報(bào)文。
請求和響應(yīng)原文都通過串口打印出來,如下圖所示:

最后,我們發(fā)送了一次POST請求報(bào)文,然后HTTP服務(wù)器返回了響應(yīng)報(bào)文。
請求和響應(yīng)原文都通過串口打印出來,如下圖所示:

10總結(jié)
本文介紹了在 W55MH32芯片上實(shí)現(xiàn) HTTP Client功能的方法,實(shí)現(xiàn)向httpbin.org網(wǎng)站獲取數(shù)據(jù)。闡述了 HTTP協(xié)議的概念、特點(diǎn)、應(yīng)用場景、工作流程、請求方法、響應(yīng)內(nèi)容,并給出請求及響應(yīng)實(shí)例。以及展示了在W55MH32上的實(shí)現(xiàn)過程。
下一篇將講解在該芯片上實(shí)現(xiàn) HTTP Server功能,介紹通過瀏覽器修改 W55MH32網(wǎng)絡(luò)地址信息的原理和實(shí)現(xiàn)步驟。敬請期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
HTTP
+關(guān)注
關(guān)注
0文章
530瀏覽量
34616 -
Client
+關(guān)注
關(guān)注
0文章
13瀏覽量
9212
發(fā)布評論請先 登錄
信號發(fā)生電路基礎(chǔ) 第八章
第八章 線性離散控制系統(tǒng)分析
51單片機(jī)第八章素材
電子技術(shù)基礎(chǔ)模擬部分第五版_第八章習(xí)題答案.pdf
IC工藝和版圖設(shè)計(jì)第八章Latch-up和GuardRing設(shè)計(jì)
第二章 W55MH32 DHCP示例
第五章 W55MH32 UDP示例
第九章 W55MH32 HTTP Server示例
第十五章 W55MH32 SNMP示例
第十八章 W55MH32 FTP_Server示例
第三十章 W55MH32 HTTP_Server&NetBIOS示例

第八章 W55MH32 HTTP Client示例
評論