我有一个客户端/服务器 LWIP 程序,它可以与单播通信正常工作,但是我想使用多播功能,所以我使用 IGMP 库执行了以下操作:
1- 在 lwipopts.h 中:
#define LWIP_IGMP 1 //allowed IGMP
2- 在 ethernetif.c 中:
netif->flags |= NETIF_FLAG_IGMP; //in low_level_init function
3-在我的源文件中(对于客户端和服务器项目):
实现了以下代码:
void recCallBack (void)
{
printf("connected"); //BREAK_POINT
}
static void UDP_Multicast_init(void *arg)
{
struct ip4_addr ipgroup, localIP;
struct udp_pcb *g_udppcb;
char msg[] = "hello";
struct pbuf* p;
p = pbuf_alloc(PBUF_TRANSPORT,sizeof(msg),PBUF_RAM);
memcpy (p->payload, msg, sizeof(msg));
IP4_ADDR(&ipgroup, 224, 0, 1, 129 ); //Multicast IP address.
IP4_ADDR(&localIP, 192, 168, 1, 2); //Interface IP address
#if LWIP_IGMP
s8_t iret = igmp_joingroup((ip4_addr_t *)(&localIP),(ip4_addr_t *)(&ipgroup));
#endif
g_udppcb =( struct udp_pcb*) udp_new();
udp_bind(g_udppcb, &localIP, 319); //to allow receiving multicast
udp_recv(g_udppcb, recCallBack,NULL); //recCallBack is the callback function that will be called every time you receive multicast
udp_sendto(g_udppcb,p,&ipgroup,319); //send a multicast packet
}
void telnet_shell_init(void)
{
sys_thread_new("TELNET", UDP_Multicast_init, NULL, DEFAULT_THREAD_STACKSIZE, osPriorityAboveNormal);
}
结果:所有提到的代码步骤都在两个项目(客户端和服务器)中成功执行,但我没有收到任何多播消息(甚至可能没有发送)!
我在回调函数中添加了一个“BREAK_POINT”,但我从未达到它。你能帮助我吗?通过提出解决方案或至少通过一种方法来跟踪问题......我正在使用带有 LWIP 的 STM32F746 Nucleo 板,由 cubeMX 生成的 FreeRTOS 库。
谢谢你。
<<< 编辑>>> 经过更多调查,我发现问题出在接收多播帧上,这应该在 MAC 初始化期间启用。虽然下面的代码对我不起作用,但对其他人有帮助,所以这里是:
4-在stm32f7xx_hal_eth.c(ETH_MACDMAConfig函数)中:
macinit.PromiscuousMode = ETH_PROMISCUOUS_MODE_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;