添加设备id和iccid持久化保存 2392/2 2392/head 2393/target/1
authorluozheng <1732036298@qq.com>
Thu, 25 Sep 2025 04:21:19 +0000 (12:21 +0800)
committerluozheng <1732036298@qq.com>
Thu, 25 Sep 2025 04:21:19 +0000 (12:21 +0800)
code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h

index 8cf9261..b511f4a 100644 (file)
@@ -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"},
 };
 
 
index 23d9a95..ebdf340 100644 (file)
@@ -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);
index 2b541e8..0667ca1 100644 (file)
@@ -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