七、W5100S/W5500+RP2040树莓派Pico<UDP 组播>

文章目录

  • 1. 前言
  • 2. 相关简介
    • 2.1 简述
    • 2.2 优点
    • 2.3 应用
  • 3. WIZnet以太网芯片
  • 4. UDP 组播回环测试
    • 4.1 程序流程图
    • 4.2 测试准备
    • 4.3 连接方式
    • 4.4 相关代码
    • 4.5 测试现象
  • 5. 注意事项
  • 6. 相关链接

1. 前言

  UDP组播是一种基于UDP协议的通信方式,它允许一台计算机通过发送单个UDP数据包来同时向多个目标发送信息。这种通信方式在需要高效、实时的数据传输的应用中非常有用,比如视频直播、在线游戏等。
  本章节将进行UDP组播回环测试。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。

2. 相关简介

2.1 简述

  UDP组播是一种基于UDP协议的通信方式,也称为多播。它允许一台计算机通过发送单个UDP数据包来同时向多个目标发送信息,而不需要像单播模式那样对每个目标单独发送数据包。

  组播地址是一种特殊的IP地址,范围从224.0.0.0到239.255.255.255,它们被划分为不同的类型,包括局部链接多播地址、预留多播地址和管理权限多播地址。使用组播时,需要在发送方和接收方之间建立对等关系,并使用特定的组播协议来确保数据的传输可靠性和顺序性。

在这里插入图片描述

  组播MAC地址:为了在本地物理网络上实现组播信息的正确传输,需要在链路层使用组播MAC地址。以太网传输IPv4单播报文的时候,目的MAC地址使用的是接收者的MAC地址。但是在传输组播数据时,其目的地不再是一个具体的接收者,而是一个成员不确定的组,所以要使用IPv4组播MAC地址,即IPv4组播地址映射到链路层中的地址。IANA规定,IPv4组播MAC地址的高24位为0x01005e,第25位为0,低23位为IPv4组播地址的低23位,映射关系如下图所示:

在这里插入图片描述

  在组播中,发送方将数据包发送到特定的组播组地址,这个地址不属于任何特定的一台计算机,而是属于一组计算机。只有订阅了这个组播组地址的计算机才能接收到这个数据包。这种通信方式可以有效地节省网络带宽,因为发送方只需要发送一个数据包,而不是对每个接收方都发送一个数据包。

  相比之下,单播模式是点对点的通信方式,每个发送方都需要单独向接收方发送数据包。在某些情况下,如果需要向多个接收方发送相同的数据包,那么单播模式会浪费大量的网络带宽。

  总的来说,UDP组播是一种非常高效的通信方式,适用于需要向多个接收者同时发送相同数据的场景,如视频直播、在线游戏、多用户协作等。

2.2 优点

  • 节省带宽:由于UDP组播允许发送方只需发送一个数据包,就可以到达多个接收方,因此可以显著节省带宽,特别是在接收方较多的情况下。
  • 高效传输:相对于单播模式,UDP组播可以在网络中快速传输数据包,因为它可以在一个网络路径上同时发送到多个接收方。
  • 实时性:UDP组播适用于实时通信,因为它可以立即将数据包发送到所有订阅了组播组的接收方,而无需等待接收方确认。
    可扩展性:通过使用组播地址,可以实现一对多的通信,适用于大规模的数据分发和实时应用

2.3 应用

  • 多媒体广播:多媒体广播应用,如电视和电台广播,通过UDP组播将音频和视频数据传输到多个接收者。
  • 多用户游戏:多用户游戏通过UDP组播将游戏数据传输到多个客户端,实现多人在线游戏。
  • 实时协作:像在线会议这样的实时协作应用,可以使用UDP组播将音频、视频和其他协作数据传输到所有参会者。
  • 分布式系统:UDP组播可以用于分布式系统,将数据从一个节点发送到其他节点,实现数据同步和状态报告等功能。
  • 网络监控:网络监控应用可以通过UDP组播将监控数据发送到多个接收者,例如实时流量监控、网络安全监控等。
  • 视频会议:多人在线的视频会议,每个用户都可以共享到音频、视频数据。

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. UDP 组播回环测试

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 GPIO 0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行连线时
    • RP2040 GPIO 16 <----> W5100S MISO
    • RP2040 GPIO 17 <----> W5100S CS
    • RP2040 GPIO 18 <----> W5100S SCK
    • RP2040 GPIO 19 <----> W5100S MOSI
    • RP2040 GPIO 20 <----> W5100S RST
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

  我们直接打开udp_multicast.c文件(路径:examples/udp_multicast/udp_multicast.c)看下具体实现:

  可以看到这里是以dhcp模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做DHCP过程中的计时以进行超时处理;接着进入DHCP配置网络信息,成功则直接进入循环调用回环测试函数,失败则用我们初始化的静态网络信息进行配置,然后再进入循环调用回环测试函数,如下所示:

/* Network information to be configured. */
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
    .ip = {192, 168, 1, 10},                     // Configured IP address
    .sn = {255, 255, 255, 0},                    // Configured subnet mask
    .gw = {192, 168, 1, 1},                      // Configured gateway
    .dns = {8, 8, 8, 8},                         // Configured domain address
    .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.

wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
};                                 // Send and receive cache
static uint8_t multicast_mac[6]= {0x01,0x00,0x5e,0x01,0x01,0x0b};   // multicast mac address
static uint8_t multicast_ip[4]  = {224, 1, 1, 11};  // multicast ip address
static uint16_t multicast_port  = 30000; // multicast port
static uint8_t dhcp_get_ip_flag = 0;         // Define the DHCP acquisition flag

int main()                                                          
{   
    struct repeating_timer timer; // Define the timer structure

    /* MCU init */
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // Initialize the chip interface

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip tcp server example.\r\n");
    network_init(&net_info); // Configuring Network Information
    print_network_information(&get_info);   // Read back the configuration information and print it

    while(true)
    {
        multicast_loopback(SOCKET_ID, ethernet_buf, multicast_mac, multicast_ip, multicast_port);   // Multicast loopback test
    }
}

  跳进回环测试里面看下其具体实现: 该函数有这几个参数,socket端口号、数据收发缓存、组播MAC地址、组播IP地址、组播端口;根据实际需要填入参数。其整体通过一个switch状态机轮询socket状态,根据不同进行相应的处理,依次完成了初始化、打开socket端口、收到数据后回传的操作 ;其中本地端口直接在函数内初始化了。如下所示:

/**
 * @brief   UDP Multicast loopback test
 * @param   sn: Socket Number
 * @param   buf: Data sending and receiving cache
 * @param   multicast_mac: Multicast MAC address
 * @param   multicast_ip:  Multicast IP address
 * @param   multicast_port:Multicast port
 * @return  value for SOCK_ERRORs,return 1:no error
*/
int32_t multicast_loopback(uint8_t sn, uint8_t* buf, uint8_t* multicast_mac, uint8_t* multicast_ip, uint16_t multicast_port)
{
   int32_t  ret;
   uint16_t size, sentsize;
   uint8_t destip[4];
   uint16_t destport, port=50000;
   
   switch(getSn_SR(sn))
   {
      case SOCK_UDP :
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
            buf[ret]=0x00;
            printf("recv from [%d.%d.%d.%d][%d]: %s\r\n",destip[0],destip[1],destip[2],destip[3],destport,buf);
            if(ret <= 0)
            {
#ifdef _MULTICAST_DEBUG_
               printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
               return ret;
            }
            size = (uint16_t) ret;
            sentsize = 0;
            while(sentsize != size)
            {
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
               if(ret < 0)
               {
#ifdef _MULTICAST_DEBUG_
                  printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
         }

         break;
      case SOCK_CLOSED:
#ifdef _MULTICAST_DEBUG_
         printf("%d:Multicast Loopback start\r\n",sn);
#endif
         setSn_DIPR(0, multicast_ip);
         setSn_DPORT(0, multicast_port);
         setSn_DHAR(0, multicast_mac);
         if((ret = socket(sn, Sn_MR_UDP, port, Sn_MR_MULTI)) != sn)
            return ret;
#ifdef _MULTICAST_DEBUG_
         printf("%d:Opened, UDP Multicast Socket\r\n", sn);
         printf("%d:Multicast Group IP - %d.%d.%d.%d\r\n", sn, multicast_ip[0], multicast_ip[1], multicast_ip[2], multicast_ip[3]);
         printf("%d:Multicast Group Port - %d\r\n", sn, multicast_port);
#endif
         break;
      default :
         break;
   }
   return 1;
}

4.5 测试现象

​ 硬件连接无误后,编译烧录程序(具体可参考第一章节),打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;打开网络调试工具SocketTester,在左列填入参数:选择UDP模式,本地IP填入电脑IP,端口随机,但尽量不要使用特殊端口;下边的远程IP和端口填入对应的组播IP和端口,然后直接发送信息,可以看到数据成功发送后串口这边收到的来自组播成员(192.168.1.2:8080)的数据,也即设备作为组播成员成功收到了电脑发给播组的数据;如下图所示:

在这里插入图片描述

为了更直接的了解其交互过程,这里通过wireshark抓包工具抓包分析,每次向播组发送数据后,设备作为播组成员收到后都进行了回传,如下图所示:
在这里插入图片描述

5. 注意事项

  • 组播MAC地址和组播IP地址的映射关系
  • 如果想用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官方库链接

    本章例程链接

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

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

相关文章

HEC-RAS 1D/2D水动力与水环境模拟技术

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而&#xff0c;一方面水动力和水环境模型的使用非常复杂&#xff0c;理论繁复&#xff1b;另一方面&#xff0c;免费的水动力和水环境软件往往缺少重要功能&a…

rcore 笔记 第一个裸机程序

文章目录 环境应用程序与基本执行环境应用程序执行环境与基本操作平台执行应用程序应用程序执行环境目标平台与目标三元组 移除标准库依赖移除 println! 宏提供 panic_handler 功能应对致命错误移除 main 函数 编译运行内核指令程序内存布局与编译流程 内核第一条指令编写内核第…

计算机毕业设计选题推荐-短文写作竞赛微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

操作系统的内存管理之虚拟空间

操作系统的内存管理&#xff0c;主要分为三个方面。 第一&#xff0c;物理内存的管理&#xff0c;相当于会议室管理员管理会议室。 第二&#xff0c;虚拟地址的管理&#xff0c;也即在项目组的视角&#xff0c;会议室的虚拟地址应该如何组织。 第三&#xff0c;虚拟地址和物…

瑞萨e2studio(28)----SPI 驱动WS2812灯珠

瑞萨e2studio.28--SPI 驱动WS2812灯珠 概述视频教学样品申请芯片级联方法数据传输时序新建工程软件准备保存工程路径芯片配置开始SPI配置SPI属性配置时钟配置SPI配置CPHA配置代码hal_entry.cws2812.cws2812.h 概述 本文介绍了如何使用瑞萨RA微控制器&#xff0c;结合E2STUDIO…

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

Docker 运行swagger-editor实现在线接口文档维护与调试

文章目录 一、序二&#xff0c; Docker部署准备1. 编辑docker-compose.yml2. 新增启动、停止脚本3. 样例 swagger.yaml 三&#xff0c; 启动swagger-editor1. 使用说明2. 完整代码备份 一、序 因工作需要&#xff0c;需要搭建python运行环境&#xff0c;项目中python基于flask…

处理SAP资产折旧AFAB 过账报错:“科目 8019010100 要求一个成本会计分配”

会计在进行资产折旧AFAB时 报错如下所示&#xff1a; 原因分析&#xff1a; 折旧时没有把资产设置得成本中心带到过账凭证的成本中心字段中去。而资产中已经维护了成本中心了。 所以要在资产过账的科目分配中设置一下路径如下&#xff1a; 或者TCODE&#xff1a;ACSET科目设置这…

一文带你了解自动化测试是什么?

本章主要讲解自动化测试的含义、分类、项目使用&#xff0c;以及自动化测试工具的优势。 一、自动化测试概述 1、什么是自动化测试&#xff1f; 自动化测试是软件测试活动中的一个重要分支和组成部分。随着软件产业的不断发展&#xff0c;市场对软件周期的要求越来越高&…

R -- 体验 stringdist

文章目录 安装使用stringdist :返回列表example stringdistmatrix &#xff1a;返回矩阵example amatch & ain延伸&#xff1a;距离计算公式Hamming distanceLongest Common Substring distanceLevenshtein distance (weighted)The optimal string alignment distance dosa…

阿里云2核2G3M带宽轻量服务器87元一年,经济型e实例99元一年

2023阿里云双十一优惠活动2核2G3M轻量应用服务器一年优惠价87元&#xff0c;云服务器ECS经济型e实例优惠价格99元一年&#xff0c;也是2核2G配置&#xff0c;自带3M带宽&#xff0c;并且续费不涨价&#xff0c;阿里云百科aliyunbaike.com还是很建议大家选择e实例的&#xff0c;…

什么测试自动化测试?

什么测试自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…

小说网站源码带管理后台手机端和采集

搭建教程&#xff0c;安装宝塔 php7.2&#xff0c;绑定域名&#xff0c;上传源码到根目录解压 源码获取请自行百度&#xff1a;一生相随博客 一生相随博客致力于分享全网优质资源&#xff0c;包括网站源码、游戏源码、主题模板、插件、电脑软件、手机软件、技术教程等等&#…

AI:47-基于深度学习的人像背景替换研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

xcode 安装及运行个人app编程应用

1.xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具&#xff08;IDE&#xff09;&#xff0c;由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计&#xff0c;编码、测试、调试都在一个简单的窗口内完成 2.xcode 下…

iOS开发-CoreNFC实现NFC标签Tag读取功能

iOS开发-CoreNFC实现NFC标签Tag读取功能 一、NFC近场通信 近场通信&#xff08;NFC&#xff09;是一种无线通信技术&#xff0c;它使设备能够在不使用互联网的情况下相互通信。它首先识别附近配备NFC的设备。NFC常用于智能手机和平板电脑。 二、实现NFC标签Tag读取功能 在…

机器学习2:决策树--基于信息增益的ID3算法

1.决策树的简介 建立决策树的过程可以分为以下几个步骤: 计算每个特征的信息增益或信息增益比,选择最优的特征作为当前节点的划分标准。根据选择的特征将数据集划分为不同的子集。对每个子集递归执行步骤 1 和步骤 2,直到满足终止条件。构建决策树,并输出。基于信息增益的…

PP-MobileSeg: 探索移动设备上又快又准的语义分割模型

论文&#xff1a;https://arxiv.org/abs/2304.05152 代码&#xff1a;https://github.com/open-mmlab/mmsegmentation/tree/main/projects/pp_mobileseg 0、摘要 transformer在CV领域的成功之后&#xff0c;出现了很多在移动设备上使用它们的尝试性工作&#xff0c;但是这些工作…

一道简单的C#面试题

试题&#xff1a; 抽顺序问题&#xff1a;有10位面试者&#xff0c;需要随机抽号面试。 1&#xff09;总共十个号数&#xff0c;用数组表示&#xff1b; 2&#xff09;每一位面试者输入1开始抽签&#xff0c;然后得到抽签号&#xff0c;输入2结束抽签&#xff1b; 3&#x…
最新文章