From 3e2752d68ef0ac44242950993ee6da190588ffdf Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 25 Sep 2025 12:21:19 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BE=E5=A4=87id=E5=92=8Ci?= =?utf8?q?ccid=E6=8C=81=E4=B9=85=E5=8C=96=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../zhihui/leiniao/imsl_ln/leiniao_api_at.c | 53 ++++++++++- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 91 +++++++++++++++++-- code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 3 + 3 files changed, 137 insertions(+), 10 deletions(-) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c index 8cf926131..b511f4a4f 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c @@ -1303,7 +1303,50 @@ static uint32_t ln_character_config_change_at(uint8_t *para, uint32_t paraLen, c free(json); return ERRCODE_SUCC; } - +/* AT^LN_GET_DEVICE_ID */ +static uint32_t ln_get_device_id_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + printf("[LN][GET_DEVICE_ID]\n"); + const char *deviceId = uapi_ln_get_device_id(); + printf("deviceId: %s\n", deviceId); + return ERRCODE_SUCC; +} +/* AT^LN_GET_DEVICE_ICCID */ +static uint32_t ln_get_device_iccid_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + printf("[LN][GET_DEVICE_ICCID]\n"); + const char *deviceIccid = uapi_ln_get_device_iccid(); + printf("deviceIccid: %s\n", deviceIccid); + return ERRCODE_SUCC; +} +/* AT^LN_GET_DEVICE_MODEL */ +static uint32_t ln_get_device_model_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + printf("[LN][GET_DEVICE_MODEL]\n"); + const char *deviceModel = uapi_ln_get_device_model(); + printf("deviceModel: %s\n", deviceModel); + return ERRCODE_SUCC; +} +/* AT^LN_GET_DEVICE_VERSION */ +static uint32_t ln_get_device_version_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + printf("[LN][GET_DEVICE_VERSION]\n"); + const char *deviceVersion = uapi_ln_get_device_version(); + printf("deviceVersion: %s\n", deviceVersion); + return ERRCODE_SUCC; +} static const at_cmd_table_t g_ln_api_cmd[] = { /* ----------------------------------- VAD ---------------------------------- */ {(char *)"AT^VAD_INIT", vad_init, (char *)"初始化 VAD"}, @@ -1361,6 +1404,14 @@ static const at_cmd_table_t g_ln_api_cmd[] = { /* 内存查看相关AT命令 */ {(char *)"AT^LN_MEMORY_INFO", ln_memory_info_at, (char *)"查看系统内存信息: AT^LN_MEMORY_INFO"}, {(char *)"AT^LN_FOLDER_SIZE", ln_folder_size_at, (char *)"查看文件夹大小: AT^LN_FOLDER_SIZE[=/path/to/folder]"}, + //获取设备id + {(char *)"AT^LN_GET_DEVICE_ID", ln_get_device_id_at, (char *)"获取设备id: AT^LN_GET_DEVICE_ID"}, + //获取设备iccid + {(char *)"AT^LN_GET_DEVICE_ICCID", ln_get_device_iccid_at, (char *)"获取设备iccid: AT^LN_GET_DEVICE_ICCID"}, + //获取设备model + {(char *)"AT^LN_GET_DEVICE_MODEL", ln_get_device_model_at, (char *)"获取设备model: AT^LN_GET_DEVICE_MODEL"}, + //获取设备version + {(char *)"AT^LN_GET_DEVICE_VERSION", ln_get_device_version_at, (char *)"获取设备version: AT^LN_GET_DEVICE_VERSION"}, }; diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 23d9a95a3..ebdf3408d 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -25,9 +25,9 @@ static app_task_definition_t ln_recv_taskcfg = {0}; static unsigned long g_ln_send_queue = 0xFFFFFFFF; static unsigned long g_ln_recv_queue = 0xFFFFFFFF; -static char *g_device_id = NULL; +static char *s_cached_device_id = NULL; char *g_device_token = NULL;//设备token,服务器获取 -static char *g_device_iccid = NULL; +static char *s_cached_device_iccid = NULL; static char *g_device_model = NULL; static char g_device_version[128] = {0}; @@ -41,17 +41,91 @@ int g_ln_last_package_size = 0; // 最近一次查询到的 OTA 包大 int g_ln_is_device_bound = 0; /* 设备绑定状态 */ char g_ln_device_user_id[64] = {0}; // 设备绑定用户ID -/* 获取设备id: 设备唯一标识 */ +/* 简单的字符串读写(以.bin形式读写原始字节,末尾补'\0')*/ +static int ln_read_string_file(const char *file_path, char **out_str) +{ + if (out_str) *out_str = NULL; + if (!file_path || !out_str) return -1; + FILE *fp = fopen(file_path, "rb"); + if (!fp) return -1; + if (fseek(fp, 0, SEEK_END) != 0) { fclose(fp); return -1; } + long len = ftell(fp); + if (len <= 0 || len > 4096) { fclose(fp); return -1; } + if (fseek(fp, 0, SEEK_SET) != 0) { fclose(fp); return -1; } + char *buf = (char*)malloc((size_t)len + 1); + if (!buf) { fclose(fp); return -1; } + size_t n = fread(buf, 1, (size_t)len, fp); + fclose(fp); + buf[n] = '\0'; + *out_str = buf; + return 0; +} + +static int ln_write_string_file(const char *file_path, const char *str) +{ + if (!file_path || !str) return -1; + /* 确保目录存在 */ + uapi_create_folder((char*)LN_DATA_PATH); + FILE *fp = fopen(file_path, "wb"); + if (!fp) return -1; + size_t len = strlen(str); + /* 写入原始字节(不强制写入'\0')*/ + size_t n = fwrite(str, 1, len, fp); + fclose(fp); + return (n == len) ? 0 : -1; +} + +/* 获取设备id: 优先读本地缓存文件 /user/userdata/leiniao/device_id.bin*/ char *uapi_ln_get_device_id(void) { - g_device_id = cat1_api_runtime_get_cat1_imei(); - return g_device_id; + if (s_cached_device_id && s_cached_device_id[0]) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "device_id cached: %s", s_cached_device_id); + return s_cached_device_id; + } + /* 1. 尝试从文件读取 */ + char *loaded = NULL; + if (ln_read_string_file(LN_DEVICE_ID_FILE, &loaded) == 0 && loaded && loaded[0]) { + s_cached_device_id = loaded; /* 接管指针 */ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "device_id loaded from %s: %s", LN_DEVICE_ID_FILE, s_cached_device_id); + return s_cached_device_id; + } + if (loaded) free(loaded); + /* 2. 文件不存在或读取失败,则通过CAT1获取并落盘 */ + char *imei = cat1_api_runtime_get_cat1_imei(); + if (imei && imei[0]) { + (void)ln_write_string_file(LN_DEVICE_ID_FILE, imei); + size_t tlen = strlen(imei); + s_cached_device_id = (char*)malloc(tlen + 1); + if (s_cached_device_id) memcpy(s_cached_device_id, imei, tlen + 1); + return s_cached_device_id; + } + return NULL; } -/* 获取设备iccid:设备物联网卡号 */ + +/* 获取设备iccid: 优先读本地缓存文件 /user/userdata/leiniao/device_iccid.bin,不存在则调用CAT1接口并落盘 */ char *uapi_ln_get_device_iccid(void) { - g_device_iccid = cat1_api_runtime_get_cat1_iccid(); - return g_device_iccid; + if (s_cached_device_iccid && s_cached_device_iccid[0]) { + return s_cached_device_iccid; + } + /* 1. 尝试从文件读取 */ + char *loaded = NULL; + if (ln_read_string_file(LN_DEVICE_ICCID_FILE, &loaded) == 0 && loaded && loaded[0]) { + s_cached_device_iccid = loaded; /* 接管指针 */ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "device_iccid loaded from %s: %s", LN_DEVICE_ICCID_FILE, s_cached_device_iccid); + return s_cached_device_iccid; + } + if (loaded) free(loaded); + /* 2. 文件不存在或读取失败,则通过CAT1获取并落盘 */ + char *iccid = cat1_api_runtime_get_cat1_iccid(); + if (iccid && iccid[0]) { + (void)ln_write_string_file(LN_DEVICE_ICCID_FILE, iccid); + size_t tlen = strlen(iccid); + s_cached_device_iccid = (char*)malloc(tlen + 1); + if (s_cached_device_iccid) memcpy(s_cached_device_iccid, iccid, tlen + 1); + return s_cached_device_iccid; + } + return NULL; } /* 获取设备model */ char *uapi_ln_get_device_model(void) @@ -62,7 +136,6 @@ char *uapi_ln_get_device_model(void) /* 获取设备固件版本version */ char *uapi_ln_get_device_version(void) { - return "V1.0.0_20250920"; char version_buf[128] = {0}; uint32_t version_len = sizeof(version_buf) - 1; // 预留1字节给字符串结束符 uapi_get_buildversion((uint8_t *)version_buf, version_len); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index 2b541e880..0667ca1cb 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -60,6 +60,9 @@ typedef struct #define story_random_file_path LN_DATA_PATH "/story/random.txt" #define LN_CHARACTER_CONFIG_FILE LN_DATA_PATH "/character/character_config.json" #define EMOJI_CACHE_BASE_PATH LN_DATA_PATH "/emoji/" // 表情缓存根目录 +/* 设备ID/ICCID 本地缓存文件路径(.bin)*/ +#define LN_DEVICE_ID_FILE LN_DATA_PATH "/device_id.bin" +#define LN_DEVICE_ICCID_FILE LN_DATA_PATH "/device_iccid.bin" #define LN_CLIENT_PREPARE_SIZE 2 * 1024 #define TEST_MP3_DOWNLOAD 0 // 测试下载mp3 -- 2.17.1