ESP32-C3, esp-idf 4.3.5, 连入指定无线网后同指定ip收发数据,要有重连机制,提供个例程,谢谢
时间: 2023-12-08 13:06:32 浏览: 170
ESP32 ESP32C3 Micropython 连接WIFI自动重连,连接阿里云物联网示例
好的,以下是一个 ESP32-C3 连接指定无线网并同指定 IP 收发数据的示例代码,同时也包含了重连机制。
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
#define SERVER_IP "YOUR_SERVER_IP"
#define SERVER_PORT 8080
static const char *TAG = "example";
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
}
}
static void wifi_init_sta(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&wifi_event_handler,
NULL));
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASSWORD,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
}
void app_main()
{
ESP_ERROR_CHECK(nvs_flash_init());
wifi_init_sta();
while (1) {
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(SERVER_PORT);
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;
}
if (connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) != 0) {
ESP_LOGE(TAG, "Socket connect failed: errno %d", errno);
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;
}
ESP_LOGI(TAG, "Socket connected");
// Send data
const char *data = "Hello, World!";
if (write(sock, data, strlen(data)) < 0) {
ESP_LOGE(TAG, "Error occurred during sending data: errno %d", errno);
}
// Receive data
char recv_buf[64];
int recv_len = read(sock, recv_buf, sizeof(recv_buf) - 1);
if (recv_len < 0) {
ESP_LOGE(TAG, "Error occurred during receiving data: errno %d", errno);
} else {
recv_buf[recv_len] = 0; // Null-terminate received data
ESP_LOGI(TAG, "Received data: %s", recv_buf);
}
close(sock);
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
```
在这个示例代码中,我们通过调用 `wifi_init_sta` 函数初始化 Wi-Fi 连接,并在 `wifi_event_handler` 中处理 Wi-Fi 事件,其中包括连接和断开连接的处理。在主任务中,我们通过创建一个 socket 并尝试连接到指定的 IP 地址和端口,如果连接失败则等待一段时间后尝试重新连接。如果连接成功,则发送一条消息并等待接收数据,然后关闭 socket 并等待一段时间后重新尝试连接。
需要注意的是,这个示例代码中并没有实现断开连接后的重连机制,但是我们可以通过在 `wifi_event_handler` 中处理 `WIFI_EVENT_STA_DISCONNECTED` 事件来实现重连机制。当设备断开连接时,我们可以在 `wifi_event_handler` 中调用 `esp_wifi_connect` 函数来重新连接到指定的 Wi-Fi 网络。
另外,需要在 `sdkconfig.defaults` 文件中开启 LWIP_SOCKET 和 LWIP_NETCONN 配置,以便使用 LWIP 库提供的 socket 和网络连接接口。
阅读全文