return (g_ln_last_saved_path && g_ln_last_saved_path[0] != '\0') ? g_ln_last_saved_path : NULL;
}
-/* 获取语音对话流录音音频路径 */
-const char *uapi_ln_get_speechchat_audio_path(void)
-{
- // 判断目录是否存在,不存在则创建
- if (access(LN_DATA_PATH, F_OK) == -1)
- {
- uapi_create_folder(LN_DATA_PATH);
- }
- const char *path = LN_DATA_PATH "/speech_chat_audio.mp3";
- return path;
-}
/* 获取选择故事录音音频路径 */
-const char *uapi_ln_get_story_choose_audio_path(void)
+const char *uapi_ln_get_audio_path(void)
{
// 判断目录是否存在,不存在则创建
if (access(LN_DATA_PATH, F_OK) == -1)
{
uapi_create_folder(LN_DATA_PATH);
}
- const char *path = LN_DATA_PATH "/story_choose_audio.mp3";
+ const char *path = LN_DATA_PATH "/audio.mp3";
return path;
}
}
/* 获取是否绑定用户 */
-uint32_t uapi_ln_is_device_bound(void)
+int uapi_ln_is_device_bound(void)
{
return g_ln_is_device_bound;
}
return g_ln_device_user_id;
}
/* 获取是否绑定用户 */
-void uapi_ln_set_device_bound(void)
+void uapi_ln_set_device_bound(int val)
{
- g_ln_is_device_bound = 1;
+ g_ln_is_device_bound = val;
}
/* 获取设备角色配置 */
/* ============================ WebSocket 业务消息 上层处理 ============================ */
-void ln_ws_process_message(int cmd, const char *json_str)
+void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type)
{
- if (!json_str)
- {
- printf("[WS] invalid json string\n");
- return;
- }
-
- cJSON *root = cJSON_Parse(json_str);
- if (!root)
+ if (!data_msg || !data_msg->raw_json)
{
- printf("[WS] parse json failed\n");
+ printf("[WS] invalid data message\n");
return;
}
- const cJSON *msgId = cJSON_GetObjectItem(root, "messageId");
- const cJSON *command = cJSON_GetObjectItem(root, "command");
- const char *message_id = (msgId && cJSON_IsString(msgId)) ? msgId->valuestring : NULL;
- const char *cmd_str = (command && cJSON_IsString(command)) ? command->valuestring : "";
- printf("[WS] cmd=%d message_id=%s cmd_str=%s\n", cmd, message_id, cmd_str);
+ const char *json_str = data_msg->raw_json;
+ const char *message_id = data_msg->message_id;
+ const char *cmd_str = data_msg->command_str;
- switch (cmd) {
- case LN_WS_RECV_CHARACTER_CHANGE: {
+ printf("[WS] cmd=%d message_id=%s cmd_str=%s\n", (int)type, message_id ? message_id : "", cmd_str ? cmd_str : "");
+
+ switch (type) {
+ case WS_CMD_CHARACTER_CHANGE: {
printf("[WS] CharacterChange:角色切换\n");
break;
}
- case LN_WS_RECV_CHARACTER_CONFIG_CHANGE: {
+ case WS_CMD_CHARACTER_CONFIG_CHANGE: {
printf("[WS] CharacterConfigChange:角色配置更改(CharacterConfigChange)\n");
- // 通知设备切换到指定角色
if(json_str)
{
- ln_parse_character_config(json_str, strlen(json_str));
+ ln_parse_character_config(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_SLEEP_MODE_START: {
+ case WS_CMD_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));
+ // ln_parse_sleep_mode_start(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_SLEEP_MODE_END: {
+ case WS_CMD_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));
+ // ln_parse_sleep_mode_end(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_DEVICE_BIND: {
+ case WS_CMD_DEVICE_BIND: {
printf("[WS] DeviceBind:设备绑定\n");
- // 通知设备已被用户绑定
+ uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND);
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));
+ // ln_parse_device_bind(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_DEVICE_UNBIND: {
+ case WS_CMD_DEVICE_UNBIND: {
printf("[WS] DeviceUnbind:设备解绑\n");
- // 通知设备已被用户解绑
+ do_restore_factory_setting();
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));
+ // ln_parse_device_unbind(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_SCHEDULE_REMINDER: {
+ case WS_CMD_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));
+ ln_parse_schedule_reminder(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_SCHEDULE_REMINDER_CFG: {
+ case WS_CMD_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));
+ ln_parse_schedule_reminder_config(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_DOWNLOAD_EMOJI: {
+ case WS_CMD_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));
+ // ln_parse_download_emoji(json_str, (int)strlen(json_str));
}
break;
}
- case LN_WS_RECV_DELETE_EMOJI: {
+ case WS_CMD_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));
+ // ln_parse_delete_emoji(json_str, (int)strlen(json_str));
}
break;
}
+ case WS_CMD_PING: {
+ printf("[WS] Ping\n");
+ break;
+ }
+ case WS_CMD_PONG: {
+ printf("[WS] Pong\n");
+ break;
+ }
default: {
- printf("[WS] Unknown command=%s\n", cmd_str);
+ printf("[WS] Unknown command=%s\n", cmd_str ? cmd_str : "");
break;
}
}
- cJSON_Delete(root);
}
/* ============================ WebSocket 业务消息 上层处理 End============================ */
if (mail.cmd == LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN)
{
printf("LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN:获取雷鸟设备Token\n");
- ln_get_device_token_http(uapi_ln_get_device_id(), uapi_ln_get_device_iccid(), uapi_ln_get_device_model(), uapi_ln_get_device_version());
+ uint32_t ret = ln_get_device_token_http(uapi_ln_get_device_id(), uapi_ln_get_device_iccid(), uapi_ln_get_device_model(), uapi_ln_get_device_version());
+ if (ret == ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 获取雷鸟设备Token成功\n");
+ ret = ln_ws_start(ln_ws_process_message);
+ if (ret != 0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 启动WebSocket失败: %d\n", ret);
+ }
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 获取雷鸟设备Token失败\n");
+ }
}
else if (mail.cmd == LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM)
{
printf("LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM\n");
- ln_speech_chat_stream_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_speechchat_audio_path());
+ ln_speech_chat_stream_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_audio_path());
}
else if (mail.cmd == LN_HTTP_SERVICE_CMD_STORY_CHOOSE)
{
printf("LN_HTTP_SERVICE_CMD_STORY_CHOOSE:选择故事\n");
- ln_story_choose_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_story_choose_audio_path());
+ ln_story_choose_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_audio_path());
}
else if (mail.cmd == LN_HTTP_SERVICE_CMD_STORY_RANDOM)
{
(void)uapi_ln_device_get_user_id(&st, g_ln_device_user_id, sizeof(g_ln_device_user_id));
/* 将内部状态映射为上层更直观的 0/1/2/3 */
if (st == LN_DEVICE_BIND_STATUS_UNBOUND ) {
- g_ln_is_device_bound = 0;//未绑定
+ uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_UNBOUND);//未绑定
} else if (st == LN_DEVICE_BIND_STATUS_BOUND) {
- g_ln_is_device_bound = 1;//已绑定
+ uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND);//已绑定
} else if (st == LN_DEVICE_BIND_STATUS_AUTH_FAILURE) {
- g_ln_is_device_bound = 2;//认证失败
+ uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_AUTH_FAILURE);//认证失败
} else {
- g_ln_is_device_bound = 3;//其他错误
+ uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_ERROR);//其他错误
g_ln_device_user_id[0] = '\0';
}
printf("LN_HTTP_SERVICE_CMD_GET_USER_ID:获取设备绑定用户ID: %s\n", uapi_ln_get_user_id());
#define LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD 0x51 /* 触发 OTA 包下载(根据 getTask 的返回 packageUrl)*/
#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_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_HTTP_SERVICE_CMD_AUDIO_PLAY 0x1001 /* 播放音频 */
#define LN_HTTP_SERVICE_CMD_AUDIO_STOP 0x1002 /* 停止播放音频 */
int uapi_ln_ota_get_update_type(void);
/* OTA 下载保存的最后一个文件路径(无则返回NULL)*/
const char *uapi_ln_ota_get_saved_path(void);
-/* 获取语音对话流录音音频路径 */
-const char *uapi_ln_get_speechchat_audio_path(void);
-/* 获取选择故事录音音频路径 */
-const char *uapi_ln_get_story_choose_audio_path(void);
+/* 获取选择录音音频路径 */
+const char *uapi_ln_get_audio_path(void);
/* 音频下载/播放控制 */
void uapi_ln_audio_download_is_cancel(int status);
/* 获取是否绑定用户 */
-uint32_t uapi_ln_is_device_bound(void);
+int uapi_ln_is_device_bound(void);
/* 设置是否绑定用户 */
-void uapi_ln_set_device_bound(void);
+void uapi_ln_set_device_bound(int val);
/* 获取设备绑定用户ID */
const char *uapi_ln_get_user_id(void);
/* 获取设备角色配置 */
/* WebSocket命令枚举 */
typedef enum {
- WS_CMD_UNKNOWN = 0,
- WS_CMD_CHARACTER_CHANGE,
- WS_CMD_CHARACTER_CONFIG_CHANGE,
- WS_CMD_SLEEP_MODE_START,
- WS_CMD_SLEEP_MODE_END,
- WS_CMD_DEVICE_BIND,
- WS_CMD_DEVICE_UNBIND,
- WS_CMD_SCHEDULE_REMINDER,
- WS_CMD_SCHEDULE_REMINDER_CFG,
- WS_CMD_DOWNLOAD_EMOJI,
- WS_CMD_DELETE_EMOJI,
- WS_CMD_PING,
- WS_CMD_PONG,
- WS_CMD_MAX
+ WS_CMD_UNKNOWN = 0, /* 未知命令 */
+ WS_CMD_CHARACTER_CHANGE, /* 角色切换 (CharacterChange) */
+ WS_CMD_CHARACTER_CONFIG_CHANGE, /* 角色配置更改 (CharacterConfigChange) */
+ WS_CMD_SLEEP_MODE_START, /* 哄睡模式开始 (SleepModeStart) */
+ WS_CMD_SLEEP_MODE_END, /* 哄睡模式结束 (SleepModeEnd) */
+ WS_CMD_DEVICE_BIND, /* 设备绑定 (DeviceBind) */
+ WS_CMD_DEVICE_UNBIND, /* 设备解绑 (DeviceUnbind) */
+ WS_CMD_SCHEDULE_REMINDER, /* 日程提醒 (ScheduleReminder) */
+ WS_CMD_SCHEDULE_REMINDER_CFG, /* 日程提醒配置 (ScheduleReminderConfig) */
+ WS_CMD_DOWNLOAD_EMOJI, /* 下载表情 (DownloadEmoji) */
+ WS_CMD_DELETE_EMOJI, /* 删除表情 (DeleteEmoji) */
+ WS_CMD_PING, /* 心跳 (Ping) */
+ WS_CMD_PONG, /* 心跳回应 (Pong) */
+ WS_CMD_MAX /* 最大命令 */
} ws_command_t;
/* 消息数据结构 */
/* 消息处理回调函数类型 */
typedef void (*ws_message_callback_t)(const ws_data_msg_t *data_msg, ws_command_t type);
+/* -------------------------------- 注册进的回调函数 -------------------------------- */
+void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type);
+/* -------------------------------------------------------------------------- */
+
/* WebSocket接口函数 */
int ln_ws_start(ws_message_callback_t callback);
int ln_ws_send_text(const char *text);