diff --git a/V1.5/STM32F103_App1/HardWare/CAR/air780e.c b/V1.5/STM32F103_App1/HardWare/CAR/air780e.c index b24b56e..7b3d37b 100644 --- a/V1.5/STM32F103_App1/HardWare/CAR/air780e.c +++ b/V1.5/STM32F103_App1/HardWare/CAR/air780e.c @@ -750,7 +750,7 @@ static void air780e_trigger_ota_body(const char *host, int port, const char *pat air780e_mqtt_result_nowait("iot.ota.result.post", ota_id, 1); bg_delay(1000); /* 给模组一点发送时间即复位(权威通知由重启后的 confirm.post 承担) */ /* 只把固件信息写入 W25Q64,版本号在 APP 确认成功后再写入 EEPROM */ - W25Q64_OTA_SetNewInfo(new_ver, file_size, crc16, ota_id); + W25Q64_OTA_SetNewInfo(new_ver, file_size, crc16); reset_log_mark(RSN_OTA_UPDATE); bg_delay(100); NVIC_SystemReset(); } @@ -777,11 +777,20 @@ int air780e_ota_confirm(void) else log_error("> OTA 确认写入失败(已重试 3 次)"); } - /* 重启后的新鲜可靠连接上,先补发 result.post(带平台任务 id,驱动"完成"标志), - * 再发 confirm.post(防回滚确认)。下载完成时发的那条 result 在 OTA 会话上不可靠 */ + /* 重启后的新鲜可靠连接上,先补发 result.post(带平台任务 id,驱动"完成"标志)。 + * 任务 id 存在 EEPROM(175~194)(下载开始时由网络层写入),发送成功后清回 0xFF */ int rc = 0; - if (info.ota_id[0]) { - rc |= NET_mqtt_report("iot.ota.result.post", info.ota_id, 1); + { + char oid[20]; + eepromReadData(175, oid, sizeof(oid)); + if ((uint8_t)oid[0] != 0xFF && oid[0] != 0) { + oid[19] = 0; + rc |= NET_mqtt_report("iot.ota.result.post", oid, 1); + if (rc == 0) { + memset(oid, 0xFF, sizeof(oid)); + eepromWriteData(175, oid, sizeof(oid)); /* 已送达,清除防止重复 */ + } + } } /* 再向服务器上报"确认成功"(走网络层路由,4G/WiFi 通道均可) */ char id_buf[24] = {0}; diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/net_wifi_ota.c b/V1.5/STM32F103_App1/HardWare/NETWORK/net_wifi_ota.c index ebf29fc..eceb665 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/net_wifi_ota.c +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/net_wifi_ota.c @@ -267,7 +267,7 @@ void net_wifi_ota(const char *host, int port, const char *path, log_info("* 正在重启进入 BootLoader... *"); log_info("**************************************"); /* 只把固件信息写入 W25Q64,版本号在 APP 确认成功后再写入 EEPROM */ - W25Q64_OTA_SetNewInfo(new_ver, file_size, crc16, ota_id); + W25Q64_OTA_SetNewInfo(new_ver, file_size, crc16); reset_log_mark(RSN_OTA_UPDATE); bg_delay(100); NVIC_SystemReset(); diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c index a2d27c8..9f1ddd7 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c @@ -52,6 +52,8 @@ static void esp_power(uint8_t on) volatile net_ui_phase_t g_net_ui_phase = NET_UI_NONE; volatile int g_net_ui_countdown = 0; +#define OTA_ID_EEP_ADDR 175 /* EEPROM 175~194:OTA 平台任务 id(确认后清 0xFF) */ + static net_backend_t s_backend = NET_BACKEND_4G; /* 上次成功联网方式(EEPROM 偏移 130,秤参数占用到 126,避开) */ @@ -451,6 +453,14 @@ void net_dispatch_message(const char *msg) else strncpy(host,p,sizeof(host)-1); }} log_info("> OTA: %s:%d%s", host, port, path); + /* 平台任务 id 存 EEPROM(偏移 175):重启确认时补发 result.post 用。 + * 注意:故意不用 W25Q64 OTA 信息结构(它 BL/APP 共享,改结构要重刷 BL, + * 现场设备无法远程刷 BL),EEPROM 是 APP 私有的 */ + if (ota_id[0]) { + char id20[20] = {0}; + strncpy(id20, ota_id, sizeof(id20) - 1); + eepromWriteData(OTA_ID_EEP_ADDR, id20, sizeof(id20)); + } /* 两条通道共用 W25Q64 双槽 + CRC + BootLoader 回退体系,仅下载传输不同 */ if (s_backend == NET_BACKEND_WIFI) { net_wifi_ota(host, port, path, ota_id, new_ver, crc16); diff --git a/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.c b/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.c index a5df2dd..dffe714 100644 --- a/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.c +++ b/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.c @@ -312,7 +312,7 @@ int W25Q64_OTA_WriteInfo(const W25Q64_OtaInfo *info) return 0; } -int W25Q64_OTA_SetNewInfo(uint16_t version, uint32_t size, uint16_t crc16, const char *ota_id) +int W25Q64_OTA_SetNewInfo(uint16_t version, uint32_t size, uint16_t crc16) { int ret; storage_lock(); @@ -330,8 +330,6 @@ int W25Q64_OTA_SetNewInfo(uint16_t version, uint32_t size, uint16_t crc16, const info.boot_trial_count = 0; info.app_confirmed = 0; info.backup_valid = 0; /* 新下载后,下一次更新需要重新备份当前 APP */ - memset(info.ota_id, 0, sizeof(info.ota_id)); - if (ota_id) strncpy(info.ota_id, ota_id, sizeof(info.ota_id) - 1); /* 平台任务 id,重启后补发结果用 */ ret = W25Q64_OTA_WriteInfo(&info); storage_unlock(); return ret; diff --git a/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.h b/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.h index b91842c..6163454 100644 --- a/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.h +++ b/V1.5/STM32F103_App1/HardWare/W25Q64/w25q64.h @@ -71,7 +71,6 @@ typedef struct { uint16_t backup_crc16; /* 备份固件 CRC16 */ uint8_t backup_valid; /* 槽 A 备份是否有效 */ uint8_t reserved2; - char ota_id[20]; /* 平台 OTA 任务 id(重启后补发 result.post 用) */ uint16_t checksum; /* 前面所有字节累加和 */ } W25Q64_OtaInfo; #pragma pack(pop) @@ -95,7 +94,7 @@ int W25Q64_Verify(uint32_t addr, const uint8_t *data, uint32_t len); /* OTA 专用信息区操作 */ int W25Q64_OTA_ReadInfo(W25Q64_OtaInfo *info); int W25Q64_OTA_WriteInfo(const W25Q64_OtaInfo *info); -int W25Q64_OTA_SetNewInfo(uint16_t version, uint32_t size, uint16_t crc16, const char *ota_id); +int W25Q64_OTA_SetNewInfo(uint16_t version, uint32_t size, uint16_t crc16); int W25Q64_OTA_SetBackupInfo(uint32_t size, uint16_t crc16); int W25Q64_OTA_ClearNew(void); int W25Q64_OTA_SetState(uint8_t state); diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index 05bcb4f..db15203 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -328,6 +328,7 @@ W25Q64 澶栭儴 Flash锛8MB锛夛細 | 164~171 | 8B | HLW8032 绱鑴夊啿鏁帮紙uint64锛屾瘡鏀 0.1kWh + 鏂數鍓嶅啓鍏ワ級 | | 172 | 1B | 浜у搧妯″紡锛0=鍥涜矾缁х數鍣(鏃犵Г)锛1=绉伴噸鎶曟枡(甯︾Г)锛岀┖鐧芥椂鐢 main.h 瀹忛粯璁ゅ硷紙钃濈墮 SCALE0/SCALE1 鍒囨崲锛 | | 173 | 1B | GPS 瀹氫綅寮鍏筹細0=鍏筹紝1=寮锛岀┖鐧芥椂鐢 main.h 瀹忛粯璁ゅ硷紙钃濈墮 GPS0/GPS1 鍒囨崲锛岄噸鍚敓鏁堬級 | +| 175~194 | 20B | OTA 骞冲彴浠诲姟 id锛堜笅杞藉紑濮嬫椂鍐欏叆锛岄噸鍚‘璁よˉ鍙 result.post 鎴愬姛鍚庢竻 0xFF锛 | | 250 | 1B | 鎺㈡祴瀛楄妭锛堜笂鐢靛啓 0xA5 鍥炶锛岄獙璇 I2C 閫氫俊锛 | > 娉ㄦ剰锛氭敼 `MqttInfo_Str` 缁撴瀯浣撲細鏀瑰彉涓婅堪鍋忕Щ锛岀Г鍙傛暟锛120+锛夊拰鑱旂綉鏂瑰紡锛130锛夊湪 diff --git a/V1.5/STM32F103_BootLoader/HardWare/W25Q64/w25q64.h b/V1.5/STM32F103_BootLoader/HardWare/W25Q64/w25q64.h index 4082fe8..111e6e6 100644 --- a/V1.5/STM32F103_BootLoader/HardWare/W25Q64/w25q64.h +++ b/V1.5/STM32F103_BootLoader/HardWare/W25Q64/w25q64.h @@ -75,7 +75,6 @@ typedef struct { uint16_t backup_crc16; /* 备份固件 CRC16 */ uint8_t backup_valid; /* 槽 A 备份是否有效 */ uint8_t reserved2; - char ota_id[20]; /* 平台 OTA 任务 id(重启后补发 result.post 用) */ uint16_t checksum; /* 前面所有字节累加和 */ } W25Q64_OtaInfo; #pragma pack(pop) diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index 364ab19..b12796b 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -159,3 +159,6 @@ 鍦ㄥ彲闈犺繛鎺ヤ笂琛ュ彂 result.post(success=1, 浠诲姟id) + confirm.post鈥斺斿钩鍙"瀹屾垚"鏍囧織鍙甯搁棴鐜 - 娉ㄦ剰锛歄TA 淇℃伅缁撴瀯鍙樺寲锛孊ootLoader 鐨 w25q64.h 宸插悓姝ワ紝**闇 J-Link 鍒蜂竴娆℃柊 BL** 锛堟棫 BL 璇讳笉浜嗘柊鏍煎紡锛屼細璁や笉鍑哄緟瀹夎鍥轰欢锛 +- OTA 闂幆锛堝吋瀹圭増锛夛細鍥為 W25Q64 缁撴瀯鏀瑰姩锛圔L/APP 鍏变韩缁撴瀯涓嶈兘鍔紝鐜板満鏃犳硶鍒 BL锛夛紝 + 骞冲彴浠诲姟 id 鏀瑰瓨 APP 绉佹湁 EEPROM(175~194)锛屾柊鍥轰欢棣栧惎纭鏃跺湪鍙潬杩炴帴涓婅ˉ鍙 + result.post(success=1, 浠诲姟id) + confirm.post锛岄佽揪鍚庢竻鍥 0xFF