From c0b35d42e04eadbcd6e1e4add5c43247c8ab63c4 Mon Sep 17 00:00:00 2001 From: cheng Date: Thu, 18 Sep 2025 11:15:46 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E8=A7=92=E8=89=B2=E4=BF=A1?= =?utf8?q?=E6=81=AF=E9=85=8D=E7=BD=AE=E5=87=BD=E6=95=B0=EF=BC=8C=E6=B7=BB?= =?utf8?q?=E5=8A=A0=E8=A7=A3=E6=9E=90=E6=97=A5=E7=A8=8B=E4=BF=A1=E6=81=AF?= =?utf8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt | 1 + code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 48 +------- code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 57 +++++---- .../leiniao/imsl_ln/ln_api_device_info.c | 86 ++++++++------ .../zhihui/leiniao/imsl_ln/ln_api_schedule.c | 108 ++++++++++++++++++ 5 files changed, 200 insertions(+), 100 deletions(-) create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c diff --git a/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt b/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt index 2af430de3..6ff514444 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt +++ b/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt @@ -18,6 +18,7 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_device_info.c ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_ota.c ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_websocket.c + ${CMAKE_CURRENT_SOURCE_DIR}/ln_api_schedule.c ) # 公共头文件路径(供其他模块引用) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 9b9287f71..ebfb9c05f 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -162,52 +162,16 @@ const char* uapi_ln_get_user_id(void) return g_ln_device_user_id; } -/* 获取设备角色id */ -const char *uapi_ln_get_character_id(void) +/* 获取设备角色配置 */ +LnCharacterConfig uapi_ln_get_character_config(void) { - return g_ln_character_id; + return g_ln_character_config; } -/* 获取设备角色名称 */ -const char *uapi_ln_get_character_name(void) +/* 获取日程提醒信息 */ +ScheduleReminder uapi_ln_get_schedule_reminder(void) { - return g_ln_character_name; -} - -/* 获取设备角色眼睛形状 */ -const char *uapi_ln_get_character_eyes_shape(void) -{ - return g_ln_avatar_eyes_shape; -} - -/* 获取设备角色头发颜色 */ -const char *uapi_ln_get_character_hair_color(void) -{ - return g_ln_avatar_hair_color; -} - -/* 获取设备角色眼睛颜色 */ -const char *uapi_ln_get_character_eyes_color(void) -{ - return g_ln_avatar_eyes_color; -} - -/* 获取设备角色头发样式 */ -const char *uapi_ln_get_character_hair_style(void) -{ - return g_ln_avatar_hair_style; -} - -/* 获取设备角色屏幕图片 */ -const char *uapi_ln_get_character_screen_image(void) -{ - return g_ln_avatar_screen_image; -} - -/* 获取设备角色屏幕图片是否为表情,默认false */ -int uapi_ln_get_character_screen_image_as_emoji(void) -{ - return g_ln_avatar_screen_image_as_emoji; + return g_schedule_reminder; } /* 自适应申请HttpClient缓冲(保证header>=2048),失败则逐步扩容重试 */ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index ace818696..f695e365e 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -133,6 +133,30 @@ typedef enum LN_DEVICE_BIND_STATUS_ERROR = 3 /* 其他错误(网络/解析等)*/ } LnDeviceBindStatus; +/* =================== 设备角色信息结构体定义 =================== */ +typedef struct { + char character_id[64]; + char character_name[64]; + char avatar_hair_color[64]; + char avatar_eyes_color[64]; + char avatar_hair_style[64]; + char avatar_eyes_shape[64]; + char avatar_screen_image[256]; + int avatar_screen_image_as_emoji; +} LnCharacterConfig; + +// 定义存储日程提醒信息的全局变量 +typedef struct +{ + int scheduleId; + char deviceId[64]; + char scheduleName[128]; + char reminderContent[512]; + char reminderAudioUrl[512]; + int enableVoice; + int enableVibration; +} ScheduleReminder; + /* 初始化 LN HTTP 服务 */ errcode_t uapi_ln_http_server_init(void); /* 通用发送接口:向 LN HTTP 发送队列投递消息 */ @@ -166,22 +190,10 @@ void uapi_ln_audio_download_is_cancel(int status); uint32_t uapi_ln_is_device_bound(void); /* 获取设备绑定用户ID */ const char* uapi_ln_get_user_id(void); -/* 获取设备角色id */ -const char *uapi_ln_get_character_id(void); -/* 获取设备角色名称 */ -const char *uapi_ln_get_character_name(void); -/* 获取设备角色眼睛形状 */ -const char *uapi_ln_get_character_eyes_shape(void); -/* 获取设备角色头发颜色 */ -const char *uapi_ln_get_character_hair_color(void); -/* 获取设备角色眼睛颜色 */ -const char *uapi_ln_get_character_eyes_color(void); -/* 获取设备角色头发样式 */ -const char *uapi_ln_get_character_hair_style(void); -/* 获取设备角色屏幕图片 */ -const char *uapi_ln_get_character_screen_image(void); -/* 获取设备角色屏幕图片是否为表情 */ -int uapi_ln_get_character_screen_image_as_emoji(void); +/* 获取设备角色配置 */ +LnCharacterConfig uapi_ln_get_character_config(void); +/* 获取日程提醒信息 */ +ScheduleReminder uapi_ln_get_schedule_reminder(void); /* ============================== 共享全局状态(跨文件) ============================== */ @@ -192,15 +204,10 @@ extern char g_ln_last_package_url[512]; extern char g_ln_last_target_version[64]; extern char g_ln_last_package_md5[65]; extern int g_ln_last_package_size; -/* 设备角色信息(由 ln_parse_character_config 填充)*/ -extern char g_ln_character_id[64]; //角色id -extern char g_ln_character_name[64]; //角色名称 -extern char g_ln_avatar_eyes_shape[64]; //眼睛形状 -extern char g_ln_avatar_hair_color[64]; //头发颜色 -extern char g_ln_avatar_eyes_color[64]; //眼睛颜色 -extern char g_ln_avatar_hair_style[64]; //发型 -extern char g_ln_avatar_screen_image[256]; //屏幕图片 -extern int g_ln_avatar_screen_image_as_emoji; //屏幕图片是否为表情 +/* 全局角色配置结构体实例 */ +extern LnCharacterConfig g_ln_character_config; +/* 全局日程提醒结构体实例 */ +extern ScheduleReminder g_schedule_reminder; /* ============================== 公共工具函数(供拆分后的模块复用) ============================== */ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c index 05d5a5518..ce607889f 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c @@ -3,16 +3,7 @@ #include #include -/* =================== 设备角色信息存储 =================== */ -char g_ln_character_id[64] = {0}; -char g_ln_character_name[64] = {0}; -char g_ln_avatar_hair_color[64] = {0}; -char g_ln_avatar_eyes_color[64] = {0}; -char g_ln_avatar_hair_style[64] = {0}; -char g_ln_avatar_eyes_shape[64] = {0}; -char g_ln_avatar_screen_image[256] = {0}; -int g_ln_avatar_screen_image_as_emoji = 0; - +ScheduleReminder g_schedule_reminder = {0}; /* 安全写入帮助函数 */ static inline void ln_safe_strcpy(char *dst, size_t dst_size, const char *src) { @@ -25,7 +16,7 @@ static inline void ln_safe_strcpy(char *dst, size_t dst_size, const char *src) dst[dst_size - 1] = '\0'; } -/* 解析设备角色配置 JSON 并保存到全局变量 */ +/* 解析设备角色配置 JSON 并保存到全局结构体 */ void ln_parse_character_config(const char *json_buf, int json_len) { if (!json_buf || json_len <= 0) @@ -69,8 +60,13 @@ void ln_parse_character_config(const char *json_buf, int json_len) /* 基础字段 */ cJSON *cid = cJSON_GetObjectItem(data, "characterId"); cJSON *cname = cJSON_GetObjectItem(data, "characterName"); - ln_safe_strcpy(g_ln_character_id, sizeof(g_ln_character_id), (cid && cJSON_IsString(cid)) ? cid->valuestring : ""); - ln_safe_strcpy(g_ln_character_name, sizeof(g_ln_character_name), (cname && cJSON_IsString(cname)) ? cname->valuestring : ""); + ln_safe_strcpy(g_ln_character_config.character_id, + sizeof(g_ln_character_config.character_id), + (cid && cJSON_IsString(cid)) ? cid->valuestring : ""); + + ln_safe_strcpy(g_ln_character_config.character_name, + sizeof(g_ln_character_config.character_name), + (cname && cJSON_IsString(cname)) ? cname->valuestring : ""); /* 头像配置 */ cJSON *avatar = cJSON_GetObjectItem(data, "characterAvatar"); @@ -83,29 +79,51 @@ void ln_parse_character_config(const char *json_buf, int json_len) cJSON *screenImage = cJSON_GetObjectItem(avatar, "screenImage"); cJSON *screenImageAsEmoji = cJSON_GetObjectItem(avatar, "screenImageAsEmoji"); - ln_safe_strcpy(g_ln_avatar_hair_color, sizeof(g_ln_avatar_hair_color), (hairColor && cJSON_IsString(hairColor)) ? hairColor->valuestring : ""); - ln_safe_strcpy(g_ln_avatar_eyes_color, sizeof(g_ln_avatar_eyes_color), (eyesColor && cJSON_IsString(eyesColor)) ? eyesColor->valuestring : ""); - ln_safe_strcpy(g_ln_avatar_hair_style, sizeof(g_ln_avatar_hair_style), (hairStyle && cJSON_IsString(hairStyle)) ? hairStyle->valuestring : ""); - ln_safe_strcpy(g_ln_avatar_eyes_shape, sizeof(g_ln_avatar_eyes_shape), (eyesShape && cJSON_IsString(eyesShape)) ? eyesShape->valuestring : ""); - ln_safe_strcpy(g_ln_avatar_screen_image, sizeof(g_ln_avatar_screen_image), (screenImage && cJSON_IsString(screenImage)) ? screenImage->valuestring : ""); - g_ln_avatar_screen_image_as_emoji = (screenImageAsEmoji && cJSON_IsBool(screenImageAsEmoji)) ? (cJSON_IsTrue(screenImageAsEmoji) ? 1 : 0) : 0; + ln_safe_strcpy(g_ln_character_config.avatar_hair_color, + sizeof(g_ln_character_config.avatar_hair_color), + (hairColor && cJSON_IsString(hairColor)) ? hairColor->valuestring : ""); + + ln_safe_strcpy(g_ln_character_config.avatar_eyes_color, + sizeof(g_ln_character_config.avatar_eyes_color), + (eyesColor && cJSON_IsString(eyesColor)) ? eyesColor->valuestring : ""); + + ln_safe_strcpy(g_ln_character_config.avatar_hair_style, + sizeof(g_ln_character_config.avatar_hair_style), + (hairStyle && cJSON_IsString(hairStyle)) ? hairStyle->valuestring : ""); + + ln_safe_strcpy(g_ln_character_config.avatar_eyes_shape, + sizeof(g_ln_character_config.avatar_eyes_shape), + (eyesShape && cJSON_IsString(eyesShape)) ? eyesShape->valuestring : ""); + + ln_safe_strcpy(g_ln_character_config.avatar_screen_image, + sizeof(g_ln_character_config.avatar_screen_image), + (screenImage && cJSON_IsString(screenImage)) ? screenImage->valuestring : ""); + + g_ln_character_config.avatar_screen_image_as_emoji = + (screenImageAsEmoji && cJSON_IsBool(screenImageAsEmoji)) ? + (cJSON_IsTrue(screenImageAsEmoji) ? 1 : 0) : 0; } else { - /* 缺省时清空 */ - g_ln_avatar_hair_color[0] = '\0'; - g_ln_avatar_eyes_color[0] = '\0'; - g_ln_avatar_hair_style[0] = '\0'; - g_ln_avatar_eyes_shape[0] = '\0'; - g_ln_avatar_screen_image[0] = '\0'; - g_ln_avatar_screen_image_as_emoji = 0; + /* 缺省时清空结构体字段 */ + g_ln_character_config.avatar_hair_color[0] = '\0'; + g_ln_character_config.avatar_eyes_color[0] = '\0'; + g_ln_character_config.avatar_hair_style[0] = '\0'; + g_ln_character_config.avatar_eyes_shape[0] = '\0'; + g_ln_character_config.avatar_screen_image[0] = '\0'; + g_ln_character_config.avatar_screen_image_as_emoji = 0; } - printf("[DEVICE_CHARACTER] parsed: id=%s\n name=%s\n hairColor=%s\n eyesColor=%s\n hairStyle=%s\n eyesShape=%s\n screenImage=%s\n asEmoji=%d\n", - g_ln_character_id, g_ln_character_name, - g_ln_avatar_hair_color, g_ln_avatar_eyes_color, - g_ln_avatar_hair_style, g_ln_avatar_eyes_shape, - g_ln_avatar_screen_image, g_ln_avatar_screen_image_as_emoji); + /* 打印解析结果 */ + printf("[DEVICE_CHARACTER] parsed:\n"); + printf(" character_id: %s\n", g_ln_character_config.character_id); + printf(" character_name: %s\n", g_ln_character_config.character_name); + printf(" avatar_hair_color: %s\n", g_ln_character_config.avatar_hair_color); + printf(" avatar_eyes_color: %s\n", g_ln_character_config.avatar_eyes_color); + printf(" avatar_hair_style: %s\n", g_ln_character_config.avatar_hair_style); + printf(" avatar_eyes_shape: %s\n", g_ln_character_config.avatar_eyes_shape); + printf(" avatar_screen_image: %s\n", g_ln_character_config.avatar_screen_image); + printf(" avatar_screen_image_as_emoji: %d\n", g_ln_character_config.avatar_screen_image_as_emoji); cJSON_Delete(root); free(text); @@ -163,8 +181,9 @@ uint32_t ln_device_get_character_http(const char *device_id, printf("device getCharacter: HTTP %d\n", code); if (clientData.responseBuf && clientData.responseBufLen > 0) { - int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen; - do_ln_http_server_recv_data(LN_HTTP_RECV_DEVICE_CHARACTER, clientData.responseBuf, (uint32_t)real_len); + // int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen; + // do_ln_http_server_recv_data(LN_HTTP_RECV_DEVICE_CHARACTER, clientData.responseBuf, (uint32_t)real_len); + printf("device getCharacter: responseBuf=%s\n", clientData.responseBuf); } goto end; } @@ -368,3 +387,4 @@ uint32_t uapi_ln_device_get_user_id(LnDeviceBindStatus *out_status, char *out_us HttpClientClse(&client); return ERRCODE_SUCC; } + \ No newline at end of file diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c new file mode 100644 index 000000000..919d1ed5c --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_schedule.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include "cJSON.h" +#include "ln_api.h" + +LnCharacterConfig g_ln_character_config = {0}; + +// 安全字符串复制函数 +static void ln_safe_strcpy(char *dest, size_t dest_size, const char *src) +{ + if (!dest || dest_size == 0 || !src) + return; + strncpy(dest, src, dest_size - 1); + dest[dest_size - 1] = '\0'; +} + +/* 解析日程提醒信息 */ +void ln_parse_schedule_reminder(const char *json_buf, int json_len) +{ + if (!json_buf || json_len <= 0) + { + printf("[SCHEDULE_REMINDER] invalid json input\n"); + return; + } + + // 复制并终止字符串 + char *text = (char *)malloc((size_t)json_len + 1); + if (!text) + return; + memcpy(text, json_buf, (size_t)json_len); + text[json_len] = '\0'; + + // 解析JSON + cJSON *root = cJSON_Parse(text); + if (!root) + { + printf("[SCHEDULE_REMINDER] json parse failed\n"); + free(text); + return; + } + + // 检查错误码 + cJSON *errorCode = cJSON_GetObjectItem(root, "errorCode"); + if (errorCode && !cJSON_IsNull(errorCode)) + { + printf("[SCHEDULE_REMINDER] server error: %s\n", + cJSON_IsString(errorCode) ? errorCode->valuestring : "unknown"); + cJSON_Delete(root); + free(text); + return; + } + + // 获取data对象 + cJSON *data = cJSON_GetObjectItem(root, "data"); + if (!data || !cJSON_IsObject(data)) + { + printf("[SCHEDULE_REMINDER] no data object\n"); + cJSON_Delete(root); + free(text); + return; + } + + // 解析各个字段 + cJSON *scheduleId = cJSON_GetObjectItem(data, "scheduleId"); + cJSON *deviceId = cJSON_GetObjectItem(data, "deviceId"); + cJSON *scheduleName = cJSON_GetObjectItem(data, "scheduleName"); + cJSON *reminderContent = cJSON_GetObjectItem(data, "reminderContent"); + cJSON *reminderAudioUrl = cJSON_GetObjectItem(data, "reminderAudioUrl"); + cJSON *enableVoice = cJSON_GetObjectItem(data, "enableVoice"); + cJSON *enableVibration = cJSON_GetObjectItem(data, "enableVibration"); + + // 填充全局结构体 + g_schedule_reminder.scheduleId = (scheduleId && cJSON_IsNumber(scheduleId)) ? scheduleId->valueint : 0; + + ln_safe_strcpy(g_schedule_reminder.deviceId, + sizeof(g_schedule_reminder.deviceId), + (deviceId && cJSON_IsString(deviceId)) ? deviceId->valuestring : ""); + + ln_safe_strcpy(g_schedule_reminder.scheduleName, + sizeof(g_schedule_reminder.scheduleName), + (scheduleName && cJSON_IsString(scheduleName)) ? scheduleName->valuestring : ""); + + ln_safe_strcpy(g_schedule_reminder.reminderContent, + sizeof(g_schedule_reminder.reminderContent), + (reminderContent && cJSON_IsString(reminderContent)) ? reminderContent->valuestring : ""); + + ln_safe_strcpy(g_schedule_reminder.reminderAudioUrl, + sizeof(g_schedule_reminder.reminderAudioUrl), + (reminderAudioUrl && cJSON_IsString(reminderAudioUrl)) ? reminderAudioUrl->valuestring : ""); + + g_schedule_reminder.enableVoice = (enableVoice && cJSON_IsNumber(enableVoice)) ? enableVoice->valueint : 0; + g_schedule_reminder.enableVibration = (enableVibration && cJSON_IsNumber(enableVibration)) ? enableVibration->valueint : 0; + + // 打印解析结果 + printf("[SCHEDULE_REMINDER] parsed successfully:\n"); + printf(" scheduleId: %d\n", g_schedule_reminder.scheduleId); + printf(" deviceId: %s\n", g_schedule_reminder.deviceId); + printf(" scheduleName: %s\n", g_schedule_reminder.scheduleName); + printf(" reminderContent: %s\n", g_schedule_reminder.reminderContent); + printf(" reminderAudioUrl: %s\n", g_schedule_reminder.reminderAudioUrl); + printf(" enableVoice: %d\n", g_schedule_reminder.enableVoice); + printf(" enableVibration: %d\n", g_schedule_reminder.enableVibration); + + // 清理资源 + cJSON_Delete(root); + free(text); +} \ No newline at end of file -- 2.17.1