break;
}
case LN_WS_RECV_CHARACTER_CONFIG_CHANGE: {
- printf("[WS] CharacterConfigChange:角色配置更改\n");
+ printf("[WS] CharacterConfigChange:角色配置更改(CharacterConfigChange)\n");
+ // 通知设备切换到指定角色
+ if(json_str)
+ {
+ ln_parse_character_config(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_SLEEP_MODE_START: {
printf("[WS] SleepModeStart:哄睡模式开始\n");
+ // 通知设备开始哄睡
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_003",
+ // "command": "SleepModeStart",
+ // "data": {
+ // "storyTheme": "爱情故事" //故事主题
+ // }
+ // }
+ // ln_parse_sleep_mode_start(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_SLEEP_MODE_END: {
printf("[WS] SleepModeEnd:哄睡模式结束\n");
+ // 通知设备结束哄睡
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_004",
+ // "command": "SleepModeEnd",
+ // "data": {}
+ // }
+ // ln_parse_sleep_mode_end(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_DEVICE_BIND: {
printf("[WS] DeviceBind:设备绑定\n");
+ // 通知设备已被用户绑定
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_007",
+ // "command": "DeviceBind",
+ // "data": {
+ // "userId": "user_001",
+ // "userName": "张三",
+ // "bindTime": 1640995200
+ // }
+ // }
+ // ln_parse_device_bind(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_DEVICE_UNBIND: {
printf("[WS] DeviceUnbind:设备解绑\n");
+ // 通知设备已被用户解绑
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_008",
+ // "command": "DeviceUnbind",
+ // "data": {
+ // "userId": "user_001",
+ // "reason": "用户主动解绑",
+ // "unbindTime": 1640995200
+ // }
+ // }
+ // ln_parse_device_unbind(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_SCHEDULE_REMINDER: {
printf("[WS] ScheduleReminder:日程提醒\n");
+ // 推送日程提醒信息
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_009",
+ // "command": "ScheduleReminder",
+ // "data": {
+ // "scheduleId": 123,
+ // "deviceId": "DEVICE_001",
+ // "scheduleName": "开会提醒",
+ // "reminderContent": "您有一个会议即将开始,请准备参加",
+ // "reminderAudioUrl": "https://example.com/reminder/reminder_001.mp3",
+ // "enableVoice": 1,
+ // "enableVibration": 1
+ // }
+ // }
+ ln_parse_schedule_reminder(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_SCHEDULE_REMINDER_CFG: {
printf("[WS] ScheduleReminderConfig:日程提醒配置\n");
+ // 推送日程提醒配置
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_009",
+ // "command": "ScheduleReminderConfig",
+ // "data": {
+ // "scheduleName": "七点起床"
+ // }
+ // }
+ ln_parse_schedule_reminder_config(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_DOWNLOAD_EMOJI: {
printf("[WS] DownloadEmoji:下载表情\n");
+ // 下载表情
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_011",
+ // "command": "DownloadEmoji",
+ // "data": {
+ // "characterId": "char_001",
+ // "eyesColor": "blue",
+ // "eyesShape": "calm-eyes",
+ // "emotionEmojis": [
+ // {
+ // "emotion": "happy",
+ // "emojiUrl": "https://example.com/emoji/happy.mp4"
+ // },
+ // {
+ // "emotion": "sad",
+ // "emojiUrl": "https://example.com/emoji/sad.mp4"
+ // }
+ // ]
+ // }
+ // }
+ // ln_parse_download_emoji(json_str, strlen(json_str));
+ }
break;
}
case LN_WS_RECV_DELETE_EMOJI: {
printf("[WS] DeleteEmoji:删除表情\n");
+ // 删除表情
+ if(json_str)
+ {
+ // {
+ // "deviceId": "DEVICE_001",
+ // "timestamp": 1640995200,
+ // "messageId": "msg_012",
+ // "command": "DeleteEmoji",
+ // "data": {
+ // "characterId": "char_001",
+ // "eyesColor": "blue",
+ // "eyesShape": "calm-eyes"
+ // }
+ // }
+ // ln_parse_delete_emoji(json_str, strlen(json_str));
+ }
break;
}
default: {
/* OTA 包保存目录*/
#define LN_OTA_SAVE_DIR "/user/update"
/* 用户数据保存目录 */
-#define LN_DATA_PATH "/user/leiniao"
+#define LN_DATA_PATH "/user/leiniao"
-#define LN_CLIENT_PREPARE_SIZE 2*1024
-#define TEST_MP3_DOWNLOAD 0 //测试下载mp3
+#define LN_CLIENT_PREPARE_SIZE 2 * 1024
+#define TEST_MP3_DOWNLOAD 0 // 测试下载mp3
-#define LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN 0x1 /* 获取设备 token */
+#define LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN 0x1 /* 获取设备 token */
#define LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM 0x2 /* 语音对话流 */
-#define LN_HTTP_SERVICE_CMD_SSE_RECV 0x3 /* 语音对话流分片接收 */
+#define LN_HTTP_SERVICE_CMD_SSE_RECV 0x3 /* 语音对话流分片接收 */
/* 故事相关命令 */
-#define LN_HTTP_SERVICE_CMD_STORY_CHOOSE 0x10 /* 智能选择故事(SSE,multipart)*/
-#define LN_HTTP_SERVICE_CMD_STORY_RANDOM 0x11 /* 随机故事(SSE,JSON)*/
+#define LN_HTTP_SERVICE_CMD_STORY_CHOOSE 0x10 /* 智能选择故事(SSE,multipart)*/
+#define LN_HTTP_SERVICE_CMD_STORY_RANDOM 0x11 /* 随机故事(SSE,JSON)*/
#define LN_HTTP_SERVICE_CMD_STORY_EXIT_INQUIRY 0x12 /* 获取退出哄睡询问(JSON)*/
-#define LN_HTTP_SERVICE_CMD_STORY_FINISH 0x13 /* 确认结束哄睡模式(JSON)*/
+#define LN_HTTP_SERVICE_CMD_STORY_FINISH 0x13 /* 确认结束哄睡模式(JSON)*/
/* 故事相关接收命令(用于区分来源,便于分类打印/处理)*/
#define LN_HTTP_RECV_STORY_CHOOSE 0x20 /* 故事-选择故事 接收 */
#define LN_HTTP_RECV_STORY_RANDOM 0x21 /* 故事-随机故事 接收 */
-#define LN_HTTP_RECV_STORY_EXIT 0x22 /* 故事-退出哄睡询问 接收 */
+#define LN_HTTP_RECV_STORY_EXIT 0x22 /* 故事-退出哄睡询问 接收 */
#define LN_HTTP_RECV_STORY_FINISH 0x23 /* 故事-确认结束哄睡模式 接收 */
/* 设备信息相关命令 */
#define LN_HTTP_SERVICE_CMD_GET_CHARACTER 0x30 /* 获取设备角色信息(JSON, GET)*/
-#define LN_HTTP_SERVICE_CMD_GET_USER_ID 0x31 /* 获取设备绑定用户ID(JSON, GET)*/
+#define LN_HTTP_SERVICE_CMD_GET_USER_ID 0x31 /* 获取设备绑定用户ID(JSON, GET)*/
/* 设备信息相关接收命令 */
#define LN_HTTP_RECV_DEVICE_CHARACTER 0x40 /* 设备角色信息 接收 */
-#define LN_HTTP_RECV_DEVICE_USER_ID 0x41 /* 设备绑定用户ID 接收 */
+#define LN_HTTP_RECV_DEVICE_USER_ID 0x41 /* 设备绑定用户ID 接收 */
/* OTA 升级相关命令 */
#define LN_HTTP_SERVICE_CMD_OTA_GET_TASK 0x50 /* 获取OTA升级任务(JSON, GET,带查询参数)*/
/* OTA 升级相关接收命令 */
#define LN_HTTP_RECV_OTA_TASK 0x60 /* OTA 升级任务 接收 */
/* OTA 下载命令与回执 */
#define LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD 0x51 /* 触发 OTA 包下载(根据 getTask 的返回 packageUrl)*/
-#define LN_HTTP_RECV_OTA_DOWNLOAD_MSG 0x61 /* 可选:OTA 下载控制消息(JSON)接收)*/
-
+#define LN_HTTP_RECV_OTA_DOWNLOAD_MSG 0x61 /* 可选:OTA 下载控制消息(JSON)接收)*/
/* WebSocket 业务消息接收命令(供 WS 回调上报分类使用)*/
-#define LN_WS_RECV_UNKNOWN 0x70 /* 未知命令 */
-#define LN_WS_RECV_CHARACTER_CHANGE 0x71 /* 角色切换 (CharacterChange) */
+#define LN_WS_RECV_UNKNOWN 0x70 /* 未知命令 */
+#define LN_WS_RECV_CHARACTER_CHANGE 0x71 /* 角色切换 (CharacterChange) */
#define LN_WS_RECV_CHARACTER_CONFIG_CHANGE 0x72 /* 角色配置更改 (CharacterConfigChange) */
-#define LN_WS_RECV_SLEEP_MODE_START 0x73 /* 哄睡模式开始 (SleepModeStart) */
-#define LN_WS_RECV_SLEEP_MODE_END 0x74 /* 哄睡模式结束 (SleepModeEnd) */
-#define LN_WS_RECV_DEVICE_BIND 0x75 /* 设备绑定 (DeviceBind) */
-#define LN_WS_RECV_DEVICE_UNBIND 0x76 /* 设备解绑 (DeviceUnbind) */
-#define LN_WS_RECV_SCHEDULE_REMINDER 0x77 /* 日程提醒 (ScheduleReminder) */
-#define LN_WS_RECV_SCHEDULE_REMINDER_CFG 0x78 /* 日程提醒配置 (ScheduleReminderConfig) */
-#define LN_WS_RECV_DOWNLOAD_EMOJI 0x79 /* 下载表情 (DownloadEmoji) */
-#define LN_WS_RECV_DELETE_EMOJI 0x7A /* 删除表情 (DeleteEmoji) */
+#define LN_WS_RECV_SLEEP_MODE_START 0x73 /* 哄睡模式开始 (SleepModeStart) */
+#define LN_WS_RECV_SLEEP_MODE_END 0x74 /* 哄睡模式结束 (SleepModeEnd) */
+#define LN_WS_RECV_DEVICE_BIND 0x75 /* 设备绑定 (DeviceBind) */
+#define LN_WS_RECV_DEVICE_UNBIND 0x76 /* 设备解绑 (DeviceUnbind) */
+#define LN_WS_RECV_SCHEDULE_REMINDER 0x77 /* 日程提醒 (ScheduleReminder) */
+#define LN_WS_RECV_SCHEDULE_REMINDER_CFG 0x78 /* 日程提醒配置 (ScheduleReminderConfig) */
+#define LN_WS_RECV_DOWNLOAD_EMOJI 0x79 /* 下载表情 (DownloadEmoji) */
+#define LN_WS_RECV_DELETE_EMOJI 0x7A /* 删除表情 (DeleteEmoji) */
/* 音频播放相关命令 */
-#define LN_HTTP_SERVICE_CMD_AUDIO_PLAY 0x1001 /* 播放音频 */
-#define LN_HTTP_SERVICE_CMD_AUDIO_STOP 0x1002 /* 停止播放音频 */
+#define LN_HTTP_SERVICE_CMD_AUDIO_PLAY 0x1001 /* 播放音频 */
+#define LN_HTTP_SERVICE_CMD_AUDIO_STOP 0x1002 /* 停止播放音频 */
#define LN_HTTP_SERVICE_CMD_AUDIO_PLAY_NEXT 0x1003 /* 播放下一首 */
#define LN_HTTP_SERVICE_CMD_AUDIO_PLAY_FILE 0x1004 /* 播放指定文件 */
-#define LN_HTTP_SERVICE_CMD_AUDIO_PAUSE 0x1005 /* 暂停播放 */
-#define LN_HTTP_SERVICE_CMD_AUDIO_RESUME 0x1006 /* 恢复播放 */
+#define LN_HTTP_SERVICE_CMD_AUDIO_PAUSE 0x1005 /* 暂停播放 */
+#define LN_HTTP_SERVICE_CMD_AUDIO_RESUME 0x1006 /* 恢复播放 */
/* Emoji 上报结果接收命令 */
-#define LN_HTTP_RECV_EMOJI_REPORT 0x1007
-#define LN_HTTP_RECV_EMOJI_REPORT_ALL 0x1008
+#define LN_HTTP_RECV_EMOJI_REPORT 0x1007
+#define LN_HTTP_RECV_EMOJI_REPORT_ALL 0x1008
/* 故事-随机故事 请求体(可选主题)*/
typedef struct
} ln_story_random_req_t;
/* OTA下载状态枚举(对应时序图中的下载阶段)*/
-typedef enum {
- OTA_DOWNLOAD_STATUS_DOWNLOADING = 0, /* 下载中 */
- OTA_DOWNLOAD_STATUS_COMPLETED = 1, /* 下载完成 */
- OTA_DOWNLOAD_STATUS_FAILED = 2, /* 下载失败 */
- OTA_DOWNLOAD_STATUS_PROGRESS = 3 /* 进度更新 */
+typedef enum
+{
+ OTA_DOWNLOAD_STATUS_DOWNLOADING = 0, /* 下载中 */
+ OTA_DOWNLOAD_STATUS_COMPLETED = 1, /* 下载完成 */
+ OTA_DOWNLOAD_STATUS_FAILED = 2, /* 下载失败 */
+ OTA_DOWNLOAD_STATUS_PROGRESS = 3 /* 进度更新 */
} OtaDownloadStatus;
/* OTA下载消息结构体(简化版)*/
-typedef struct {
- OtaDownloadStatus status; /* 下载状态*/
- int progress; /* 进度(0-100),仅状态为PROGRESS时有效 */
- char file_path[256]; /* 文件路径,仅状态为COMPLETED时有效 */
- char error_msg[128]; /* 错误信息,仅状态为FAILED时有效 */
- char md5[65]; /* MD5(来自任务),仅状态为COMPLETED时有效 */
+typedef struct
+{
+ OtaDownloadStatus status; /* 下载状态*/
+ int progress; /* 进度(0-100),仅状态为PROGRESS时有效 */
+ char file_path[256]; /* 文件路径,仅状态为COMPLETED时有效 */
+ char error_msg[128]; /* 错误信息,仅状态为FAILED时有效 */
+ char md5[65]; /* MD5(来自任务),仅状态为COMPLETED时有效 */
} OtaDownloadMsg;
/* =================== Emoji 表情上报相关结构体 =================== */
} 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;
+typedef struct
+{
+ char character_id[64]; // 角色ID
+ 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;
// 定义存储日程提醒信息的全局变量
} ScheduleReminder;
/* 日程 日程提醒醒配置配置信息结构体 */
-typedef struct {
- char scheduleName[128]; // 日程名称
+typedef struct
+{
+ char scheduleName[128]; // 日程名称
} ScheduleReminderConfig;
/* 初始化 LN HTTP 服务 */
-errcode_t uapi_ln_http_server_init(void);
+errcode_t uapi_ln_http_server_init(void);
/* 通用发送接口:向 LN HTTP 发送队列投递消息 */
void do_ln_http_server_send_data(int cmd, char *data, uint32_t len);
/* 通用接收接口:向 LN HTTP 接收队列投递消息(供发送线程/HTTP回调使用) */
/* 设置是否绑定用户 */
void uapi_ln_set_device_bound(void);
/* 获取设备绑定用户ID */
-const char* uapi_ln_get_user_id(void);
+const char *uapi_ln_get_user_id(void);
/* 获取设备角色配置 */
LnCharacterConfig uapi_ln_get_character_config(void);
/* 获取日程提醒信息 */
ScheduleReminder uapi_ln_get_schedule_reminder(void);
-
/* ============================== 共享全局状态(跨文件) ============================== */
extern char *g_device_token;
extern int g_ln_last_update_type;
uint32_t uapi_ln_refresh_device_token(void);
uint32_t uapi_ln_device_get_user_id(LnDeviceBindStatus *out_status, char *out_user_id, uint32_t out_user_id_len);
-//解析设备角色配置
+// 解析设备角色配置
void ln_parse_character_config(const char *json_buf, int json_len);
+/* 解析哄睡模式开始 */
+void ln_parse_sleep_mode_start(const char *json_str, int json_len);
+/* 解析哄睡模式结束 */
+void ln_parse_sleep_mode_end(const char *json_str, int json_len);
+/* 解析设备绑定 */
+void ln_parse_device_bind(const char *json_str, int json_len);
+/* 解析设备解绑 */
+void ln_parse_device_unbind(const char *json_str, int json_len);
+/* 解析日程提醒 */
+void ln_parse_schedule_reminder(const char *json_str, int json_len);
+/* 解析日程提醒配置 */
+void ln_parse_schedule_reminder_config(const char *json_str, int json_len);
+/* 解析下载表情 */
+void ln_parse_download_emoji(const char *json_str, int json_len);
+/* 解析删除表情 */
+void ln_parse_delete_emoji(const char *json_str, int json_len);
/* ============================== 各接口函数声明 ============================== */
uint32_t ln_get_device_token_http(const char *device_id,
- const char *device_iccid,
- const char *device_model,
- const char *device_version);
+ const char *device_iccid,
+ const char *device_model,
+ const char *device_version);
uint32_t ln_speech_chat_stream_http(const char *device_id,
const char *device_token,
const char *audio_path);
uint32_t ln_story_choose_http(const char *device_id,
- const char *device_token,
- const char *audio_path);
+ const char *device_token,
+ const char *audio_path);
uint32_t ln_story_random_http(const char *device_id,
- const char *device_token,
- const char *story_theme);
+ const char *device_token,
+ const char *story_theme);
uint32_t ln_story_exit_inquiry_http(const char *device_id,
const char *device_token);
uint32_t ln_story_finish_http(const char *device_id,
- const char *device_token);
+ const char *device_token);
uint32_t ln_device_get_character_http(const char *device_id,
- const char *device_token);
+ const char *device_token);
uint32_t ln_device_get_user_id_http(const char *device_id,
const char *device_token);
uint32_t ln_ota_get_task_http(const char *device_id,
- const char *device_token,
- const char *source_version);
+ const char *device_token,
+ const char *source_version);
uint32_t ln_ota_download_flow_http(const char *device_id,
- const char *device_token,
- const char *source_version);
+ const char *device_token,
+ const char *source_version);
/* Emoji 表情接口 */
uint32_t ln_emoji_report_status_http(const char *device_id,
- const char *device_token,
- const char *character_id,
- const char *eyes_color,
- const char *eyes_shape,
- const char *status);
+ const char *device_token,
+ const char *character_id,
+ const char *eyes_color,
+ const char *eyes_shape,
+ const char *status);
uint32_t ln_emoji_report_all_http(const char *device_id,
- const char *device_token,
- const LnEmojiGroup *groups,
- int group_count);
+ const char *device_token,
+ const LnEmojiGroup *groups,
+ int group_count);
/* ============================== WebSocket 客户端接口 ============================== */
int ln_ws_start(void);
int ln_ws_send_text(const char *text);
int ln_ws_stop(void);
-
#ifdef __cplusplus
}
#endif