三十一、W5100S/W5500+RP2040树莓派Pico<TCP_Server多路socket>

文章目录

  • 1 前言
  • 2 简介
    • 2. 1 使用多路socket的优点
    • 2.2 多路socket数据交互原理
    • 2.3 多路socket应用场景
  • 3 WIZnet以太网芯片
  • 4 多路socket设置示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 结果演示
  • 5 注意事项
  • 6 相关链接

1 前言

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。支持多路socket独立通信,通信效率互不影响。本教程将介绍W5100S/W5500以太网多路socket应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2 简介

2. 1 使用多路socket的优点

  多路socket的优点主要体现在以下几个方面:

  1. 提高并发处理能力:多路socket可以同时处理多个网络连接请求,显著提高服务器的性能和并发处理能力。这意味着服务器可以同时处理多个客户端的请求,而不需要为每个客户端连接创建一个线程。
  2. 增强可靠性:多路socket可以为对可靠性要求比较高的场景提供主服务器和备服务器连接。在实际使用中,当主服务器出现异常时,可以通过备用服务器提供服务。
  3. 优化数据处理:多路socket可以根据不同的网络连接请求进行优化处理,比如对数据传输间隔较长的连接使用网络心跳包定期上传一组固定的数据,让服务器知道设备处于正常工作状态;对于触发式上传数据的场景,则可以减少不必要的处理过程。
  4. 方便设备识别:在设备启动时,多路socket可以上传一组带有唯一编号的信息到服务器,用于服务器辨别是那一台设备,方便后续进行数据交互。

2.2 多路socket数据交互原理

在这里插入图片描述

服务器建立多路socket的流程可以按照以下步骤进行:

  1. 服务器端创建socket,并绑定到一个IP地址和一个端口上,然后开启侦听,等待客户端连接请求。
  2. 当服务器端接到客户端的连接请求后,会为这个连接创建一个新的socket,并与客户端建立连接。
  3. 服务器端和客户端可以通过各自的socket进行数据交互。
  4. 当数据交互完成后,可以关闭连接(可能主动,也可能被动)。
  5. 服务器继续侦听,等待下一个客户端连接请求。

2.3 多路socket应用场景

多路socket应用是指使用socket接口进行网络通信,并允许多个客户端或服务器同时建立连接的应用程序。以下是一些常见的多路socket应用:

  1. 聊天服务器:聊天服务器可以同时与多个客户端建立连接,接收和发送消息。多路socket可以让服务器同时处理多个客户端的连接请求,实现高效的并发处理。
  2. 游戏服务器:游戏服务器需要同时与多个客户端建立连接,处理游戏逻辑和数据交换。多路socket可以让服务器同时处理多个客户端的连接请求,提高游戏的流畅度和稳定性。
  3. 视频直播服务器:视频直播服务器需要同时与多个客户端建立连接,传输视频数据。多路socket可以让服务器同时处理多个客户端的连接请求,提高直播的流畅度和稳定性。
  4. 分布式系统:分布式系统需要多个服务器协同工作,处理客户端的请求。多路socket可以让每个服务器同时处理多个客户端的连接请求,提高系统的可扩展性和稳定性。

3 WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPv6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4 多路socket设置示例概述以及使用

4.1 流程图

  程序的运行框图如下所示:

在这里插入图片描述

4.2 准备工作核心

软件

  • Visual Studio Code
  • WIZnet UartTool
  • SocketTester

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)

  • 通过TTL串口转USB,连接UART0 的默认引脚:

    • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040 进行接线时

    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:tcp_server_multi_socket.c文件中加入对应的.h文件。

第二步:定义DHCP配置需要的宏。

第三步:网络信息的配置,开启DHCP模式。

第四步:编写定时器回调处理函数,用于 DHCP 1秒嘀嗒定时器处理函数。

第五步:主函数先是定义了一个定时器结构体参数用来触发定时器回调函数,对串口和SPI进行初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,主循环进行服务器运行函数中。

第六步:我们看到服务器的函数的运行函数,先是打开socket,创建服务器,然后开始监听,如果有客户连接socket号会进行加一操作,W5100S最多支持4路socket,W5500最多支持8路socket。循环检测客户端发来的消息,并打印出对应连接客户端的信息。

void do_tcp_server(void)
{
    static uint8_t sock_cof = 0;
    uint16_t len = 0;
    uint8_t destip[4];
    uint16_t destport;
    switch (getSn_SR(sock_cof)) /*Get the socket status*/
    {
    case SOCK_CLOSED:                                      /*The socket is closed*/
        socket(sock_cof, Sn_MR_TCP, local_port, Sn_MR_ND); // Open socket
        break;

    case SOCK_INIT:       /*The socket is in the initialization state*/
        listen(sock_cof); /*socket starts listening*/
        break;

    case SOCK_ESTABLISHED: /*The socket is in the connection establishment state*/

        if (getSn_IR(sock_cof) & Sn_IR_CON) /*Receive interrupt flags clearly*/
        {
            setSn_IR(sock_cof, Sn_IR_CON);
        }
        len = getSn_RX_RSR(sock_cof);
        if (len > 0)
        {
            recv(sock_cof, buff, len); /*print the receive data.*/
            buff[len] = 0x00;
            getSn_DIPR(sock_cof, destip);
            destport = getSn_DPORT(sock_cof);
            printf("socket%d form:%d.%d.%d.%d port: %d  message:%s\r\n", sock_cof, destip[0], destip[1], destip[2], destip[3], destport, buff);
            send(sock_cof, buff, len);
        }
        break;

    case SOCK_CLOSE_WAIT: /*The socket is waiting to be closed*/
        close(sock_cof);
        break;
    }
#if (_WIZCHIP_ == W5100S)
    if (sock_cof < 4)
    {
        sock_cof++;
    }
    else
    {
        sock_cof = 0;
    }
#elif (_WIZCHIP_ == W5500)
    if (sock_cof < 8)
    {
        sock_cof++;
    }
    else
    {
        sock_cof = 0;
    }
#endif
}

4.5 结果演示

在这里插入图片描述

在这里插入图片描述

5 注意事项

  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

​ (2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/163280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(七)

LEFT JOIN LEFT JOIN 同样用于关联两个表&#xff0c;ON 关键字后指定两个表共有的字段作为匹配条件&#xff0c;与 INNER JOIN 不同的地方在于匹配不上的数据行&#xff0c;INNER JOIN 对两表匹配不上的数据行不返回结果&#xff0c;而 LEFT JOIN 只对右表&#xff08;table2…

gRPC 四模式之 客户端流RPC模式

客户端流RPC模式 在客户端流 RPC 模式中&#xff0c;客户端会发送多个请求给服务器端&#xff0c;而不再是单个请求。服务器端则会发送一个响应给客户端。但是&#xff0c;服务器端不一定要等到从客户端接收到所有消息后才发送响应。基于这样的逻辑&#xff0c;我们可以在接收…

基于SSM+Vue的鲜花销售系统/网上花店系统

基于SSM的鲜花销售系统/网上花店系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 摘要 鲜花销售系统是一个基于SSM&#xff08;Spring …

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(八)

FULL OUTER JOIN 除了前面讲到的 INNER JOIN&#xff08;内连接&#xff09;、LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;&#xff0c;还有另外一种关联方式&#xff0c;即 FULL OUTER JOIN&#xff08;全外连接&#xff09; FULL O…

深信服AC设备用户认证

拓扑图 目录 拓扑图 一. 无需认证 思路&#xff1a;创建用户和组&#xff0c;将无需认证策略和用户绑定 1.创建组&#xff0c;组里添加用户 2. 新建不需要认证策略&#xff0c;将不需要认证策略和用户关联 3.验证 二.密码认证 思路&#xff1a;创建用户和组&#xff0c;并…

通过bat脚本控制Oracle服务启动停止

1、将Oracle服务全部设置为手动启动 初始安装Oracle之后服务启动状态&#xff1a; 2、服务功能介绍 3、构建服务启动/停止bat脚本 注意&#xff1a;编码选择ANSI(如果编码不是ANSI运行脚本会显示乱码) echo off :main cls echo 当前Oracle服务状态&#xff1a; for /f &quo…

Swagger(4):Swagger配置

在上一张的项目中创建SwaggerConfig&#xff0c;进行配置文档内容。 1 配置基本信息 Docket&#xff1a;摘要对象&#xff0c;通过对象配置描述文件的信息。 apiInfo:设置描述文件中info。参数类型ApiInfo select():返回ApiSelectorBuilder对象&#xff0c;通过对象调用buil…

Java 某市教育局综合信息管理平台

1) 项目简介 “互联网智慧教育”管理平台&#xff0c;实现全市教育信息系统集中建设和教育数据在云平台的汇集&#xff0c;在全市中小学整体实现电子班牌、家校通等功能&#xff0c;选取部分重点学校进行一卡通系统试点建设&#xff0c;实现智能化门禁、道闸、实体卡等功能…

后端面经学习自测(三)

文章目录 1、ArrayList和Linkedlist区别&#xff1f;2、ArrayList扩容机制&#xff1f;3、ArrayList和Linkedlist分别能做什么场景&#xff1f;4、事务特性&#xff1f;MySQL事务Redis事务Spring事务5、在Spring中事务失效的场景&#xff1f;6、Java泛型&#xff1f;7、泛型擦除…

FPGA_边沿检测电路设计

FPGA_边沿检测电路设计 边沿检测原理图波形图分析实现方法方法一&#xff1a;与逻辑实现方法二&#xff1a;或逻辑实现方法三&#xff1a;与逻辑实现 边沿检测原理图 由状态转移表可以看出&#xff0c;其转换条件中需要检测到下降沿以及上升沿&#xff0c;而边沿检测其原理就是…

1.0 Zookeeper 教程

分类 Zookeeper 教程 ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&…

团结引擎已全面支持 OpenHarmony 操作系统

Unity 中国宣布与开放原子开源基金会达成平台级战略合作。 据称团结引擎已全面支持 OpenHarmony 操作系统&#xff0c;同时将为 OpenHarmony 生态快速带来更多高品质游戏与实时 3D 内容。Unity 称现在用户可以 “在 OpenHarmony 框架中感受到与安卓和 iOS 同样丝滑的游戏体验”…

分支限界法(1)--旅行商问题

一、概述 有n个城市&#xff0c;旅行者要访问所有n个城市&#xff0c;最终回到起始点&#xff0c;假设起始点给定为1&#xff0c;城市间距离已知&#xff0c;求能够完成旅行的最短距离。题干如下图。 算法&#xff1a;分支限界法&#xff0c;使用队列进行bfs搜索。 二、代码 i…

工程化实战 - 前端AST(进阶)

###脚手架 *快速自动化搭建启动工具 目标: ####第一步:处理依赖 npm i path npm i chalk4.1.0 npm i fs-extra npm i inquirer8.2.2 npm i commander npm i axios npm i download-git-repo //ora easy-table figlet ####第二步:处理工程入口 ####3.加入命令交互 交互好帮手…

<MySQL> 如何合理的设计数据库中的表?数据表设计的三种关系

目录 一、表的设计 二、一对一关系 三、一对多关系 四、多对多关系 一、表的设计 数据库设计就是根据需要创建出符合需求的表。 首先根据需求找到体系中的关键实体对象&#xff0c;通常每个实体对象都会有一个表&#xff0c;表中包含了这个实体的相关属性。 再理清楚实体对…

Linux——进程控制

Linux——进程控制 fork()缺页中断 进程终止进程异常exit_exit进程等待waitwaitpidstatusWIFEXITED 多进程等待阻塞等待和非阻塞等待进程替换单进程的进程替换execlexeclpexecvexecle fork() 我们之前是接触过这个函数的&#xff0c;这个函数我们之前是要来创建子进程的函数&a…

生命科学领域 - FAIR原则和如果使数据FAIR化

2016年&#xff0c;《Scientific Data》发表了《科学数据管理和监督的FAIR指导原则》&#xff08;FAIR Guiding Principles for scientific data management and stewardship&#xff09;。文章旨在提供指导方针&#xff0c;以提高数字资产的可发现性、可访问性、互操作性和重用…

一些RLHF的平替汇总

卷友们好&#xff0c;我是rumor。 众所周知&#xff0c;RLHF十分玄学且令人望而却步。我听过有的小道消息说提升很大&#xff0c;也有小道消息说效果不明显&#xff0c;究其根本还是系统链路太长自由度太高&#xff0c;不像SFT一样可以通过数据配比、prompt、有限的超参数来可控…

【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集

【论文解读】FFHQ-UV 论文地址&#xff1a;https://arxiv.org/pdf/2211.13874.pdf 0. 摘要 我们提出了一个大规模的面部UV纹理数据集&#xff0c;其中包含超过50,000张高质量的纹理UV贴图&#xff0c;这些贴图具有均匀的照明、中性的表情和清洁的面部区域&#xff0c;这些都是…

【数据预处理2】数据预处理——数据标准化

数据标准化 1. 什么是标准化&#xff1f;   数据标准化是一个常用的数据预处理操作&#xff0c;目的是将不同规格的数据转换到统一规格或不同分布的数据转换到某个特定范围&#xff0c;以减少规模、特征、分布差异等对模型的影响。这种操作也叫作无量纲化。   除了用作模型…