diff --git a/AI项目上下文.md b/AI项目上下文.md index 4164a27..6b66e29 100644 --- a/AI项目上下文.md +++ b/AI项目上下文.md @@ -108,7 +108,7 @@ SCALE/SCALE0/SCALE1(控制终端)/ GPS/GPS0/GPS1 / ENCLR(控制终端电 ## 8. 网络层(network.c 抽象) - 4G(模组内置 MQTT,Air780 AT 指令)与 WiFi(ESP-01S TCP 透传+MCU 软件 MQTT 3.1.1)统一 NET_* 接口,共享 U2_CopyBuff 接收缓冲,net_at_mutex 互斥 -- 通道选择:EEPROM 记忆上次成功方式优先;4G 无 SIM/无信号重试 3 次回退 WiFi;WiFi 按 固定热点(40s) → SmartConfig(100s) 失败回 4G 循环 +- 通道选择(V1.7.1 起改为**开机按键手动选择**,仅控制终端新板):欢迎页后 10s 倒计时,KEY1=4G/KEY2=WiFi固定/KEY3=配网,超时=EEPROM(130)记忆的上次选择(首次默认4G);选定后锁定通道原地重试,**不再自动回退**;老版本(含采集终端)仍是 EEPROM 记忆优先+4G/WiFi 自动回退循环 - **心跳阶梯**(防误复位):30s PINGREQ,无应答立即 3s 快探测,连续 5 次(约42s)判死 → 先原 TCP 重发 CONNECT,失败再完整重建链路,**不整机复位** - ESP_EN 断电重启:esp_reset 先断电 500ms 再上电(治模块半死);CWJAP 冷启动失败自动重试一次;连上后 AT+CWJAP? 打印信号强度%(含 busy 重试) - WiFi 就绪后 4G 断电省电(老板 CAT_PWR 置高;**控制终端新板 PC1 反相为拉低=掉电**) diff --git a/STM32F103_App1/HardWare/NETWORK/net_wifi.c b/STM32F103_App1/HardWare/NETWORK/net_wifi.c index be07dbb..e594ff5 100644 --- a/STM32F103_App1/HardWare/NETWORK/net_wifi.c +++ b/STM32F103_App1/HardWare/NETWORK/net_wifi.c @@ -54,22 +54,25 @@ int net_wifi_init(void) int joined = 0; uint8_t via_smart = 0; /* 1=õȵ㣨ѴAPSmartConfig */ - /* ϴȵɹģģŸȵ룬ȲԶ */ - if (NET_GetLastMode() == NET_MODE_WIFI_SMART) { + /* ѡģʽӷʽ(V1.7.1 ): ģʽֻѴAP+SmartConfig, ̶ģʽ̶ֻȵ */ + uint8_t fmode = NET_GetForceMode(); + + /* ģʽģϴȵ룬ȲԶ */ + if (fmode == NET_MODE_WIFI_SMART) { if (esp_saved_ap_connected(10) == 0) { joined = 1; via_smart = 1; } } - /* ̶ SSID/PASS */ - if (!joined && esp_join_fixed_ap() == 0) { + /* ̶ȵģʽ̶/EEPROM õ SSID/PASS */ + if (!joined && fmode == NET_MODE_WIFI_FIXED && esp_join_fixed_ap() == 0) { joined = 1; via_smart = 0; } - /* ̶ȵϣ SmartConfig ESP-Touch APP 㲥룩 */ - if (!joined) { + /* ģʽѴ AP SmartConfig ESP-Touch APP 㲥룩 */ + if (!joined && fmode == NET_MODE_WIFI_SMART) { if (esp_smartconfig() == 0) { joined = 1; via_smart = 1; diff --git a/STM32F103_App1/HardWare/NETWORK/network.c b/STM32F103_App1/HardWare/NETWORK/network.c index 7bfea01..d6c774d 100644 --- a/STM32F103_App1/HardWare/NETWORK/network.c +++ b/STM32F103_App1/HardWare/NETWORK/network.c @@ -67,7 +67,6 @@ volatile int g_net_ui_countdown = 0; static net_backend_t s_backend = NET_BACKEND_4G; /* ϴγɹʽEEPROM ƫ 130Ӳռõ 126ܿ */ -#define EEPROM_NETMODE_ADDR 130 static uint8_t s_last_mode = NET_MODE_4G; /* SIM Զٴκ WiFi */ @@ -123,6 +122,15 @@ uint8_t NET_GetLastMode(void) } /* ʽ䣺ʽ仯ʱдһ EEPROM"ֻһ" */ +/* ѡʽ(Ĭ 4G); ѡͨ, ԭԲл */ +static uint8_t s_force_mode = NET_MODE_4G; +void NET_SetForceMode(uint8_t mode) +{ + if (mode > NET_MODE_WIFI_SMART) mode = NET_MODE_4G; + s_force_mode = mode; +} +uint8_t NET_GetForceMode(void) { return s_force_mode; } + void NET_SaveMode(uint8_t mode) { if (mode == s_last_mode || mode > NET_MODE_WIFI_SMART) return; @@ -140,10 +148,8 @@ void NET_init(void) g_no_sim_detected = 0; g_no_signal_detected = 0; - /* EEPROM ϴγɹʽǷֵ( EEPROM δʼ 0xFF) 4G */ - uint8_t m = NET_MODE_4G; - eepromReadData(EEPROM_NETMODE_ADDR, &m, 1); - if (m > NET_MODE_WIFI_SMART) m = NET_MODE_4G; + /* ʽ = ѡ(NET_SetForceMode), ٶ EEPROM ϴγɹʽ */ + uint8_t m = s_force_mode; s_last_mode = m; if (m == NET_MODE_4G) { @@ -222,7 +228,7 @@ void NET_process(void) if (!g_no_sim_detected && !g_no_signal_detected) { log_info("> NET: 4G SIM/źѻָ"); fail_count = 0; - } else if (fail_count >= NET_NO_SIM_SWITCH_COUNT) { + } else if (fail_count >= NET_NO_SIM_SWITCH_COUNT && s_force_mode != NET_MODE_4G) { log_warn("> NET: 4G %d Բã˵ WiFi", NET_NO_SIM_SWITCH_COUNT); net_switch_to_wifi(); @@ -259,7 +265,7 @@ void NET_process(void) net_at_unlock(); if (wifi_rc == 0) { fail_count = 0; - } else if (fail_count >= NET_WIFI_FAIL_SWITCH_COUNT) { + } else if (fail_count >= NET_WIFI_FAIL_SWITCH_COUNT && s_force_mode == NET_MODE_4G) { log_warn("> NET: WiFi ʧܣ˵ 4G"); net_switch_to_4g(); fail_count = 0; diff --git a/STM32F103_App1/HardWare/NETWORK/network.h b/STM32F103_App1/HardWare/NETWORK/network.h index ca3e9a7..6ecd306 100644 --- a/STM32F103_App1/HardWare/NETWORK/network.h +++ b/STM32F103_App1/HardWare/NETWORK/network.h @@ -21,7 +21,13 @@ extern volatile uint8_t g_no_signal_detected; /* 4G /*===== ϴγɹʽEEPROM ־ûʽ仯ʱдһΣ=====*/ #define NET_MODE_4G 0 /* 4G */ #define NET_MODE_WIFI_FIXED 1 /* WiFi - ̶ȵ */ -#define NET_MODE_WIFI_SMART 2 /* WiFi - SmartConfig ȵ */ +#define NET_MODE_WIFI_SMART 2 + +#define EEPROM_NETMODE_ADDR 130 /* EEPROM ʽֽ: Ϊѡģʽ(V1.7.1 ) */ + +/* ѡʽ: ѡԶлͨ, ԭ */ +void NET_SetForceMode(uint8_t mode); +uint8_t NET_GetForceMode(void); /* WiFi - SmartConfig ȵ */ uint8_t NET_GetLastMode(void); /* ǰķʽ */ void NET_SaveMode(uint8_t mode); /* ʽ仯ʱд EEPROMδ仯ղ */ diff --git a/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 4143921..784fb9e 100644 --- a/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -61,6 +61,76 @@ void storage_unlock(void) /*==== ҵģʼǰãһ£====*/ static volatile uint8_t s_qr_showing = 0; /* άҳʾ: Ԥˢ */ +/*==== ʽѡ(V1.7.1 °尴): 10s ʱ ==== + * KEY1(PC6)=4G KEY2(PC7)=WiFi̶ȵ KEY3(PB14)=SmartConfig , ͵ƽ=; + * ʱδ = EEPROM ϴѡ(״Ĭ 4G); ѡ仯д EEPROM(ƫ130); + * ѡԶлͨ, ԭ */ + +/* ɨ: 0= 1~3=; 2 (Լ100ms)ȷ */ +static int key_scan_once(void) +{ + static uint8_t last = 0, cnt = 0; + uint8_t cur = 0; + if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_6) == GPIO_PIN_RESET) cur = 1; + else if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == GPIO_PIN_RESET) cur = 2; + else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET) cur = 3; + if (cur && cur == last) { + cnt++; + if (cnt >= 2) { cnt = 0; last = 0; return cur; } + } else { + cnt = 0; + last = cur; + } + return 0; +} + +static uint8_t net_mode_select(void) +{ + uint8_t saved = NET_MODE_4G; + eepromReadData(EEPROM_NETMODE_ADDR, &saved, 1); + if (saved > NET_MODE_WIFI_SMART) saved = NET_MODE_4G; + uint8_t mode = saved; + + static const char *const names[3] = { "4G", "WiFiȵ", "" }; + + oled_clear(); + oled_locate(0, 1); oled_print("ѡʽ"); + oled_locate(1, 0); oled_print("1:4G 2:WiFiȵ"); + oled_locate(2, 0); oled_print("3:"); + + uint32_t start = HAL_GetTick(); + int last_sec = -1; + int key = 0; + for (;;) { + uint32_t elapsed = HAL_GetTick() - start; + int remain = (int)(10000u - elapsed) / 1000; + if (remain < 0) remain = 0; + if (remain != last_sec) { + char buf[24]; + last_sec = remain; + snprintf(buf, sizeof(buf), "ϴ:%s %2ds", names[mode], remain); + oled_locate(3, 0); oled_print_line(buf); + } + key = key_scan_once(); + if (key) break; + if (elapsed >= 10000u) break; + bg_delay(50); + } + + if (key) { + mode = (uint8_t)(key - 1); /* 1->0(4G) 2->1(WiFi̶) 3->2() */ + if (mode != saved) { + eepromWriteData(EEPROM_NETMODE_ADDR, &mode, 1); /* 䱾ѡ */ + } + } + log_info("> NET: ʽѡ: %s (%s)", names[mode], key ? "ѡ" : "ʱĬ"); + oled_locate(3, 0); oled_print_line("ѡ:"); + oled_print((char *)names[mode]); + bg_delay(800); + oled_clear(); + return mode; +} + void app_init(void) { log_info(""); @@ -127,7 +197,11 @@ void app_init(void) /* ģʼ EEPROM ϴγɹʽȣ4G WiFi * δʱ 4G/WiFi ÿݿת */ - if (g_mqtt_configured) NET_init(); + /* : 10s ѡʽ(ʱ=EEPROM /Ĭ 4G), ѡԶл */ + if (g_mqtt_configured) { + NET_SetForceMode(net_mode_select()); + NET_init(); + } /* ·ڽ */ USART2_StartRx(); /* RS485 ιϳ */ diff --git a/版本说明.md b/版本说明.md index c9a1194..2a29bd4 100644 --- a/版本说明.md +++ b/版本说明.md @@ -21,6 +21,12 @@ 控制命令改三段式:FC03 预读(判定在线 + 快照命令前反馈)→ FC05 → 150ms → FC03 校验跳变; 命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复; 断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发) +- **联网方式改为开机按键手动选择**(废除自动切换):欢迎页后 10s 倒计时,KEY1(PC6)=4G / + KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;超时未按 = EEPROM 记忆的上次选择(首次默认 4G); + 选择变化才写 EEPROM(偏移 130,复用原联网方式记忆字节);**选定后锁定通道,连不上原地重试, + 不再 4G↔WiFi 自动回退**(4G 无卡/无信号、WiFi 连不上均为每 10s 重试); + WiFi 侧按模式限制连接方式:固定模式只连固定热点,配网模式只走已存 AP+SmartConfig; + 待配置模式(未灌身份)跳过选择;WiFi 心跳重建、4G MQTTSTATU 健康检查等模式内自愈逻辑不变 - **4G MQTT 主动健康检查**(移植自老工程 V1.6.6,根治断网假死):MQTT Ready 后每 60s 查一次 `AT+MQTTSTATU`,连续 3 次不在线(离线/未认证/查询超时)整机复位;OTA 下载期间(g_net_tx_busy)暂停查询; 被动 URC 处理保留双保险;新增复位原因码 RSN_MQTT_LOST(18)(BL 的 boot_share.h 同步补齐 16/17/18)。