From 59c1bcfd940f3ba088a97a1e0a38a42a8d5ac2e5 Mon Sep 17 00:00:00 2001 From: cheng Date: Sat, 20 Sep 2025 22:35:04 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96=E5=BD=95?= =?utf8?q?=E9=9F=B3=E8=B7=AF=E5=BE=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../src/ThunderBirdDialogueView.cpp | 1 + .../thunderbird/src/ThunderBirdModel.cpp | 2 +- .../zhihui/leiniao/imsl_ln/leiniao_api_at.c | 2 +- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 227 +++++------------- code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 55 ++--- 5 files changed, 89 insertions(+), 198 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp index 2a837b370..3a66221cf 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp @@ -1,6 +1,7 @@ #include "thunderbird/include/ThunderBirdDialogueView.h" #include "thunderbird/include/ThunderBirdModel.h" #include "wearable_log.h" +#include namespace OHOS diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index f07359f64..f9ae3683a 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -333,7 +333,7 @@ return false; } g_isRecording = true;//设置录音状态 - std::string audioPath = uapi_ln_get_story_choose_audio_path(); + std::string audioPath = uapi_ln_get_audio_path(); if(audioPath.empty()) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 故事选择的录音文件路径为空"); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c index bff370a6d..7f2f022d6 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c @@ -601,7 +601,7 @@ static uint32_t ln_device_set_userid_at(uint8_t *para, uint32_t paraLen, char *s VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); printf("[LN][DEVICE_SET_USER_ID]\n"); - uapi_ln_set_device_bound(); + uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND); return ERRCODE_SUCC; } /* OTA-获取升级任务:AT^LN_OTA_GET_TASK */ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 84c6e1173..86ed32aaa 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -127,26 +127,15 @@ const char *uapi_ln_ota_get_saved_path(void) 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; } @@ -165,7 +154,7 @@ void uapi_ln_audio_download_is_cancel(int status) } /* 获取是否绑定用户 */ -uint32_t uapi_ln_is_device_bound(void) +int uapi_ln_is_device_bound(void) { return g_ln_is_device_bound; } @@ -176,9 +165,9 @@ const char* uapi_ln_get_user_id(void) 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; } /* 获取设备角色配置 */ @@ -486,213 +475,112 @@ static void handle_ota_download_msg(const OtaDownloadMsg *msg) /* ============================ 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============================ */ @@ -1189,17 +1077,30 @@ static void ln_http_server_send_task(void const *arg) 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) { @@ -1231,13 +1132,13 @@ static void ln_http_server_send_task(void const *arg) (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()); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index d88185318..879a7168a 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -86,19 +86,6 @@ typedef struct #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 /* 停止播放音频 */ @@ -208,16 +195,14 @@ void uapi_ln_clear_device_token(void); 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); /* 获取设备角色配置 */ @@ -326,20 +311,20 @@ uint32_t ln_emoji_report_all_http(const char *device_id, /* 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; /* 消息数据结构 */ @@ -355,6 +340,10 @@ typedef struct { /* 消息处理回调函数类型 */ 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); -- 2.17.1