新增:添加 Wi-Fi 和 MQTT 连接状态变量,并更新 UI

- 引入了新的全局变量,用于跟踪 Wi-Fi 和 MQTT 连接状态。
- 实现了 Wi-Fi 和 MQTT 连接状态的 getter 和 setter 函数。
- 增加了管理网络信息和时间同步的功能。
- 更新了主应用程序逻辑,以反映 UI 中的当前连接状态。
- 改进了 Wi-Fi 连接处理,以定期发布网络信息。
-土壤湿度和空气温度的综合阈值变量被整合到 UI 中。
This commit is contained in:
Wang Beihong
2026-03-14 18:10:43 +08:00
parent bec31c01ce
commit ce2cf9a9ee
18 changed files with 1109 additions and 43 deletions

View File

@@ -32,6 +32,9 @@
#define WIFI_CONNECT_NVS_KEY_PASS "pass"
#define WIFI_CONNECT_HTTP_BUF_SIZE 256
#define WIFI_CONNECT_NETINFO_UPDATE_MS 15000
#define WIFI_CONNECT_NETINFO_DEFAULT_RSSI_DBM (-127)
#ifndef CONFIG_WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS
#define CONFIG_WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS 5000
@@ -43,6 +46,8 @@
static const char *TAG = "wifi_connect";
extern void set_var_iot_net_info(const char *value) __attribute__((weak));
static inline bool wifi_connect_is_always_on_mode(void)
{
#if CONFIG_WIFI_CONNECT_PROVISION_MODE_ALWAYS_ON
@@ -106,6 +111,7 @@ typedef struct {
TaskHandle_t button_task;
TaskHandle_t dns_task;
TaskHandle_t net_info_task;
SemaphoreHandle_t lock;
@@ -127,6 +133,84 @@ static wifi_connect_ctx_t s_ctx = {
.dns_sock = -1,
};
static void wifi_connect_publish_iot_net_info(const char *info)
{
if (set_var_iot_net_info != NULL) {
set_var_iot_net_info(info);
}
}
static void wifi_connect_publish_net_info_disconnected(void)
{
char info[96] = {0};
snprintf(info,
sizeof(info),
"RSSI:%ddBm IP:0.0.0.0",
WIFI_CONNECT_NETINFO_DEFAULT_RSSI_DBM);
wifi_connect_publish_iot_net_info(info);
}
static void wifi_connect_net_info_task(void *arg)
{
(void)arg;
for (;;) {
bool connected = false;
xSemaphoreTake(s_ctx.lock, portMAX_DELAY);
connected = s_ctx.sta_connected;
xSemaphoreGive(s_ctx.lock);
if (!connected) {
wifi_connect_publish_net_info_disconnected();
vTaskDelay(pdMS_TO_TICKS(WIFI_CONNECT_NETINFO_UPDATE_MS));
continue;
}
int8_t rssi_dbm = 0;
bool has_rssi = false;
wifi_ap_record_t ap_info = {0};
if (esp_wifi_sta_get_ap_info(&ap_info) == ESP_OK) {
rssi_dbm = ap_info.rssi;
has_rssi = true;
}
esp_netif_ip_info_t ip_info = {0};
bool has_ip = (esp_netif_get_ip_info(s_ctx.sta_netif, &ip_info) == ESP_OK) && (ip_info.ip.addr != 0);
char info[96] = {0};
if (has_rssi) {
if (has_ip) {
snprintf(info,
sizeof(info),
"RSSI:%ddBm IP:" IPSTR,
rssi_dbm,
IP2STR(&ip_info.ip));
} else {
snprintf(info,
sizeof(info),
"RSSI:%ddBm IP:0.0.0.0",
rssi_dbm);
}
} else {
if (has_ip) {
snprintf(info,
sizeof(info),
"RSSI:%ddBm IP:" IPSTR,
WIFI_CONNECT_NETINFO_DEFAULT_RSSI_DBM,
IP2STR(&ip_info.ip));
} else {
snprintf(info,
sizeof(info),
"RSSI:%ddBm IP:0.0.0.0",
WIFI_CONNECT_NETINFO_DEFAULT_RSSI_DBM);
}
}
wifi_connect_publish_iot_net_info(info);
vTaskDelay(pdMS_TO_TICKS(WIFI_CONNECT_NETINFO_UPDATE_MS));
}
}
// 配网页面(内嵌 HTML + JS
static const char *s_html_page =
"<!doctype html><html><head><meta charset='utf-8'/>"
@@ -987,6 +1071,7 @@ static void wifi_connect_event_handler(void *arg, esp_event_base_t event_base, i
esp_timer_stop(s_ctx.connect_timer);
}
xSemaphoreGive(s_ctx.lock);
wifi_connect_publish_net_info_disconnected();
}
}
@@ -1233,6 +1318,10 @@ esp_err_t wifi_connect_init(void)
}
s_ctx.initialized = true;
wifi_connect_publish_net_info_disconnected();
BaseType_t net_info_ok = xTaskCreate(wifi_connect_net_info_task, "wifi_net_info", 4096, NULL, 3, &s_ctx.net_info_task);
ESP_RETURN_ON_FALSE(net_info_ok == pdPASS, ESP_ERR_NO_MEM, TAG, "net info task create failed");
if (wifi_connect_is_always_on_mode()) {
wifi_connect_log_state_i("配网模式", "常驻配网(上电自动开启且不会自动关闭)");