STM32 LWIP(裸机) RAW接口通讯——UDP API讲解(含源码)_lwip raw udp
LWIP
目录
LWIP移植:
参考(官网API讲解链接):
RAW UDP接口:
udp_new(创建UDP控制块)
udp_remove(移除UDP控制块)
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控制块)
struct udp_pcb *
udp_new(void)
udp_pcb :返回成功创建的UDP控制块
NULL:创建控制块失败
udp_remove(移除UDP控制块)
void
udp_remove(struct udp_pcb *pcb)
无
udp_bind(UDP绑定IP及端口)
err_t
udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
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 的远程端)
err_t
udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
pcb: 指定一个需要连接的UDP控制块
ipaddr:要连接的远程 IP 地址
port:要连接的远程 UDP 端口
注意:iPaddr和端口应按照PCB中的字节顺序排列
如果尚未绑定,则 udp pcb 将绑定到随机本地端口
lwIP 错误代码
udp_disconnect(移除 PCB 的远程端)
udp_disconnect(struct udp_pcb *pcb)
pcb: 要断开连接的UDP PCB
lwIP 错误代码
udp_recv(设置 UDP PCB 的接收回调)
udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
pcb: 要为其设置 RECV 回调的 PCB
recv:回调函数的函数指针
recv_arg:传递给回调函数的附加参数
无
udp_send(UDP发送函数)
udp_send(struct udp_pcb *pcb, struct pbuf *p)
pcb: 用于发送数据的 UDP PCB。
p:要发送的PBUF链
注意:数据报将被发送到当前remote_ip并remote_port存储在pcb中。如果 pcb 没有绑定到某个端口,它会自动绑定到一个随机端口。
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官网
有问题欢迎大家指正讨论