LwIP RAW API 实现UDP多播收发

news/2025/1/11 18:02:58/

LwIP RAW API 实现UDP多播收发实现

1、初始化

static struct udp_pcb *multicast_pcb = NULL;
static ip_addr_t mutlcast_send_ip;
static ip_addr_t mutlcast_recv_ip;static void udp_recv_multicast(void *arg, struct udp_pcb *pcb, struct pbuf *p,const ip_addr_t *addr, u16_t port);static void udp_multicast_init(void)
{err_t err;if (multicast_pcb != NULL) return;multicast_pcb = udp_new();if (multicast_pcb == NULL){LOG_LINE("udp_pcb申请失败");return;}IP4_ADDR(&mutlcast_send_ip, 239, 255, 255, 255);  /* 设置发送多播地址 */IP4_ADDR(&mutlcast_recv_ip, 239, 255, 255, 0);  /* 设置加入的多播接收地址 *//* 加入多播组 */err = igmp_joingroup(IP_ADDR_ANY, &mutlcast_recv_ip);if (err != ERR_OK){LOG_LINE("加入多播组失败");goto free_udp_pcb;}err = udp_bind(multicast_pcb, IP_ADDR_ANY, 7770);   /* 绑定端口 */if (err != ERR_OK){if (err == ERR_USE){LOG_LINE("IP地址或端口已经被使用");}LOG_LINE("绑定IP、端口失败");goto free_udp_pcb;}udp_recv(multicast_pcb, udp_recv_multicast, NULL);LOG_LINE("组播初始化");return;
free_udp_pcb:udp_remove(multicast_pcb);
}

2、多播发送

int udp_multicast_send(const void *psrc, uint32_t src_len, uint16_t port)
{struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, src_len, PBUF_POOL);if (p == NULL){LOG_LINE("pbuf申请失败");return -1;}pbuf_take(p, psrc, src_len);udp_sendto(multicast_pcb, p, &mutlcast_send_ip, port);pbuf_free(p);  /* 释放pbuf */return 0;
}

3、多播接收

static char recv_multicast_buf[1024] = {0};
void udp_recv_multicast(void *arg, struct udp_pcb *pcb, struct pbuf *p,const ip_addr_t *addr, u16_t port)
{struct pbuf *q;int recv_count = 0;struct ip4_addr_fmt {uint32_t addr1 : 8;uint32_t addr2 : 8;uint32_t addr3 : 8;uint32_t addr4 : 8;};for (q = p; q != NULL; q = p->next){if (q->len > sizeof(recv_multicast_buf)){memcpy(recv_multicast_buf, q->payload, sizeof(recv_multicast_buf));LOG_LINE("数据溢出, 截断接收");return;}else {if (recv_count < sizeof(recv_multicast_buf)){rt_memcpy(&recv_multicast_buf[recv_count], q->payload, q->len);recv_count += q->len;}else{LOG_LINE("数据溢出, 截断接收");return;}}}// uint32_t ip = addr->addr;struct ip4_addr_fmt *ip = (struct ip4_addr_fmt *)addr;LOG_LINE("multicast recv from %d.%d.%d.%d/%d, msg %s", ip->addr1, ip->addr2, ip->addr3, ip->addr4, port, recv_multicast_buf);
}

通过UDP接收回调函数接收数据保存到buffer。
这里只是将接收的消息打印出来。

测试

组播发送测试:
打开网络调试助手,设置好监听端口号,板子程序通过什么端口号发送,这里就设置为相应的端口号。
在这里插入图片描述
前面初始化程序发送设置的多播组是239.255.255.255 ,往7777端口发送数据,所以这里设置端口号为7777

测试程序:

static char fmt_buf[10] = {0};
static uint16_t test_count = 0;
void btn_long_press_start(void *p_btn)
{struct Button *btn = (struct Button *)p_btn;switch (btn->button_id){case BTN_ID_SYS_TEST:  /* 测试键 */break;case BTN_ID_CARD_OUT:  /* 强制退卡键 */rt_snprintf(fmt_buf, sizeof(fmt_buf), "test %d", ++test_count);udp_multicast_send(fmt_buf, rt_strlen(fmt_buf), 7777);LOG_LINE("退卡键长按 %s", fmt_buf);rt_memset(fmt_buf, 0, sizeof(fmt_buf));break;default:LOG_LINE("don't have this key");break;}
}

在这里插入图片描述
组播接收测试:
网络调试助手设置组播地址和远程地址、端口
在这里插入图片描述
板子程序接收数据加入的多播组是239.255.255.0,端口号是7770 ,IP地址是192.168.57.101

点击网络调试助手发送,串口调试助手打印出接收的数据
在这里插入图片描述

参考:

网络编程:用UDP通信实现组播通信(多播)_udp组播通信_qq_42343682的博客-CSDN博客

UDP局域网内广播消息_udp广播网段192.168.0.255_changeyourmind的博客

STM32F4板子使用LWIP进行组播收发数据的完整过程,附代码_lwip组播_纵横千里,捭阖四方的博客-CSDN博客


http://www.ppmy.cn/news/436597.html

相关文章

【振奋人心】中科院芯片突破,中国ai将逆袭

最近&#xff0c;中国科学院在人工智能芯片领域取得了一项重大突破。中科院计算技术研究所和中国电子科技集团公司第五十三研究所联合研发的新型神经网络加速器芯片&#xff0c;成功实现高效率和低功耗的特性&#xff0c;而且在典型人工智能测试中获取了高达1000倍计算效率的提…

xps常见问题与解答

在做X 射线光电子能谱(XPS)测试时&#xff0c;科学指南针检测平台工作人员在与很多同学沟通中了解到&#xff0c;好多同学仅仅是通过文献或者师兄师姐的推荐对XPS测试有了解&#xff0c;但是对于其原理还属于小白阶段&#xff0c;针对此&#xff0c;科学指南针检测平台团队组织…

dell xps u盘启动设置

今天想要给dell xps重装下系统&#xff0c;在u盘里装好老毛桃之后&#xff0c;重启电脑&#xff0c;按快捷键F12&#xff0c;确实进入了boot&#xff0c;但是没有usb启动这个选项&#xff0c;上网查了下也都无法解决&#xff0c;最后摸索了下通过下列方式解决了。 解决步骤&…

Win10 安装 XPS查看器

在看网课的时候&#xff0c;下载的课件是XPS格式&#xff0c;目前我很少使用这种格式的文件&#xff0c;因此&#xff0c;下载文件后打不开XPS文件格式&#xff0c;下面就是WIN10系统安装XPS步骤&#xff1a; 1.打开左下角开始设置面板 2.选择设置中的“应用” 3.选择----管…

xps是什么文件?xps文件怎么打开?

Xps是一种电子文件格式&#xff0c;它是微软公司开发的一种文档保存与查看的规范,在电脑中,许多用户可能对此文件格式很是陌生,更别说要打开的操作修改编辑了&#xff0c;我们一般会将xps转为pdf在来编辑操作&#xff0c;那么该如何操作呢&#xff1f;今天小编就和大家分享一款…

XPS是什么格式?如何编辑?

XPS是什么格式&#xff1f;我们在工作中偶尔会遇到这种格式的文档&#xff0c;这种格式比较小众&#xff0c;所以很多人不知道如何打开阅读或者是修改&#xff0c;XPS就是XML文件规格书的简称&#xff0c;全称为“XML Paper  Specification”&#xff0c;其实就是电子文件的格…

XPS 介绍

最近看Windows7 相关的资料,微软提供了一个xps文档,以前没见过,列一下了解的东西: 扩展名:.xps 文件说明: XPS (XML Paper Specification, XML 纸张规范)文件格式是微软在Vista平台上主推的一种2维的文件格式,类似于PDF.它可以容易地以编页、固定布局格式创建文档,以逐页的方式…

XPS 的一般应用

在做X 射线光电子能谱(XPS)测试时&#xff0c;XPS测试的一般应用有哪些&#xff1f;我们科学指南针平台组织相关同事对网上海量知识进行整理&#xff0c;具体如下&#xff1a; 1.元素组成分析 每种元素都有唯一的一套芯能级&#xff0c;起到了“原子指纹”的作用&#xff0c;因…