esp32UDP使用的步骤

 1.创建等链接套接字fd=socket()

sock = socket(AF_INET,SOCK_DGRAM,0);

参数说明:

AF_INET                        --- IPV4的都是使用这个

SOCK_DGRAM            ----指明协议是UDP   TCP的是SOCK_STREAM

0                                   -----这个是服务 UDP和TCP都是0
 2.绑定待链接套接字bind(fd,服务器ip和端口)

bind(sock,(struct sockaddr *)&Loacl_addr,sizeof(Loacl_addr));

参数说明:

sock                               ---- 第一步创建的套接字socket描述符

Loacl_addr                    ----- 设置本地的端口等信息

sizeof(Loacl_addr)     ------ 结构体的长度

具体的设置:

struct sockaddr_in Loacl_addr; //设置本地端口

Loacl_addr.sin_addr.s_addr = htonl(INADDR_ANY);

Loacl_addr.sin_family = AF_INET;

Loacl_addr.sin_port = htons(54321);

 3.等待信息recvfrom(fd,对端地址)

len =recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen);

参数说明:

sock                               ---- 第一步创建的套接字socket描述符

rx_buffer                        ----接收的缓冲区

sizeof(rx_buffer) - 1      -----接收缓冲区的大小

0                                   -----指明用户控制接收的方式 通常是0

source                         ------ 目标地址的信息

socklen                       -----  source结构体的长度

二、具体代码

在wifi连接成功之后触发UDP的初始化,首先发送一个字符串,然后等待接收,把接收到的数据原路返回

 
#include <string.h>
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "tcpip_adapter.h"
 
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>
 
 
#define HOST_IP_ADDR "255.255.255.255"
#define PORT         12345
int sock = 0;
struct sockaddr_in dest_addr;
 TaskHandle_t xUDPRecvTask = NULL;
 
void udp_recv_data(void *pvParameters){
 
    uint8_t rx_buffer[1024] = {0};
    printf("create udp recv\n");
        int err = sendto(sock, "udp test", strlen("udp test"), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    if (err < 0) {
        printf( "Error occurred during sending: errno %d", errno);
        return;
        }
        printf("Message sent");
    struct sockaddr_in source_addr; // Large enough for both IPv4 or IPv6
   
    socklen_t socklen = sizeof(source_addr);
    while (1)
    {
        int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen);
        if(len > 0){
                rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string
                printf("Received %d bytes from %s:\n", len, rx_buffer);
          
                int err = sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr, sizeof(source_addr));
                if (err < 0) {
                    printf( "Error occurred during sending: errno %d", errno);
                    return;
                 }
                 printf("Message sent");
        }
    }
 
}
 
void udp_ini_client(void){
 
    sock = socket(AF_INET,SOCK_DGRAM,0);
     printf("sock:%d\n",sock);
    if(sock < 0){
        
       printf( "Unable to create socket: errno %d", errno);
       return;
    }
    printf("Socket created, sending to %s:%d", HOST_IP_ADDR, PORT);
   
    dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR); //设置目标IP地址 
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);//目标端口
    struct sockaddr_in Loacl_addr; 
    Loacl_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    Loacl_addr.sin_family = AF_INET;
    Loacl_addr.sin_port = htons(54321); //设置本地端口
    uint8_t res = 0;
    res = bind(sock,(struct sockaddr *)&Loacl_addr,sizeof(Loacl_addr));
    if(res != 0){
        printf("bind error\n");
 
    }//创建接收任务函数
    xTaskCreate(&udp_recv_data,"udp_recv_data",2048*2,NULL,10,&xUDPRecvTask);
    }

ESP32是一个基于Espressif Systems ESP8266 Wi-Fi SoC开发的开源硬件平台,它支持TCP/IP协议栈,包括UDP(用户数据报协议),可用于广播通信。UDP广播是一种单播到网络中所有主机的技术,通过将数据包的目标IP地址设置为255.255.255.255,数据包会被发送到网络内的所有设备。 在ESP32中进行UDP广播通信的基本步骤如下: 1. **初始化UDP模块**:首先需要配置ESP32网络接口,启用UDP功能并设置正确的网络接口。 ```c WiFi.mode(WIFI_STA); // 设置工作模式为接入点 WiFi.begin("SSID", "password"); // 连接Wi-Fi UDPServer server(LOCAL_PORT); // 初始化本地端口服务器 ``` 2. **设置广播地址**:创建一个数据包,目标地址设为全网广播地址。 ```c struct sockaddr_in broadcast_addr; broadcast_addr.sin_family = AF_INET; // 使用IPv4 broadcast_addr.sin_port = htons(BROADCAST_PORT); // 广播端口 broadcast_addr.sin_addr.s_addr = INADDR_BROADCAST; // 全局广播地址 ``` 3. **发送广播消息**:创建一个UDP数据包,并将其发送到广播地址。 ```c char data[] = "Hello, this is a UDP broadcast message"; // 数据内容 server.sendTo(data, sizeof(data), &broadcast_addr, sizeof(broadcast_addr)); ``` 4. **接收响应**:如果其他设备对广播进行了回应,可以通过监听收到的数据包来进行处理。 ```c UdpPacket packet; while (server.receive(&packet)) { Serial.println(packet.remoteIP(), DEC); Serial.print("Message received: "); Serial.println(packet.data(), DEC); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值