at32+free+rtos+lwip下,使用UDP通信作为网络的打印日志示例代码
lwip使用UDP通信作为网络的打印日志示例代码,参考代码如下
点击查看代码
//
#ifndef __UDP_Send_H
#define __UDP_Send_H
#include "lwip/udp.h"
#include "lwip/ip.h"
#include "lwip/netif.h"
#include "lwip/init.h"
#include "lwip/mem.h"
#include <string.h>
#define UDP_REMOTE_PORT 8089 /* 远端端口 */
#define UDP_LOCAL_PORT 8089 /* 本地端口 */
//远端地址
#define UDP_REMOTE_IP0 192
#define UDP_REMOTE_IP1 168
#define UDP_REMOTE_IP2 1
#define UDP_REMOTE_IP3 140
void udp_client_init(void);
void udp_client_send(char *pData);
#endif
/******************************************************************************/
//
#include "UDP_Send.h"
/* udp控制块 */
static struct udp_pcb *upcb;
/******************************************************************************
* 描述 : 接收回调函数
******************************************************************************/
static void udp_receive_callback(void *arg, struct udp_pcb *upcb,
struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
char buf[1024]={0};
//拷贝接收到的数据
if(pbuf_copy_partial(p,(void *)buf,p->len,0)>0){
}
//数据回传
udp_send(upcb, p);
printf("%s\r\n",buf);
pbuf_free(p);
}
/******************************************************************************
* 描述 : 发送udp数据
* 参数 : (in)pData 发送数据的指针
******************************************************************************/
void udp_client_send(char *pData)
{
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL);
if (p != NULL)
{
/* 填充缓冲区数据 */
pbuf_take(p, pData, strlen(pData));
/* 发送udp数据 */
udp_send(upcb, p);
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
/******************************************************************************
* 描述 : 创建udp客户端
******************************************************************************/
void udp_client_init(void)
{
ip_addr_t serverIP;
err_t err;
//接收端地址
IP4_ADDR(&serverIP,UDP_REMOTE_IP0,UDP_REMOTE_IP1,UDP_REMOTE_IP2,UDP_REMOTE_IP3);
/* 创建udp控制块 */
upcb = udp_new();
if (upcb!=NULL)
{
/* 配置本地端口 */
upcb->local_port = UDP_LOCAL_PORT;
/* 配置服务器IP和端口 */
err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
udp_recv(upcb, (udp_recv_fn)udp_receive_callback, NULL);
/* 发送udp数据 */
udp_client_send("udp client connected");
}
else
{
udp_remove(upcb);
}
}
}
/******************************************************************************/
在初始化基本的内存池等等函数后进行udp_client_init();的初始化即可使用udp_client_send函数
例如:
LwIP_Init();
iperf_Server_init();
httpd_init();
udp_client_init();
for(;;)
{
vTaskDelay((10));
}
