当前位置: 首页 > news >正文

W6100-EVB-PICO进行UDP组播数据回环测试(九)

前言

        上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。

什么是UDP组播?

        组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的组播地址,组播地址不同于单播地址,它并不属于特定某个主机,而是属于一组主机。一个组播地址表示一个群组,需要接收组播报文的接收者都加入这个群组。

IPv4组播地址

IANA将D类地址空间分配给IPv4组播使用。IPv4地址一共32位,D类地址最高4位为1110,地址范围从224.0.0.0到239.255.255.255,具体分类及含义见下图。

连接方式

使开发板和我们的电脑处于同一网段方便测试:

  • 开发板通过交叉线直连主机
  • 开发板和主机都接在路由器LAN口

测试工具

  • 网路调试工具(具有UDP组播模式的功能)
  • wireshark抓包工具

UDP组播数据回环测试

1. 相关代码

我们打开库文件找到其中的multicast.c文件,先看下传入的参数有:socket端口号、数据收发缓存、组播MAC地址、组播IP地址、组播端口和回环模式(W6100支持IPv6,因此模式上做以区分);根据数据手册组播模式在打开socket端口前需要先初始化组播的MAC地址、IP地址和端口,端口打开后判断是否收到数据,收到就进行回传,并在串口打印显示;整体逻辑比较简单,就是在UDP模式下,以组播进行回环测试,代码如下所示:

int32_t multicast_loopback(uint8_t sn, uint8_t* buf, uint8_t* multicast_mac, uint8_t* multicast_ip, uint16_t multicast_port, uint8_t loopback_mode)
{uint8_t status;static uint8_t dest_ip[16] = {0,};static uint16_t dest_port;uint8_t pack_info;uint8_t addr_len;datasize_t ret;datasize_t received_size;uint16_t size, sentsize;uint8_t* mode_msg;uint16_t any_port = 50000;if(loopback_mode == AS_IPV4){mode_msg = "IPv4 mode";}else if(loopback_mode == AS_IPV6){mode_msg = "IPv6 mode";}else{mode_msg = "Dual IP mode";}getsockopt(sn, SO_STATUS, &status);switch (status){case SOCK_UDP:getsockopt(sn, SO_RECVBUF, &received_size);if(received_size > DATA_BUF_SIZE) received_size = DATA_BUF_SIZE;if(received_size>0){ret = recvfrom(sn, buf, received_size, (uint8_t*)&dest_ip, (uint16_t*)&dest_port, &addr_len);buf[ret]=0x00;printf("recv from [%d.%d.%d.%d][%d]: %s\n",dest_ip[0],dest_ip[1],dest_ip[2],dest_ip[3],dest_port,buf);if(ret <= 0)return ret;received_size = (uint16_t) ret;sentsize = 0;while(sentsize != received_size){ret = sendto(sn, buf+sentsize, received_size-sentsize, dest_ip, dest_port, addr_len);if(ret < 0) return ret;sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.}}break;case SOCK_CLOSED:setSn_DHAR(sn, multicast_mac);setSn_DIP4R(sn, multicast_ip);setSn_DPORTR(sn, multicast_port);switch(loopback_mode){case AS_IPV4:socket(sn,Sn_MR_UDP4, any_port, SF_MULTI_ENABLE);break;case AS_IPV6:socket(sn,Sn_MR_UDP6, any_port, SF_MULTI_ENABLE);break;case AS_IPDUAL:socket(sn,Sn_MR_UDPD, any_port, SF_MULTI_ENABLE);break;}printf("%d:UDP Multicast looptest as %s\r\n",sn,mode_msg);printf("%d:UDP Multicast IP: %d.%d.%d.%d\r\n",sn,multicast_ip[0],multicast_ip[1],multicast_ip[2],multicast_ip[3]);printf("%d:UDP Multicast PORT: %d\r\n",sn,multicast_port);break;default:break;}
}

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

知道了映射关系后我们能很容易根据组播IP地址得到对应的组播MAC地址,例如我们本次测试的组播地址224.1.1.11对应的组播MAC地址为01-00-5e-01-01-0b。我们这里直接用数组初始化相关信息后传入测试函数,在主函数里循环调用即可,如下所示:

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)void network_init(void);wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 1, 10},.sn = {255, 255, 255, 0},.gw = {192, 168, 1, 1},.dns = {8, 8, 8, 8},.ipmode = NETINFO_STATIC_V4};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
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 portint main()                                                          
{   stdio_init_all();sleep_ms(2000);network_init();while(true){multicast_loopback(SOCKET_ID, ethernet_buf, multicast_mac,multicast_ip, multicast_port, AS_IPV4);sleep_ms(500);}
}void network_init(void)
{uint8_t temp;wizchip_initialize();printf("W6100 udp multicast example.\r\n");sleep_ms(2000);/* Determine the network lock register status */if(!ctlwizchip(SYS_NET_LOCK, &temp)){   printf("unlock.\n");NETUNLOCK();}wizchip_setnetinfo(&net_info);ctlwizchip(CW_RESET_WIZCHIP, NULL);print_net_info(&get_info);sleep_ms(2000);   
}

2. 测试现象

我们编译烧录完成后,打开串行监视器,打开wireshark输入过滤条件<ip.addr == 224.1.1.11>然后开启监听,打开网络调试工具点击创建连接,类型选择UDP(组播模式),目标IP选择224.1.1.11,端口为3000(其他非特殊端口也可以),本机端口指定为30000(本次测试组播端口为30000)是为了方便我们在调试工具看到组播组收到数据,参数配置完成后我们点击创建,然后在发送区输入123点击发送测试,在调试工具接收区可以看到成功收到2次,一次是PC端发送给组播组的,另一次是我们开发板作为组播组成员收到PC端发送给组播组的数据后回传的;如下图所示:

 

相关链接 

本章相关例程链接icon-default.png?t=N6B9https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git本章所用网络调试工具资源获取链接icon-default.png?t=N6B9https://download.csdn.net/download/WIZnet2012/88252449?spm=1001.2101.3001.9500

相关文章:

W6100-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…...

Qt 阴影边框

阴影边框很常见&#xff0c;诸如360以及其他很多软件都有类似效果&#xff0c;了解CSS3的同学们应该都知道box-shadow&#xff0c;它就是来设定阴影效果的&#xff0c;那么Qt呢&#xff1f;看过一些资料&#xff0c;说是QSS是基于CSS2的&#xff0c;既然如此&#xff0c;box-sh…...

前端面试:【性能优化】页面加载性能、渲染性能、资源优化

嗨&#xff0c;亲爱的前端开发者&#xff01;在今天的Web世界中&#xff0c;用户期望页面加载速度快、交互流畅。因此&#xff0c;前端性能优化成为了至关重要的任务。本文将探讨三个关键方面的性能优化&#xff1a;页面加载性能、渲染性能以及资源优化&#xff0c;以帮助你构建…...

从按下电源键到进入系统,CPU在干什么?

本专栏更新速度较慢&#xff0c;简单讲讲计算机的那些事&#xff0c;简单讲讲那些特别散乱杂的知识&#xff0c;欢迎各位朋友订阅专栏啊 感谢一路相伴的朋友们 浅淡操作系统系列第2篇 目录 通电 保护模式和实模式 内存管理单元MMU 逻辑地址&#xff1f;物理地址&#xff1…...

TypeScript初体验

1.安装编译TS工具包 npm i -g typescript 2. 查看版本号 tsc -v 3.创建ts文件 说明&#xff1a;创建一个index.ts文件 4.TS编译为JS tsc index.ts 5.执行JS代码 node index.js 6.简化TS的步骤 6.1安装 npm i -g ts-node 6.2执行 ts-node index.ts...

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine&#xff08;简介&#xff09; Alpine Linux 是一款极其轻量级的 Linux 发行版&#xff0c;基于 busybox&#xff0c;多被当做 Docker 镜像的底包&#xff08;基础镜像&#xff09;&#xff0c;在使用容器时或多或少都会接触到此系统&#xff0c;本篇文章我们以该镜…...

政府网站定期巡检:构建高效、安全与透明的数字政务

在数字时代&#xff0c;政府网站已不仅仅是一个信息发布窗口&#xff0c;更是政府与公众互动的桥梁、政务服务的主要渠道以及数字化治理的重要平台。因此&#xff0c;确保政府网站的高效运行、信息安全与透明公开就显得尤为重要。在此背景下&#xff0c;定期的网站巡检与巡查成…...

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母

#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…...

leetcode1475. 商品折扣后的最终价格 【单调栈】

简单题 第一次错误做法 class Solution { public:vector<int> finalPrices(vector<int>& prices) {int n prices.size();stack<int> st;unordered_map<int, int> mp;int i 0;while(i ! prices.size()) {int t prices[i];if (st.empty() || t …...

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码&#xff0c;安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速&#xff1a; import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…...

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…...

【DEVOPS】Jenkins使用问题 - 控制台输出乱码

0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式&#xff0c;即作为Master节点的Jenkins只负责任务调度&#xff0c;具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…...

logback-spring.xml

<?xml version"1.0" encoding"UTF-8"?> <configuration> <appender name"stdout" class"ch.qos.logback.core.ConsoleAppender"> <encoder> <springProfile name"dev"> <pattern>%d{…...

华为OD机试之报文重排序【Java源码】

题目描述 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓中区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N&#xff0c;表示子报文的个数&#xff0c;0 &#xff1c;N ≤ …...

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效…...

DPU在东数西算背景下如何赋能下一代算力基础设施 中科驭数在未来网络发展大会论道

以ChatGPT为代表的人工智能大模型的快速发展&#xff0c;对网络信息技术创新发展提出了新的挑战&#xff0c;我国东数西算重大工程也在加速布局。以确定性网络、算力网络为代表的未来网络核心技术&#xff0c;正成为决定未来经济和产业发展的关键。 8月23日&#xff0c;第七届…...

2021年12月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右…...

ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题

问题&#xff1a; 因未知原因Windows下的Server安装账户密码变更&#xff0c;但是又忘记了密码&#xff0c;导致&#xff0c;Server服务启动失败&#xff0c;错误1069&#xff1a; 解决方法&#xff1a; 在账户管理界面&#xff0c;重置对应的arcgis账户的密码&#xff0c;…...

React 面试题集锦

目录 如果想要在组件第一次加载后获取该组件的dom元素&#xff0c;应当在以下哪个生命周期中进行 React支持的键盘事件是 使用严格模式&#xff08;Strict Mode&#xff09;优点 React 动态引入组件 当使用ReactDOM.unmountComponentAtNode从DOM中卸载组件时 说一下useS…...

xargs命令解决“Argument list too long”

一、xargs命令概述 xargs命令是给其他命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数&#xff0c;xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。空格是其默认定界符&#xff0c;管道传递给xargs的输入…...

Wan2.2-I2V-A14B绿色AI实践:显存优化降低35%功耗的碳足迹测算

Wan2.2-I2V-A14B绿色AI实践&#xff1a;显存优化降低35%功耗的碳足迹测算 1. 引言&#xff1a;绿色AI的迫切需求 在AI技术快速发展的今天&#xff0c;大模型训练和推理带来的能源消耗问题日益突出。Wan2.2-I2V-A14B作为一款先进的文生视频模型&#xff0c;通过显存优化技术实…...

ESP32-Bus-Pirate:多功能硬件协议分析工具开发指南

ESP32-Bus-Pirate&#xff1a;多功能硬件协议分析工具开发指南1. 项目概述1.1 系统架构ESP32-Bus-Pirate是基于ESP32平台开发的多协议硬件调试工具&#xff0c;采用模块化分层设计架构。系统包含四个主要层次&#xff1a;用户交互层&#xff1a;支持USB串口终端、WiFi网页终端和…...

PT-Plugin-Plus高效管理指南:全平台适配与进阶应用技巧

PT-Plugin-Plus高效管理指南&#xff1a;全平台适配与进阶应用技巧 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 项目…...

SMUDebugTool:深度掌控AMD Ryzen系统的硬件调试利器

SMUDebugTool&#xff1a;深度掌控AMD Ryzen系统的硬件调试利器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…...

如何3步上手语音转换:Retrieval-based Voice-Conversion-WebUI完整实战指南

如何3步上手语音转换&#xff1a;Retrieval-based Voice-Conversion-WebUI完整实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型&#xff01; 项目地址: https://gitcode.com/GitHub_Trending/re/R…...

不止于画图:用@antv/g6-editor的Command系统打造可撤销/重做的智能流程设计器

超越基础绘图&#xff1a;利用antv/g6-editor构建企业级智能流程设计器 在当今快速发展的数字化时代&#xff0c;流程设计工具已成为企业数字化转型的核心组件。从简单的审批流程到复杂的业务编排&#xff0c;一个功能完备的流程设计器不仅能提升工作效率&#xff0c;更能确保…...

低头编程:颈椎快要崩溃!

长期低头编写代码、调试程序、查看文档&#xff0c;是程序员、IT 从业者等人群颈椎损伤的高发原因。当你专注于电脑屏幕上的代码时&#xff0c;颈椎会不自觉地向前倾斜&#xff0c;颈部后侧肌肉为了支撑头部重量&#xff0c;会持续处于紧绷痉挛状态&#xff0c;时间一长&#x…...

STM32摇杆驱动设计:裸机与FreeRTOS下的轻量级Joystick模块实现

1. 项目概述“Joystick”并非一个通用型开源驱动库或标准化外设抽象层&#xff0c;而是一个面向特定毕业设计&#xff08;Tesis&#xff09;场景的嵌入式人机交互模块实现。其核心目标是为基于STM32系列微控制器&#xff08;如STM32F407VG、STM32F103C8T6等常见开发板&#xff…...

Midscene.js视觉驱动自动化:从认知到实践的AI跨平台控制指南

Midscene.js视觉驱动自动化&#xff1a;从认知到实践的AI跨平台控制指南 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 一、认知篇&#xff1a;理解Midscene.js的技术革新 1.1 破解传统自动…...

Python农业物联网开发正在淘汰Django!FastAPI+Redis Stream+TimescaleDB构建毫秒级响应灌溉调度中枢(压测QPS达42,800)

第一章&#xff1a;Python农业物联网开发Python凭借其简洁语法、丰富生态和强大的硬件交互能力&#xff0c;已成为农业物联网&#xff08;Agri-IoT&#xff09;系统开发的主流语言。从土壤温湿度传感器数据采集到云端可视化决策支持&#xff0c;Python贯穿设备端、网关层与应用…...