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”至此,组播功能应该可以实现了。 需要完整工程可以联系我。
发表评论