指令应答可靠化:新增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();
|
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(每次联网成功报一次) */
|
/* 上报代码版本字符串: ver 字段,内容即 FIRMWARE_VERSION_STR(每次联网成功报一次) */
|
||||||
void NET_publish_version(const char *ver)
|
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,
|
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=已发出 */
|
float weight_kg, float once_wt_kg, float zero_kg); /* 返回 0=已发出 */
|
||||||
void NET_publish_response(const char *cmd_id, int ok, const char *msg);
|
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(int on);
|
||||||
int NET_publish_power_wait(int on); /* 断电预警专用:等模组 OK,0=已受理 */
|
int NET_publish_power_wait(int on); /* 断电预警专用:等模组 OK,0=已受理 */
|
||||||
void NET_publish_version(const char *ver); /* 上报代码版本字符串(FIRMWARE_VERSION_STR) */ /* 返回 0=已发出,-1=通道忙被丢弃 */
|
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)
|
static void ext_respond(int ok, const char *msg)
|
||||||
{
|
{
|
||||||
if (cmd_id[0]) {
|
if (cmd_id[0]) {
|
||||||
NET_publish_response(cmd_id, ok, msg);
|
NET_publish_response_wait(cmd_id, ok, msg); /* µÈÄ£×é OK+ÖØÊÔ, ·ÀÓ¦´ð¶ªÊ§ */
|
||||||
cmd_id[0] = 0;
|
cmd_id[0] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,23 +40,23 @@ void relayCmdProcess(void)
|
||||||
if (MqttInfoStr.Relay_State[ch]) {
|
if (MqttInfoStr.Relay_State[ch]) {
|
||||||
if (relay_cmd_fb_before == FB_INACTIVE && fb_after == FB_ACTIVE) {
|
if (relay_cmd_fb_before == FB_INACTIVE && fb_after == FB_ACTIVE) {
|
||||||
log_info("> 继电器: SW%d 动作正常", ch);
|
log_info("> 继电器: SW%d 动作正常", ch);
|
||||||
NET_publish_response(relay_cmd_id, 1, "OK");
|
NET_publish_response_wait(relay_cmd_id, 1, "OK");
|
||||||
} else {
|
} else {
|
||||||
log_warn("> 继电器: SW%d 未接负载或继电器断开", ch);
|
log_warn("> 继电器: SW%d 未接负载或继电器断开", ch);
|
||||||
NET_publish_response(relay_cmd_id, 0, failmsg);
|
NET_publish_response_wait(relay_cmd_id, 0, failmsg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (relay_cmd_fb_before == FB_ACTIVE && fb_after == FB_INACTIVE) {
|
if (relay_cmd_fb_before == FB_ACTIVE && fb_after == FB_INACTIVE) {
|
||||||
log_info("> 继电器: SW%d 动作正常", ch);
|
log_info("> 继电器: SW%d 动作正常", ch);
|
||||||
NET_publish_response(relay_cmd_id, 1, "OK");
|
NET_publish_response_wait(relay_cmd_id, 1, "OK");
|
||||||
} else {
|
} else {
|
||||||
log_warn("> 继电器: SW%d 未接负载或继电器断开", ch);
|
log_warn("> 继电器: SW%d 未接负载或继电器断开", ch);
|
||||||
NET_publish_response(relay_cmd_id, 0, failmsg);
|
NET_publish_response_wait(relay_cmd_id, 0, failmsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log_info("> 继电器: SW%d 动作正常", ch);
|
log_info("> 继电器: SW%d 动作正常", ch);
|
||||||
NET_publish_response(relay_cmd_id, 1, "OK");
|
NET_publish_response_wait(relay_cmd_id, 1, "OK");
|
||||||
}
|
}
|
||||||
/* 参考 APP1: 命令响应后立即上报一次全状态, 让平台刷新开关状态 */
|
/* 参考 APP1: 命令响应后立即上报一次全状态, 让平台刷新开关状态 */
|
||||||
relayStatueUpdata();
|
relayStatueUpdata();
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>Middlewares/FreeRTOS</GroupName>
|
<GroupName>Middlewares/FreeRTOS</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|
@ -389,7 +389,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>Drivers/STM32F1xx_HAL_Driver</GroupName>
|
<GroupName>Drivers/STM32F1xx_HAL_Driver</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|
@ -605,7 +605,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>Drivers/CMSIS</GroupName>
|
<GroupName>Drivers/CMSIS</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|
@ -626,7 +626,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>m_app</GroupName>
|
<GroupName>m_app</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|
@ -963,6 +963,19 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</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>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
|
|
@ -973,7 +986,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>53</FileNumber>
|
<FileNumber>54</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<Focus>0</Focus>
|
<Focus>0</Focus>
|
||||||
|
|
|
||||||
4
版本说明.md
4
版本说明.md
|
|
@ -21,6 +21,10 @@
|
||||||
控制命令改三段式:FC03 预读(判定在线 + 快照命令前反馈)→ FC05 → 150ms → FC03 校验跳变;
|
控制命令改三段式:FC03 预读(判定在线 + 快照命令前反馈)→ FC05 → 150ms → FC03 校验跳变;
|
||||||
命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复;
|
命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复;
|
||||||
断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发)
|
断电恢复触发点不变(离线→上线比对 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
|
- **开机二维码页**:已配置身份的设备开机后 OLED 显示 10s 二维码——内容为设备 ClientID
|
||||||
(`MqttInfoStr.ClientID`,不是产品 ID/密码),左侧 QR 白底暗码(Nayuki qrcodegen,MIT,V1~V3 自动/ECC-L/2px 模块),
|
(`MqttInfoStr.ClientID`,不是产品 ID/密码),左侧 QR 白底暗码(Nayuki qrcodegen,MIT,V1~V3 自动/ECC-L/2px 模块),
|
||||||
右侧 x=64 起分行显示 ID 文本;10s 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖;
|
右侧 x=64 起分行显示 ID 文本;10s 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue