char pyVer[32] ;
char iccid[32] ;
char modemVer[64] ;
+ char old_imei[32] ;
}cat1_runtime_status_t;
{
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;
+}
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);
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)
{
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
}
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};
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");
#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
{
}
}
+/* 目标版本为 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");
return;
}
+
+
/* 兼容 updateType 为数字或字符串的两种情况 */
int ut = -1;
if (cJSON_IsNumber(updateType)) ut = (int)updateType->valuedouble;
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "解析OTA升级任务JSON");
+
// 入参校验:url为空时直接返回(避免空指针赋值)
if (!url)
{
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)
"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");
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);
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) {
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);
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);