0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第八章 W55MH32 HTTP Client示例

W55MH32 来源:W55MH32 作者:W55MH32 2025-07-24 09:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32提供了两种选择:QFN100和QFN68。

W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2iBiluAVPzhAACkXwEtdxk292.png

第八章 W55MH32 HTTP Client示例

本篇文章我们将详细介绍如何在W55MH32芯片上面实现HTTP Client功能,并通过实战例程,为大家讲解如何向一个指定的网站提交数据。为方便讲解,在该例程中,我们选用了一个专门测试HTTP协议的网站:httpbin.org,并实现了GET和POST这两种常用的HTTP提交数据的方法,供大家参考。

该例程用到的其他网络协议,例如DHCP和DNS,以及W55MH32的初始化过程,请参考相关章节,这里不再赘述。

1 HTTP协议简介

HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议,基于 TCP/IP通信协议来传递数据,是万维网(WWW)的数据通信的基础。设计 HTTP最初的目的是为了提供一种发布和接收 HTML页面的方法,通过 HTTP或者 HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

以上是HTTP协议的简介,如想深入了解该协议,请参考mozilla网站上的介绍:HTTP 概述 - HTTP | MDN

2 HTTP协议特点

基于请求-响应模型:客户端发起请求,服务器处理后返回响应。例如,用户在浏览器输入网址时,浏览器会向对应服务器发送HTTP请求,服务器返回网页内容。

无状态性:HTTP本身不保存请求之间的状态,每次请求独立。但可以通过Cookie、Session等机制实现状态保持。

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,便立即断开连接。

3 HTTP应用场景

接下来,我们了解下在W55MH32上可以使用HTTP客户端模式完成哪些操作及应用呢?

数据采集与上传:将传感器采集到的数据上传到服务器中。

远程配置与管理:通过向服务器上请求配置文件或者管理指令,实现远程管理和控制。例如工控设备获取最新的运行策略或指令。

固件更新(OTA):通过向服务器请求下载最新的固件包,实现远程升级固件的功能。

日志和错误报告上传:定时上传系统运行日志,用于分析设备状态,或在出现异常情况时上传错误报告,方便快速定位和解决问题。

用户认证与授权管理:通过服务器进行交互,验证用户或设备的身份。

4 HTTP协议的基本工作流程

HTTP的请求-响应模型通常由以下几个步骤组成

建立连接:客户端与服务器之间基于TCP/IP协议建立连接。

发送请求:客户端向服务器发送请求,请求中包含要访问的资源的 URL、请求方法(GET、POST、PUT、DELETE 等)、请求头(例如,Accept、User-Agent)以及可选的请求体(对于 POST或 PUT 请求)。

处理请求:服务器接收到请求后,根据请求中的信息找到相应的资源,执行对应的处理操作。这可能涉及从数据库中检索数据、生成动态内容或者简单地返回静态文件。

发送响应:服务器将处理后的结果封装在响应中,并将其发送回客户端。响应包含状态码(用于指示请求的成功或失败)、响应头(例如,Content-Type、Content-Length)以及可选的响应体(例如,HTML 页面、图像数据)。

关闭连接:在完成请求-响应周期后,客户端和服务器之间的连接将被关闭,除非使用了持久连接(如 HTTP/1.1中的 keep-alive)。

5 HTTP请求方法

在HTTP协议中,GETPOST是两种常用的请求方法,用于客户端向服务器发送数据和获取资源。

GET方法

GET方法通常用于从服务器获取资源。它有以下特点:

参数传递:请求参数通过URL中的查询字符串传递,形如?key1=value1&key2=value2。

数据大小限制:由于参数附加在URL后,长度可能受URL长度限制(取决于浏览器和服务器设置)。

安全性:数据在URL中明文显示,不适合传递敏感信息。

请求格式:

GET < Request-URI > HTTP/< Version >
< Headers >

Request-URI:表示目标资源的路径,可能包含参数。

Version:HTTP协议版本。

Headers:包含元信息,例如客户端的属性、支持的格式等。

Blank Line:空行。

POST方法

POST方法通常用于向服务器提交数据。它有以下特点:

参数传递:数据放在请求体中,而不是URL中。

数据大小限制:POST请求的体积没有明显限制,可以传递大量数据。

安全性:数据在请求体中传输,相对来说更安全。

请求格式:

POST < Request-URI > HTTP/< Version >
< Headers >

Request-URI:目标资源的路径,通常是API的端点。

Headers:元信息,例如内容类型和长度。

Blank Line:空行,区分头和主体。

Body:数据的主体,包含客户端发送到服务器的长度。

6 HTTP协议响应内容

HTTP协议响应内容包含状态行、响应头以及响应体三个部分。

状态行

HTTP状态行包含HTTP协议版本、状态码以及状态描述。

状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。

状态码分为五类:

1xx(信息性状态码):表示接收的请求正在处理。

2xx(成功状态码):表示请求正常处理完毕。

3xx(重定向状态码):需要后续操作才能完成这一请求。

4xx(客户端错误状态码):表示请求包含语法错误或无法完成。

5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。

示例:

HTTP/1.1 200 OK

响应头

响应头则会包含内容类型、长度、编码等信息。

常见的响应头字段有:

Content-Type:响应内容的MIME类型,例如 text/html、application/json。

Content-Length:响应内容的字节长度。

Server:服务器信息。

Set-Cookie:设置客户端的Cookie。

示例:

Content-Type: text/html; charset=UTF-8
Content-Length: 3495
Server: Apache/2.4.41 (Ubuntu)

响应体

响应体包含实际的数据内容,具体形式取决于响应的类型和请求内容。例如:HTML页面内容,JSON数据,文件的二进制数据等。

如果是状态码为204 No Content或 304 Not Modified的响应,则通常没有正文。

注意:响应体和响应头之间会添加一个空行来分隔内容。

7 HTTP请求及响应实例

GET请求示例如下:

//请求
GET /get?username=admin&password=admin HTTP/1.1
Host:httpbin.org

//响应
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
//响应
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实现过程

接下来,我们看看如何在W55MH32上实现HTTP客户端模式发送GET和POST请求示例。

注意:因为本示例需要访问互联网,请确保W55MH32的网络环境及配置能够正常访问互联网。

例程中使用的是httpbin.org的服务器,它的get请求路径为httpbin.org/get,post请求路径为httpbin.org/post。

我们向httpbin.org发送请求后,它会把我们请求时提交的参数体现在响应内容中。

步骤一:通过DNS协议解析HTTP服务器的域名

在利用 HTTP向httpbin.org服务器提交数据时,首先要与该服务器建立 TCP链接。要知道,建立 TCP链接是必须基于 IP地址来进行连接操作的。而此处的 do_dns ()所承担的任务,正是借助 DNS协议对域名进行解析,进而获取到相应 IP地址的过程。

if (do_dns(ethernet_buf, org_server_name, org_server_ip))
{
 printf("DNS request failed.rn");
 while (1)
   {
   }
}

步骤二:进行HTTP GET和POST请求组包

接下来,我们需要按前面介绍的HTTP协议的规范来组包。

本例程中,我们定义了两个函数来分别生产HTTP GET Header()和HTTP POST Header()。详细代码如下:

/**
* @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);
}

步骤三:发送HTTP请求以及超时和响应内容处理

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()函数为发送HTTP请求并监听响应,具体内容如下:

/**
* @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;
       }
   }
}

在该函数中,程序会执行一个TCP Client模式的状态机,具体详细讲解请看TCP Client示例章节,当程序处于SOCK_ESTABLISHED状态时,会发送1次请求内容到服务器。接着就是监听服务器响应数据以及超时处理。

如果服务器返回异常响应,则会立即关闭链接,因此我们需要在SOCK_CLOSE_WAIT状态中处理服务器异常响应的内容。

9运行结果

烧录例程运行后,首先可以看到打印了PHY链路检测和DHCP获取网络信息,然后是DNS解析HTTP服务器域名结果,如下图所示:

wKgZPGiBi3mACmDlAACVUl9RtuM609.png

接着我们发送了一次GET请求报文,然后HTTP服务器返回了响应报文。

请求和响应原文都通过串口打印出来,如下图所示:

wKgZPGiBi3mAEPpxAACxKvOA-TA385.png

最后,我们发送了一次POST请求报文,然后HTTP服务器返回了响应报文。

请求和响应原文都通过串口打印出来,如下图所示:

wKgZO2iBi3mAeOZuAADPuChoh3k234.png

10总结

本文介绍了在 W55MH32芯片上实现 HTTP Client功能的方法,实现向httpbin.org网站获取数据。阐述了 HTTP协议的概念、特点、应用场景、工作流程、请求方法、响应内容,并给出请求及响应实例。以及展示了在W55MH32上的实现过程。

下一篇将讲解在该芯片上实现 HTTP Server功能,介绍通过浏览器修改 W55MH32网络地址信息的原理和实现步骤。敬请期待!

WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。

WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HTTP
    +关注

    关注

    0

    文章

    531

    浏览量

    34859
  • Client
    +关注

    关注

    0

    文章

    13

    浏览量

    9244
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    《测控电路》习题完整参考答案(第八章

    《测控电路》习题完整参考答案(第八章
    发表于 05-07 11:39

    波形的产生与变换电路 第八章PPT

    波形的产生与变换电路 第八章
    发表于 04-20 09:33 19次下载
    波形的产生与变换电路 <b class='flag-5'>第八章</b>PPT

    信号发生电路基础 第八章

    信号发生电路基础 第八章 8.1正弦波振荡电路1、振荡电路:是一种不需要外接输入信号就能将直流能源转换成具有一定频率、一定幅度和一定波形的交流能量
    发表于 04-20 13:58 49次下载

    第八章 线性离散控制系统分析

    第八章 线性离散控制系统分析 数字控制系统是一种以数字计算机为控制器去控制具有连续工作状态的被控对象的闭环控制系统。
    发表于 05-27 15:50 0次下载

    51单片机第八章素材

    单片机第八章素材练习,主要讲解单片机的初步应用只是,配合protues使用,加强对单片机有关知识的理解。
    发表于 11-16 18:53 1次下载

    电子技术基础模拟部分第五版_第八章习题答案.pdf

    电子技术基础模拟部分第五版_第八章习题答案.pdf,作业题解答!
    发表于 04-11 17:44 0次下载

    《测控电路》习题完整参考答案(第八章

    《测控电路》习题完整参考答案(第八章
    发表于 02-14 17:02 0次下载

    电路《电路原理》邱关源---第八章 相量法

    电路《电路原理》邱关源---第八章 相量法
    发表于 01-18 11:37 0次下载

    IC工艺和版图设计第八章Latch-up和GuardRing设计

    IC工艺和版图设计第八章Latch-up和GuardRing设计
    发表于 02-10 18:11 0次下载

    第三 W55MH32 TCP Client示例

    本文介绍在 W55MH32 芯片上实现 TCP 客户端模式进行数据回环测试的方法。阐述 TCP 协议概念、特点、与 UDP 区别、应用场景及相关机制。展示实现过程,包括开启 Keepalive 功能,在主循环运行测试程序。烧录例程后进行 PHY 链路检测、获取网络地址,再借助网络调试工具测试。
    的头像 发表于 07-24 09:06 768次阅读
    第三<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> TCP <b class='flag-5'>Client</b><b class='flag-5'>示例</b>

    第五 W55MH32 UDP示例

    本文介绍了在 W55MH32 芯片上实现 UDP 通信及数据回环测试的方法。阐述了 UDP 协议的概念、特点、应用场景、报文传输流程和报文结构,展示了实现过程,借助网络调试工具完成测试。
    的头像 发表于 07-24 09:13 648次阅读
    第五<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> UDP<b class='flag-5'>示例</b>

    第九 W55MH32 HTTP Server示例

    本文介绍了在 W55MH32 芯片上实现 HTTP Server 功能,并通过浏览器修改其网络地址信息的方法。阐述了 HTTP 协议的概念、特点、应用场景、工作流程、请求方法、响应内容,以及 Web 页面构成和交互方式。展示了在
    的头像 发表于 07-24 09:35 641次阅读
    第九<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> <b class='flag-5'>HTTP</b> Server<b class='flag-5'>示例</b>

    第十五 W55MH32 SNMP示例

    本文讲解了如何在 W55MH32 芯片上实现 SNMP 功能,通过实战例程展示了使用 MIB Browser 管理 W55MH32 的具体过程,涵盖在 MIB Browser 中创建分支、添加叶子
    的头像 发表于 07-24 10:43 705次阅读
    第十五<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> SNMP<b class='flag-5'>示例</b>

    第十八章 W55MH32 FTP_Server示例

    本文讲解了如何在 W55MH32 芯片上实现 FTP 协议的服务器模式,通过实战例程展示了使用 W55MH32 作为 FTP 服务器与 PC 端进行文件传输、目录操作等功能的过程,涵盖获取网络配置
    的头像 发表于 07-24 11:55 450次阅读
    第十<b class='flag-5'>八章</b> <b class='flag-5'>W55MH32</b> FTP_Server<b class='flag-5'>示例</b>

    第三十 W55MH32 HTTP_Server&amp;NetBIOS示例

    本文讲解了如何在 W55MH32 芯片上实现 HTTP_Server 与 NetBIOS 功能,并通过 NetBIOS 访问 HTTP 服务器网页内容,通过实战例程展示了在主循环中并行处理 H
    的头像 发表于 07-24 16:21 896次阅读
    第三十<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> <b class='flag-5'>HTTP</b>_Server&amp;NetBIOS<b class='flag-5'>示例</b>