第一次提交:完成了网关的单路485数据采集,还有以太网链接和MQTT配置,实现数据上报和命令下发,差一个断网储存

This commit is contained in:
Wang Beihong
2026-02-01 18:31:06 +08:00
commit b284cb4953
35 changed files with 4338 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
#include "SNTP_ESP.h"
#include "esp_log.h"
#include "esp_sntp.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <sys/time.h>
#include <string.h>
#define TAG "SNTP_ESP"
static bool time_synced = false;
// 时间同步回调函数
static void sntp_sync_time_callback(struct timeval *tv)
{
time_t now = tv->tv_sec;
struct tm timeinfo;
localtime_r(&now, &timeinfo);
char time_str[64];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", &timeinfo);
ESP_LOGI(TAG, "时间同步成功: %s", time_str);
time_synced = true;
}
esp_err_t sntp_esp_set_timezone(void)
{
// 设置中国标准时间(北京时间)
setenv("TZ", "CST-8", 1);
tzset();
ESP_LOGI(TAG, "时区设置为北京时间 (CST-8)");
return ESP_OK;
}
time_t sntp_esp_get_current_time(void)
{
// 使用POSIX函数获取时间
return time(NULL);
}
void sntp_esp_print_current_time(void)
{
time_t now = sntp_esp_get_current_time();
struct tm timeinfo;
char buffer[64];
localtime_r(&now, &timeinfo);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S %A", &timeinfo);
ESP_LOGI(TAG, "当前时间: %s", buffer);
}
esp_err_t sntp_esp_get_formatted_time(char *buffer, size_t size, const char *format)
{
if (buffer == NULL || format == NULL) {
return ESP_FAIL;
}
time_t now = sntp_esp_get_current_time();
struct tm timeinfo;
localtime_r(&now, &timeinfo);
strftime(buffer, size, format, &timeinfo);
return ESP_OK;
}
bool sntp_esp_is_synced(void)
{
time_t now = time(NULL);
// 检查时间是否已初始化从1970年到现在
return (now > 1000000000); // 2001年9月9日之后的任何时间都认为是有效时间
}
bool sntp_esp_wait_sync(uint32_t max_wait_ms)
{
ESP_LOGI(TAG, "等待时间同步(最长等待 %lu ms...", (unsigned long)max_wait_ms);
uint32_t start_time = xTaskGetTickCount();
uint32_t max_wait_ticks = pdMS_TO_TICKS(max_wait_ms);
while ((xTaskGetTickCount() - start_time) < max_wait_ticks) {
if (sntp_esp_is_synced()) {
ESP_LOGI(TAG, "时间同步完成");
return true;
}
vTaskDelay(pdMS_TO_TICKS(100)); // 每100毫秒检查一次
}
ESP_LOGW(TAG, "时间同步超时");
return false;
}
esp_err_t sntp_esp_init(void)
{
ESP_LOGI(TAG, "初始化SNTP服务");
// 重置同步标志
time_synced = false;
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
// 设置时间服务器(默认使用 pool.ntp.org
esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);
// 添加 NTP 服务器
// esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器
esp_sntp_setservername(0, "cn.pool.ntp.org"); // 中国 NTP 服务器
esp_sntp_setservername(1, "ntp1.aliyun.com"); // 阿里云 NTP 服务器
esp_sntp_setservername(2, "ntp.tencent.com"); // 腾讯云 NTP 服务器
// 设置时间同步回调
esp_sntp_set_time_sync_notification_cb(sntp_sync_time_callback);
// 初始化 SNTP
esp_sntp_init();
#else
sntp_setoperatingmode(SNTP_OPMODE_POLL);
// esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器
sntp_setservername(0, "cn.pool.ntp.org"); // 中国 NTP 服务器
sntp_setservername(1, "ntp1.aliyun.com"); // 阿里云 NTP 服务器
sntp_setservername(2, "ntp.tencent.com"); // 腾讯云 NTP 服务器
sntp_set_time_sync_notification_cb(sntp_sync_time_callback);
sntp_init(); // 初始化 SNTP
#endif
sntp_esp_set_timezone(); // 设置时区
sntp_esp_print_current_time(); // 打印时间
ESP_LOGI(TAG, "SNTP服务初始化完成");
return ESP_OK;
}