联网方式改开机按键手动选择:10s倒计时,KEY1=4G/KEY2=WiFi固定/KEY3=配网,超时进EEPROM记忆(首次默认4G);选定后锁定通道原地重试不再自动切换

This commit is contained in:
helei 2026-09-18 15:19:22 +08:00
parent 5bc543237e
commit 67fed98891
6 changed files with 111 additions and 16 deletions

View File

@ -108,7 +108,7 @@ SCALE/SCALE0/SCALE1控制终端/ GPS/GPS0/GPS1 / ENCLR控制终端电
## 8. 网络层network.c 抽象)
- 4G模组内置 MQTTAir780 AT 指令)与 WiFiESP-01S TCP 透传+MCU 软件 MQTT 3.1.1)统一 NET_* 接口,共享 U2_CopyBuff 接收缓冲net_at_mutex 互斥
- 通道选择EEPROM 记忆上次成功方式优先4G 无 SIM/无信号重试 3 次回退 WiFiWiFi 按 固定热点(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 反相为拉低=掉电**

View File

@ -54,22 +54,25 @@ int net_wifi_init(void)
int joined = 0;
uint8_t via_smart = 0; /* 1=本次用的是配网热点已存AP或SmartConfig */
/* 上次是配网热点成功的:模块里存着该热点密码,优先查自动连接 */
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;

View File

@ -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;

View File

@ -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未变化则空操作 */

View File

@ -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 喂料秤 */

View File

@ -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