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); /* 断电预警专用:等模组 OK,0=已受理 */ 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 @@ 鎺у埗鍛戒护鏀逛笁娈靛紡锛欶C03 棰勮锛堝垽瀹氬湪绾 + 蹇収鍛戒护鍓嶅弽棣堬級鈫 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锛孶ART 搴旂瓟浜ょ粐/ + 閾捐矾鍗婃鏃跺簲绛斾涪澶便傛敞鎰忔帓鏌ユ椂韪╄繃 `` 琚啓鎴 0x12 鐨勫潙锛圕 婧愮爜蹇呴』鏄 `\22`锛 - **寮鏈轰簩缁寸爜椤**锛氬凡閰嶇疆韬唤鐨勮澶囧紑鏈哄悗 OLED 鏄剧ず 10s 浜岀淮鐮佲斺斿唴瀹逛负璁惧 ClientID 锛坄MqttInfoStr.ClientID`锛屼笉鏄骇鍝 ID/瀵嗙爜锛夛紝宸︿晶 QR 鐧藉簳鏆楃爜锛圢ayuki qrcodegen锛孧IT锛孷1~V3 鑷姩/ECC-L/2px 妯″潡锛夛紝 鍙充晶 x=64 璧峰垎琛屾樉绀 ID 鏂囨湰锛10s 鍚庤嚜鍔ㄥ垏鍥炴甯哥晫闈紝鏈熼棿鎶戝埗棰勮皟搴﹀懆鏈熷埛鏂伴槻姝㈣鐩栵紱