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

这篇具有很好参考价值的文章主要介绍了W6100-EVB-PICO进行UDP组播数据回环测试(九)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

什么是UDP组播?

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

IPv4组播地址

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

W6100-EVB-PICO进行UDP组播数据回环测试(九),WIZnet W6100-EVB-Pico  C/C++教程,w6100以太网芯片,树莓派RP2040,wiznet,以太网,UDP

连接方式

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

  • 开发板通过交叉线直连主机
  • 开发板和主机都接在路由器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位,映射关系如下图所示。

W6100-EVB-PICO进行UDP组播数据回环测试(九),WIZnet W6100-EVB-Pico  C/C++教程,w6100以太网芯片,树莓派RP2040,wiznet,以太网,UDP

知道了映射关系后我们能很容易根据组播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 port

int 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端发送给组播组的数据后回传的;如下图所示:

W6100-EVB-PICO进行UDP组播数据回环测试(九),WIZnet W6100-EVB-Pico  C/C++教程,w6100以太网芯片,树莓派RP2040,wiznet,以太网,UDP

 W6100-EVB-PICO进行UDP组播数据回环测试(九),WIZnet W6100-EVB-Pico  C/C++教程,w6100以太网芯片,树莓派RP2040,wiznet,以太网,UDP

相关链接 

本章相关例程链接https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git本章所用网络调试工具资源获取链接https://download.csdn.net/download/WIZnet2012/88252449?spm=1001.2101.3001.9500文章来源地址https://www.toymoban.com/news/detail-678441.html

到了这里,关于W6100-EVB-PICO进行UDP组播数据回环测试(九)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • W5500-EVB-PICO 做UDP Server进行数据回环测试(七)

            前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。         UDP (User Dataqram Protocol) 是一种无连接的、不可靠的传输协议,用于在计算机网络上传输数据UDP Server是指UDP网络

    2024年02月12日
    浏览(42)
  • W5100S-EVB-PICO进行UDP组播数据回环测试(九)

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

    2024年02月10日
    浏览(36)
  • W5500-EVB-PICO作为TCP Client 进行数据回环测试(五)

            上一章我们用W5500-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器。         TCP (Transmission Control Protocol) 是一种面向连

    2024年02月13日
    浏览(43)
  • W5500-EVB-PICO 做TCP Server进行回环测试(六)

            上一章我们用W5500-EVB-PICO开发板做 TCP 客户端连 接服务器进行数据回环测试,那么本章将用开发板做 TCP服务器 来进行数据回环测试。         TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TC

    2024年02月13日
    浏览(40)
  • W5100S-EVB-PICO 做UDP Server进行数据回环测试(七)

            前面我们用W5100S-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。         UDP (User Dataqram Protocol) 是一种无连接的、不可靠的传输协议,用于在计算机网络上传输数据UDP Server是指UDP网络

    2024年02月13日
    浏览(38)
  • WIZnet W6100-EVB-Pico DHCP 配置教程(三)

           在上一章节中我们讲了网络信息配置,那些网络信息的配置都是用户手动的去配置的,为了能跟电脑处于同一网段,且电脑能成功ping通板子,我们不仅要注意子网掩码,对于IP地址主机位和网络位的划分,而且还要注意不能跟同一网段已有IP地址的重复,对于新手和不

    2024年02月15日
    浏览(43)
  • W5100S-EVB-PICO作为TCP Client 进行数据回环测试(五)

            上一章我们用W5100S-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器。         TCP (Transmission Control Protocol) 是一种面向连

    2024年02月13日
    浏览(41)
  • W5100S-EVB-PICO 做TCP Server进行回环测试(六)

            上一章我们用W5100S-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试,那么本章将用开发板做TCP服务器来进行数据回环测试。         TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TCP S

    2024年02月13日
    浏览(42)
  • 六、W5100S/W5500+RP2040树莓派Pico<UDP Server数据回环测试>

      UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来进行数据传输。尽管它并不保证数据传输的完整性和顺序性,但UDP在某些场景下却具有独特的优势,例如在实时应用或网络游戏等领域中。   W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控

    2024年02月07日
    浏览(44)
  • WIZnet W5500-EVB-Pico DHCP 配置教程(三)

            动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。         DHCP于1993年10月成为标准协议,其前身是BOOTP协议。DHCP协议由RFC 2131定义,采用客户端/服务器通信模式,由客户端(DHCP Client)向服

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包