指令应答可靠化:新增NET_publish_response_wait(等OK+重试2次),继电器/扩展板反馈应答换用,修复动作了但平台响应超时
This commit is contained in:
parent
ed955fca03
commit
3cdaba312f
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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=通道忙被丢弃 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
4
版本说明.md
4
版本说明.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 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖;
|
||||
|
|
|
|||
Loading…
Reference in New Issue