[其他ST产品] STM32 W5500 HTTP Client POST 方式请求/提交网络数据

[复制链接]
1160|12
 楼主| 突然下起雨 发表于 2023-1-15 17:22 | 显示全部楼层 |阅读模式
现在想让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我已具备条件,下面看下远程服务器接口是否可以访问:


评论

———————————————— 版权声明:本文为CSDN博主「Mr_Johhny」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lnniyunlong99/article/details/105614408/  发表于 2023-1-15 17:22
 楼主| 突然下起雨 发表于 2023-1-15 17:24 | 显示全部楼层
Header部分:
1404763c3c632a8f1d.png
 楼主| 突然下起雨 发表于 2023-1-15 17:24 | 显示全部楼层
Request Body和Response Body
4964163c3c658295b6.png
 楼主| 突然下起雨 发表于 2023-1-15 17:25 | 显示全部楼层
接口返回了JSON 结构数据,说明接口是可以访问的。

打开WireShark工具,追踪一下POSTMAN访问的流数据,以及服务器返回的响应报文数据。
 楼主| 突然下起雨 发表于 2023-1-15 17:26 | 显示全部楼层
请求数据的追踪
5414163c3c69885279.png
 楼主| 突然下起雨 发表于 2023-1-15 17:27 | 显示全部楼层
接口返回的报文数据追踪

 楼主| 突然下起雨 发表于 2023-1-15 17:27 | 显示全部楼层
 楼主| 突然下起雨 发表于 2023-1-15 17:28 | 显示全部楼层
基础准备工作已经做好,那么STM32 W5500 Http Client POST请求的实现,由于一些信息比较敏感,对代码做了处理:
 楼主| 突然下起雨 发表于 2023-1-15 17:29 | 显示全部楼层
httppost.c
  1. #ifndef __HTTPPOST_H
  2. #define __HTTPPOST_H
  3. #include "httppost.h"
  4. #endif

  5. u16 func_pack_httppost_body(char *buff_body, char *productId, char *deviceSn, char *deviceMac, char *devicePassword, char *hardwareVersion)
  6. {
  7.         u16 len;
  8.         len = sprintf(buff_body, "a=%s&b=%s&c=%s&d=%s&e=%s",\
  9.                 productId, deviceSn, deviceMac, devicePassword, hardwareVersion);
  10.         return len;
  11. }

  12. u16 func_pack_httppost_head_body(char *buff_post, char *url_tail, u8 *host, u16 port, char *body, u16 body_len)
  13. {
  14.         u16 len;
  15.         len = sprintf(buff_post, "POST %s HTTP/1.1\r\n"
  16.                 "Connection: close\r\n"
  17.                 "User-Agent:W5500\r\n"
  18.                 "Content-Type:application/x-www-form-urlencoded\r\n"
  19.                 "Host: %d.%d.%d.%d:%d\r\n"
  20.                 "Content-Length: %d\r\n\r\n"
  21.                 "%s\r\n", url_tail, host[0], host[1], host[2], host[3], port, body_len, body
  22.         );
  23.         return len;
  24. }

  25. static u16 local_port = 50000;

  26. 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)
  27. {
  28.         u16 cnt, len;       
  29.         char *body_cont;
  30.         cnt = 0;
  31.        
  32.         for(;;)
  33.         {
  34.                 switch(getSn_SR(sock_no))
  35.                 {
  36.                         case SOCK_INIT:
  37.                                 connect(sock_no, rip, port);
  38.                         break;
  39.                         case SOCK_ESTABLISHED:
  40.                                 send(sock_no, (u8*)buf_post, len_post);
  41.                                 if(getSn_IR(sock_no) & Sn_IR_CON)                                          
  42.                                 {
  43.                                         setSn_IR(sock_no, Sn_IR_CON);
  44.                                 }
  45.                                 len = getSn_RX_RSR(sock_no);
  46.                                 if(len > 0)
  47.                                 {
  48.                                         memset(buf_recv, 0, len_post);
  49.                                         len = recv(sock_no, (u8*)buf_recv, len);
  50.                                         body_cont = strstr((char*)buf_recv, "HTTP/1.1 200");
  51.                                         if(body_cont == NULL)
  52.                                         {
  53.                                                 return 2;
  54.                                         }
  55.                                         body_cont = strstr((char*)buf_recv, "\r\n\r\n");
  56.                                         if(body_cont != NULL)
  57.                                         {
  58.                                                 len = strlen(body_cont) - 4;
  59.                                                 memcpy(buf_recv, body_cont + 4, len);
  60.                                                 buf_recv[len] = '\0';
  61.                                                 *len_recv = len;
  62.                                                 close(sock_no);
  63.                                                 return 0;
  64.                                         }                                       
  65.                                 }                               
  66.                         break;
  67.                         case SOCK_CLOSE_WAIT:
  68.                                 close(sock_no);
  69.                         break;
  70.                         case SOCK_CLOSED:
  71.                                 socket(sock_no, Sn_MR_TCP, local_port++, Sn_MR_ND);
  72.                                 if(local_port > 64000)
  73.                                 {
  74.                                         local_port = 50000;
  75.                                 }
  76.                         break;
  77.                 }
  78.                
  79.                 cnt ++;
  80.                 if(cnt >= timeout_ms)
  81.                 {
  82.                         close(sock_no);
  83.                         return 1;
  84.                 }
  85.                 delay_ms(1);
  86.         }
  87. }
 楼主| 突然下起雨 发表于 2023-1-15 17:29 | 显示全部楼层
测试的主函数代码:
  1. #ifndef __STM32F10X_H
  2. #define __STM32F10X_H
  3. #include "stm32f10x.h"
  4. #endif

  5. #ifndef __Z_UTIL_TIME_H
  6. #define __Z_UTIL_TIME_H
  7. #include "z_util_time.h"
  8. #endif

  9. #ifndef __Z_HARDWARE_LED_H
  10. #define __Z_HARDWARE_LED_H
  11. #include "z_hardware_led.h"
  12. #endif

  13. #ifndef __Z_HARDWARE_SPI_H
  14. #define __Z_HARDWARE_SPI_H
  15. #include "z_hardware_spi.h"
  16. #endif

  17. #ifndef __Z_HARDWARE_USART2_H
  18. #define __Z_HARDWARE_USART2_H
  19. #include "z_hardware_usart2.h"
  20. #endif

  21. #include "w5500.h"
  22. #include "socket.h"
  23. #include "w5500_conf.h"
  24. #include "dhcp.h"
  25. #include "dns.h"

  26. #ifndef __HTTPPOST_H
  27. #define __HTTPPOST_H
  28. #include "httppost.h"
  29. #endif

  30. char buf_send[2048];
  31. char buf_cont[256];
  32.        
  33. int main(void)
  34. {
  35.         DHCP_Get dhcp_get;
  36. //        u8 buf_recv[1536] = {0, };
  37.        
  38.         u16 len, recv_len;
  39.         u8 res;
  40.        
  41.         uint8 mac[6];
  42.         u8 remote_ip[4] = {192, 168, 1, 109};
  43.         u16 port = 8084;       
  44.        
  45.         init_led();
  46.        
  47.         init_system_spi();
  48.         func_w5500_reset();
  49.        
  50.         init_hardware_usart2_dma(115200);
  51.                
  52.         getMacByLockCode(mac);
  53.         setSHAR(mac);
  54.        
  55.         sysinit(txsize, rxsize);
  56.         setRTR(2000);
  57.   setRCR(3);
  58.        
  59.         //USART DMA problem 2byte missing
  60.         func_usart2_dma_send_bytes(mac, 2);
  61.         delay_ms(100);
  62.        
  63.         //DHCP
  64.         for(;func_dhcp_get_ip_sub_gw(1, mac, &dhcp_get, 500) != 0;);       
  65.         if(func_dhcp_get_ip_sub_gw(1, mac, &dhcp_get, 500) == 0)
  66.         {
  67.                 setSUBR(dhcp_get.sub);
  68.                 setGAR(dhcp_get.gw);
  69.                 setSIPR(dhcp_get.lip);
  70.         }
  71.        
  72.         len = func_pack_httppost_body(buf_cont, "", "", "", "", "");
  73.        
  74. //        pack http message               
  75.         len = func_pack_httppost_head_body(buf_send, "/a/b/c/d/create", remote_ip, port, buf_cont, len);
  76.        
  77. //        res = func_httpc_post(0, remote_ip, port, buf_send, len, buf_send, &recv_len, 1000, 5000);
  78.         res = func_http_post(0, remote_ip, port, buf_send, len, buf_send, &recv_len, 1000);
  79.         if(res == 0)
  80.         {
  81.                 func_usart2_dma_send_bytes((u8*)buf_send, recv_len);
  82.         }

  83.         for(;;)
  84.         {
  85.                
  86.                 func_led1_on();
  87.                 delay_ms(1000);
  88.                 func_led1_off();
  89.                 delay_ms(1000);
  90.                
  91.         }
  92. }
 楼主| 突然下起雨 发表于 2023-1-15 17:35 | 显示全部楼层
测试的结果,解析报文的body,并通过串口打印出来:
5640963c3c8e0080fc.png
 楼主| 突然下起雨 发表于 2023-1-15 17:36 | 显示全部楼层
通过16进制转字符串转换一下,看看结果
8665563c3c918682dd.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

531

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部