指令应答可靠化:新增NET_publish_response_wait(等OK+重试2次),继电器/扩展板反馈应答换用,修复动作了但平台响应超时

This commit is contained in:
helei 2026-09-14 10:23:05 +08:00
parent ed955fca03
commit 3cdaba312f
6 changed files with 56 additions and 11 deletions

View File

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

View File

@ -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=通道忙被丢弃 */

View File

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

View File

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

View File

@ -316,7 +316,7 @@
<Group>
<GroupName>Middlewares/FreeRTOS</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -389,7 +389,7 @@
<Group>
<GroupName>Drivers/STM32F1xx_HAL_Driver</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -605,7 +605,7 @@
<Group>
<GroupName>Drivers/CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -626,7 +626,7 @@
<Group>
<GroupName>m_app</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -963,6 +963,19 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\HardWare\OLED\qrcodegen.c</PathWithFileName>
<FilenameWithoutPath>qrcodegen.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -973,7 +986,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>54</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>

View File

@ -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 发完就走不等 OKUART 应答交织/
链路半死时应答丢失。注意排查时踩过 `` 被写成 0x12 的坑C 源码必须是 `\22`
- **开机二维码页**:已配置身份的设备开机后 OLED 显示 10s 二维码——内容为设备 ClientID
`MqttInfoStr.ClientID`,不是产品 ID/密码),左侧 QR 白底暗码Nayuki qrcodegenMITV1~V3 自动/ECC-L/2px 模块),
右侧 x=64 起分行显示 ID 文本10s 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖;