#include "RS-485-SP3485EEN.h" #include "ETH_CH390H.h" #include "MQTT_ESP.h" #include "STATUS_LED.h" #include "MODBUS_ESP.h" #include "SNTP_ESP.h" #include "FLASH_SPIFS.h" #include "OFFLINE_STORAGE.h" #define TAG "main" void app_main(void) { // 1. 初始化LED(最先初始化,让用户知道设备已上电) status_led_init(); status_led_blink_mode(1, 1); // LED1 快闪:系统启动中 status_led_blink_mode(2, 0); // LED2 慢闪:等待初始化 ESP_ERROR_CHECK(nvs_flash_init()); // 初始化SPIFFS文件系统 ESP_LOGI(TAG, "正在初始化SPIFFS文件系统..."); ESP_ERROR_CHECK(flash_spiffs_init()); // 初始化离线存储模块 ESP_LOGI(TAG, "正在初始化离线存储模块..."); ESP_ERROR_CHECK(offline_storage_init()); // 初始化以太网,这里包含了 esp_netif_init();和esp_event_loop_create_default(); eth_init(); // 初始化RS485 init_specific_rs485_channel(0); // 初始化通道0 start_rs485_rx_task_for_channel(0, 5, 8192); // 为通道0启动接收任务(增加栈大小) // 等待网络连接建立 ESP_LOGI(TAG, "正在等待网络连接..."); esp_netif_t *eth_netif = esp_netif_get_handle_from_ifkey("ETH_DEF"); // 获取默认以太网接口 // 循环等待直到获得IP地址 while (true) { esp_netif_ip_info_t ip_info; if (esp_netif_get_ip_info(eth_netif, &ip_info) == ESP_OK && ip_info.ip.addr != 0) { ESP_LOGI(TAG, "网络已连接,IP地址: " IPSTR, IP2STR(&ip_info.ip)); break; } ESP_LOGI(TAG, "正在等待IP地址分配..."); vTaskDelay(pdMS_TO_TICKS(1000)); // 等待1秒后重试 } // 初始化SNTP时间同步服务 ESP_LOGI(TAG, "正在初始化SNTP时间同步服务..."); sntp_esp_init(); // 等待时间同步完成(最长等待10秒) if (sntp_esp_wait_sync(10000)) { ESP_LOGI(TAG, "时间同步完成"); } else { ESP_LOGW(TAG, "时间同步超时,使用本地时间"); } ESP_LOGI(TAG, "正在启动MQTT客户端..."); // 启动MQTT客户端 mqtt_app_start(); // 网络连接成功后 status_led_set(1, 1); // LED1 常亮:网络正常 // MQTT 启动后 status_led_blink_mode(2, 2); // LED2 心跳:系统运行正常 // ============================ // 配置并标记设备状态上报任务(将在MQTT连接后自动启动) // ============================ if (mqtt_start_device_status_task(10000) == pdPASS) { ESP_LOGI(TAG, "设备状态上报任务已配置,将在MQTT连接后自动启动"); } else { ESP_LOGE(TAG, "配置设备状态上报任务失败"); } // ============================ // 启动离线数据补传任务 // ============================ if (mqtt_start_offline_upload_task() == pdPASS) { ESP_LOGI(TAG, "离线数据上传任务已启动"); } else { ESP_LOGE(TAG, "启动离线数据上传任务失败"); } ESP_LOGI(TAG, "正在等待MQTT发送MODBUS轮询命令..."); for (;;) { vTaskDelay(1000 / portTICK_PERIOD_MS); } }