基于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”至此,组播功能应该可以实现了。 需要完整工程可以联系我。
作者:汤圆好吃