乐鑫技术交流
直播中

fejlkel

8年用户 1094经验值
擅长:制造/封装
私信 关注
[问答]

请问esp32-c3 wifi和mqtt实现重连方法有哪些?

问题请教,esp32-c3 wifi和mqtt实现重连方法有哪些?

目前只实现了一种:
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
     case MQTT_EVENT_DISCONNECTED:
        //在这里加好像不行。
        ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
        break;
case MQTT_EVENT_ERROR:
        ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
        if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
            log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err);
            log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err);
            log_error_if_nonzero("captured as transport's socket errno",  event->error_handle->esp_transport_sock_errno);
            ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno));
            
        }
        //202205111413 test
        esp_wifi_disconnect...;
        esp_wifi_set_config... ;
        esp_wifi_connect...;
        esp_mqtt_client_disconnect...;
        esp_mqtt_client_reconnect...;

。。。
}
能实现WiFi断网后再开启重连。
1,不知道这方法长期来讲是靠谱不
2,为什么在MQTT_EVENT_DISCONNECTED不行,在MQTT_EVENT_ERROR行呢?
3,在程序中还有什么方法能知道设备WiFi掉线了,mqtt连不上了?mqtt还可以靠这个事件。WiFi呢?
4,如果用个笨的方法WiFi断网就直接复位,长期的话,那会让设备出问题不。
谢谢大家。
                          

回帖(1)

訾存贵

2024-6-17 17:48:18
在ESP32-C3上实现WiFi和MQTT的重连方法,可以通过以下几个步骤来实现:

1. 初始化WiFi和MQTT连接:

首先,需要初始化WiFi和MQTT连接。这包括设置WiFi的SSID和密码,以及MQTT服务器的地址、端口和凭据。

```c
esp_err_t ret = esp_wifi_connect();
if (ret != ESP_OK) {
    ESP_LOGE(TAG, "Failed to connect to WiFi");
}

esp_mqtt_client_config_t mqtt_config = {
    .uri = "your_mqtt_broker_address",
    .port = your_mqtt_broker_port,
    .client_id = "your_client_id",
    .username = "your_username",
    .password = "your_password",
};
esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_config);
```

2. 注册MQTT事件回调函数:

在这一步,需要注册一个MQTT事件回调函数,以便在MQTT连接断开时进行重连。

```c
esp_mqtt_set_event_handler(client, mqtt_event_handler, NULL);
```

3. 实现MQTT事件回调函数:

在MQTT事件回调函数中,可以处理各种MQTT事件,如连接成功、断开连接等。对于断开连接事件,可以在这里实现重连逻辑。

```c
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    switch (event_id) {
        case MQTT_EVENT_DISCONNECTED:
            ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
            reconnect_mqtt(client);
            break;
        case MQTT_EVENT_ERROR:
            ESP_LOGE(TAG, "MQTT_EVENT_ERROR");
            break;
        // 处理其他事件
    }
}
```

4. 实现重连函数:

在重连函数中,可以设置重连尝试的次数和间隔。如果重连失败,可以等待一段时间后再次尝试。

```c
#define MQTT_RECONNECT_MAX_ATTEMPTS 5
#define MQTT_RECONNECT_INTERVAL (1000 * 1000) // 1000ms

static void reconnect_mqtt(esp_mqtt_client_handle_t client) {
    static int reconnect_attempts = 0;

    if (reconnect_attempts < MQTT_RECONNECT_MAX_ATTEMPTS) {
        reconnect_attempts++;
        ESP_LOGI(TAG, "Attempting to reconnect MQTT (attempt %d)", reconnect_attempts);

        esp_err_t ret = esp_mqtt_client_reconnect(client);
        if (ret == ESP_OK) {
            reconnect_attempts = 0;
            ESP_LOGI(TAG, "MQTT reconnected");
        } else {
            ESP_LOGE(TAG, "Failed to reconnect MQTT (attempt %d)", reconnect_attempts);
            vTaskDelay(MQTT_RECONNECT_INTERVAL / portTICK_PERIOD_MS);
            reconnect_mqtt(client);
        }
    } else {
        ESP_LOGE(TAG, "MQTT reconnection failed after %d attempts", MQTT_RECONNECT_MAX_ATTEMPTS);
    }
}
```

5. 启动MQTT客户端:

最后,启动MQTT客户端以开始连接和接收消息。

```c
esp_mqtt_client_start(client);
```

通过以上步骤,可以实现ESP32-C3的WiFi和MQTT重连功能。在MQTT断开连接时,系统会自动尝试重新连接,直到达到最大重连次数。如果重连失败,系统会等待一段时间后再次尝试。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分