From 5f6b2670d63a134954399459925cb1a9cfec82d8 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Mon, 27 Apr 2026 20:43:24 +0800 Subject: [PATCH] =?utf8?q?=E9=9B=B7=E9=B8=9F47=E7=89=88=E6=9C=AC=E9=9C=80?= =?utf8?q?=E8=A6=81=E6=90=BA=E5=B8=A6=E4=BF=AE=E6=94=B9=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../4g/cat1Service/Service/cat1_runtime.c | 13 ++++++ .../4g/cat1Service/Service/cat1_server.c | 3 +- .../4g/cat1Service/include/cat1_runtime.h | 3 ++ code/sdk/zhihui/4gTest/cat1_porting.c | 13 +++++- code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c | 42 +++++++++++++++++++ .../sdk/zhihui/leiniao/imsl_ln/ln_api_token.c | 8 +++- .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 20 ++++++++- 7 files changed, 97 insertions(+), 5 deletions(-) diff --git a/code/sdk/zhihui/4g/cat1Service/Service/cat1_runtime.c b/code/sdk/zhihui/4g/cat1Service/Service/cat1_runtime.c index 1be77e3cf..361f5ada9 100644 --- a/code/sdk/zhihui/4g/cat1Service/Service/cat1_runtime.c +++ b/code/sdk/zhihui/4g/cat1Service/Service/cat1_runtime.c @@ -33,6 +33,7 @@ typedef struct char pyVer[32] ; char iccid[32] ; char modemVer[64] ; + char old_imei[32] ; }cat1_runtime_status_t; @@ -209,3 +210,15 @@ char* cat1_api_runtime_get_cat1_modemver(void) { return (char*)g_runtime.modemVer; } + +void cat1_api_runtime_set_cat1_old_imei(char* old_imei) +{ + if (old_imei == NULL) return; + int len=strlen(old_imei); + memset_s(g_runtime.old_imei,sizeof(g_runtime.old_imei),0,sizeof(g_runtime.old_imei)); + memcpy_s(g_runtime.old_imei,sizeof(g_runtime.old_imei),old_imei,len); +} +char* cat1_api_runtime_get_cat1_old_imei(void) +{ + return (char*)g_runtime.old_imei; +} diff --git a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c index 0cece84ea..c11b297d0 100644 --- a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c +++ b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c @@ -128,7 +128,7 @@ enum UDP_COMMAND_HEAD { void udp_send_msg_toCat1(uint8_t cmd,char *content); /** 0: old format 1字节cmd, 1: new format 2字节cmd */ -static uint8_t g_msg_format_type = 0; +static uint8_t g_msg_format_type = 1; // void watch_replay_cat1_ANSWER(void); void cat1_get_DEV_ID(void); @@ -1768,6 +1768,7 @@ static int udp_packet_parse(char *rx_buffer, int len) cat1_print_info("IMEI received, sending AT+ICCID command\n"); cat1_at_cmd("AT+ICCID"); + cat1_at_cmd("AT+CGSN"); if (g_msg_callback_func!=NULL) { diff --git a/code/sdk/zhihui/4g/cat1Service/include/cat1_runtime.h b/code/sdk/zhihui/4g/cat1Service/include/cat1_runtime.h index b2fa702d4..512ad9223 100644 --- a/code/sdk/zhihui/4g/cat1Service/include/cat1_runtime.h +++ b/code/sdk/zhihui/4g/cat1Service/include/cat1_runtime.h @@ -69,6 +69,9 @@ char* cat1_api_runtime_get_cat1_pyver(void); void cat1_api_runtime_set_cat1_modemver(char* cat1_operator); char* cat1_api_runtime_get_cat1_modemver(void); +void cat1_api_runtime_set_cat1_old_imei(char* old_imei); +char* cat1_api_runtime_get_cat1_old_imei(void); + #ifdef __cplusplus } diff --git a/code/sdk/zhihui/4gTest/cat1_porting.c b/code/sdk/zhihui/4gTest/cat1_porting.c index 4eea17fc4..b6d9792dc 100644 --- a/code/sdk/zhihui/4gTest/cat1_porting.c +++ b/code/sdk/zhihui/4gTest/cat1_porting.c @@ -317,7 +317,7 @@ errcode_t cat1_msg_callback(MESSAGE_4G_T msg, void *msg_buf, uint16_t msglen) cat1_print_warning("MESSAGE_4G_SMS_RECEIVED %s",msg_buf); break; case MESSAGE_4G_AT_RECEIVED: //返回值为字符串 - cat1_print_warning("MESSAGE_4G_AT_RECEIVED %s",msg_buf); + cat1_print_warning("MESSAGE_4G_AT_RECEIVED %s %d",msg_buf, strlen(msg_buf)); if(strlen(msg_buf) == 28 && strncmp(msg_buf, "+ICCID: ", 8) == 0) { char iccid_buffer[21] = {0}; @@ -325,6 +325,17 @@ errcode_t cat1_msg_callback(MESSAGE_4G_T msg, void *msg_buf, uint16_t msglen) cat1_api_runtime_set_cat1_iccid(iccid_buffer); cat1_print_warning("ICCID extracted and set: %s", iccid_buffer); } + // MESSAGE_4G_AT_RECEIVED "867998086764203" + else if(strstr(msg_buf, "867") != NULL) + { + char old_imei_buffer[16] = {0}; + // strncpy(old_imei_buffer, msg_buf + 3, 12); + // strstr(msg_buf, "867"); + char *pos = strstr(msg_buf, "867"); + strncpy(old_imei_buffer, pos, 15); + cat1_api_runtime_set_cat1_old_imei(old_imei_buffer); + cat1_print_warning("OLD_IMEI extracted and set: %s", old_imei_buffer); + } break; case MESSAGE_4G_TIME_SYNCED: //无参数 cat1_print_warning("MESSAGE_4G_TIME_SYNCED"); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c index 54ad3ea4f..a3d51f20c 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c @@ -13,6 +13,9 @@ #endif #include "cat1_pub_api.h" /* 包含 uapi_get_py_ver() 函数声明 */ +// static int ln_ota_reject_1047_if_not_py34(const char *target); + + /* OTA下载状态枚举(对应时序图中的下载阶段)*/ typedef enum { @@ -162,11 +165,47 @@ static void ln_ota_handle_download_msg(const OtaDownloadMsg *msg) } } +/* 目标版本为 1.0.47(可带 V 前缀、日期后缀如 1.0.47_20260427) */ +static int ln_ota_target_is_1047(const char *target) +{ + if (!target || target[0] == '\0') { + return 0; + } + if (strcmp(target, "1.0.47") == 0 || strcmp(target, "V1.0.47") == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA] target is 1.0.47 %s", target); + return 1; + } + if (strncmp(target, "1.0.47", 6) == 0 && (target[6] == '\0' || target[6] == '_')) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA] target is 1.0.47 %s", target); + return 1; + } + if (strncmp(target, "V1.0.47", 7) == 0 && (target[7] == '\0' || target[7] == '_')) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA] target is 1.0.47 %s", target); + return 1; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA] target is not 1.0.47 %s", target); + return 0; +} + +/* 1.0.47 仅当 Cat1 已先升到 Py 版 34 后才允许,否则需先走 Py 升级再继续 */ +static int ln_ota_reject_1047_if_not_py34(const char *target) +{ + return ln_ota_target_is_1047(target) && (uapi_get_py_ver() != 34); +} //解析 OTA 任务 JSON,决定是否触发下载 static void ln_handle_ota_task_response(const char *json_buf, int json_len) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析OTA升级任务JSON"); + if (ln_ota_reject_1047_if_not_py34(uapi_ln_get_device_version())) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA] task rejected: 1.0.47 requires py version 34 first, current=%u", + (unsigned int)uapi_get_py_ver()); + return; + } + + + if (!json_buf || json_len <= 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA] handle ota task: invalid json"); @@ -397,6 +436,8 @@ void ln_parse_device_upgrade(const char *json_buf, int json_len) return; } + + /* 兼容 updateType 为数字或字符串的两种情况 */ int ut = -1; if (cJSON_IsNumber(updateType)) ut = (int)updateType->valuedouble; @@ -1249,6 +1290,7 @@ static void ln_handle_ota_task_response_CAT1(const char *json_buf, int json_len, { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "解析OTA升级任务JSON"); + // 入参校验:url为空时直接返回(避免空指针赋值) if (!url) { diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_token.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_token.c index 8f8ecf64a..bcfd56931 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_token.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_token.c @@ -256,7 +256,11 @@ uint32_t ln_get_device_token_http(const char *device_id, free(sign_data); return ERRCODE_FAIL; } + char old_device_id[32] = {0}; + // uapi_ln_get_device_id(old_device_id, sizeof(old_device_id)); + strcpy(old_device_id, cat1_api_runtime_get_cat1_old_imei()); + printf("old_device_id: %s\n", old_device_id); /* 3. 组织自定义请求头 */ char *header_buf = (char *)malloc(1024); if (!header_buf) @@ -272,10 +276,12 @@ uint32_t ln_get_device_token_http(const char *device_id, "signature: %s\r\n" "deviceModel: %s\r\n" "deviceVersion: %s\r\n" + "oldDeviceId: %s\r\n" "Content-Type: application/json\r\n", device_id, device_iccid, timestamp, nonce, signature, (device_model && device_model[0]) ? device_model : "AB101", - (device_version && device_version[0]) ? device_version : "1.0.0"); + (device_version && device_version[0]) ? device_version : "1.0.0", + old_device_id); if (hdr_len <= 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ln_get_device_token_http: header build failed"); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c index 042a284b9..7978e095a 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -796,7 +796,7 @@ int ln_ws_send_audio_data(const uint8_t *audio_data, uint32_t audio_size, bool f cJSON_AddBoolToObject(data_obj, "finished", finished); if (ln_http_download_is_initialized() && g_audio_chat_command_type == LN_AUDIO_CHAT_CHOOSE_STORY_REQUEST ) { - cJSON_AddBoolToObject(data_obj, "returnBytes", false); + cJSON_AddBoolToObject(data_obj, "returnBytes", false); } cJSON_AddItemToObject(json, "data", data_obj); @@ -1583,6 +1583,14 @@ void ln_ws_audio_init(bool is_vad_server_enabled) uapi_ws_wake_keep(1); LN_WS_INFO("Audio initialization completed successfully\n"); + + errcode_t err = uapi_pm_request_mode(PM_ID_SPI, PM_MODE_PERFORMACE); + if (err != ERRCODE_SUCC) { + LN_WS_ERROR("Failed to request PM mode: %d\n", err); + } + else { + LN_WS_INFO("Requested PM mode successfully\n"); + } #if ENABLE_VAD_SERVER if (is_vad_server_enabled) { @@ -1634,6 +1642,14 @@ void ln_ws_audio_deinit(void) StopAIVoice(); + errcode_t err = uapi_pm_request_mode(PM_ID_SPI, PM_MODE_NORMAL); + if (err != ERRCODE_SUCC) { + LN_WS_ERROR("Failed to request PM mode: %d\n", err); + } + else { + LN_WS_INFO("Requested PM mode successfully\n"); + } + #ifdef SUPPORT_CAT1_SERVICE cat1_api_keep_wakeup(0); cat1_api_wakeup_cat1(0); @@ -3750,7 +3766,7 @@ static int ln_ws_send_audio_data_direct(const uint8_t *audio_data, uint32_t audi cJSON_AddBoolToObject(data_obj, "finished", finished); if (ln_http_download_is_initialized() && g_audio_chat_command_type == LN_AUDIO_CHAT_CHOOSE_STORY_REQUEST ) { - cJSON_AddBoolToObject(data_obj, "returnBytes", false); + cJSON_AddBoolToObject(data_obj, "returnBytes", false); } cJSON_AddItemToObject(json, "data", data_obj); -- 2.17.1