${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
)
# 公共头文件路径(供其他模块引用)
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),失败则逐步扩容重试 */
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 发送队列投递消息 */
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);
/* ============================== 共享全局状态(跨文件) ============================== */
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;
/* ============================== 公共工具函数(供拆分后的模块复用) ============================== */
#include <string.h>
#include <cJSON.h>
-/* =================== 设备角色信息存储 =================== */
-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)
{
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)
/* 基础字段 */
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");
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);
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;
}
HttpClientClse(&client);
return ERRCODE_SUCC;
}
+
\ No newline at end of file
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#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