ESP32-C3, esp-idf 4.3.5, 连入指定无线网后同指定ip循环收发数据,要有重连机制,提供个例程,谢谢
时间: 2023-12-08 20:06:32 浏览: 178
好的,下面是一个基于 ESP-IDF 4.3.5 的 ESP32-C3 的 WiFi 连接和数据收发的例程,同时也包含了重连机制。请确保你已经正确安装了 ESP-IDF 开发环境并且熟悉 ESP-IDF 开发流程。
```c
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/sockets.h"
#define WIFI_SSID "your_wifi_ssid" // WiFi SSID
#define WIFI_PASS "your_wifi_password" // WiFi 密码
#define HOST_IP_ADDR "192.168.0.100" // 目标 IP 地址
#define HOST_PORT 8080 // 目标端口号
static const char *TAG = "example";
/* WiFi 事件处理函数 */
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
{
switch (event->event_id) {
case SYSTEM_EVENT_STA_START:
// 开始连接 WiFi
ESP_LOGI(TAG, "Connecting to WiFi...");
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
// 成功获取到 IP 地址
ESP_LOGI(TAG, "Connected to WiFi! IP address: %s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
// WiFi 断开连接
ESP_LOGI(TAG, "WiFi disconnected! Reconnecting...");
esp_wifi_connect();
break;
default:
break;
}
return ESP_OK;
}
/* 连接 WiFi */
static void wifi_init_sta(void)
{
// 初始化 WiFi
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL) );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 设置 WiFi STA 模式
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
.bssid_set = 0
}
};
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
}
/* 连接到目标服务器并发送/接收数据 */
static void tcp_client_task(void *pvParameters)
{
char rx_buffer[128];
char addr_str[128];
int addr_family;
int ip_protocol;
int sock = -1;
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(HOST_PORT);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);
while (1) {
if (sock == -1) {
// 创建套接字
sock = socket(addr_family, SOCK_STREAM, ip_protocol);
if (sock < 0) {
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
break;
}
// 连接服务器
int err = connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
if (err != 0) {
ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
close(sock);
sock = -1;
continue;
}
ESP_LOGI(TAG, "Successfully connected to server %s:%d", addr_str, HOST_PORT);
}
// 发送数据
char tx_buffer[] = "Hello, world!";
int err = send(sock, tx_buffer, sizeof(tx_buffer), 0);
if (err < 0) {
ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
break;
}
// 接收数据
int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
if (len < 0) {
ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno);
break;
} else if (len == 0) {
ESP_LOGW(TAG, "Server closed the connection");
break;
} else {
rx_buffer[len] = 0;
ESP_LOGI(TAG, "Received %d bytes: %s", len, rx_buffer);
}
// 延时 1 秒
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
if (sock != -1) {
ESP_LOGE(TAG, "Shutting down socket and restarting...");
shutdown(sock, 0);
close(sock);
}
vTaskDelete(NULL);
}
void app_main(void)
{
// 初始化 NVS
ESP_ERROR_CHECK(nvs_flash_init());
// 连接 WiFi
wifi_init_sta();
// 创建数据收发任务
xTaskCreate(tcp_client_task, "tcp_client_task", 4096, NULL, 5, NULL);
}
```
这个例程中,我们先通过 `wifi_init_sta()` 函数连接到指定的 WiFi 网络,然后在 `tcp_client_task()` 函数中创建一个 TCP 客户端套接字,并连接到指定的 IP 地址和端口号。在发送和接收数据的过程中,如果出现错误或者连接断开,我们会关闭套接字并重新连接服务器。整个过程会一直循环执行,直到程序结束。
请注意,这个例程只是一个基本的示例,实际使用时需要根据具体需求进行调整。同时,为了保证代码的可读性和可维护性,我们省略了一些错误处理和异常情况的处理,实际使用时需要根据具体情况进行补充。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)