概述
现在想让STM32 W5500通过HTTP Client POST的方式提交数据到远程服务器,并接收服务返回的JSON格式数据,解析和处理。
实现以上功能,需要具备几个条件:
1、STM32 W5500的基础配置,使得PC和W5500在同一个局域网内,PC可以PING通W5500。
2、STM32 W5500的TCP Client可以成功发数据,HTTP协议是基于TCP协议之上封装的协议。
3、远程服务器接口可以访问,可以通过POSTMAN工具先测试。
4、使用WireShark工具,追踪POSTMAN访问服务接口的报文数据,以及返回的报文数据。
STM32 W5500的基础配置和TCP Client我已具备条件,下面看下远程服务器接口是否可以访问:
Header部分:
Request Body和Response Body
接口返回了JSON 结构数据,说明接口是可以访问的。
打开WireShark工具,追踪一下POSTMAN访问的流数据,以及服务器返回的响应报文数据。
请求数据的追踪
接口返回的报文数据追踪
基础准备工作已经做好,那么STM32 W5500 Http Client POST请求的实现,由于一些信息比较敏感,对代码做了处理:
httppost.c
#ifndef __HTTPPOST_H
#define __HTTPPOST_H
#include "httppost.h"
#endif
u16 func_pack_httppost_body(char *buff_body, char *productId, char *deviceSn, char *deviceMac, char *devicePassword, char *hardwareVersion)
{
u16 len;
len = sprintf(buff_body, "a=%s&b=%s&c=%s&d=%s&e=%s",
productId, deviceSn, deviceMac, devicePassword, hardwareVersion);
return len;
}
u16 func_pack_httppost_head_body(char *buff_post, char *url_tail, u8 *host, u16 port, char *body, u16 body_len)
{
u16 len;
len = sprintf(buff_post, "POST %s HTTP/1.1rn"
"Connection: closern"
"User-Agent:W5500rn"
"Content-Type:application/x-www-form-urlencodedrn"
"Host: %d.%d.%d.%d:%drn"
"Content-Length: %drnrn"
"%srn", url_tail, host[0], host[1], host[2], host[3], port, body_len, body
);
return len;
}
static u16 local_port = 50000;
u8 func_http_post(u8 sock_no, u8 *rip, u16 port, char *buf_post, u16 len_post,char *buf_recv, u16 *len_recv, u16 timeout_ms)
{
u16 cnt, len;
char *body_cont;
cnt = 0;
for(;;)
{
switch(getSn_SR(sock_no))
{
case SOCK_INIT:
connect(sock_no, rip, port);
break;
case SOCK_ESTABLISHED:
send(sock_no, (u8*)buf_post, len_post);
if(getSn_IR(sock_no) & Sn_IR_CON)
{
setSn_IR(sock_no, Sn_IR_CON);
}
len = getSn_RX_RSR(sock_no);
if(len > 0)
{
memset(buf_recv, 0, len_post);
len = recv(sock_no, (u8*)buf_recv, len);
body_cont = strstr((char*)buf_recv, "HTTP/1.1 200");
if(body_cont == NULL)
{
return 2;
}
body_cont = strstr((char*)buf_recv, "rnrn");
if(body_cont != NULL)
{
len = strlen(body_cont) - 4;
memcpy(buf_recv, body_cont + 4, len);
buf_recv[len] = '