首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在STM32F7 + FreeRTOS上实现LWIP组播?

在STM32F7 + FreeRTOS上实现LWIP组播?
EN

Stack Overflow用户
提问于 2018-05-20 19:20:14
回答 1查看 4.4K关注 0票数 4

我有一个用于单播通信的客户机/服务器LWIP程序,但是我想使用多播功能,所以我使用了IGMP库,执行了以下操作:

1-在Iwipopts.h:

代码语言:javascript
复制
#define LWIP_IGMP 1 //allowed IGMP

2-以太法。c:

代码语言:javascript
复制
netif->flags |= NETIF_FLAG_IGMP; //in low_level_init function

3-在我的源文件中(用于客户机和服务器项目):

实现了以下代码:

代码语言:javascript
复制
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“,但始终没有到达。你能帮帮我吗?要么提出解决方案,要么至少找到追踪问题的方法.我使用的是STM32F746核心板和cubeMX生成的FreeRTOS库LWIP。

谢谢。

<<<编辑,>>>,经过更多的调查后,我发现问题是在接收多播帧,这应该是启用期间的MAC初始化。尽管下面的代码对我不起作用,但它对其他人很有帮助,如下所示:

4-在stm32f7xx_hal_eth.c (ETH_MACDMAConfig函数)中:

代码语言:javascript
复制
macinit.PromiscuousMode = ETH_PROMISCUOUS_MODE_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;
EN

回答 1

Stack Overflow用户

发布于 2018-06-28 09:07:12

我的多播测试是用STM32F407和CubeMX版本4.25.0成功完成的。

Kalkhouri's question是有帮助的。我在这里分享我的工作代码。

下面的代码必须与Kalkhouri的代码相同。

代码语言:javascript
复制
#define LWIP_IGMP 1
代码语言:javascript
复制
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;
代码语言:javascript
复制
netif->flags |= NETIF_FLAG_IGMP;

我使用的是LWIP的套接字API,而不是低级函数。

代码语言:javascript
复制
#include "lwip/opt.h"
#include "lwip/dhcp.h"
#include "lwip/netif.h"
#include "lwip/tcpip.h"
#include "lwip/sockets.h"

int Bind(int sock, uint16_t port)
{
  struct sockaddr_in serv_addr;
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(port);
  if (bind(sock, (struct sockaddr *) &serv_addr, (socklen_t)sizeof(serv_addr)) < 0)
    return -1;
  return 0;
}

int JoinGroup(int sock, const char* join_ip, const char* local_ip)
{
  ip_mreq mreq;
  mreq.imr_multiaddr.s_addr = inet_addr(join_ip);
  mreq.imr_interface.s_addr = inet_addr(local_ip);
  if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
    return -1;
  return 0;
}

void  MulticastStart()
{
  int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  Bind(sock, 5000);
  JoinGroup(sock, "224.1.1.1", "192.168.10.123");

  // Now you can do recvfrom() in RTOS task.
  ........
}

注意:您应该在RTOS支持下使用此代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50438577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档