关于LWIP的IGMP阶段性⼩结
(6)要加上随机数相关。
========================================================================
下⾯转载个⽂章
=======================================================================
再来个⽂章 ,具体内容如下:
最近需要⽤到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]
转存失败 转存失败
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]
转存失败 转存失败
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端⼝,⼜绑定组播端⼝。真的可以?
发布评论