457|0

63

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第4期】基础任务二:TCP echo 服务器 [复制链接]

 

主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)

tcpecho 服务器

LWIP 源码包中也是没有 tcpecho 应用代码的,需要在 contrib 代码包中复制过来

pico (无 OS)

LWIP 在无 OS 的情况下只能使用 raw 的 api,所以把 tcpecho_raw.c 和 tcpecho_raw.h 复制到工程中。

在 while(1) 前加这行代码即可,修改 IP 地址、网关等就和 ping 的操作类似

  1. tcpecho_raw_init();

因为来回的插拔杜邦线不太方便,所以画了一个底板,原理图如下,引出了 485 串口、LCD、按键*3、CH340、两路 ADC

LCD 的驱动是 ST7735S 的,资料很多,就不赘述驱动代码了

然后在 tcpecho_raw.c 中添加 LCD 显示的代码和串口输出的代码,具体就是用 sprintf 来格式化,然后在 LCD 上显示并且行数自增,然后打印到调试串口

  1.     static char lcd_buff[512];
  2.     static int  lcd_line = 0;
  3.     sprintf(lcd_buff, "%.*s", p->len, p->payload);
  4.     LCD_ShowString(10, lcd_line, lcd_buff, GREEN);
  5.     lcd_line += 20;
  6.     lcd_line %= 320;
  7.     printf("rec msg: %s\n", lcd_buff);

这样 W5500 PICO 服务器端搭建好了,还需要一个客户端,用 js 写一段代码来实现一个连接服务器、发送消息、关闭连接的流程

  1. let net = require('net');
  2. let client = net.Socket();
  3. const host = '192.168.0.188';
  4. var arguments = process.argv;
  5. client.connect(7, host, () => {
  6. arguments.forEach((val, index) => {
  7. if (index > 1) {
  8. console.log(`send: ${val}`);
  9. client.write(`${val}`);
  10. }
  11. });
  12. });
  13. client.on('data', data => {
  14. console.log('rec:', data.toString() );
  15. client.end();
  16. })
  17. client.on('end', () => {
  18. console.log('client end');
  19. })

然后运行,后面的参数就是要发送的内容,可以看到串口输出了发送的内容

同时也在屏幕上面显示,可以看到显示了三行内容,和发送的消息一致

wireshark 抓包

使用如下规则,过滤掉网络质量不佳时候重发的内容,筛选出开发板的 IP

  1. ip.src == 192.168.0.188 || ip.dst == 192.168.0.188 && !tcp.analysis.retransmission && !tcp.analysis.duplicate_ack

可以很清楚的看到非常典型的 TCP 三次握手、ECHO 数据、四次挥手的流程

打开其中一条内容可以看到它的组成比 ICMP 消息包的内容要复杂一些,不过就是加了几个状态位和一些选项,可以在 rfc793 文档中查看具体的格式

然后打开 ECHO 的请求包查看详细内容

可以看到刚刚发送的消息

STM32 (有 OS) 作 Client

当有 RTOS 时, LWIP 可供选择的 API 就多了,这里写一个使用 netconn API 来连接服务器、发送消息、关闭连接的 demo

  1. #include "tcpecho.h"
  2. #include "lwip/opt.h"
  3. #if LWIP_NETCONN
  4. #include "lwip/sys.h"
  5. #include "lwip/api.h"
  6. #include <string.h>
  7. /*-----------------------------------------------------------------------------------*/
  8. char send_buf[128] = "";
  9. static void
  10. tcpecho_thread(void *arg)
  11. {
  12. struct netconn *conn;
  13. int ret;
  14. ip4_addr_t ipaddr;
  15. IP4_ADDR(&ipaddr,192,168,0,188);
  16. while (1)
  17. {
  18. conn = netconn_new(NETCONN_TCP);
  19. if (conn == NULL)
  20. {
  21. printf("create conn failed!\n");
  22. vTaskDelay(10);
  23. continue;
  24. }
  25. ret = netconn_connect(conn, &ipaddr, 7);
  26. if (ret == -1)
  27. {
  28. printf("Connect failed!\n");
  29. netconn_close(conn);
  30. vTaskDelay(10);
  31. continue;
  32. }
  33. printf("Connect to iperf server successful!\n");
  34. static int tick = 0;
  35. sprintf(send_buf, "STM32 TCP Client %d times.", tick++);
  36. ret = netconn_write(conn,send_buf, sizeof(send_buf), 0);
  37. printf("send msg: %s\n", send_buf);
  38. netconn_close(conn);
  39. netconn_delete(conn);
  40. vTaskDelay(2000);
  41. }
  42. }
  43. /*-----------------------------------------------------------------------------------*/
  44. void
  45. tcpecho_init(void)
  46. {
  47. sys_thread_new("tcpecho_thread", tcpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
  48. }
  49. /*-----------------------------------------------------------------------------------*/
  50. #endif /* LWIP_NETCONN */

在 main 函数中暂时关闭掉 Cache,因为 STM32H7 系列的 DCache 有概率影响到上面代码中 sprintf 的输出

  1. // CPU_CACHE_Enable();

烧录到 STM32,把 W5500 pico 和 STM32 都复位,可以查看到屏幕输出 STM32 发来的消息

同时两个开发板的串口都输出了收发消息的内容

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表