联网方式改开机按键手动选择:10s倒计时,KEY1=4G/KEY2=WiFi固定/KEY3=配网,超时进EEPROM记忆(首次默认4G);选定后锁定通道原地重试不再自动切换
This commit is contained in:
parent
5bc543237e
commit
67fed98891
|
|
@ -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 反相为拉低=掉电**)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,未变化则空操作 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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 喂料秤 */
|
||||
|
|
|
|||
6
版本说明.md
6
版本说明.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)。
|
||||
|
|
|
|||
Loading…
Reference in New Issue