ESP8266学习实战之UdpClient与UdpSever(FreeRTOS)

Udpclient 任务流程

①判断是否获取ip地址

新建状态变量 

STATION_STATUS stastatus;

 

调用wifi接口,并判断是否获取IP地址

  ·do
        {
        stastatus = wifi_station_get_connect_status();
        vTaskDelay(100);
        }
    while (stastatus != STATION_GOT_IP);

 

②创建Socket

    int fd = -1;
        fd = socket(PF_INET,SOCK_DGRAM,0);
    if(fd = -1)
        {
            printf("get socket fail!");
            vTaskDelete(NULL);
        }

 

③设置接收超时时间

int setsockopt(int sock,int level,int optname,void *optval,socklen to optlen );

sock:将要被设置或者获取选项的套接字

level:选项所在的协议层

optname:需要访问的选项名

optval:对于getsockopt()指向返回值的缓冲,对于setsockopt()指向包含新选项的缓冲。

optlen:对于getsockop(),作为入口参数时,选项值得最大长度;作为出口参数时,选项值得实际长度。对于setsockopt(),现选项的长度。

  int NetTimeOut = 1000;
  setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int))

 

④赋值sever信息

定义一个struct_sockaddr_in类型的变量并清空

struct sockaddr_in myaddr;

memset(&myaddr,0,sizeof(myaddr));

填充地址信息

myaddr.sin_family = PF_INET;

myaddr.sin_port = htons(8888);

myaddr.sin_addr.s_addr = inet_addr("192.168.x.xxx");

将该变量强制转换为struct sockaddr 类型在函数中使用

bind(listenfd,(struct sockaddr*)(&myaddr),sizeof(myaddr));

#define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000

    struct sockaddr_in SeverAddr;
    memset(&SeverAddr,0,sizeof(SeverAddr));

    SeverAddr.sin_family = AF_INET;
    SeverAddr.sin_addr.s_addr = inet_addr(SEVERADDR);
    SeverAddr.sin_port = htons(SEVERPORT);
    SeverAddr.sin_len = sizeof(SeverAddr);    

 

 

⑤发送数据到sever端

ssize t send(int socket,const void *buffer,size  t length,int flages);

ssize t sendto( int s,const void *data ,size t size ,int falges,const struct sockaddr *to,socklen t tolen);

头文件:#include<sys/socket.h>

buffer:发送缓冲区首地址

length:发送字节数

flages:发送方式(通常为0)

    //发送数据
    sendto(fd, "I am Udp", sizeof("I am Udp"), 0, (struct sockaddr *)&SeverAddr, (socklen_t)SeverAddr.sin_len);

 

⑥从sever端接收数据

     int ret;
     char udpmsg[48];


do { ret = recvfrom(fd, udpmsg, 48, 0, (struct sockaddr *)&SeverAddr, (socklen_t*)(&SeverAddr.sin_len)); vTaskDelay(100); if(ret > 0) { printf("UdpSever:%s\n",udpmsg); } else printf("UdpSever data is no\n"); } while (ret == -1);

 udpsever任务流程

直接复制SDK中的udpclient文件夹的所有文件到新建文件夹udpsever中

在udpsever中新建udpsever.c和udpsever.h

将udpcline.c和udpcline.h中的代码分别复制到udpsever.c和udpsever.h中并修改头文件以及函数名

 

 

 

 

修改sever地址

 

 

 

 sever地址后添加

    if(bind(fd,(struct sockaddr*)&SeverAddr,SeverAddr.sin_len) != 0)
        {
            printf("bind socket fail!\n");
            vTaskDelete(NULL);
            return;
        }
    

 

修改发射接收端

struct sockaddr from;
socklen_t fromlen = sizeof(struct sockaddr);


for(;;) { do { ret = recvfrom(fd, udpmsg, 48, 0, &from, &fromlen); vTaskDelay(100); if(ret > 0) { printf("UdpClient:%s\n",udpmsg); } else printf("UdpClient data is Null\n"); } while (ret == -1); //发送返回数据 sendto(fd, "I am UdpSever", sizeof("I am UdpSever"), 0, &from, fromlen); } vTaskDelete( NULL );

UDPClient源码:

//udpclient.c
#include "esp_common.h"
    
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
    
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "udpclient.h"

#define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000

/******************************************************************************
 * FunctionName : ATaskUdpclient
 * Description  : ATaskUdpclient 任务
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ATaskUdpclient(void *pvParameters)
{
    int iVariableExample = 0;
    int fd = -1;
    int NetTimeOut = 5000;
    int ret;
    char udpmsg[48];

    STATION_STATUS stastatus;
    
    struct sockaddr_in SeverAddr;
    do
        {
        stastatus = wifi_station_get_connect_status();
        vTaskDelay(100);
        }while (stastatus != STATION_GOT_IP);
    
    fd = socket(PF_INET,SOCK_DGRAM,0);
    
    if(fd == -1)
        {
            printf("get socket fail!");
            vTaskDelete(NULL);
        }
    
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int));
    memset(&SeverAddr,0,sizeof(SeverAddr));

    SeverAddr.sin_family = AF_INET;
    SeverAddr.sin_addr.s_addr = inet_addr(SEVERADDR);
    SeverAddr.sin_port = htons(SEVERPORT);
    SeverAddr.sin_len = sizeof(SeverAddr);
    for(;;)
        {
            //发送数据
            sendto(fd, "I am Udp", sizeof("I am Udp"), 0, (struct sockaddr *)&SeverAddr, (socklen_t)SeverAddr.sin_len);
            do
                {
                    ret = recvfrom(fd, udpmsg, 48, 0, (struct sockaddr *)&SeverAddr, (socklen_t*)(&SeverAddr.sin_len));
                    vTaskDelay(100);
                    if(ret > 0)
                        {
                            printf("UdpSever:%s\n",udpmsg);
                        }
                    else
                        printf("UdpSever data is no\n");
                }
            while (ret == -1);
        
            
        }
    vTaskDelete( NULL );
}

/******************************************************************************
 * FunctionName : Udpclient_init
 * Description  : Udpclient_init 初始化
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void Udpclient_init(void)
{
    xTaskCreate(ATaskUdpclient, "Udpclient", 256, NULL, 4 , NULL);
}

 

//udpclient.h
#ifndef __UART_H__
#define __UART_H__

#ifdef __cplusplus
extern "C" {
#endif

void ATaskUdpclient(void *pvParameters);
void Udpclient_init(void);

#ifdef __cplusplus
}
#endif

#endif

 

UDPSever源码:

//udpsever.c
#include "esp_common.h"
    
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
    
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "udpsever.h"

#define SEVERADDR "192.168.0.207"
#define SEVERPORT 8000

/******************************************************************************
 * FunctionName : ATaskUdpsever
 * Description  : ATaskUdpsever 任务
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ATaskUdpsever(void *pvParameters)
{
    int iVariableExample = 0;
    int fd = -1;
    int NetTimeOut = 5000;
    int ret;
    char udpmsg[48];

    STATION_STATUS stastatus;
    
    struct sockaddr_in SeverAddr;
    struct sockaddr from;
    socklen_t fromlen = sizeof(struct sockaddr);
    
    do
        {
        stastatus = wifi_station_get_connect_status();
        vTaskDelay(100);
        }while (stastatus != STATION_GOT_IP);
    
    fd = socket(PF_INET,SOCK_DGRAM,0);
    
    if(fd == -1)
        {
            printf("get socket fail!");
            vTaskDelete(NULL);
            return;
        }
    
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &NetTimeOut, sizeof(int));
    memset(&SeverAddr,0,sizeof(SeverAddr));

    SeverAddr.sin_family = AF_INET;
    SeverAddr.sin_addr.s_addr = INADDR_ANY;
    SeverAddr.sin_port = htons(SEVERPORT);
    SeverAddr.sin_len = sizeof(SeverAddr);

    if(bind(fd,(struct sockaddr*)&SeverAddr,SeverAddr.sin_len) != 0)
        {
            printf("bind socket fail!\n");
            vTaskDelete(NULL);
            return;
        }
    
    for(;;)
        {
            do
                {
                    ret = recvfrom(fd, udpmsg, 48, 0, &from, &fromlen);
                    vTaskDelay(100);
                    if(ret > 0)
                        {
                            printf("UdpClient:%s\n",udpmsg);
                        }
                    else
                        printf("UdpClient data is Null\n");
                }
            while (ret == -1);
        
            

            //发送数据
            sendto(fd, "I am UdpSever", sizeof("I am UdpSever"), 0, &from, fromlen);

        }
    vTaskDelete( NULL );
}

/******************************************************************************
 * FunctionName : Udpsever_init
 * Description  : Udpsever_init 初始化
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void Udpsever_init(void)
{
    xTaskCreate(ATaskUdpsever, "Udpsever", 256, NULL, 4 , NULL);
}

 

 

//udpsever.h
#ifndef __UDPSEVER_H__
#define __UDPSEVER_H__

#ifdef __cplusplus
extern "C" {
#endif

void ATaskUdpsever(void *pvParameters);
void Udpsever_init(void);

#ifdef __cplusplus
}
#endif

#endif

 

posted @ 2020-07-22 16:18  fyxs  阅读(944)  评论(0编辑  收藏  举报