雷鸟47版本需要携带修改提交 3378/1
authorhcj <1224667075@qq.com>
Mon, 27 Apr 2026 12:43:24 +0000 (20:43 +0800)
committerhcj <1224667075@qq.com>
Mon, 27 Apr 2026 12:43:24 +0000 (20:43 +0800)
code/sdk/zhihui/4g/cat1Service/Service/cat1_runtime.c
code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c
code/sdk/zhihui/4g/cat1Service/include/cat1_runtime.h
code/sdk/zhihui/4gTest/cat1_porting.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_token.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index 1be77e3..361f5ad 100644 (file)
@@ -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;
+}
index 0cece84..c11b297 100644 (file)
@@ -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)
                 {
index b2fa702..512ad92 100644 (file)
@@ -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
 }
index 4eea17f..b6d9792 100644 (file)
@@ -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");
index 54ad3ea..a3d51f2 100644 (file)
@@ -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)
     {
index 8f8ecf6..bcfd569 100644 (file)
@@ -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");
index 042a284..7978e09 100644 (file)
@@ -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);