关于LWIP的IGMP阶段性小结

(6)要加上随机数相关。

========================================================================

下面转载个文章  STM32F4板子使用LWIP进行组播收发数据的完整过程,附代码

=======================================================================

 

再来个文章  STM32 + LWIP + Enc28J60 + 组播实现,具体内容如下:
 
 

最近需要用到LWIP的组播,我用的是 STM32F103VC + ENC28J60  + LWIP。LWIP中是支持组播的,下面记录下实现方法。

1.既然ENC28J60要接收组播数据,首先要保证能接收到,检查ERXFCON 寄存器是不是过滤掉了你的组播数据,我之前的设置是:

   ENC28J60_Write(ERXFCON,ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);//能实现UDP,TCP的收发。但组播数据不行。

   后来修改为

   ENC28J60_Write(ERXFCON,ERXFCON_CRCEN);//实现组播

   也可以直接将它清0接收所有数据包。

2.LWIP中打开IGMP开关。opt.h中 

    #define LWIP_IGMP                       1

3.low_level_init函数中使能IGMP标志

   netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP |NETIF_FLAG_IGMP;//添加IGMP

4.LWIP组播需要定时调用igmp_tmr();函数。所以将其放入LWIP_poll循环中。

  #if LWIP_IGMP
    if(timer_expired(&last_igmp_time,IGMP_TMR_INTERVAL/CLOCKTICKS_PER_MS))//IGMP处理定时器处理函数
    {
igmp_tmr();
    }
    #endif

5.UDP初始化函数实现。

 

[cpp]  view plain  copy
 
  print ? CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消 在CODE上查看代码片 ico_fork.svguploading.4e448015.gif转存失败重新上传取消 派生到我的代码片
  1. void Init_UDP_Server(void){  
  2.        
  3.     IP4_ADDR(&ipgroup, 230,0,0,11);//组播IP地址  
  4. #if LWIP_IGMP  
  5.     igmp_joingroup(IP_ADDR_ANY,(struct ip_addr *)(&ipgroup));//组播加入当前  
  6. #endif  
  7.     udp_server_pcb = udp_new();  
  8.     if(udp_server_pcb!=NULL){  
  9.         udp_bind(udp_server_pcb,IP_ADDR_ANY,1177);//本地UDP端口  
  10.           
  11.         udp_bind(udp_server_pcb,IP_ADDR_ANY,65000);//组播端口  
  12.           
  13.         udp_recv(udp_server_pcb,udp_server_rev,NULL);//接收回调函数  
  14.     }  
  15. }  
6.添加组播发送函数。

 

 

[cpp]  view plain  copy
 
  print ? CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消 在CODE上查看代码片 ico_fork.svguploading.4e448015.gif转存失败重新上传取消 派生到我的代码片
  1. void multicast_send_data(unsigned char * data,unsigned short len)  
  2. {  
  3.     struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT,len, PBUF_RAM);  
  4.     memcpy(p->payload, "TESTa", 5);//测试数据  
  5.         udp_sendto(udp_server_pcb, p,(struct ip_addr *) (&ipgroup),65000);  
  6.     pbuf_free(p);  
  7. }  
7.在UDP接收回调函数中添加multicast_send_data函数,实现在本地1177端口有数据收到后,往组播地址为230.0.0.11,组播端口为65000发送一个组播数据。

编译后,出错。在igmp.c中的igmp_start_timer函数中,LWIP_RAND()这个函数没有定义。这是产生一个随机数的。

 

group->timer = (LWIP_RAND() % (max_time - 1)) + 1;

直接改为

group->timer = max_time + 1;

再编译通过。

192.168.1.150是我自己的板子的IP。

希望能帮到大家!

 
=================
这个文章里面 同一个PCB,既绑定UDP端口,又绑定组播端口。真的可以?
 

 

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值