> 技术文档 > STM32 LWIP(裸机) RAW接口通讯——UDP API讲解(含源码)_lwip raw udp

STM32 LWIP(裸机) RAW接口通讯——UDP API讲解(含源码)_lwip raw udp


LWIP

目录

LWIP移植:

参考(官网API讲解链接):

RAW UDP接口:

udp_new(创建UDP控制块)

udp_remove(移除UDP控制块)

udp_bind(UDP绑定IP及端口)

udp_connect(设置 PCB 的远程端)

udp_disconnect(移除 PCB 的远程端)

udp_recv(设置 UDP PCB 的接收回调)

udp_send(UDP发送函数)

UDP初始化源码(含:绑定IP、远程主机连接、回调函数)

UDP发送(源码)


LWIP移植:

手动移植LWIP(裸机):

                STM32H5 LWIP移植

基于CubeMX移植LWIP(裸机):

                STM32F4 LWIP移植

参考(官网API讲解链接):

https://www.nongnu.org/lwip/2_1_x/group__udp__raw.html

RAW UDP接口:

udp_new(创建UDP控制块)
API:

struct udp_pcb *

udp_new(void)

作    用: 创建一个UDP控制快 参    数: 无 返回值:

udp_pcb :返回成功创建的UDP控制块

NULL:创建控制块失败

udp_remove(移除UDP控制块)
API:

void

udp_remove(struct udp_pcb *pcb)

作    用: 移除一个UDP控制块,释放该控制块内存 参    数: pcb: 指定一个UDP控制块移除 返回值:

udp_bind(UDP绑定IP及端口)
API:

err_t

udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)

作    用: 使UDP控制块绑定一个IP和端口 参    数:

pcb: 指定一个需要绑定的UDP控制块
ipaddr:要绑定的本地IP地址,使用IP_ANY_TYPE绑定到所有本地接口。

port:要绑定的本地 UDP 端口。使用 0 可自动绑定到 UDP_LOCAL_PORT_RANGE_START 和

UDP_LOCAL_PORT_RANGE_END 之间的随机端口

注意:iPaddr和端口应按照PCB中的字节顺序排列

返回值:

lwIP 错误代码

  ERR_OK:成功

  ERR_USE:指定的 ipaddr 和端口已经被另一个 UDP PCB 绑定到。

udp_connect(设置 PCB 的远程端)
API:

err_t

udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)

作    用: 使UDP控制块连接一个为指定IP和端口的主机 参    数:

pcb: 指定一个需要连接的UDP控制块
ipaddr:要连接的远程 IP 地址

port:要连接的远程 UDP 端口

注意:iPaddr和端口应按照PCB中的字节顺序排列

如果尚未绑定,则 udp pcb 将绑定到随机本地端口

返回值:

lwIP 错误代码

udp_disconnect(移除 PCB 的远程端)
API: void
udp_disconnect(struct udp_pcb *pcb) 作    用: 使UDP控制块断开连接 参    数:

pcb: 要断开连接的UDP PCB

返回值:

lwIP 错误代码

udp_recv(设置 UDP PCB 的接收回调)
API: void
udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) 作    用: 创建一个UDP接受回调函数 参    数:

pcb: 要为其设置 RECV 回调的 PCB

recv:回调函数的函数指针

recv_arg:传递给回调函数的附加参数

返回值:

udp_send(UDP发送函数)
API: err_t
udp_send(struct udp_pcb *pcb, struct pbuf *p) 作    用: 使用UDP发送pbuf  参    数:

pcb: 用于发送数据的 UDP PCB。

p:要发送的PBUF链

注意:数据报将被发送到当前remote_ip并remote_port存储在pcb中。如果 pcb 没有绑定到某个端口,它会自动绑定到一个随机端口。

返回值: lwIP 错误代码

        ERR_OK:成功。未发生错误

        ERR_MEM:内存不足

        ERR_RTE:找不到到目标地址的路由

        ERR_VAL:无 PCB 或 PCB 为双堆栈

注意:较低的协议层可能会返回更多错误

UDP初始化源码(含:绑定IP、远程主机连接、回调函数)

#define U_DEST_IP_ADDR0 xxx//对方IP#define U_DEST_IP_ADDR1 xxx #define U_DEST_IP_ADDR2xxx #define U_DEST_IP_ADDR3xxx #define UDP_BIND_PORTxxx//监听端口#defineUDP_REMOTE_PORTxxx//发送端口struct udp_pcb *upcb;//UDP控制块void UDP_Init(){ip_addr_t remote_ip; //对方IPupcb = udp_new(); //创建UDP控制块 /* IP_ADDR_ANY:该参数为 lwip移植时分配的IP */udp_bind(upcb,IP_ADDR_ANY,UDP_BIND_PORT);//绑定IP、端口IP4_ADDR(&remote_ip,U_DEST_IP_ADDR0,U_DEST_IP_ADDR1,U_DEST_IP_ADDR2,U_DEST_IP_ADDR3); //设置由四个字节部分给出的IP地址udp_connect(upcb,&remote_ip,UDP_REMOTE_PORT);//设置固定远端地址及端口udp_recv(upcb, udp_demo_recv, NULL); // 注册报文处理回调}/** * @brief UDP服务器回调函数 * @param arg :传入的参数 * @param upcb:UDP控制块 * @param p : 网络数据包 * @param addr:远程主机IP地址 * @param port:远程主机端口号 * @retval 无 */void udp_demo_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port){ uint32_t order;//存放接收数据 //将UDP接收到的消息保存 并释放内存order = ntohs(*(u16_t *)p->payload);memset(p->payload, 0 , p->tot_len);pbuf_free(p);}

UDP发送(源码)

err_t UDP_Send_Data(struct udp_pcb *upcb,uint8_t *ad,uint32_t len){struct pbuf *ptr; //创建pbuf err_t err;ptr = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL);//申请内存if(ptr == NULL) {return ERR_MEM;}memset(ptr->payload, 0 , ptr->len);//清零memcpy((char*)ptr->payload, ad, len);//数据err = udp_send(upcb,ptr);//发送数据if(err != ERR_OK){return ERR_ABRT;}memset(ptr->payload, 0 , ptr->len);pbuf_free(ptr);//释放内存return ERR_OK;}

本文只介绍了部分常用UDP API 如果想了解更多API使用可去LWIP官网

有问题欢迎大家指正讨论