From 3cdaba312f06b9a0aa25da5ff87d81590e965307 Mon Sep 17 00:00:00 2001 From: helei Date: Mon, 14 Sep 2026 10:23:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E4=BB=A4=E5=BA=94=E7=AD=94=E5=8F=AF?= =?UTF-8?q?=E9=9D=A0=E5=8C=96:=E6=96=B0=E5=A2=9ENET=5Fpublish=5Fresponse?= =?UTF-8?q?=5Fwait(=E7=AD=89OK+=E9=87=8D=E8=AF=952=E6=AC=A1),=E7=BB=A7?= =?UTF-8?q?=E7=94=B5=E5=99=A8/=E6=89=A9=E5=B1=95=E6=9D=BF=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=E5=BA=94=E7=AD=94=E6=8D=A2=E7=94=A8,=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8A=A8=E4=BD=9C=E4=BA=86=E4=BD=86=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STM32F103_App1/HardWare/NETWORK/network.c | 27 +++++++++++++++++++ STM32F103_App1/HardWare/NETWORK/network.h | 1 + STM32F103_App1/HardWare/RELAY/ext_relay.c | 2 +- STM32F103_App1/HardWare/RELAY/relay.c | 10 +++---- .../MDK-ARM/STM32F103rb_App1.uvoptx | 23 ++++++++++++---- 版本说明.md | 4 +++ 6 files changed, 56 insertions(+), 11 deletions(-) diff --git a/STM32F103_App1/HardWare/NETWORK/network.c b/STM32F103_App1/HardWare/NETWORK/network.c index 7b46d9b..312d78a 100644 --- a/STM32F103_App1/HardWare/NETWORK/network.c +++ b/STM32F103_App1/HardWare/NETWORK/network.c @@ -341,6 +341,33 @@ void NET_publish_response(const char *cmd_id, int ok, const char *msg) net_at_unlock(); } +/* ָӦɿ: 4G ͨģ OK(Լ1.5s/, 2), ʧܴ WARN; + * : ͨ淢, ģ UART Ӧ֯/·ʱӦʧ, + * Ϊ"̵Ѷƽ̨ʾӦʱ" */ +int NET_publish_response_wait(const char *cmd_id, int ok, const char *msg) +{ + if (g_net_tx_busy) { log_info("> NET: Ӧϱ (OTAæ)"); return -1; } + if (net_at_trylock() != 0) { log_info("> NET: Ӧϱ (AT æ)"); return -1; } + const char *text = msg ? msg : (ok ? "OK" : "command failed"); + int rc = 0; + if (s_backend == NET_BACKEND_4G) { + static char cmd[256]; + sprintf(cmd, "AT+MPUB=\\22/iot/data/up/%s\\22,0,0,\\22{\\22id\\22:\\22%s\\22,\\22code\\22:0,\\22message\\22:\\22%s\\22}\\22", + MqttInfoStr.ClientID, cmd_id, text); + if (catSendCmd(cmd, "OK", 2, 15) != 0) { + rc = -1; + log_warn("> NET: ָӦʧ(Ժ OK)"); + } + } else { + char json[200]; + snprintf(json, sizeof(json), + "{\"id\":\"%s\",\"code\":0,\"message\":\"%s\"}", cmd_id, text); + net_wifi_publish_up(json); + } + net_at_unlock(); + return rc; +} + /* ϱ汾ַ: ver ֶΣݼ FIRMWARE_VERSION_STRÿɹһΣ */ void NET_publish_version(const char *ver) { diff --git a/STM32F103_App1/HardWare/NETWORK/network.h b/STM32F103_App1/HardWare/NETWORK/network.h index e9edddf..ca3e9a7 100644 --- a/STM32F103_App1/HardWare/NETWORK/network.h +++ b/STM32F103_App1/HardWare/NETWORK/network.h @@ -56,6 +56,7 @@ void NET_esp_power(uint8_t on); /* WiFi ģ int NET_publish_status(int sw1, int feeding, int sw2, int sw3, int sw4, float weight_kg, float once_wt_kg, float zero_kg); /* 0=ѷ */ void NET_publish_response(const char *cmd_id, int ok, const char *msg); +int NET_publish_response_wait(const char *cmd_id, int ok, const char *msg); /* ģ OK+, ָӦר(ʧ); 0= -1=ʧ */ int NET_publish_power(int on); int NET_publish_power_wait(int on); /* ϵԤרãģ OK0= */ void NET_publish_version(const char *ver); /* ϱ汾ַ(FIRMWARE_VERSION_STR) */ /* 0=ѷ-1=ͨæ */ diff --git a/STM32F103_App1/HardWare/RELAY/ext_relay.c b/STM32F103_App1/HardWare/RELAY/ext_relay.c index 95692a8..b1d5c02 100644 --- a/STM32F103_App1/HardWare/RELAY/ext_relay.c +++ b/STM32F103_App1/HardWare/RELAY/ext_relay.c @@ -174,7 +174,7 @@ static void ext_note_fail(void) static void ext_respond(int ok, const char *msg) { if (cmd_id[0]) { - NET_publish_response(cmd_id, ok, msg); + NET_publish_response_wait(cmd_id, ok, msg); /* ģ OK+, Ӧʧ */ cmd_id[0] = 0; } } diff --git a/STM32F103_App1/HardWare/RELAY/relay.c b/STM32F103_App1/HardWare/RELAY/relay.c index b90dbc2..c438dce 100644 --- a/STM32F103_App1/HardWare/RELAY/relay.c +++ b/STM32F103_App1/HardWare/RELAY/relay.c @@ -40,23 +40,23 @@ void relayCmdProcess(void) if (MqttInfoStr.Relay_State[ch]) { if (relay_cmd_fb_before == FB_INACTIVE && fb_after == FB_ACTIVE) { log_info("> ̵: SW%d ", ch); - NET_publish_response(relay_cmd_id, 1, "OK"); + NET_publish_response_wait(relay_cmd_id, 1, "OK"); } else { log_warn("> ̵: SW%d δӸػ̵Ͽ", ch); - NET_publish_response(relay_cmd_id, 0, failmsg); + NET_publish_response_wait(relay_cmd_id, 0, failmsg); } } else { if (relay_cmd_fb_before == FB_ACTIVE && fb_after == FB_INACTIVE) { log_info("> ̵: SW%d ", ch); - NET_publish_response(relay_cmd_id, 1, "OK"); + NET_publish_response_wait(relay_cmd_id, 1, "OK"); } else { log_warn("> ̵: SW%d δӸػ̵Ͽ", ch); - NET_publish_response(relay_cmd_id, 0, failmsg); + NET_publish_response_wait(relay_cmd_id, 0, failmsg); } } } else { log_info("> ̵: SW%d ", ch); - NET_publish_response(relay_cmd_id, 1, "OK"); + NET_publish_response_wait(relay_cmd_id, 1, "OK"); } /* ο APP1: Ӧϱһȫ״̬, ƽ̨ˢ¿״̬ */ relayStatueUpdata(); diff --git a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx index 21ae48c..0f099a4 100644 --- a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx +++ b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx @@ -316,7 +316,7 @@ Middlewares/FreeRTOS - 0 + 1 0 0 0 @@ -389,7 +389,7 @@ Drivers/STM32F1xx_HAL_Driver - 0 + 1 0 0 0 @@ -605,7 +605,7 @@ Drivers/CMSIS - 0 + 1 0 0 0 @@ -626,7 +626,7 @@ m_app - 0 + 1 0 0 0 @@ -963,6 +963,19 @@ 0 0 + + 7 + 53 + 1 + 0 + 0 + 0 + 0 + ..\HardWare\OLED\qrcodegen.c + qrcodegen.c + 0 + 0 + @@ -973,7 +986,7 @@ 0 8 - 53 + 54 5 0 0 diff --git a/版本说明.md b/版本说明.md index 90fe207..7c46d66 100644 --- a/版本说明.md +++ b/版本说明.md @@ -21,6 +21,10 @@ 控制命令改三段式:FC03 预读(判定在线 + 快照命令前反馈)→ FC05 → 150ms → FC03 校验跳变; 命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复; 断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发) +- **指令应答改可靠发送**(修复"继电器已动作但平台响应超时"):新增 `NET_publish_response_wait()`, + 4G 通道等模组回 OK(~1.5s/次,重试 2 次,仍失败打 WARN);继电器反馈应答(板载 relayCmdProcess 3 处+ + 扩展板 ext_respond)全部换用。原因:普通版 NET_publish_response 发完就走不等 OK,UART 应答交织/ + 链路半死时应答丢失。注意排查时踩过 `` 被写成 0x12 的坑(C 源码必须是 `\22`) - **开机二维码页**:已配置身份的设备开机后 OLED 显示 10s 二维码——内容为设备 ClientID (`MqttInfoStr.ClientID`,不是产品 ID/密码),左侧 QR 白底暗码(Nayuki qrcodegen,MIT,V1~V3 自动/ECC-L/2px 模块), 右侧 x=64 起分行显示 ID 文本;10s 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖;