兰州网站定制公司/在线资源搜索引擎
文章目录
- 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 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max 25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max 25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
- 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 flagint main()
{ struct repeating_timer timer; // Define the timer structure/* MCU init */stdio_init_all(); // Initialize the main control peripheralwizchip_initialize(); // Initialize the chip interface/*dhcp init*/DHCP_init(SOCKET_ID, ethernet_buf); // DHCP initializationadd_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handlerprintf("wiznet chip tcp server example.\r\n");network_init(&net_info); // Configuring Network Informationprint_network_information(&get_info); // Read back the configuration information and print itwhile(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);
#endifreturn 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);
#endifreturn 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);
#endifsetSn_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);
#endifbreak;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来实现本章的示例,我们只需修改两个地方即可:
-
在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。
-
在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。
6. 相关链接
WIZnet官方库链接
本章例程链接
相关文章:

七、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协议的通信方式,它允许一台计算机通过发送单…...

Wonder3D:用单张图片生成纹理网格
Wonder3D 只需 2 ∼ 3 分钟即可从单视图图像重建高度详细的纹理网格。 Wonder3D首先通过跨域扩散模型生成一致的多视图法线图和相应的彩色图像,然后利用新颖的法线融合方法实现快速、高质量的重建。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 1、推理准…...

macOS 创建Flutter项目
参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档,配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter,验证 F…...

【微服务 Spring Cloud Alibaba】- Nacos 服务注册中心
目录 1. 什么是注册中心? 1.2 注册中心的作用 2. SpringBoot 整合 Nacos 实现服务注册中心 2.1 将服务注册到 Nacos 2.2 实现消费者 3. 服务列表各个参数的含义、作用以及应用场景 1. 什么是注册中心? 注册中心是微服务架构中的一个重要组件&…...

windows openssl安装和基本使用
OpenSSL使用 私钥和证书文件 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365这是一个使用OpenSSL命令行工具生成自签名X.509证书的命令。通过执行该命令,您将生成一个4096位RSA密钥对,并使用该密钥对生成一个自…...

Qt Concurrent框架详解(QFuture、QFutureWatcher)
1.概述 Qt Concurrent是Qt提供的一个并发编程框架,用于简化多线程和并行计算的开发。它提供了一组易于使用的函数和类,可以方便地在多线程环境下处理并发任务。 有以下特点: 简单易用:Qt Concurrent提供了一组高级函数和类&…...

zip函数用法:解压与打包
解释 在 Python 中,zip 函数可以用于两种情况:打包(压缩)和解压(解包)。 1.打包(压缩): 当传递多个可迭代对象作为参数给 zip 函数时,它会将这些可迭代对象…...

这一份免费API接口集合,开发者必备
台风信息查询:提供西北太平洋及南海地区过去两年及当前年份所有编号台风的信息查询,包括台风实时位置、过去路径、预报路径及登陆信息等要素。未来7天生活指数:支持国内3400个城市以及国际4万个城市的天气指数数据,包括晨练、洗车…...

【IDEA】设置sql提示
第一步:注入SQL语言 1.首先选择任意一条sql语句,右击,选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻,找到MySQL 第二步:配置MySQL数据库连接 1.首先点击侧边的数据库,再点击上面的加号 2…...

Swagger + DOCWAY 一步导出为优雅完整的Markdown、Pdf接口文档
只要开发,只要写接口应该没人不知道Swagger,但DOCWAY可能知道的人不多,但知道用过后就离不开了,不管是作为多方联调的接口文档,还是交接给客户的文档,都是可以的,具体如何使用,详细步…...

HTML链接、头部
HTML链接: HTML使用超级链接与网络上的另一个文档相连。HTML中的链接是一种用于在不同网页之间的导航的元素。链接通常用于将一个网页与另一个网页或资源(文档、图像、音频文件等)相关联。链接允许用户在浏览网页时单击文本或图像来跳转到其他…...

IDEA优雅自动生成类注释和快捷键生成方法注释
生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板: /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…...

数据库面试题整理
目录 MySQL事务隔离级别有哪几种?MySQL的常用的存储引擎有哪些?特点是什么,分别适合什么场景下使用MySQL有数据缓存吗?原理是怎么样的?InnoDB的缓冲池默认是开启的吗?基本原理是什么?会有脏数据…...

【无标题】输入日期是当年的第n天
从键盘输入正确日期,程序输出是当年的第n天。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么…...

金蝶云星空自定义校验器和使用
文章目录 金蝶云星空自定义校验器和使用 金蝶云星空自定义校验器和使用 1、创建类,并继承抽象接口 using Kingdee.BOS.Core; using Kingdee.BOS.Core.Validation; using System;namespace mm.K3.SCM.App.Service.PlugIn.SC.Validator {public class AfterOrderChe…...

MyBatis实验(四)——关联查询
前言 多表关联查询是软件开发中最常见的应用场景,多表查询需要将数据实体之间的一对多、多对多、一对一的关系的转换为复杂的数据对象。mybaits提供的association和collection元素,通过映射文件构造复杂实体对象,在构造实体过程中࿰…...

Redis与Mysql的数据一致性(双写一致性)
双写一致性:当修改了数据库的数据也要同时的更新缓存的数据,使缓存和数据库的数据要保持一致。 一般是在写数据的时候添加延迟双删的策略 先删缓存 再修改数据 延迟一段时间后再次删除缓存 这种方式其实不是很靠谱 一致性要求高 共享锁:读…...

sql-50练习题16-20
sql-50练习题16-20 前言数据库表结构介绍学生表课程表成绩表教师表 1-6 检索"01"课程分数小于60,按分数降序排列的学生信息1-7 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩1-8 查询各科成绩最高分、最低分和平均分:以如下形式…...

算法通关村第四关|青铜|自己实现栈
1.自己实现栈——基于数组 top 有的地方指向栈顶元素,有的地方指向栈顶再往上的一个空单位,根据题目要求设计。 *这里将 top 设置为栈顶再往上的一个空单位。 import java.util.Arrays; class Mystack<T> {private Object[] stack;// 指向栈顶…...

Calcite 自定义优化器规则
1)总结 1.创建 CSVProjectRule 继承 RelRule<CSVProjectRule.Config> a)在 CSVProjectRule.Config 接口中实现匹配规则 Config DEFAULT EMPTY.withOperandSupplier(b0 ->b0.operand(LogicalProject.class).anyInputs()).as(Config.class);b…...

【flink】flink获取-D参数方式
参考官网 一、idea 本地运行 使用Flink官方的ParameterTool或者其他工具都可以。 二、集群运行flink run/run-application (1)ParameterTool 获取参数 以-D开头的参数: ParameterTool parameter ParameterTool.fromSystemProperties()…...

NLP之多循环神经网络情感分析
文章目录 代码展示代码意图代码解读知识点介绍 代码展示 import pandas as pd import tensorflow as tf# 构建RNN神经网络 tf.random.set_seed(1) df pd.read_csv("../data/Clothing Reviews.csv") print(df.info())df[Review Text] df[Review Text].astype(str) …...

【AutoML】AutoKeras 的安装和环境配置(VSCode)
本地环境中已经有太多的工作配置了(Python、Java、Maven、Docker 等等),为了不影响其他环境运行,我选择直接在 VSCode 中创建工作空间并配置好 AutoKeras(反正最后也是要在 VSCode 中进行开发的)。 打开 V…...

树结构及其算法-用数组来实现二叉树
目录 树结构及其算法-用数组来实现二叉树 C代码 树结构及其算法-用数组来实现二叉树 使用有序的一维数组来表示二叉树,首先可将此二叉树假想成一棵满二叉树,而且第层具有个节点,按序存放在一维数组中。首先来看看使用一维数组建立二叉树的…...

知识图谱与大模型结合方法概述
《Unifying Large Language Models and Knowledge Graphs: A Roadmap》总结了大语言模型和知识图谱融合的三种路线:1)KG增强的LLM,可在LLMs的预训练和推理阶段引入KGs;2)LLM增强KG,LLM可用于KG构建、KG emb…...

ASO优化之如何制作Google Play的长短描述
应用的描述以及标题和图标是元数据中最关键的元素,可以影响用户是否决定下载我们的应用程序。简短描述的长度限制为80个字符,它提供了更多的有关应用背景信息的机会。 1、简短描述帮助用户快速了解我们应用。 确保内容丰富的同时,保持简洁和…...

Python-platform模块
platform目录 前言一、platform.system()二、platform.release()三、platform.python_version()四、platform.machine()五、platform.python_implementation()六、其他代码示例七、help总结前言 Python platform模块是一个用于获取和操作操作系统相关信息的内置模块。它提供了…...

Yolov5旋转框(斜框)检测自己的数据集,附带代码模型可以收敛
文章目录 1. 制作数据集1.1 标注数据集1.2标签转换1.3 数据集划分2. 环境搭建1.安装nms_rotated2.安装DOTA_devkit3. 代码讲解3.1坐标表示3.2 损失函数4.训练+测试链接后面附上百度网盘链接,内部包含数据集。 下一篇介绍tensorRT部署yolov5-obb 1. 制作数据集 标注软件为…...

嵌入式应用选择正确的系统设计方法:第三部分
产品质量低下的原因有很多,例如,产品制造粗糙,组件设计不当,架构不佳以及对产品的要求了解不多。点击领取嵌入式物联网学习路线 必须设计质量。 您不能测试出足够的错误来交付高质量的产品。的质量保证(QA)…...

pthread_attr_getstacksize 问题
最近公司里遇到一个线程栈大小的问题,借此机会刚好学习一下这个线程栈大小相关的函数。如果公司里用的还是比较老的代码的话,都是用的 pthread 库支持线程的,而不是 c11 里的线程类。主要有两个相关函数:pthread_attr_setstacksiz…...