增加断网保存数据到FLASH,恢复联网重新补发,并加上标志位

This commit is contained in:
Wang Beihong
2026-02-02 00:31:52 +08:00
parent 86b2425e93
commit d56c730cfe
19 changed files with 1853 additions and 52 deletions

View File

@@ -1,4 +1,4 @@
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES nvs_flash STATUS_LED RS-485-SP3485EEN ETH_CH390H MQTT_ESP SNTP_ESP
REQUIRES nvs_flash STATUS_LED RS-485-SP3485EEN ETH_CH390H MQTT_ESP SNTP_ESP FLASH_SPIFS OFFLINE_STORAGE
)

View File

@@ -16,3 +16,5 @@ dependencies:
# public: true
espressif/mqtt: ^1.0.0
espressif/cjson: ^1.7.19

View File

@@ -4,6 +4,8 @@
#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)
@@ -15,15 +17,23 @@ void app_main(void)
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, 4096); // 为通道0启动接收任务
start_rs485_rx_task_for_channel(0, 5, 8192); // 为通道0启动接收任务(增加栈大小)
// 等待网络连接建立
ESP_LOGI(TAG, "Waiting for network connection...");
ESP_LOGI(TAG, "正在等待网络连接...");
esp_netif_t *eth_netif = esp_netif_get_handle_from_ifkey("ETH_DEF"); // 获取默认以太网接口
@@ -33,25 +43,25 @@ void app_main(void)
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, "Network connected with IP: " IPSTR, IP2STR(&ip_info.ip));
ESP_LOGI(TAG, "网络已连接IP地址: " IPSTR, IP2STR(&ip_info.ip));
break;
}
ESP_LOGI(TAG, "Waiting for IP address...");
ESP_LOGI(TAG, "正在等待IP地址分配...");
vTaskDelay(pdMS_TO_TICKS(1000)); // 等待1秒后重试
}
// 初始化SNTP时间同步服务
ESP_LOGI(TAG, "Initializing SNTP time synchronization...");
ESP_LOGI(TAG, "正在初始化SNTP时间同步服务...");
sntp_esp_init();
// 等待时间同步完成最长等待10秒
if (sntp_esp_wait_sync(10000)) {
ESP_LOGI(TAG, "Time synchronization completed successfully");
ESP_LOGI(TAG, "时间同步完成");
} else {
ESP_LOGW(TAG, "Time synchronization timeout, using local time");
ESP_LOGW(TAG, "时间同步超时,使用本地时间");
}
ESP_LOGI(TAG, "Starting MQTT client...");
ESP_LOGI(TAG, "正在启动MQTT客户端...");
// 启动MQTT客户端
mqtt_app_start();
@@ -63,15 +73,24 @@ void app_main(void)
status_led_blink_mode(2, 2); // LED2 心跳:系统运行正常
// ============================
// 启动设备状态上报任务(每10秒上报一次
// 配置并标记设备状态上报任务(将在MQTT连接后自动启动
// ============================
if (mqtt_start_device_status_task(10000) == pdPASS) {
ESP_LOGI(TAG, "Device status report task started");
ESP_LOGI(TAG, "设备状态上报任务已配置将在MQTT连接后自动启动");
} else {
ESP_LOGE(TAG, "Failed to start device status report task");
ESP_LOGE(TAG, "配置设备状态上报任务失败");
}
ESP_LOGI(TAG, "Waiting for MODBUS poll command via MQTT...");
// ============================
// 启动离线数据补传任务
// ============================
if (mqtt_start_offline_upload_task() == pdPASS) {
ESP_LOGI(TAG, "离线数据上传任务已启动");
} else {
ESP_LOGE(TAG, "启动离线数据上传任务失败");
}
ESP_LOGI(TAG, "正在等待MQTT发送MODBUS轮询命令...");
for (;;)
{