基于lwip库在ZYNQ Vivado 2018 SDK中实现UDP组播

1.Vivado搭建

勾选PS或者PL网口并导入sdk中,本文选用的为ZYNQ7020,只有PL端有网口。BD设计如下图。

2.选择新建New Projet

新建new project,选择如下图所示,会自带lwip库

3.打开组播池#define LWIP_IGMP 1

具体操作如下两图,点击图1到图2,将igmp_optinns设置为true。

4.组播初始化与发送函数编写

/*
 *
 * 组播发送函数 *
 *
 */
 void udp_send_hy(unsigned char *data, unsigned short len, u16 port)
 {
     err_t err;
     struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
     unsigned char *data2 = "hello";

     u32  remote_addr[4] = { 0 };
     int i ;
     if (p)
     {
         memcpy(p->payload, data, len);

        err = udp_sendto(g_udppcb, p , &ipgroup,  port );

         pbuf_free(p);

     }

 }
/*
 *
 * 组播初始化
 */
 void UDP_Multicast(void)
 {

        char msg[] = "gaurav";
        err_t err;
        struct pbuf *p;

         p = pbuf_alloc(PBUF_TRANSPORT, sizeof(msg), PBUF_RAM);
         memcpy(p->payload, msg, sizeof(msg));

         IP4_ADDR(&ipgroup , 224, 23, 0, 1);

#if LWIP_IGMP

     err = igmp_joingroup(IP_ADDR_ANY , (struct ip4_addr*)(&ipgroup)); // 只需要将接收地址放入igmp组, 发送的不需要
     if (ERR_OK != err)
     {
         printf("LWIP_IGMP err  = %d \n", err);
         return ;
     }
#endif

      g_udppcb  = (struct udp_pcb*)udp_new();
      udp_bind(g_udppcb,IP_ADDR_ANY, UDP_MULTICAST_LOCAL_PORT );
      udp_recv(g_udppcb , udp_recv_hy, NULL);

 }

5.最后上开发板验证

从wireshark可以看到已经接受到组播信息6.注意事项!!!!!!!

一定要关闭MAC滤波功能,具体操作如下,1.打开 SDK 工程目录下文件 libsrc/emacps/src/xemacps.c。2.在函数 XEmacPs_Reset 中修改XEmacPs_SetOptions 函数中添加选项‐——“ XEMACPS_PROMISC_OPTION”至此,组播功能应该可以实现了。 需要完整工程可以联系我。

作者:汤圆好吃

物联沃分享整理
物联沃-IOTWORD物联网 » 基于lwip库在ZYNQ Vivado 2018 SDK中实现UDP组播

发表回复