完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题请教,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个回答
|
|
在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断开连接时,系统会自动尝试重新连接,直到达到最大重连次数。如果重连失败,系统会等待一段时间后再次尝试。 |
|
|
|
只有小组成员才能发言,加入小组>>
492 浏览 1 评论
1896 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
398浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
188浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
230浏览 2评论
用AT+CIPSNTPCFG=1,8,\"cn.ntp.org.cn\",\"ntp.sjtu.edu.cn\"更新不了时间怎么处理?
595浏览 2评论
279浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-14 18:35 , Processed in 1.439900 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191