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"},
/* 内存查看相关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"},
};
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};
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)
/* 获取设备固件版本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);