From 961c10c6d6d89ecefe81b8bb06cc306600ce2e28 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 24 Sep 2025 20:55:13 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0haisi=20websocket=E6=8E=A5?= =?utf8?q?=E5=8F=A3=20=E5=A2=9E=E5=8A=A0ai2.5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/service_init.c | 10 + .../brandy-native-js-fd230/libwebsocket.a | Bin 59696 -> 398220 bytes .../libwebsocket.a | Bin 59696 -> 61148 bytes .../brandy-native-js/libwebsocket.a | Bin 59696 -> 61148 bytes .../websocket/include/net_websocket_type.h | 4 +- .../modules/websocket/websocket_module.cpp | 2 +- code/sdk/zhihui/CMakeLists.txt | 1 + code/sdk/zhihui/ai/include/ai_media.h | 12 +- .../zhihui/ai/media/ai_media_service_ext.cpp | 57 +- .../sdk/zhihui/ai/src/ai_connection_manager.c | 2 +- code/sdk/zhihui/ai_new/CMakeLists.txt | 1 + code/sdk/zhihui/ai_new/ai_V2.5/CMakeLists.txt | 60 + code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_api.h | 95 ++ .../zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.cpp | 160 +++ .../zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.h | 32 + .../zhihui/ai_new/ai_V2.5/ai_v2_5_main.cpp | 1011 +++++++++++++++++ code/sdk/zhihui/ai_old/zhihui_ws.cpp | 455 +++++++- .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 7 +- code/sdk/zhihui/websocket/CMakeLists.txt | 2 + .../zhihui/websocket/os_ws/haisi_websocket.c | 851 ++++++++++++++ .../zhihui/websocket/os_ws/haisi_websocket.h | 73 ++ .../zhihui/websocket/src/zhihui_websocket.c | 2 +- 22 files changed, 2768 insertions(+), 69 deletions(-) create mode 100644 code/sdk/zhihui/ai_new/CMakeLists.txt create mode 100644 code/sdk/zhihui/ai_new/ai_V2.5/CMakeLists.txt create mode 100644 code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_api.h create mode 100644 code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.cpp create mode 100644 code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.h create mode 100644 code/sdk/zhihui/ai_new/ai_V2.5/ai_v2_5_main.cpp create mode 100644 code/sdk/zhihui/websocket/os_ws/haisi_websocket.c create mode 100644 code/sdk/zhihui/websocket/os_ws/haisi_websocket.h diff --git a/code/sdk/application/brandy/brandy_standard/service_init.c b/code/sdk/application/brandy/brandy_standard/service_init.c index c507d3973..9b7fedc2c 100644 --- a/code/sdk/application/brandy/brandy_standard/service_init.c +++ b/code/sdk/application/brandy/brandy_standard/service_init.c @@ -109,6 +109,10 @@ #include "ai_old_at_cmd.h" #endif +#ifdef SUPPORT_ZHIHUI_AI_NEW +#include "ai_V2_5_at_cmd.h" +#endif + static void register_at_service(void) { #ifdef SUPPORT_AT_GRAPHIC @@ -189,6 +193,12 @@ static void register_at_service(void) at_cmd_add_moudle(ai_old_table, ai_old_cmd_count); #endif +#ifdef SUPPORT_ZHIHUI_AI_NEW + uint32_t ai_new_cmd_count; + at_cmd_table_t *ai_new_table = get_ai_2_5_cmd_table(&ai_new_cmd_count); + at_cmd_add_moudle(ai_new_table, ai_new_cmd_count); +#endif + #ifdef SUPPORT_AT_LIS2DOC uint32_t lis2doc_cmd_count; at_cmd_table_t *lis2doc_table = get_lis2doc_cmd_table(&lis2doc_cmd_count); diff --git a/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a b/code/sdk/open_source/openharmony/foundation/ace/ace_engine_lite/brandy-native-js-fd230/libwebsocket.a index 93b5e6f80fc437ea9ae1fe4187d8ab987618dd84..909c556d0afcd5d7aed86f50c6e18e2e03cacd84 100644 GIT binary patch literal 398220 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≶`n(jPTC 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%0A(Nc3}x$yXjYXLuCuMko2p(DGrx= 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 literal 59696 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 + captureConfig.channelCount = context->channelCount; captureConfig.linkDir = AUDIO_DOWN_LINK; - captureConfig.sampleRate = SAMPLERATE_16000; + captureConfig.sampleRate = context->sampleRate; captureConfig.sessionID = context->sessionId; captureConfig.streamType = AUDIO_STREAM_VOICE_ASSISTANT; @@ -250,10 +261,10 @@ static int32_t LocalAIVoiceStart(AIVoiceContext *context) // create uplink AudioStreamOut AudioRendererConfig renderConfig = {}; - renderConfig.audioFormat = MP3; - renderConfig.channelCount = 1; + renderConfig.audioFormat = context->audioFormat; + renderConfig.channelCount = context->channelCount; renderConfig.linkDir = AUDIO_UP_LINK; - renderConfig.sampleRate = SAMPLERATE_16000; + renderConfig.sampleRate = context->sampleRate; renderConfig.sessionID = context->sessionId; renderConfig.streamType = AUDIO_STREAM_VOICE_ASSISTANT; @@ -327,7 +338,7 @@ static int32_t CreateAIVoiceInputThread(AIVoiceContext *context) task_cfg.create_queue_handle = NULL; task_cfg.attr.name = "AIVoiceInputThread"; - task_cfg.attr.priority = (osPriority_t)16; // 使用合适的优先级 + task_cfg.attr.priority = (osPriority_t)24; // 使用合适的优先级 task_cfg.attr.stack_size = 0x2000; // 8KB栈空间 task_cfg.func = AIVoiceInputThreadFunc; task_cfg.use_mem = USE_EXTEND_MEM; @@ -622,7 +633,8 @@ static void AIVoiceThread(void *priv) // 简单清理,避免复杂的互斥锁操作 printf("AI voice thread cleanup completed\r\n"); } -int32_t old_Start_AIVoice(AIVoiceDataCallback dataCallback, void* userData) +int32_t old_Start_AIVoice(AIVoiceDataCallback dataCallback, void* userData, + const AIVoiceAudioParams* audioParams) { MEDIA_ERR_LOG("StartAIVoice"); app_task_definition_t task_cfg; @@ -653,6 +665,21 @@ int32_t old_Start_AIVoice(AIVoiceDataCallback dataCallback, void* userData) // 设置回调函数 g_aiVoiceContext->dataCallback = dataCallback; g_aiVoiceContext->callbackUserData = userData; + + // 设置音频参数(如果未传入则使用默认值) + if (audioParams != nullptr) { + g_aiVoiceContext->audioFormat = (AudioCodecFormat)audioParams->audioFormat; + g_aiVoiceContext->channelCount = audioParams->channelCount; + g_aiVoiceContext->sampleRate = audioParams->sampleRate; + MEDIA_INFO_LOG("Using custom audio params: format=%d, channels=%u, sampleRate=%u", + audioParams->audioFormat, audioParams->channelCount, audioParams->sampleRate); + } else { + g_aiVoiceContext->audioFormat = DEFAULT_AUDIO_FORMAT; + g_aiVoiceContext->channelCount = DEFAULT_CHANNEL_COUNT; + g_aiVoiceContext->sampleRate = DEFAULT_SAMPLE_RATE; + MEDIA_INFO_LOG("Using default audio params: format=%d, channels=%u, sampleRate=%u", + DEFAULT_AUDIO_FORMAT, DEFAULT_CHANNEL_COUNT, DEFAULT_SAMPLE_RATE); + } MediaMutexUnLock(mutex); MediaThreadJoin(&g_aiVoiceContext->taskHandle); @@ -824,7 +851,16 @@ static void ExampleAIVoiceDataCallback(const uint8_t* data, uint32_t size, void* } // 使用示例: -// int32_t result = old_Start_AIVoice(ExampleAIVoiceDataCallback, nullptr); +// 1. 使用默认参数 +// int32_t result = old_Start_AIVoice(ExampleAIVoiceDataCallback, nullptr, nullptr); +// +// 2. 使用自定义参数 +// AIVoiceAudioParams audioParams = { +// .audioFormat = MP3, +// .channelCount = 1, +// .sampleRate = 16000 +// }; +// int32_t result = old_Start_AIVoice(ExampleAIVoiceDataCallback, nullptr, &audioParams); // // 队列使用示例: // uint8_t audioData[] = {0x01, 0x02, 0x03, 0x04}; @@ -878,6 +914,7 @@ int32_t AI_WriteAudioData(const uint8_t* data, uint32_t size) // MEDIA_INFO_LOG("Successfully wrote %u bytes of audio data to output stream", size); return 0; } + /** * @brief 检查AI语音服务是否正在运行 * @return true 正在运行,false 未运行 diff --git a/code/sdk/zhihui/ai/src/ai_connection_manager.c b/code/sdk/zhihui/ai/src/ai_connection_manager.c index 37a845f76..9ff161b14 100644 --- a/code/sdk/zhihui/ai/src/ai_connection_manager.c +++ b/code/sdk/zhihui/ai/src/ai_connection_manager.c @@ -1075,7 +1075,7 @@ static ai_error_t websocket_connect(ai_connection_info_t *conn_info) AI_LOGI("Creating WebSocket client for service %s", g_service_names[conn_info->service_type]); conn_info->websocket = WebSocketClientConstructor(websocket_on_connected, websocket_on_message, - websocket_on_error, websocket_on_disconnected); + websocket_on_error, websocket_on_disconnected); if (conn_info->websocket < 0) { AI_LOGE("Failed to create WebSocket client: %d", conn_info->websocket); return AI_ERROR_MEMORY_ALLOC; diff --git a/code/sdk/zhihui/ai_new/CMakeLists.txt b/code/sdk/zhihui/ai_new/CMakeLists.txt new file mode 100644 index 000000000..5e4bf76c6 --- /dev/null +++ b/code/sdk/zhihui/ai_new/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory_if_exist(ai_V2.5) \ No newline at end of file diff --git a/code/sdk/zhihui/ai_new/ai_V2.5/CMakeLists.txt b/code/sdk/zhihui/ai_new/ai_V2.5/CMakeLists.txt new file mode 100644 index 000000000..8287dc772 --- /dev/null +++ b/code/sdk/zhihui/ai_new/ai_V2.5/CMakeLists.txt @@ -0,0 +1,60 @@ +#=============================================================================== +# @brief cmake file +# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. +#=============================================================================== + +set(COMPONENT_NAME "ai_V2.5") + +set(PUBLIC_HEADER +${CMAKE_CURRENT_SOURCE_DIR} +) +set(PRIVATE_HEADER +${ROOT_DIR}/open_source/openharmony/third_party/cJSON +${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/netstack/websocket/include +${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include +${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include +${ROOT_DIR}/zhihui/websocket/os_ws +${ROOT_DIR}/zhihui/ai/include +) + +set(SOURCES +${CMAKE_CURRENT_SOURCE_DIR}/ai_V2_5_at_cmd.cpp +${CMAKE_CURRENT_SOURCE_DIR}/ai_v2_5_main.cpp +) + +set(COMPONENT_PUBLIC_CCFLAGS +) + +set(COMPONENT_CCFLAGS + -std=c++11 + -Wno-error + -Wno-unused-parameter + -fno-exceptions + -fno-unwind-tables + -fno-asynchronous-unwind-tables + -Wno-undef + -Wno-bitwise-op-parentheses + -Wno-shift-op-parentheses + -nostdlibinc + -nostdinc + -nostdlib + -Wno-c++11-narrowing + -Wno-error=unused-function +) + +set(WHOLE_LINK + true +) + +set(MAIN_COMPONENT + false +) + +set(PUBLIC_DEFINES +SUPPORT_ZHIHUI_AI_NEW +) + +set(PRIVATE_DEFINES +) + +build_component() diff --git a/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_api.h b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_api.h new file mode 100644 index 000000000..6cb7453ab --- /dev/null +++ b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_api.h @@ -0,0 +1,95 @@ +/** + * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n + * + * Description: Provides at cmd register func \n + * Author: @CompanyNameTag \n + * History: \n + * 2022-07-20, Create file. \n + */ +#ifndef AI_V2_5_API_H +#define AI_V2_5_API_H + +#include +#include +#include "errcode.h" +#include "soc_osal.h" +#include "at_cmd_api.h" + +/* AI音频参数配置 - 与ai_generate_start_config保持一致 */ +#define AI_AUDIO_FORMAT_PCM 0 // PCM格式 +#define AI_AUDIO_FORMAT_MP3 1 // MP3格式 +#define AI_DEFAULT_AUDIO_FORMAT AI_AUDIO_FORMAT_PCM +#define AI_DEFAULT_SAMPLE_RATE 16000 // 16kHz采样率 +#define AI_DEFAULT_CHANNEL_COUNT 1 // 单声道 +#define AI_DEFAULT_BIT_RATE 16 // 16位比特率 + +/* AI事件类型枚举 */ +typedef enum { + AI_EVENT_AUDIO_CREATE = 0, // 音频创建事件 + AI_EVENT_AUDIO_COMPLETED, // 音频完成事件 + AI_EVENT_CANCEL, // 取消事件 + AI_EVENT_AUDIO_PLAYED, // 音频播放完成事件 + + // ASR事件 + AI_EVENT_ASR_STARTED, // ASR开始事件 + AI_EVENT_ASR_RESULT, // ASR结果事件 + AI_EVENT_ASR_COMPLETED, // ASR完成事件 + + // LLM事件 + AI_EVENT_LLM_CREATED, // LLM创建事件 + AI_EVENT_LLM_DELTA, // LLM增量事件 + AI_EVENT_LLM_COMPLETED, // LLM完成事件 + AI_EVENT_LLM_DONE, // LLM结束事件 + + // TTS事件 + AI_EVENT_TTS_CREATED, // TTS创建事件 + AI_EVENT_TTS_STARTED, // TTS开始事件 + AI_EVENT_TTS_COMPLETED, // TTS完成事件 + + AI_EVENT_MAX // 事件类型总数 +} ai_event_type_t; + +/* AI事件数据结构体 */ +typedef struct { + ai_event_type_t event_type; // 事件类型 + char content[256]; // 事件内容(如ASR结果、LLM内容等) + char dialog_id[128]; // 对话ID + char sid[128]; // 会话ID +} ai_event_data_t; + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +int ai_service_start(void); + +/* JSON配置生成函数 */ +char* ai_generate_start_config(const char* device_id, const char* bot_id, + const char* workflow_id, const char* voice_name); +void ai_free_json_string(char* json_string); +void ai_print_start_config(void); +void ai_test_json_generation(void); + +/* AI配置发送函数 */ +int ai_send_start_config(void); +int ai_send_custom_start_config(const char* device_id, const char* bot_id, + const char* workflow_id, const char* voice_name); + +/* AI事件发送函数 */ +int ai_send_event(ai_event_type_t event_type); +const char* ai_get_event_name(ai_event_type_t event_type); + +/* AI事件解析函数 */ +ai_event_type_t ai_parse_event(const char* json_string, ai_event_data_t* event_data); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif diff --git a/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.cpp b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.cpp new file mode 100644 index 000000000..999f600e2 --- /dev/null +++ b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.cpp @@ -0,0 +1,160 @@ + +#include "at_cmd_api.h" +#include "pm_control.h" +#include "cat1_server.h" +#include "ai_old_at_cmd.h" +#include "cat1_ctl.h" +#include +#include +#include +#include +#include +#include +#include "ai_V2_5_api.h" + + +// #include "phoneaddressmodel.h" // Commented out due to missing header + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ +#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) +#define PPG_MAX_ARGC 8 +#define PPG_MAX_ARGV_LEN 64 + +#define PPG_SUCCESS 0 +#define PPG_FAILED (-1) + +#include "app_at_process.h" +#include "zhihui_ws.h" +#include "websocket_test.h" +#include "cmsis_os2.h" +#include "chat_https_servrt.h" + +static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen, + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN], uint32_t* argc) +{ + uint32_t pos = 0; + *argc = 0; + + for (uint32_t i = 0; i < paraLen; i++) { + if ((para[i] == ' ' || para[i] == '\n') && pos != 0) { + argv[*argc][pos] = '\0'; + *argc += 1; + pos = 0; + if (*argc >= PPG_MAX_ARGC) { + return PPG_FAILED; + } + } else { + argv[*argc][pos] = para[i]; + pos++; + if (pos >= PPG_MAX_ARGV_LEN) { + return PPG_FAILED; + } + } + } + if (pos != 0) { + *argc += 1; + } + + return PPG_SUCCESS; +} + + +static uint32_t Start(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + printf("ai_msg\n"); + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + ai_service_start(); + return 0; +} + +static uint32_t SendEvent(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("AI Event ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + if (argc < 1) { + printf("Usage: AT^SENDEVENT=\n"); + printf("Event types: 0=audio.create, 1=audio.completed, 2=cancel, 3=audio.played\n"); + return ERRCODE_FAIL; + } + + int event_type = atoi((char*)argv[0]); + if (event_type < 0 || event_type >= AI_EVENT_MAX) { + printf("Invalid event type: %d (valid range: 0-%d)\n", event_type, AI_EVENT_MAX - 1); + return ERRCODE_FAIL; + } + + printf("Sending AI event: %s (type=%d)\n", ai_get_event_name((ai_event_type_t)event_type), event_type); + ret = ai_send_event((ai_event_type_t)event_type); + + if (ret == 0) { + printf("Event sent successfully\n"); + return ERRCODE_SUCC; + } else { + printf("Failed to send event, ret=%d\n", ret); + return ERRCODE_FAIL; + } +} + +static uint32_t ListEvents(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(para); + UNUSED(paraLen); + UNUSED(strCommonCmd); + + printf("Available AI Events:\n"); + printf("0 - %s\n", ai_get_event_name(AI_EVENT_AUDIO_CREATE)); + printf("1 - %s\n", ai_get_event_name(AI_EVENT_AUDIO_COMPLETED)); + printf("2 - %s\n", ai_get_event_name(AI_EVENT_CANCEL)); + printf("3 - %s\n", ai_get_event_name(AI_EVENT_AUDIO_PLAYED)); + printf("4 - %s\n", ai_get_event_name(AI_EVENT_ASR_STARTED)); + printf("5 - %s\n", ai_get_event_name(AI_EVENT_ASR_RESULT)); + printf("6 - %s\n", ai_get_event_name(AI_EVENT_ASR_COMPLETED)); + printf("7 - %s\n", ai_get_event_name(AI_EVENT_LLM_CREATED)); + printf("8 - %s\n", ai_get_event_name(AI_EVENT_LLM_DELTA)); + printf("9 - %s\n", ai_get_event_name(AI_EVENT_LLM_COMPLETED)); + printf("10 - %s\n", ai_get_event_name(AI_EVENT_LLM_DONE)); + printf("11 - %s\n", ai_get_event_name(AI_EVENT_TTS_CREATED)); + printf("12 - %s\n", ai_get_event_name(AI_EVENT_TTS_STARTED)); + printf("13 - %s\n", ai_get_event_name(AI_EVENT_TTS_COMPLETED)); + printf("Usage: AT^SENDEVENT=\n"); + + return ERRCODE_SUCC; +} + + + +static const at_cmd_table_t g_ai_25_cmd[] = { + { (char *)"AT^STARTAI", Start, (char *)"1" }, + { (char *)"AT^SENDEVENT", SendEvent, (char *)"1" }, + { (char *)"AT^LISTEVENTS", ListEvents, (char *)"0" }, +}; + +at_cmd_table_t *get_ai_2_5_cmd_table(uint32_t *cmd_count) +{ + *cmd_count = ARRAY_COUNT(g_ai_25_cmd); + return (at_cmd_table_t *)g_ai_25_cmd; +} +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ \ No newline at end of file diff --git a/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.h b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.h new file mode 100644 index 000000000..746f5063d --- /dev/null +++ b/code/sdk/zhihui/ai_new/ai_V2.5/ai_V2_5_at_cmd.h @@ -0,0 +1,32 @@ +/** + * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n + * + * Description: Provides at cmd register func \n + * Author: @CompanyNameTag \n + * History: \n + * 2022-07-20, Create file. \n + */ +#ifndef AI_NEW_2_5_AT_CMD_H +#define AI_NEW_2_5_AT_CMD_H + +#include +#include +#include "errcode.h" +#include "soc_osal.h" +#include "at_cmd_api.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +at_cmd_table_t *get_ai_2_5_cmd_table(uint32_t *cmd_count); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif diff --git a/code/sdk/zhihui/ai_new/ai_V2.5/ai_v2_5_main.cpp b/code/sdk/zhihui/ai_new/ai_V2.5/ai_v2_5_main.cpp new file mode 100644 index 000000000..132131882 --- /dev/null +++ b/code/sdk/zhihui/ai_new/ai_V2.5/ai_v2_5_main.cpp @@ -0,0 +1,1011 @@ +/* ============================== AI V2.5 主程序 ============================== */ + +#include +#include +#include +#include +#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h" +#include "haisi_websocket.h" +#include "ai_media.h" +#include "ai_V2_5_api.h" +#include "audio_base_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +void ai_print_start_config(void); +char* ai_generate_start_config(const char* device_id, const char* bot_id, + const char* workflow_id, const char* voice_name); + +int ai_send_start_config(void); + +void ai_free_json_string(char* json_string); +/* ============================== 全局变量 ============================== */ + +static int g_ai_running = 0; // AI服务运行状态 + +/* ============================== WebSocket回调函数 ============================== */ + +// {"event":"started","sid":"37efa28576ae4afe8129efcf8677b82e"} + +// { +// "event": "audio.create", +// "payload": {} +// } + +uint8_t asr_is_start=0; + +/** + * @brief 文本消息处理回调函数 + * @param raw_data 原始消息数据 + * @param timestamp 消息时间戳 + */ +static void ai_message_handler(const char *raw_data, uint32_t timestamp) +{ + printf("[AI] Received text message at %u: %s\n", timestamp, raw_data); + + // 解析事件数据 + ai_event_data_t event_data; + ai_event_type_t event_type = ai_parse_event(raw_data, &event_data); + + if (event_type == AI_EVENT_MAX) { + printf("[AI] Failed to parse event or unknown event type\n"); + return; + } + + printf("[AI] Parsed event: %s, content: %s, dialog_id: %s, sid: %s\n", + ai_get_event_name(event_type), event_data.content, event_data.dialog_id, event_data.sid); + + // 根据事件类型进行相应处理 + switch (event_type) { + + case AI_EVENT_ASR_STARTED: + printf("[AI] Handling asr.started event\n"); + // TODO: 处理ASR开始事件 + asr_is_start=1; + break; + + case AI_EVENT_ASR_RESULT: + printf("[AI] Handling asr.result event, content: %s\n", event_data.content); + // TODO: 处理ASR结果事件 + asr_is_start=0; + break; + + case AI_EVENT_ASR_COMPLETED: + printf("[AI] Handling asr.completed event\n"); + // TODO: 处理ASR完成事件 + break; + + case AI_EVENT_LLM_CREATED: + printf("[AI] Handling llm.created event\n"); + // TODO: 处理LLM创建事件 + break; + + case AI_EVENT_LLM_DELTA: + printf("[AI] Handling llm.delta event, content: %s\n", event_data.content); + // TODO: 处理LLM增量事件 + break; + + case AI_EVENT_LLM_COMPLETED: + printf("[AI] Handling llm.completed event, content: %s\n", event_data.content); + // TODO: 处理LLM完成事件 + break; + + case AI_EVENT_LLM_DONE: + printf("[AI] Handling llm.done event\n"); + // TODO: 处理LLM结束事件 + break; + + case AI_EVENT_TTS_CREATED: + printf("[AI] Handling tts.created event\n"); + // TODO: 处理TTS创建事件 + break; + + case AI_EVENT_TTS_STARTED: + printf("[AI] Handling tts.started event\n"); + // TODO: 处理TTS开始事件 + break; + + case AI_EVENT_TTS_COMPLETED: + printf("[AI] Handling tts.completed event\n"); + // TODO: 处理TTS完成事件 + break; + + default: + printf("[AI] Unknown event type: %d\n", event_type); + break; + } +} + +/** + * @brief 二进制消息处理回调函数 + * @param raw_data 原始二进制数据 + * @param timestamp 消息时间戳 + * @param data_len 数据长度 + */ +static void ai_binary_message_handler(const uint8_t *raw_data, uint32_t timestamp, uint16_t data_len) +{ + printf("[AI] Received binary message at %u, length: %d bytes\n", timestamp, data_len); + + // TODO: 处理二进制数据(如音频数据) + // TODO: 根据数据长度和内容进行相应处理 + // TODO: 调用音频处理逻辑 + AI_SendAudioDataToQueue(raw_data,data_len); + + // 打印前几个字节用于调试 + // if (data_len > 0 && raw_data != NULL) { + // printf("[AI] Binary data preview (first 16 bytes): "); + // int preview_len = (data_len > 16) ? 16 : data_len; + // for (int i = 0; i < preview_len; i++) { + // printf("%02X ", raw_data[i]); + // } + // printf("\n"); + // } +} + +/** + * @brief URL构建回调函数 + * @param url URL输出缓冲区 + * @param url_size URL缓冲区大小 + * @param header_buf Header输出缓冲区 + * @param header_size Header缓冲区大小 + */ +static void ai_url_handler(char *url, size_t url_size, char *header_buf, size_t header_size) +{ + printf("[AI] Building WebSocket URL and headers\n"); + snprintf(url, url_size, "ws://118.145.158.207:22080/vc/chat"); + +} + +/** + * @brief 心跳处理回调函数 + * @return 1表示需要发送心跳,0表示不需要 + */ +static int ai_heartbeat_handler(void) +{ + printf("[AI] Heartbeat check\n"); + + // TODO: 实现心跳逻辑 + // TODO: 检查是否需要发送心跳 + // TODO: 发送心跳消息 + + return 0; // 暂时不发送心跳 +} + +/** + * @brief 连接事件回调函数 + * @param event_type 事件类型 + */ +static void ai_event_handler(ws_event_type_t event_type) +{ + switch (event_type) { + case WS_EVENT_CONNECTING: + printf("[AI] WebSocket connecting...\n"); + // TODO: 连接开始处理 + break; + + case WS_EVENT_CONNECTED: + printf("[AI] WebSocket connected successfully!\n"); + // TODO: 连接成功处理 + // TODO: 发送初始化消息 + ai_send_start_config(); + break; + + case WS_EVENT_DISCONNECTED: + printf("[AI] WebSocket disconnected\n"); + asr_is_start=0; + // TODO: 连接断开处理 + // TODO: 清理资源 + break; + } +} + +/* ============================== AI配置发送函数 ============================== */ + +/** + * @brief 发送AI启动配置JSON + * @return 0成功,-1失败 + */ + int ai_send_start_config(void) +{ + printf("[AI] Sending AI start configuration...\n"); + + // 生成AI启动配置JSON + char* config_json = ai_generate_start_config(NULL, NULL, NULL, NULL); + if (config_json == NULL) { + printf("[AI] Failed to generate start configuration JSON\n"); + return -1; + } + + printf("[AI] Generated configuration:\n%s\n", config_json); + + // 通过WebSocket发送配置 + int ret = uapi_ws_send_text(config_json); + if (ret == 0) { + printf("[AI] Start configuration sent successfully\n"); + } else { + printf("[AI] Failed to send start configuration, ret: %d\n", ret); + } + + // 释放JSON字符串内存 + ai_free_json_string(config_json); + + return ret; +} + +/** + * @brief 发送自定义AI启动配置JSON + * @param device_id 设备ID + * @param bot_id Coze机器人ID + * @param workflow_id Coze工作流ID + * @param voice_name 音色名称 + * @return 0成功,-1失败 + */ + int ai_send_custom_start_config(const char* device_id, const char* bot_id, + const char* workflow_id, const char* voice_name) +{ + printf("[AI] Sending custom AI start configuration...\n"); + + // 生成自定义AI启动配置JSON + char* config_json = ai_generate_start_config(device_id, bot_id, workflow_id, voice_name); + if (config_json == NULL) { + printf("[AI] Failed to generate custom start configuration JSON\n"); + return -1; + } + + printf("[AI] Generated custom configuration:\n%s\n", config_json); + + // 通过WebSocket发送配置 + int ret = uapi_ws_send_text(config_json); + if (ret == 0) { + printf("[AI] Custom start configuration sent successfully\n"); + } else { + printf("[AI] Failed to send custom start configuration, ret: %d\n", ret); + } + + // 释放JSON字符串内存 + ai_free_json_string(config_json); + + return ret; +} + +/* ============================== AI服务管理函数 ============================== */ + +/** + * @brief 初始化AI服务 + * @return 0成功,-1失败 + */ +static int ai_service_init(void) +{ + printf("[AI] Initializing AI service...\n"); + + // TODO: 初始化AI相关资源 + // TODO: 加载模型 + // TODO: 初始化其他组件 + + return 0; +} + +static void AIVoiceDataCallback_(const uint8_t* data, uint32_t size, void* userData) +{ + // MEDIA_INFO_LOG("Received audio data: size=%u bytes", size); + // 在这里处理音频数据,例如: + // - 发送到AI语音识别服务 + // - 保存到文件 + // - 进行音频处理等 + // 注意:data指针指向的缓冲区在回调函数返回后可能被释放,如需保存数据请复制 + if(asr_is_start) + { + uapi_ws_send_BIN((uint8_t*)data,size); + } + +} + + +/** + * @brief 启动AI服务 + * @return 0成功,-1失败 + */ +int ai_service_start(void) +{ + printf("[AI] Starting AI service...\n"); + + // 初始化AI服务 + if (ai_service_init() != 0) { + printf("[AI] Failed to initialize AI service\n"); + return -1; + } + + // 设置WebSocket回调 + ws_call_backs_t callbacks = { + .message_callback = ai_message_handler, + .binary_callback = ai_binary_message_handler, + .url_callback = ai_url_handler, + .heartbeat_callback = ai_heartbeat_handler, + .event_callback = ai_event_handler + }; + + // 启动WebSocket服务 + int ret = uapi_ws_start(&callbacks); + if (ret != 0) { + printf("[AI] Failed to start WebSocket service: %d\n", ret); + return -1; + } + + g_ai_running = 1; + printf("[AI] AI service started successfully\n"); + + // 创建与ai_generate_start_config一致的音频参数 + AIVoiceAudioParams audioParams = { + .audioFormat = PCM, + .channelCount = AI_DEFAULT_CHANNEL_COUNT, + .sampleRate = AI_DEFAULT_SAMPLE_RATE + }; + + printf("[AI] Starting AI voice with audio params: format=%d, channels=%u, sampleRate=%u\n", + audioParams.audioFormat, audioParams.channelCount, audioParams.sampleRate); + + old_Start_AIVoice(AIVoiceDataCallback_, nullptr, &audioParams); + + return 0; +} + +/* ============================== 测试函数 ============================== */ + +/** + * @brief 测试JSON配置生成功能 + */ +void ai_test_json_generation(void) +{ + printf("\n=== AI JSON配置生成测试 ===\n"); + + // 测试1: 使用默认参数 + printf("\n1. 使用默认参数生成配置:\n"); + ai_print_start_config(); + + // 测试2: 使用自定义参数 + printf("\n2. 使用自定义参数生成配置:\n"); + char* custom_config = ai_generate_start_config( + "DEVICE_001", + "CUSTOM_BOT_123", + "CUSTOM_WORKFLOW_456", + "zh_male_custom_voice" + ); + + if (custom_config) { + printf("[AI] Custom config:\n%s\n", custom_config); + ai_free_json_string(custom_config); + } else { + printf("[AI] Failed to generate custom config\n"); + } + + printf("=== 测试完成 ===\n\n"); +} + +/* ============================== AI事件发送函数 ============================== */ + +/** + * @brief 获取事件名称 + * @param event_type 事件类型 + * @return 事件名称字符串 + */ +const char* ai_get_event_name(ai_event_type_t event_type) +{ + switch (event_type) { + case AI_EVENT_AUDIO_CREATE: + return "audio.create"; + case AI_EVENT_AUDIO_COMPLETED: + return "audio.completed"; + case AI_EVENT_CANCEL: + return "cancel"; + case AI_EVENT_AUDIO_PLAYED: + return "audio.played"; + + // ASR事件 + case AI_EVENT_ASR_STARTED: + return "asr.started"; + case AI_EVENT_ASR_RESULT: + return "asr.result"; + case AI_EVENT_ASR_COMPLETED: + return "asr.completed"; + + // LLM事件 + case AI_EVENT_LLM_CREATED: + return "llm.created"; + case AI_EVENT_LLM_DELTA: + return "llm.delta"; + case AI_EVENT_LLM_COMPLETED: + return "llm.completed"; + case AI_EVENT_LLM_DONE: + return "llm.done"; + + // TTS事件 + case AI_EVENT_TTS_CREATED: + return "tts.created"; + case AI_EVENT_TTS_STARTED: + return "tts.started"; + case AI_EVENT_TTS_COMPLETED: + return "tts.completed"; + + default: + return "unknown"; + } +} + +/** + * @brief 发送AI事件 + * @param event_type 事件类型 + * @return 0成功,-1失败 + */ +int ai_send_event(ai_event_type_t event_type) +{ + if (event_type >= AI_EVENT_MAX) { + printf("[AI] Invalid event type: %d\n", event_type); + return -1; + } + + printf("[AI] Sending AI event: %s\n", ai_get_event_name(event_type)); + + // 生成事件JSON + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + printf("[AI] Failed to create event JSON object\n"); + return -1; + } + + // 设置event字段 + cJSON_AddStringToObject(root, "event", ai_get_event_name(event_type)); + + + + // 创建空的payload对象 + cJSON *payload = cJSON_CreateObject(); + if (payload == NULL) { + printf("[AI] Failed to create payload JSON object\n"); + cJSON_Delete(root); + return -1; + } + + cJSON_AddItemToObject(root, "payload", payload); + + // 生成JSON字符串 + char *json_string = cJSON_Print(root); + if (json_string == NULL) { + printf("[AI] Failed to print event JSON to string\n"); + cJSON_Delete(root); + return -1; + } + + printf("[AI] Generated event JSON:\n%s\n", json_string); + + // 通过WebSocket发送事件 + int ret = uapi_ws_send_text(json_string); + if (ret == 0) { + printf("[AI] Event '%s' sent successfully\n", ai_get_event_name(event_type)); + if(AI_EVENT_AUDIO_COMPLETED) + { + asr_is_start=0; + } + } else { + printf("[AI] Failed to send event '%s', ret: %d\n", ai_get_event_name(event_type), ret); + } + + // 清理资源 + free(json_string); + cJSON_Delete(root); + + return ret; +} + +/** + * @brief 解析AI事件JSON字符串 + * @param json_string JSON字符串 + * @param event_data 输出参数:事件数据结构体 + * @return 事件类型枚举,如果解析失败返回AI_EVENT_MAX + */ +ai_event_type_t ai_parse_event(const char* json_string, ai_event_data_t* event_data) +{ + if (json_string == NULL || event_data == NULL) { + printf("[AI] Invalid parameters for event parsing\n"); + return AI_EVENT_MAX; + } + + // 初始化输出参数 + event_data->event_type = AI_EVENT_MAX; + event_data->content[0] = '\0'; + event_data->dialog_id[0] = '\0'; + event_data->sid[0] = '\0'; + + printf("[AI] Parsing event JSON:\n%s\n", json_string); + + // 解析JSON + cJSON *root = cJSON_Parse(json_string); + if (root == NULL) { + printf("[AI] Failed to parse JSON string\n"); + return AI_EVENT_MAX; + } + + // 获取event字段 + cJSON *event_item = cJSON_GetObjectItem(root, "event"); + if (event_item == NULL || !cJSON_IsString(event_item)) { + printf("[AI] Missing or invalid 'event' field\n"); + cJSON_Delete(root); + return AI_EVENT_MAX; + } + + const char *event_name = event_item->valuestring; + printf("[AI] Parsed event: %s\n", event_name); + + // 获取payload字段 + cJSON *payload = cJSON_GetObjectItem(root, "payload"); + if (payload != NULL && cJSON_IsObject(payload)) { + // 获取content字段 + cJSON *content_item = cJSON_GetObjectItem(payload, "content"); + if (content_item != NULL && cJSON_IsString(content_item)) { + strncpy(event_data->content, content_item->valuestring, sizeof(event_data->content) - 1); + event_data->content[sizeof(event_data->content) - 1] = '\0'; + printf("[AI] Parsed content: %s\n", event_data->content); + } + + // 获取dialog_id字段 + cJSON *dialog_id_item = cJSON_GetObjectItem(payload, "dialog_id"); + if (dialog_id_item != NULL && cJSON_IsString(dialog_id_item)) { + strncpy(event_data->dialog_id, dialog_id_item->valuestring, sizeof(event_data->dialog_id) - 1); + event_data->dialog_id[sizeof(event_data->dialog_id) - 1] = '\0'; + printf("[AI] Parsed dialog_id: %s\n", event_data->dialog_id); + } + } + + // 获取sid字段 + cJSON *sid_item = cJSON_GetObjectItem(root, "sid"); + if (sid_item != NULL && cJSON_IsString(sid_item)) { + strncpy(event_data->sid, sid_item->valuestring, sizeof(event_data->sid) - 1); + event_data->sid[sizeof(event_data->sid) - 1] = '\0'; + printf("[AI] Parsed sid: %s\n", event_data->sid); + } + + // 根据事件名称返回对应的枚举类型 + ai_event_type_t event_type = AI_EVENT_MAX; + + if (strcmp(event_name, "audio.create") == 0) { + event_type = AI_EVENT_AUDIO_CREATE; + } else if (strcmp(event_name, "audio.completed") == 0) { + event_type = AI_EVENT_AUDIO_COMPLETED; + } else if (strcmp(event_name, "cancel") == 0) { + event_type = AI_EVENT_CANCEL; + } else if (strcmp(event_name, "audio.played") == 0) { + event_type = AI_EVENT_AUDIO_PLAYED; + } else if (strcmp(event_name, "asr.started") == 0) { + event_type = AI_EVENT_ASR_STARTED; + } else if (strcmp(event_name, "asr.result") == 0) { + event_type = AI_EVENT_ASR_RESULT; + } else if (strcmp(event_name, "asr.completed") == 0) { + event_type = AI_EVENT_ASR_COMPLETED; + } else if (strcmp(event_name, "llm.created") == 0) { + event_type = AI_EVENT_LLM_CREATED; + } else if (strcmp(event_name, "llm.delta") == 0) { + event_type = AI_EVENT_LLM_DELTA; + } else if (strcmp(event_name, "llm.completed") == 0) { + event_type = AI_EVENT_LLM_COMPLETED; + } else if (strcmp(event_name, "llm.done") == 0) { + event_type = AI_EVENT_LLM_DONE; + } else if (strcmp(event_name, "tts.created") == 0) { + event_type = AI_EVENT_TTS_CREATED; + } else if (strcmp(event_name, "tts.started") == 0) { + event_type = AI_EVENT_TTS_STARTED; + } else if (strcmp(event_name, "tts.completed") == 0) { + event_type = AI_EVENT_TTS_COMPLETED; + } + else if (strcmp(event_name, "completed") == 0) { + event_type = AI_EVENT_ASR_COMPLETED; + } + else { + printf("[AI] Unknown event type: %s\n", event_name); + } + + // 设置事件类型到结构体中 + event_data->event_type = event_type; + + cJSON_Delete(root); + + if (event_type != AI_EVENT_MAX) { + printf("[AI] Successfully parsed event: %s (type=%d)\n", event_name, event_type); + } + + return event_type; +} + +/* ============================== JSON配置生成函数 ============================== */ + +/** + * @brief 生成AI服务启动配置JSON + * @param device_id 设备ID + * @param bot_id Coze机器人ID + * @param workflow_id Coze工作流ID + * @param voice_name 音色名称 + * @return 生成的JSON字符串,需要调用者释放内存 + */ +char* ai_generate_start_config(const char* device_id, const char* bot_id, + const char* workflow_id, const char* voice_name) +{ + cJSON *root = NULL; + cJSON *payload = NULL; + cJSON *dialog_attributes = NULL; + cJSON *dialog_cfg = NULL; + cJSON *custom_variables = NULL; + cJSON *greeting = NULL; + cJSON *bot_option = NULL; + cJSON *outbound_attributes = NULL; + cJSON *outbound_cfg = NULL; + cJSON *inbound_attributes = NULL; + cJSON *interrupt_options = NULL; + cJSON *inbound_cfg = NULL; + cJSON *keywords_array = NULL; + char *json_string = NULL; + + // 创建根对象 + root = cJSON_CreateObject(); + if (root == NULL) { + printf("[AI] Failed to create root JSON object\n"); + goto error; + } + + // 设置event字段 + cJSON_AddStringToObject(root, "event", "start"); + + // 创建payload对象 + payload = cJSON_CreateObject(); + if (payload == NULL) { + printf("[AI] Failed to create payload JSON object\n"); + goto error; + } + + // 设置payload基本字段 + cJSON_AddStringToObject(payload, "device_id", device_id ? device_id : "123123123"); + cJSON_AddStringToObject(payload, "user_agent", "AudioClient/1.0"); + cJSON_AddBoolToObject(payload, "simple_response", cJSON_True); + + // 创建dialog_attributes对象 + dialog_attributes = cJSON_CreateObject(); + if (dialog_attributes == NULL) { + printf("[AI] Failed to create dialog_attributes JSON object\n"); + goto error; + } + + cJSON_AddStringToObject(dialog_attributes, "provider", "coze"); + + // 创建dialog_cfg对象 + dialog_cfg = cJSON_CreateObject(); + if (dialog_cfg == NULL) { + printf("[AI] Failed to create dialog_cfg JSON object\n"); + goto error; + } + + cJSON_AddBoolToObject(dialog_cfg, "disable_empty_prompt", cJSON_True); + + // 创建custom_variables对象 + custom_variables = cJSON_CreateObject(); + if (custom_variables == NULL) { + printf("[AI] Failed to create custom_variables JSON object\n"); + goto error; + } + cJSON_AddStringToObject(custom_variables, "name", "小瑞"); + cJSON_AddItemToObject(dialog_cfg, "custom_variables", custom_variables); + + // 创建greeting对象 + greeting = cJSON_CreateObject(); + if (greeting == NULL) { + printf("[AI] Failed to create greeting JSON object\n"); + goto error; + } + cJSON_AddBoolToObject(greeting, "enabled", cJSON_True); + cJSON_AddStringToObject(greeting, "content", ""); + cJSON_AddItemToObject(dialog_cfg, "greeting", greeting); + + // 创建bot_option对象 + bot_option = cJSON_CreateObject(); + if (bot_option == NULL) { + printf("[AI] Failed to create bot_option JSON object\n"); + goto error; + } + cJSON_AddBoolToObject(bot_option, "use_workflow", cJSON_True); + cJSON_AddStringToObject(bot_option, "bot_id", bot_id ? bot_id : "7462617881076351002"); + cJSON_AddStringToObject(bot_option, "workflow_id", workflow_id ? workflow_id : "7462621757327196187"); + cJSON_AddItemToObject(dialog_cfg, "bot_option", bot_option); + + cJSON_AddItemToObject(dialog_attributes, "cfg", dialog_cfg); + cJSON_AddItemToObject(payload, "dialog_attributes", dialog_attributes); + + // 创建outbound_attributes对象 + outbound_attributes = cJSON_CreateObject(); + if (outbound_attributes == NULL) { + printf("[AI] Failed to create outbound_attributes JSON object\n"); + goto error; + } + + cJSON_AddStringToObject(outbound_attributes, "provider", "volcengine"); + + // 创建outbound_cfg对象 + outbound_cfg = cJSON_CreateObject(); + if (outbound_cfg == NULL) { + printf("[AI] Failed to create outbound_cfg JSON object\n"); + goto error; + } + + cJSON_AddStringToObject(outbound_cfg, "format", "pcm"); + cJSON_AddNumberToObject(outbound_cfg, "sample_rate", AI_DEFAULT_SAMPLE_RATE); + cJSON_AddNumberToObject(outbound_cfg, "bit_rate", AI_DEFAULT_BIT_RATE); + cJSON_AddNumberToObject(outbound_cfg, "channel", AI_DEFAULT_CHANNEL_COUNT); + cJSON_AddNumberToObject(outbound_cfg, "volume", 100); + cJSON_AddNumberToObject(outbound_cfg, "speech_rate", 0); + cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 100); + cJSON_AddStringToObject(outbound_cfg, "voice", voice_name ? voice_name : "zh_female_linjianvhai_moon_bigtts"); + cJSON_AddStringToObject(outbound_cfg, "voice_source", "system"); + + cJSON_AddItemToObject(outbound_attributes, "cfg", outbound_cfg); + cJSON_AddItemToObject(payload, "outbound_attributes", outbound_attributes); + + // 创建inbound_attributes对象 + inbound_attributes = cJSON_CreateObject(); + if (inbound_attributes == NULL) { + printf("[AI] Failed to create inbound_attributes JSON object\n"); + goto error; + } + + cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine"); + cJSON_AddBoolToObject(inbound_attributes, "disable_vad", cJSON_False); + cJSON_AddNumberToObject(inbound_attributes, "vad_silence", 400); + + // 创建interrupt_options对象 + interrupt_options = cJSON_CreateObject(); + if (interrupt_options == NULL) { + printf("[AI] Failed to create interrupt_options JSON object\n"); + goto error; + } + cJSON_AddBoolToObject(interrupt_options, "concatenate_results", cJSON_True); + cJSON_AddBoolToObject(interrupt_options, "thinking_time_only", cJSON_True); + cJSON_AddItemToObject(inbound_attributes, "interrupt_options", interrupt_options); + + // 创建inbound_cfg对象 + inbound_cfg = cJSON_CreateObject(); + if (inbound_cfg == NULL) { + printf("[AI] Failed to create inbound_cfg JSON object\n"); + goto error; + } + + cJSON_AddStringToObject(inbound_cfg, "format", "pcm"); + cJSON_AddNumberToObject(inbound_cfg, "sample_rate", AI_DEFAULT_SAMPLE_RATE); + cJSON_AddNumberToObject(inbound_cfg, "bit_rate", AI_DEFAULT_BIT_RATE); + cJSON_AddNumberToObject(inbound_cfg, "channel", AI_DEFAULT_CHANNEL_COUNT); + cJSON_AddBoolToObject(inbound_cfg, "enable_punctuation", cJSON_True); + cJSON_AddBoolToObject(inbound_cfg, "enable_itn", cJSON_True); + + // 创建keywords数组 + keywords_array = cJSON_CreateArray(); + if (keywords_array == NULL) { + printf("[AI] Failed to create keywords array\n"); + goto error; + } + cJSON_AddItemToArray(keywords_array, cJSON_CreateString("张三")); + cJSON_AddItemToObject(inbound_cfg, "keywords", keywords_array); + + cJSON_AddItemToObject(inbound_attributes, "cfg", inbound_cfg); + cJSON_AddItemToObject(payload, "inbound_attributes", inbound_attributes); + + // 将payload添加到根对象 + cJSON_AddItemToObject(root, "payload", payload); + + // 生成JSON字符串 + json_string = cJSON_Print(root); + if (json_string == NULL) { + printf("[AI] Failed to print JSON to string\n"); + goto error; + } + + // 清理资源 + cJSON_Delete(root); + return json_string; + +error: + if (root) { + cJSON_Delete(root); + } + return NULL; +} + +/** + * @brief 释放JSON字符串内存 + * @param json_string 需要释放的JSON字符串 + */ +void ai_free_json_string(char* json_string) +{ + if (json_string) { + free(json_string); + } +} + +/** + * @brief 打印AI配置JSON(用于测试) + */ +void ai_print_start_config(void) +{ + char* config_json = ai_generate_start_config(NULL, NULL, NULL, NULL); + if (config_json) { + printf("[AI] Generated start config:\n%s\n", config_json); + ai_free_json_string(config_json); + } else { + printf("[AI] Failed to generate start config\n"); + } +} + +// { +// "event": "start", +// "payload": { +// "device_id": "123123123", // 设备ID +// "user_agent": "AudioClient/1.0", // 浏览器 UA +// "simple_response": true, // true 只返回完整的LLM文本 默认false 返回增量LLM文本 +// "dialog_attributes": { // 智能体配置 +// "provider": "coze", // 切换服务驱动 +// "cfg": { +// "disable_empty_prompt": true, // 拦截 asr 识别出来的空文本发送到大模型 +// "custom_variables": { // coze 自定义参数 +// "name": "小瑞" +// }, +// "greeting": { // 问候语 配置 +// "enabled": true, // 是否开启问候语 +// "content": "" // 问候语内容 coze 不填写默认使用 coze 平台设置的 +// }, +// "bot_option": { +// "use_workflow": true, // 使用对话流方式 coze 推荐使用对话流 +// "bot_id":"7462617881076351002", // 使用对话流 bot_id 需要和 workflow_id处于同一个工作空间即可 +// "workflow_id":"7462621757327196187", // +// } +// } +// }, +// "outbound_attributes": { // TTS输出音频配置 +// "provider": "volcengine", // TTS服务驱动 +// "cfg": { +// "format": "pcm", // 音频输出格式 +// "sample_rate": AI_DEFAULT_SAMPLE_RATE, // 音频输出采样率 +// "bit_rate": AI_DEFAULT_BIT_RATE, // 比特率 +// "channel": AI_DEFAULT_CHANNEL_COUNT, // 声道 1 单声道 +// "volume": 100, // 音量 0-100 +// "speech_rate": 0, // 语速 [-50,100] 默认 0 +// "chunk_interval_ms": 100, // 配置每段音频入队间隔时间 100ms +// "voice": "zh_female_linjianvhai_moon_bigtts" // 音色 +// "voice_source": "system", // 音色来源。目前定义 private 复刻音色。 system 使用系统默认音色,不提交这个参数兼容 system +// } +// }, +// "inbound_attributes": { // ASR输入音频配置 +// "provider": "volcengine", // ASR服务驱动 +// "disable_vad": false, // 开启vad 自动断句 (开启后可以有客户端处理回音消除后持续发送音频由服务器判断是否转写和发送LLM) +// "vad_silence": 400, // 设置vad 静音阈值 (毫秒) 连续静音超过 阈值自动切换状态 +// "interrupt_options": { +// "concatenate_results": true, // 是否在打断后拼接前后的ASR结果 +// "thinking_time_only":true // 是否只在思考时间允许打断 思考时间(ASR结束--->第一帧音频合成) +// // "keyword_interrupt": false, // 启用打断词功能 (打断词只有在思考以及之后才能打断) +// // "interrupt_keywords": ["停止", "打断","打断一下", "等一下", "别说了", "打住"] // 配置打断词列表 +// }, +// "cfg": { +// "format": "pcm", // 音频输入格式 +// "sample_rate": AI_DEFAULT_SAMPLE_RATE, // 音频输入采样率 目前只支持 16000 +// "bit_rate": AI_DEFAULT_BIT_RATE, // 比特率 目前只支持 16bit +// "channel": AI_DEFAULT_CHANNEL_COUNT // 声道 目前只支持单声道 +// "enable_punctuation": true, // 开启标点 +// "enable_itn":true, // 开启itn +// "keywords": ["张三"] // 热词 +// } +// }, +// } + +// { +// "event": "audio.create", +// "payload": {} +// } +// { +// "event": "audio.completed", +// "payload": {} +// } +// { +// "event": "cancel", +// "payload": {} +// } +// { +// "event": "audio.played", +// "payload": {} +// } + +// { +// "event": "asr.started", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "asr.result", +// "payload": { +// "content": "你好。", +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "asr.completed", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + + +// { +// "event": "llm.created", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "llm.delta", +// "payload": { +// "content": "哈喽", +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "llm.completed", +// "payload": { +// "content": "哈喽呀小a!今天过得咋样?", +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "llm.done", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "tts.created", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + + +// { +// "event": "tts.started", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +// { +// "event": "tts.completed", +// "payload": { +// "dialog_id": "f56fd6081f6e4f40bf325fd625f214ea_1744162450468050009" +// }, +// "sid": "f56fd6081f6e4f40bf325fd625f214ea" +// } + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + diff --git a/code/sdk/zhihui/ai_old/zhihui_ws.cpp b/code/sdk/zhihui/ai_old/zhihui_ws.cpp index d741fc1cb..6e4c7f66c 100644 --- a/code/sdk/zhihui/ai_old/zhihui_ws.cpp +++ b/code/sdk/zhihui/ai_old/zhihui_ws.cpp @@ -132,16 +132,280 @@ void bk_sleep(uint32_t time) { msleep(time); } + +// DNS 解析相关结构 +typedef struct { + char hostname[256]; + struct in_addr ip_addr; + int resolved; + int error; +} dns_result_t; + +// 异步 DNS 解析回调函数 +static void dns_callback(const char *name, const struct ip_addr *ipaddr, void *callback_arg) { + dns_result_t *result = (dns_result_t *)callback_arg; + // if (ipaddr != NULL) { + // result->ip_addr = *ipaddr; + // result->resolved = 1; + // printf("DNS callback: %s resolved to %s\n", name, inet_ntoa(result->ip_addr)); + // } else { + // result->error = 1; + // printf("DNS callback: Failed to resolve %s\n", name); + // } +} + +// 异步 DNS 解析函数 +static int dns_resolve_async(const char *hostname, struct in_addr *ip_addr, uint32_t timeout_ms) { + dns_result_t result; + memset(&result, 0, sizeof(result)); + strncpy(result.hostname, hostname, sizeof(result.hostname) - 1); + + printf("Starting async DNS resolution for: %s\n", hostname); + + // 启动异步 DNS 解析 + err_t ret = 0;//dns_gethostbyname(hostname, &result.ip_addr, dns_callback, &result); + + if (ret == ERR_OK) { + // 立即解析成功 + *ip_addr = result.ip_addr; + printf("DNS resolved immediately: %s -> %s\n", hostname, inet_ntoa(*ip_addr)); + return 0; + } else if (ret == ERR_INPROGRESS) { + // 异步解析中,等待结果 + printf("DNS resolution in progress, waiting...\n"); + + uint32_t start_time = (uint32_t)osKernelGetTickCount(); + while (!result.resolved && !result.error) { + uint32_t current_time = (uint32_t)osKernelGetTickCount(); + if ((current_time - start_time) >= timeout_ms) { + printf("DNS resolution timeout after %u ms\n", timeout_ms); + return -1; + } + osDelay(10); // 等待 10ms + } + + if (result.resolved) { + *ip_addr = result.ip_addr; + printf("DNS resolved: %s -> %s\n", hostname, inet_ntoa(*ip_addr)); + return 0; + } else { + printf("DNS resolution failed for: %s\n", hostname); + return -1; + } + } else { + printf("DNS resolution error: %d\n", ret); + return -1; + } +} + +// SSL/TLS 支持函数实现 +#ifdef CONFIG_CRYPTO_MBEDTLS +int ws_ssl_init(WebSocketClient *client) { + if (!client || !client->use_ssl) { + return 0; // 不需要SSL + } + + WS_LOG_INFO("Initializing SSL/TLS context"); + + // 分配SSL上下文 + client->ssl_context = malloc(sizeof(mbedtls_ssl_context)); + client->ssl_config = malloc(sizeof(mbedtls_ssl_config)); + client->ctr_drbg = malloc(sizeof(mbedtls_ctr_drbg_context)); + client->entropy = malloc(sizeof(mbedtls_entropy_context)); + client->cacert = malloc(sizeof(mbedtls_x509_crt)); + + if (!client->ssl_context || !client->ssl_config || + !client->ctr_drbg || !client->entropy || !client->cacert) { + WS_LOG_ERROR("Failed to allocate SSL context memory"); + ws_ssl_cleanup(client); + return -1; + } + + // 初始化SSL上下文 + mbedtls_ssl_init((mbedtls_ssl_context*)client->ssl_context); + mbedtls_ssl_config_init((mbedtls_ssl_config*)client->ssl_config); + mbedtls_ctr_drbg_init((mbedtls_ctr_drbg_context*)client->ctr_drbg); + mbedtls_entropy_init((mbedtls_entropy_context*)client->entropy); + mbedtls_x509_crt_init((mbedtls_x509_crt*)client->cacert); + + // 设置随机数生成器 + const char *pers = "websocket_client"; + int ret = mbedtls_ctr_drbg_seed((mbedtls_ctr_drbg_context*)client->ctr_drbg, + mbedtls_entropy_func, + (mbedtls_entropy_context*)client->entropy, + (const unsigned char *) pers, strlen(pers)); + if (ret != 0) { + WS_LOG_ERROR("mbedtls_ctr_drbg_seed failed: %d", ret); + ws_ssl_cleanup(client); + return -1; + } + + // 配置SSL + ret = mbedtls_ssl_config_defaults((mbedtls_ssl_config*)client->ssl_config, + MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, + MBEDTLS_SSL_PRESET_DEFAULT); + if (ret != 0) { + WS_LOG_ERROR("mbedtls_ssl_config_defaults failed: %d", ret); + ws_ssl_cleanup(client); + return -1; + } + + // 设置RNG + mbedtls_ssl_conf_rng((mbedtls_ssl_config*)client->ssl_config, + mbedtls_ctr_drbg_random, + (mbedtls_ctr_drbg_context*)client->ctr_drbg); + + // 设置验证模式(可选:跳过证书验证用于测试) + mbedtls_ssl_conf_authmode((mbedtls_ssl_config*)client->ssl_config, MBEDTLS_SSL_VERIFY_NONE); + + // 设置SSL上下文 + ret = mbedtls_ssl_setup((mbedtls_ssl_context*)client->ssl_context, + (mbedtls_ssl_config*)client->ssl_config); + if (ret != 0) { + WS_LOG_ERROR("mbedtls_ssl_setup failed: %d", ret); + ws_ssl_cleanup(client); + return -1; + } + + // 设置主机名 + ret = mbedtls_ssl_set_hostname((mbedtls_ssl_context*)client->ssl_context, client->host); + if (ret != 0) { + WS_LOG_ERROR("mbedtls_ssl_set_hostname failed: %d", ret); + ws_ssl_cleanup(client); + return -1; + } + + WS_LOG_INFO("SSL/TLS context initialized successfully"); + return 0; +} + +void ws_ssl_cleanup(WebSocketClient *client) { + if (!client) return; + + if (client->ssl_context) { + mbedtls_ssl_free((mbedtls_ssl_context*)client->ssl_context); + free(client->ssl_context); + client->ssl_context = NULL; + } + + if (client->ssl_config) { + mbedtls_ssl_config_free((mbedtls_ssl_config*)client->ssl_config); + free(client->ssl_config); + client->ssl_config = NULL; + } + + if (client->ctr_drbg) { + mbedtls_ctr_drbg_free((mbedtls_ctr_drbg_context*)client->ctr_drbg); + free(client->ctr_drbg); + client->ctr_drbg = NULL; + } + + if (client->entropy) { + mbedtls_entropy_free((mbedtls_entropy_context*)client->entropy); + free(client->entropy); + client->entropy = NULL; + } + + if (client->cacert) { + mbedtls_x509_crt_free((mbedtls_x509_crt*)client->cacert); + free(client->cacert); + client->cacert = NULL; + } +} + +int ws_ssl_handshake(WebSocketClient *client) { + if (!client || !client->use_ssl || !client->ssl_context) { + return 0; // 不需要SSL握手 + } + + WS_LOG_INFO("Starting SSL/TLS handshake"); + + // 设置socket文件描述符 + mbedtls_ssl_set_bio((mbedtls_ssl_context*)client->ssl_context, + &client->sockfd, + mbedtls_net_send, + mbedtls_net_recv, + NULL); + uint32_t ret=0; + + // 执行SSL握手 + while ((ret = mbedtls_ssl_handshake((mbedtls_ssl_context*)client->ssl_context)) != 0) { + if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { + WS_LOG_ERROR("SSL handshake failed: %x", ret); + return -1; + } + } + + WS_LOG_INFO("SSL/TLS handshake completed successfully"); + return 0; +} + +int ws_ssl_send(WebSocketClient *client, const uint8_t *data, size_t len) { + if (!client || !client->use_ssl || !client->ssl_context) { + // 使用普通socket发送 + return lwip_send(client->sockfd, data, len, 0); + } + + int ret = mbedtls_ssl_write((mbedtls_ssl_context*)client->ssl_context, data, len); + if (ret < 0) { + WS_LOG_ERROR("SSL send failed: %d", ret); + return -1; + } + + return ret; +} + +int ws_ssl_recv(WebSocketClient *client, uint8_t *data, size_t len) { + if (!client || !client->use_ssl || !client->ssl_context) { + // 使用普通socket接收 + return lwip_recv(client->sockfd, data, len, 0); + } + + int ret = mbedtls_ssl_read((mbedtls_ssl_context*)client->ssl_context, data, len); + if (ret < 0) { + if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { + return 0; // 需要更多数据 + } + WS_LOG_ERROR("SSL recv failed: %d", ret); + return -1; + } + + return ret; +} +#else +// 当没有mbedTLS支持时的空实现 +int ws_ssl_init(WebSocketClient *client) { + WS_LOG_WARNING("SSL/TLS not supported - mbedTLS not available"); + return -1; +} + +void ws_ssl_cleanup(WebSocketClient *client) { + (void)client; +} + +int ws_ssl_handshake(WebSocketClient *client) { + (void)client; + return -1; +} + +int ws_ssl_send(WebSocketClient *client, const uint8_t *data, size_t len) { + if (!client) return -1; + return lwip_send(client->sockfd, data, len, 0); +} + +int ws_ssl_recv(WebSocketClient *client, uint8_t *data, size_t len) { + if (!client) return -1; + return lwip_recv(client->sockfd, data, len, 0); +} +#endif #include #include #include -void * aic_zalloc(unsigned int len) -{ - return malloc(len); -} +// malloc 函数已移除,直接使用 malloc @@ -162,7 +426,7 @@ char* bk_strdup(const char* str) { return NULL; } size_t len = strlen(str) + 1; - char* new_str = (char*)aic_zalloc(len); + char* new_str = (char*)malloc(len); if (new_str == NULL) { return NULL; } @@ -406,11 +670,11 @@ int send_handshake(WebSocketClient *client,const char *headers,char *response,in generate_accept_key(key, accept_key); WS_LOG_INFO("send_handshake2"); - char *request =( char *)aic_zalloc(BUFFER_SIZE); + char *request =( char *)malloc(BUFFER_SIZE); if(request==NULL) { - WS_LOG_ERROR("request aic_zalloc error"); + WS_LOG_ERROR("request malloc error"); return -1; } @@ -449,13 +713,13 @@ int send_handshake(WebSocketClient *client,const char *headers,char *response,in WS_LOG_INFO("发送WebSocket握手请求..."); // 发送握手请求 - int send_ret = lwip_send(client->sockfd, request, strlen(request), 0); + int send_ret = ws_ssl_send(client, (const uint8_t*)request, strlen(request)); if (send_ret < 0) { WS_LOG_ERROR("发送握手请求失败: %d", send_ret); ret = -1; } else { // 接收响应 - ret = lwip_recv(client->sockfd, response, response_len - 1, 0); + ret = ws_ssl_recv(client, (uint8_t*)response, response_len - 1); if (ret > 0) { response[ret] = '\0'; // 确保字符串结束 } @@ -500,10 +764,10 @@ int send_handshake(WebSocketClient *client,const char *headers) { int ret = 0; generate_accept_key(key, accept_key); printf("send_handshake2"); - char *request =( char *)aic_zalloc(BUFFER_SIZE); + char *request =( char *)malloc(BUFFER_SIZE); if(request==NULL) { - printf("request aic_zalloc erro"); + printf("request malloc error"); return -1; } @@ -568,12 +832,12 @@ int send_websocket_message(WebSocketClient *client, uint8_t *message, size_t mes WS_LOG_ERROR("send_websocket_message: WebSocket handshake not completed"); return -1; } - uint8_t* frame=( uint8_t *)aic_zalloc(message_len + 50); + uint8_t* frame=( uint8_t *)malloc(message_len + 50); int offset = 0; int ret = -1; if(!frame) { - WS_LOG_ERROR("send_websocket_message zalloc error"); + WS_LOG_ERROR("send_websocket_message malloc error"); return -1; } // 第一个字节:FIN = 1, 设置 opcode @@ -624,7 +888,7 @@ int send_websocket_message(WebSocketClient *client, uint8_t *message, size_t mes - ret_tcp_send_data = lwip_send(client->sockfd, frame, offset, 0); + ret_tcp_send_data = ws_ssl_send(client, frame, offset); if (ret_tcp_send_data < 0) { WS_LOG_ERROR("send message failed %d", ret_tcp_send_data); ret = -1; @@ -681,6 +945,7 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint int ret=0; parsed_url = parse_url(url);//解析url + bool use_ssl =false; if (parsed_url.error) { printf("init_websocket_client Error: %s", parsed_url.error_message); @@ -691,14 +956,23 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint printf("Port: %d\n", parsed_url.port); printf("Path: %s\n", parsed_url.path); printf("Query: %s\n", parsed_url.query); - + + // 检查是否使用SSL/TLS + use_ssl = false; + if (strcmp(parsed_url.protocol, "wss") == 0 || strcmp(parsed_url.protocol, "https") == 0) { + use_ssl = true; + printf("Using SSL/TLS for secure WebSocket connection\n"); + } } - client = (WebSocketClient *)aic_zalloc(sizeof(WebSocketClient)) ; + client = (WebSocketClient *)malloc(sizeof(WebSocketClient)) ; if(!client) { - printf("init_websocket_client alloc error"); + printf("init_websocket_client malloc error"); goto client_ERROR; } + + // 设置SSL标志 + client->use_ssl = use_ssl; @@ -713,27 +987,50 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint lwip_setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt)); lwip_setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt)); // printf("init_websocket_client 3\n"); - if(use_dns) - { - // ip_sem.dns_done_sem= osSemaphoreNew(1, 0, NULL); - // if(ip_sem.dns_done_sem==0) - // { - // goto client_ERROR; - // } - - // ret =dns_gethostbyname(parsed_url.host,&ip,dns_found,&ip_sem); - // // if(ERR_OK==ret) - // { - // osSemaphoreAcquire(ip_sem.dns_done_sem, 1000*30); - // } - // osSemaphoreDelete(ip_sem.dns_done_sem); - // printf("dns_gethostbyname %d\r\n",ip_sem.ip.u_addr.ip4); - // memcpy(&server_addr.sin_addr.s_addr, &ip_sem.ip.u_addr.ip4, 4); - - } - else - { - inet_pton(AF_INET, parsed_url.host, &server_addr.sin_addr); + // DNS 解析或直接使用 IP + if (use_dns || !inet_aton(parsed_url.host, &server_addr.sin_addr)) { + printf("Resolving DNS for host: %s\n", parsed_url.host); + + // 首先尝试异步 DNS 解析(推荐方式) + struct in_addr resolved_ip; + if (0) + { + //dns_resolve_async(parsed_url.host, &resolved_ip, 5000) == 0) { + // 异步解析成功 + server_addr.sin_addr = resolved_ip; + printf("Async DNS resolved %s to %s\n", parsed_url.host, inet_ntoa(server_addr.sin_addr)); + } else { + // 异步解析失败,尝试同步解析作为后备 + printf("Async DNS failed, trying sync DNS...\n"); + struct hostent *host_entry = lwip_gethostbyname(parsed_url.host); + if (host_entry == NULL) { + printf("init_websocket_client Error: Both async and sync DNS resolution failed for %s\n", parsed_url.host); + printf("DNS error: %s\n", strerror(errno)); + goto client_ERROR; + } + + // 检查解析结果 + if (host_entry->h_addr_list[0] == NULL) { + printf("init_websocket_client Error: No address found for %s\n", parsed_url.host); + goto client_ERROR; + } + + // 复制解析到的 IP 地址 + memcpy(&server_addr.sin_addr, host_entry->h_addr_list[0], host_entry->h_length); + printf("Sync DNS resolved %s to %s\n", parsed_url.host, inet_ntoa(server_addr.sin_addr)); + + // 打印所有解析到的地址(如果有多个) + if (host_entry->h_addr_list[1] != NULL) { + printf("Additional addresses found:\n"); + for (int i = 1; host_entry->h_addr_list[i] != NULL; i++) { + struct in_addr addr; + memcpy(&addr, host_entry->h_addr_list[i], host_entry->h_length); + printf(" %s\n", inet_ntoa(addr)); + } + } + } + } else { + printf("Using direct IP address: %s\n", parsed_url.host); } @@ -754,6 +1051,24 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint } printf("socket creation succ\r\n"); + + // 如果需要SSL,先进行SSL握手 + if (client->use_ssl) { + printf("Initializing SSL/TLS connection...\n"); + if (ws_ssl_init(client) != 0) { + printf("SSL initialization failed\n"); + lwip_close(sockfd); + goto client_ERROR; + } + + if (ws_ssl_handshake(client) != 0) { + printf("SSL handshake failed\n"); + ws_ssl_cleanup(client); + lwip_close(sockfd); + goto client_ERROR; + } + printf("SSL/TLS connection established\n"); + } strcpy(client->host, parsed_url.host); @@ -764,21 +1079,23 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint if (send_handshake(client,headers) < 0) { //发送头 printf("socket send_handshake client_ERROR"); - + if (client->use_ssl) { + ws_ssl_cleanup(client); + } lwip_close(sockfd); goto client_ERROR; } - buffer=(char *)aic_zalloc(BUFFER_SIZE); + buffer=(char *)malloc(BUFFER_SIZE); if(buffer==NULL) { - printf("aic_zalloc(BUFFER_SIZE);null "); + printf("malloc(BUFFER_SIZE) failed"); goto client_ERROR; } printf("recv:%s\r\n",parsed_url.path); - bytes_received = lwip_recv(sockfd, buffer, BUFFER_SIZE - 1, 0); + bytes_received = ws_ssl_recv(client, (uint8_t*)buffer, BUFFER_SIZE - 1); printf("recv; "); @@ -815,6 +1132,9 @@ client_ERROR: buffer=NULL; } if(client){ + if (client->use_ssl) { + ws_ssl_cleanup(client); + } free(client); client = NULL; } @@ -840,6 +1160,7 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint int error = 0; socklen_t len = sizeof(error); int flags; + bool use_ssl = false; if (!url) { WS_LOG_ERROR("init_websocket_client Error: URL is NULL"); @@ -857,16 +1178,25 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint WS_LOG_INFO("Port: %d", parsed_url.port); WS_LOG_INFO("Path: %s", parsed_url.path); WS_LOG_INFO("Query: %s", parsed_url.query); + + // 检查是否使用SSL/TLS + if (strcmp(parsed_url.protocol, "wss") == 0 || strcmp(parsed_url.protocol, "https") == 0) { + use_ssl = true; + WS_LOG_INFO("Using SSL/TLS for secure WebSocket connection"); + } } - client = (WebSocketClient *)aic_zalloc(sizeof(WebSocketClient)) ; + client = (WebSocketClient *)malloc(sizeof(WebSocketClient)) ; memset_s(client,sizeof(WebSocketClient),0,sizeof(WebSocketClient)); if(!client) { - WS_LOG_ERROR("init_websocket_client alloc error: Failed to allocate memory for WebSocketClient"); + WS_LOG_ERROR("init_websocket_client malloc error: Failed to allocate memory for WebSocketClient"); goto client_ERROR; } + // 设置SSL标志 + client->use_ssl = use_ssl; + // 使用标准 socket 替代 TCP 管理器 printf("lwip_socket init_websocket_client\r\n"); client->sockfd = lwip_socket(AF_INET, SOCK_STREAM, 0); @@ -918,8 +1248,23 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint if (lwip_getsockopt(client->sockfd, SOL_SOCKET, SO_ERROR, &error, &len) == 0 && error == 0) { WS_LOG_INFO("Socket connected successfully"); + // 如果需要SSL,先进行SSL握手 + if (client->use_ssl) { + if (ws_ssl_init(client) != 0) { + WS_LOG_ERROR("SSL initialization failed"); + goto client_ERROR; + } + + if (ws_ssl_handshake(client) != 0) { + WS_LOG_ERROR("SSL handshake failed"); + ws_ssl_cleanup(client); + goto client_ERROR; + } + WS_LOG_INFO("SSL/TLS connection established"); + } + // 发送 WebSocket 握手 - char *buffer = (char *)aic_zalloc(BUFFER_SIZE); + char *buffer = (char *)malloc(BUFFER_SIZE); if (buffer != NULL) { int bytes_received = send_handshake(client, NULL, buffer, BUFFER_SIZE); if (bytes_received >= 0) { @@ -1003,6 +1348,11 @@ void close_websocket_client(WebSocketClient *client) { WS_LOG_INFO("close_websocket_client %s %s", client->host, client->path); + // 先关闭SSL连接 + if (client->use_ssl) { + ws_ssl_cleanup(client); + } + // 先关闭socket连接,避免数据继续流入 if (client->sockfd >= 0) { lwip_close(client->sockfd); @@ -1018,6 +1368,7 @@ void close_websocket_client(WebSocketClient *client) { // 清理客户端状态 client->handshake = 0; client->packet_callback = NULL; + client->use_ssl = false; free(client); } @@ -1292,7 +1643,7 @@ static void* websocket_receive_thread(void* arg) { if (FD_ISSET(client->sockfd, &read_fds)) { // 有数据可读 - int bytes_received = lwip_recv(client->sockfd, buffer, sizeof(buffer), 0); + int bytes_received = ws_ssl_recv(client, buffer, sizeof(buffer)); if (bytes_received <= 0) { WS_LOG_ERROR("websocket_receive_thread: connection closed or error"); break; @@ -1413,7 +1764,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l return -1; } - bytes_received = lwip_recv_with_timeout(client->sockfd, frame, 1, 0, remaining_time); + bytes_received = ws_ssl_recv(client, frame, 1); if (bytes_received <= 0) { @@ -1466,7 +1817,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l return -1; } - bytes_received = lwip_recv_with_timeout(client->sockfd, frame+1, 1, 0, remaining_time); + bytes_received = ws_ssl_recv(client, frame+1, 1); if (bytes_received <= 0) { if (bytes_received == 0) { printf("Connection lwip_closed by server.\n"); @@ -1497,7 +1848,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l } unsigned short extended_payload_len; - int ret = lwip_recv_with_timeout(client->sockfd, frame+offset, 2, 0, remaining_time); + int ret = ws_ssl_recv(client, frame+offset, 2); if (ret <= 0) { printf("receive_websocket_message: failed to receive extended length (126)\n"); return -1; @@ -1522,7 +1873,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l } uint64_t extended_payload_len; - int ret = lwip_recv_with_timeout(client->sockfd, frame+offset, 8, 0, remaining_time); + int ret = ws_ssl_recv(client, frame+offset, 8); if (ret <= 0) { printf("receive_websocket_message: failed to receive extended length (127)\n"); return -1; @@ -1570,7 +1921,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l return -1; } - int ret = lwip_recv_with_timeout(client->sockfd, frame+offset, 4, 0, remaining_time); + int ret = ws_ssl_recv(client, frame+offset, 4); if (ret <= 0) { printf("receive_websocket_message: failed to receive masking key\n"); return -1; @@ -1597,7 +1948,7 @@ int receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l } //bk_sleep(recv_len/1000+1); - recv_len = lwip_recv_with_timeout(client->sockfd, buf+bytes_received, payload_len-bytes_received, 0, remaining_time); + recv_len = ws_ssl_recv(client, buf+bytes_received, payload_len-bytes_received); if(recv_len>0) bytes_received += recv_len; else if(recv_len<0) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c index 9d05eeb62..45ec9db14 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -94,7 +94,7 @@ static void ln_ws_on_open(int client) */ // [LN][WS] on_message: {"deviceId":"860132060562402","timestamp":1758275259,"messageId":"0fb3719adca2472c8f0909d38df87666","command":"Pong"} -static void ln_ws_on_message(int client, const char *data, size_t length, bool isFinished) +static void ln_ws_on_message(int client, const char *data, size_t length, bool isFinished,bool isBinary) { (void)client; (void)isFinished; @@ -152,7 +152,10 @@ static void ln_ws_on_close(int client) // int ret = WebSocketClientClose(g_ws_client_fd); } - g_ws_client_fd=-1; + else + { + g_ws_client_fd=-1; + } } /* 断开后增加重连计数,由监督线程在下一次连接时携带 */ if (g_ws_running) { diff --git a/code/sdk/zhihui/websocket/CMakeLists.txt b/code/sdk/zhihui/websocket/CMakeLists.txt index 12e538f93..91fb1cd37 100644 --- a/code/sdk/zhihui/websocket/CMakeLists.txt +++ b/code/sdk/zhihui/websocket/CMakeLists.txt @@ -18,6 +18,7 @@ ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/inc # ${ROOT_DIR}/open_source/openharmony/base/security/huks/frameworks/huks_standard/main/crypto_engine/mbedtls/include # ${ROOT_DIR}/open_source/openharmony/base/security/huks/frameworks/huks_standard/main/common/include ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/netstack/websocket/include +${ROOT_DIR}/zhihui/websocket/os_ws ) @@ -26,6 +27,7 @@ set(WEBSOCKET_SOURCES # ${CMAKE_CURRENT_SOURCE_DIR}/websocket/cat1_ai_server.c # ${CMAKE_CURRENT_SOURCE_DIR}/websocket/dev_authentication.c ${CMAKE_CURRENT_SOURCE_DIR}/src/websocket_parser.c +${CMAKE_CURRENT_SOURCE_DIR}/os_ws/haisi_websocket.c # ${CMAKE_CURRENT_SOURCE_DIR}/websocket/websocket_test.c ${CMAKE_CURRENT_SOURCE_DIR}/src/zhihui_websocket.c ${CMAKE_CURRENT_SOURCE_DIR}/test/ws_multi_test.c diff --git a/code/sdk/zhihui/websocket/os_ws/haisi_websocket.c b/code/sdk/zhihui/websocket/os_ws/haisi_websocket.c new file mode 100644 index 000000000..21fe09128 --- /dev/null +++ b/code/sdk/zhihui/websocket/os_ws/haisi_websocket.c @@ -0,0 +1,851 @@ +#include "net_websocket.h" +#include +#include +#include +#include "cJSON.h" // Added for JSON parsing +#include "custom_utils.h" +#include "soc_osal.h" +#include "cmsis_os2.h" +#include "haisi_websocket.h" + +/* + * - g_ws_client_fd 当前 WebSocket 客户端fd + * - g_ws_connected 连接状态:0=未连接,1=连接中,2=连接成功 + * - g_ws_running 心跳线程运行标志 + */ + +/* 消息队列相关定义 */ +#define WS_MSG_QUEUE_COUNT 16 +#define WS_MSG_TYPE_SEND_TEXT 0x01 +#define WS_MSG_TYPE_FORCE_RECONNECT 0x02 +#define WS_MSG_TYPE_STOP 0x03 +#define WS_MSG_TYPE_RAW_MESSAGE 0x04 + +/* 连接状态定义 */ +#define WS_STATE_DISCONNECTED 0 // 未连接 +#define WS_STATE_CONNECTING 1 // 连接中 +#define WS_STATE_CONNECTED 2 // 连接成功 +#define WS_STATE_SLEEP 3 // 休眠状态 + +/* WebSocket关闭状态枚举 */ +typedef enum { + WS_CLOSE_NOT_EXECUTED = 0, // 未执行 + WS_CLOSE_STARTING = 1, // 开始执行 + WS_CLOSE_SUCCESS = 2 // 执行成功 +} ws_close_status_t; + +/* WebSocket命令枚举 */ + + + +typedef struct { + uint8_t msg_type; + uint16_t data_len; + uint32_t timestamp; // 收到消息的时间戳 + bool isBinary; // 消息是否为二进制数据 + char *raw_data; // 动态分配的原始消息数据 +} ws_msg_info_t; + + +static int g_ws_client_fd = -1; +static volatile int g_ws_connected = WS_STATE_DISCONNECTED; +static uint32_t g_ws_main_thread = 0; +static volatile int g_ws_running = 0; +static volatile unsigned int g_ws_reconnect_count = 0; /* 断线后递增,用于URL reconnect参数 */ +static osMessageQueueId_t g_ws_msg_queue = NULL; +static ws_call_backs_t g_ws_callbacks = {0}; /* WebSocket回调函数结构体 */ +static volatile ws_close_status_t g_ws_close_status = WS_CLOSE_NOT_EXECUTED; /* WebSocket关闭状态标志位 */ + +static void uapi_ws_build_url(char *out, size_t out_size); +static void uapi_ws_default_url_handler(char *url, size_t url_size, char *header_buf, size_t header_size); +int uapi_ws_send_ping(void); +static int uapi_ws_close_with_status(int client_fd); +static ws_close_status_t uapi_ws_get_close_status(void); +static void uapi_ws_reset_close_status(void); +const char* uapi_ws_get_connection_state_string(void); + +/* 消息内存管理函数 */ +static ws_msg_info_t* ws_msg_create(uint16_t data_len) +{ + ws_msg_info_t *msg = (ws_msg_info_t*)malloc(sizeof(ws_msg_info_t)); + if (msg == NULL) { + printf("[LN][WS] Failed to allocate memory for ws_msg_info_t\n"); + return NULL; + } + + msg->raw_data = (char*)malloc(data_len + 1); // +1 for null terminator + if (msg->raw_data == NULL) { + printf("[LN][WS] Failed to allocate memory for raw_data (size: %d)\n", data_len); + free(msg); + return NULL; + } + + msg->data_len = data_len; + msg->raw_data[data_len] = '\0'; // Ensure null termination + return msg; +} + +static void ws_msg_free(ws_msg_info_t *msg) +{ + if (msg != NULL) { + if (msg->raw_data != NULL) { + free(msg->raw_data); + } + free(msg); + } +} + +/* 队列创建函数 */ +void uapi_ws_queue_init(void) +{ + printf("[LN][WS] uapi_ws_queue_init\n"); + g_ws_msg_queue = osMessageQueueNew(WS_MSG_QUEUE_COUNT, sizeof(ws_msg_info_t*), NULL); + if (g_ws_msg_queue == NULL) { + printf("[LN][WS] uapi_ws_queue_init failed: failed to create message queue\n"); + } else { + printf("[LN][WS] uapi_ws_queue_init success: queue created\n"); + } +} + +/* 握手成功回调:标记连接就绪 */ +static void uapi_ws_on_open(int client) +{ + (void)client; + printf("WebSocketClientConstructor uapi_ws_on_open\r\n"); + g_ws_connected = WS_STATE_CONNECTED; + uapi_ws_reset_close_status(); // 连接成功时重置关闭状态 + printf("[LN][WS] 连接状态: 连接成功, 关闭状态已重置为 NOT_EXECUTED (%d)\n", g_ws_close_status); +} + +/* + * 收到服务器下发的文本消息 + * - 上层可根据业务定义的 JSON 字段进行再分发 + */ +static void uapi_ws_on_message(int client, const char *data, size_t length, bool isFinished,bool isBinary) +{ + (void)client; + (void)isFinished; + if (data == NULL || length == 0) return; + + /* 数据完整性判断 */ + printf("WebSocketClientConstructor data %d\r\n",length); + if (isFinished) { + // 数据完整,创建消息结构体 + ws_msg_info_t *msg = ws_msg_create(length); + if (msg == NULL) { + printf("[LN][WS] Failed to create message structure\n"); + return; + } + + msg->msg_type = WS_MSG_TYPE_RAW_MESSAGE; + msg->isBinary = isBinary; // 设置二进制标志 + + // 记录收到消息的时间戳 + uapi_get_timestampe_ss(&msg->timestamp); + + // 复制原始数据 + memcpy(msg->raw_data, data, length); + msg->raw_data[length] = '\0'; + + if(isBinary) + { + if (g_ws_callbacks.binary_callback != NULL) { + g_ws_callbacks.binary_callback((const uint8_t*)msg->raw_data, msg->timestamp, msg->data_len); + } else { + printf("[LN][WS] No binary message callback registered\n"); + } + // 二进制消息处理完后释放内存 + ws_msg_free(msg); + } + else + { + osStatus_t ret = osMessageQueuePut(g_ws_msg_queue, &msg, 0, 0); + if (ret == osOK) { + printf("[LN][WS] Raw message queued successfully, length: %d, timestamp: %u\n", msg->data_len, msg->timestamp); + } else { + printf("[LN][WS] Failed to queue raw message: %d\n", ret); + // 队列失败时释放内存 + ws_msg_free(msg); + } + } + + } else { + printf("[LN][WS] Incomplete or invalid message data\n"); + } +} + +/* 出错回调:仅打印,实际重连策略可在上层统一管理 */ +static void uapi_ws_on_error(int client, struct WebSocketErrorResult error) +{ + (void)client; + printf("WebSocketClientConstructor [LN][WS] error: code=%d msg=%s\n", error.errorCode, error.errorMessage); +} + +/* 断开回调:标记为未连接。是否自动重连交由上层决定 */ +static void uapi_ws_on_close(int client) +{ + printf("WebSocketClientConstructor [LN][WS] uapi_ws_on_close %d\r\n",client); + + // 在断开回调触发时,将关闭状态设置为成功 + + printf("[LN][WS] WebSocket close callback triggered, status set to SUCCESS (%d)\n", g_ws_close_status); + + g_ws_connected = WS_STATE_DISCONNECTED; + printf("[LN][WS] 连接状态: 未连接\n"); + + // 触发连接断开事件(注意:这里不能直接调用回调,因为不在主线程中) + // 事件回调将在主线程中处理 + if(g_ws_client_fd>=0) + { + // 这里不再调用 uapi_ws_close_with_status,因为回调已经触发说明关闭成功 + if(g_ws_close_status==WS_CLOSE_NOT_EXECUTED) + { + + } + else + { + g_ws_client_fd=-1; + } + + } + /* 断开后增加重连计数,由监督线程在下一次连接时携带 */ + if (g_ws_running) { + if (g_ws_reconnect_count < 0xFFFFFFFFu) { + g_ws_reconnect_count++; + } + } +} + +/* + * 主线程:负责连接管理、心跳维护和队列消息处理 + * - 监督连接状态,处理重连逻辑 + * - 心跳处理完全由回调函数负责(包括时间判断) + * - 处理队列中的消息 + */ +static void uapi_ws_main_thread(void *arg) +{ + (void)arg; + ws_msg_info_t *msg; + uint32_t msgsize =0; + int last_connection_state = WS_STATE_DISCONNECTED; // 记录上次连接状态 + + while (g_ws_running) { + // 处理队列消息(非阻塞) + if (osMessageQueueGet(g_ws_msg_queue, &msg, NULL, 1000) == osOK) { + printf("[LN][WS] osMessageQueueGet: g_ws_msg_queue\n"); + switch (msg->msg_type) { + case WS_MSG_TYPE_SEND_TEXT: + if (g_ws_connected == WS_STATE_CONNECTED && g_ws_client_fd >= 0) { + // 对于文本消息,我们需要特殊处理,因为现在data是ws_data_msg_t类型 + // 这里需要重新设计文本消息的存储方式 + printf("[LN][WS] Text message type not supported in new structure\n"); + } else { + printf("[LN][WS] Cannot send text, connection state: %d\n", g_ws_connected); + } + ws_msg_free(msg); + break; + + case WS_MSG_TYPE_FORCE_RECONNECT: + printf("[LN][WS] Force reconnect requested\n"); + if (g_ws_client_fd >= 0) { + printf("[LN][WS] WebSocketClientClose\n"); + uapi_ws_close_with_status(g_ws_client_fd); + printf("[LN][WS] WebSocketClientClose end\n"); + } + g_ws_connected = WS_STATE_DISCONNECTED; + printf("[LN][WS] 连接状态: 未连接(强制重连)\n"); + ws_msg_free(msg); + break; + + case WS_MSG_TYPE_STOP: + printf("[LN][WS] Stop requested from queue\n"); + g_ws_running = 0; + ws_msg_free(msg); + break; + + case WS_MSG_TYPE_RAW_MESSAGE: + { + printf("[LN][WS] Received raw message: %s, timestamp: %u, isBinary: %s\n", + msg->raw_data, msg->timestamp, msg->isBinary ? "true" : "false"); + + // 根据消息类型调用不同的回调函数 + if (!msg->isBinary) { + + // 文本消息 + if (g_ws_callbacks.message_callback != NULL) { + g_ws_callbacks.message_callback(msg->raw_data, msg->timestamp); + } else { + printf("[LN][WS] No text message callback registered\n"); + } + } + // 处理完消息后释放内存 + ws_msg_free(msg); + } + break; + + default: + printf("[LN][WS] Unknown message type: %d\n", msg->msg_type); + ws_msg_free(msg); + break; + } + } + else + { + // printf("osMessageQueueGet timeout or failed\r\n"); + } + + // 检测连接状态变化并触发事件回调 + if (g_ws_callbacks.event_callback != NULL && g_ws_connected != last_connection_state) { + if (g_ws_connected == WS_STATE_CONNECTED && last_connection_state != WS_STATE_CONNECTED) { + // 连接成功事件 + g_ws_callbacks.event_callback(WS_EVENT_CONNECTED); + } else if (g_ws_connected == WS_STATE_DISCONNECTED && last_connection_state == WS_STATE_CONNECTED) { + // 连接断开事件 + g_ws_callbacks.event_callback(WS_EVENT_DISCONNECTED); + } + last_connection_state = g_ws_connected; + } + + // 连接管理部分 + if (g_ws_connected == WS_STATE_SLEEP) { + // 休眠状态:暂停所有操作,只打印状态信息 + printf("[LN][WS] Sleep mode: pausing all operations\n"); + usleep(1000 * 1000); // 休眠1秒 + continue; + } + + if (g_ws_connected == WS_STATE_DISCONNECTED) { + if (g_ws_client_fd >= 0) { + { + if(g_ws_close_status== WS_CLOSE_NOT_EXECUTED){ + printf("[LN][WS] WebSocketClientClose WS_CLOSE_NOT_EXECUTED\n"); + uapi_ws_close_with_status(g_ws_client_fd); + g_ws_client_fd=-1; + printf("[LN][WS] WebSocketClientClose WS_CLOSE_NOT_EXECUTED end\n"); + } + } + } + + if (g_ws_client_fd < 0) { + + + printf("[LN][WS] 开始创建WebSocket客户端...\n"); + + // 触发连接开始事件 + if (g_ws_callbacks.event_callback != NULL) { + g_ws_callbacks.event_callback(WS_EVENT_CONNECTING); + } + + g_ws_client_fd = WebSocketClientConstructor(uapi_ws_on_open, uapi_ws_on_message, uapi_ws_on_error, uapi_ws_on_close); + if (g_ws_client_fd < 0) { + printf("[LN][WS] constructor failed: %d\n", g_ws_client_fd); + g_ws_connected = WS_STATE_DISCONNECTED; + printf("[LN][WS] 连接状态: 未连接(创建失败)\n"); + /* 失败则短暂休眠后重试创建 */ + usleep(2000 * 1000); + continue; + } + } + + char url[512] = {0}; + char header_buf[512] = {0}; + + // 使用回调函数处理URL和Header + if (g_ws_callbacks.url_callback != NULL) { + g_ws_callbacks.url_callback(url, sizeof(url), header_buf, sizeof(header_buf)); + } + + printf("[LN][WS] 尝试连接WebSocket: %s\n", url); + printf("[LN][WS] 使用Header: %s\n", header_buf); + int ret=0; + if(strlen(header_buf)==0) + { + ret= WebSocketClientConnect(g_ws_client_fd, url, NULL); + } + else + { + ret= WebSocketClientConnect(g_ws_client_fd, url, header_buf); + } + + // int ret = WebSocketClientConnect(g_ws_client_fd,"ws://118.145.158.207:22080/chat/ws?platform=huoshan"); + + if (ret != 0) { + printf("[LN][WS] connect failed: %d\n", ret); + g_ws_connected = WS_STATE_DISCONNECTED; + printf("[LN][WS] 连接状态: 未连接(连接失败)\n"); + (void)uapi_ws_close_with_status(g_ws_client_fd); + g_ws_client_fd = -1; + /* 指数退避*/ + unsigned int delay = 1u << (g_ws_reconnect_count > 5 ? 5 : g_ws_reconnect_count); + if (delay > 60) delay = 60; + for (unsigned int i = 0; i < delay && g_ws_running; i++) { + usleep(1000 * 1000); + } + continue; + } + else + { + g_ws_connected = WS_STATE_CONNECTING; + } + /* 连接请求已发送,等待握手完成 */ + printf("[LN][WS] 连接请求已发送,等待握手完成...\n"); + } + + // 心跳部分:由回调函数处理时间判断和心跳发送 + if (g_ws_connected == WS_STATE_CONNECTED && g_ws_client_fd >= 0) { + // 使用心跳回调函数处理,包括时间判断 + if (g_ws_callbacks.heartbeat_callback != NULL) { + if (g_ws_callbacks.heartbeat_callback()) { + // 回调函数返回1表示需要发送心跳,这里可以添加额外的处理 + printf("[LN][WS] Heartbeat callback triggered\n"); + } + } + } + else + { + printf("ln ws_state %s\r\n",uapi_ws_get_connection_state_string()); + } + + /* 1秒间隔 */ + usleep(1000 * 1000); + } + + + if (g_ws_client_fd >= 0) { + uapi_ws_close_with_status(g_ws_client_fd); + } + g_ws_connected = WS_STATE_DISCONNECTED; + + // 删除消息队列 + if (g_ws_msg_queue != NULL) { + ws_msg_info_t msg; + while (osMessageQueueGet(g_ws_msg_queue, &msg, NULL, 0) == osOK) { + // 原始消息数据不需要额外释放,因为存储在栈上 + printf("[LN][WS] Clearing queued message: %s\n", msg.raw_data); + } + osMessageQueueDelete(g_ws_msg_queue); + g_ws_msg_queue = NULL; + } +} +/* + * 启动:开启监督线程与心跳机制(心跳线程首次连接成功后会自然启动) + * - 若已在运行则直接返回成功 + * - callback: 消息处理回调函数,可以为NULL使用默认处理 + */ +int uapi_ws_start(const ws_call_backs_t *callbacks) +{ + if (g_ws_running) { + return 0; + } + g_ws_running = 1; + g_ws_reconnect_count = 0; /* 启动时从0开始 */ + g_ws_connected = WS_STATE_DISCONNECTED; /* 启动时重置连接状态 */ + + // 注册回调函数结构体 + if (callbacks != NULL) { + g_ws_callbacks = *callbacks; + printf("[LN][WS] WebSocket callbacks registered successfully\n"); + + if (g_ws_callbacks.message_callback != NULL) { + printf("[LN][WS] Text message callback registered\n"); + } else { + printf("[LN][WS] No text message callback registered\n"); + } + + if (g_ws_callbacks.binary_callback != NULL) { + printf("[LN][WS] Binary message callback registered\n"); + } else { + printf("[LN][WS] No binary message callback registered\n"); + } + + if (g_ws_callbacks.url_callback != NULL) { + printf("[LN][WS] URL callback registered\n"); + } else { + printf("[LN][WS] Using default URL handler\n"); + } + + if (g_ws_callbacks.heartbeat_callback != NULL) { + printf("[LN][WS] Heartbeat callback registered\n"); + } else { + printf("[LN][WS] No heartbeat callback registered\n"); + } + + if (g_ws_callbacks.event_callback != NULL) { + printf("[LN][WS] Event callback registered\n"); + } else { + printf("[LN][WS] No event callback registered\n"); + } + } else { + memset(&g_ws_callbacks, 0, sizeof(ws_call_backs_t)); + printf("[LN][WS] No callbacks provided, using defaults\n"); + } + if (!g_ws_main_thread) { + app_task_definition_ext_t main_task = { + .attr = { + .name = "uapi_ws_main", + .stack_size = 0x2000, + .priority = osPriorityNormal + }, + .func = uapi_ws_main_thread, + .task_handle = &g_ws_main_thread, + .create_queue_handle = uapi_ws_queue_init, + .use_mem = USE_EXTEND_MEM, + .inst_args = NULL + }; + (void)uapi_create_osThread_custom_with_args(&main_task); + } + cat1_api_keep_wakeup(1); + cat1_api_wakeup_cat1(1); + + return 0; +} + +/* 发送文本消息:仅在连接就绪时有效 */ +int uapi_ws_send_text(const char *text) +{ + if (!text) return -1; + if (g_ws_connected != WS_STATE_CONNECTED || g_ws_client_fd < 0) { + printf("[LN][WS] Cannot send text, connection state: %d\n", g_ws_connected); + return -1; + } + return WebSocketClientSendText(g_ws_client_fd, text, strlen(text)); +} + +int uapi_ws_send_BIN(uint8_t *data,int len) +{ + if (!data) return -1; + if (g_ws_connected != WS_STATE_CONNECTED || g_ws_client_fd < 0) { + printf("[LN][WS] Cannot send text, connection state: %d\n", g_ws_connected); + return -1; + } + if(len%3) + { + uint16_t data_mod_len=len%3; + + WebSocketClientSendBinStart(g_ws_client_fd, data, (len/3)); + + WebSocketClientSendBinContinue(g_ws_client_fd, data+ (len/3), (len/3)); + + WebSocketClientSendBinEnd(g_ws_client_fd,data+(len/3)+(len/3),(len/3)+data_mod_len); + + } + else + { + WebSocketClientSendBinStart(g_ws_client_fd, data, len/3); + + WebSocketClientSendBinContinue(g_ws_client_fd,data+len/3,len/3); + + WebSocketClientSendBinEnd(g_ws_client_fd,data+len/3+len/3,len/3); + + } + printf("[LN][WS] uapi_ws_send_BIN,size: %d\n", len); + + return 0; +} + + + +/* 通过队列发送文本消息(异步) */ +int uapi_ws_send_text_async(const char *text) +{ + if (!text || !g_ws_running) return -1; + + // 由于新的数据结构不支持直接文本消息,这里暂时返回错误 + // 如果需要支持文本消息,需要重新设计消息类型 + printf("[LN][WS] Text message not supported in new queue structure\n"); + return -1; +} + +/* 强制重连 */ +int uapi_ws_force_reconnect(void) +{ + if (!g_ws_running) return -1; + + ws_msg_info_t *msg = ws_msg_create(0); + if (msg == NULL) { + printf("[LN][WS] Failed to create force reconnect message\n"); + return -1; + } + + msg->msg_type = WS_MSG_TYPE_FORCE_RECONNECT; + msg->timestamp = 0; // 控制消息不需要时间戳 + msg->isBinary = false; // 控制消息不是二进制数据 + + osStatus_t ret = osMessageQueuePut(g_ws_msg_queue, &msg, 0, 0); + if (ret != osOK) { + ws_msg_free(msg); + return -1; + } + return 0; +} + + +/* 通过队列停止WebSocket服务 */ +int uapi_ws_stop_async(void) +{ + if (!g_ws_running) return -1; + + ws_msg_info_t *msg = ws_msg_create(0); + if (msg == NULL) { + printf("[LN][WS] Failed to create stop message\n"); + return -1; + } + + msg->msg_type = WS_MSG_TYPE_STOP; + msg->timestamp = 0; // 控制消息不需要时间戳 + msg->isBinary = false; // 控制消息不是二进制数据 + + osStatus_t ret = osMessageQueuePut(g_ws_msg_queue, &msg, 0, 0); + if (ret != osOK) { + ws_msg_free(msg); + return -1; + } + return 0; +} + +/* 停止:关闭心跳并关闭连接 */ +int uapi_ws_stop(void) +{ + g_ws_running = 0; + if (g_ws_main_thread) { + osThreadJoin(g_ws_main_thread); + g_ws_main_thread = 0; + } + int ret = 0; + if (g_ws_client_fd >= 0) { + ret = uapi_ws_close_with_status(g_ws_client_fd); + g_ws_client_fd = -1; + } + g_ws_connected = WS_STATE_DISCONNECTED; + + // 删除消息队列 + if (g_ws_msg_queue != NULL) { + osMessageQueueDelete(g_ws_msg_queue); + g_ws_msg_queue = NULL; + } + + return ret; +} + +/* 获取当前连接状态 */ +int uapi_ws_get_connection_state(void) +{ + return g_ws_connected; +} + +/* 获取连接状态字符串 */ +const char* uapi_ws_get_connection_state_string(void) +{ + switch (g_ws_connected) { + case WS_STATE_DISCONNECTED: + return "未连接"; + case WS_STATE_CONNECTING: + return "连接中"; + case WS_STATE_CONNECTED: + return "连接成功"; + case WS_STATE_SLEEP: + return "休眠状态"; + default: + return "未知状态"; + } +} + +/* ============================ 公共回调函数接口 ============================ */ + +/** + * @brief 注册文本消息处理回调函数(公共接口) + * @param callback 回调函数 + */ +void uapi_ws_register_message_callback(ws_message_callback_t callback) +{ + g_ws_callbacks.message_callback = callback; + if (callback != NULL) { + printf("[LN][WS] Text message callback registered successfully\n"); + } else { + printf("[LN][WS] Text message callback unregistered\n"); + } +} + +/** + * @brief 注册二进制消息处理回调函数(公共接口) + * @param callback 回调函数 + */ +void uapi_ws_register_binary_callback(ws_binary_message_callback_t callback) +{ + g_ws_callbacks.binary_callback = callback; + if (callback != NULL) { + printf("[LN][WS] Binary message callback registered successfully\n"); + } else { + printf("[LN][WS] Binary message callback unregistered\n"); + } +} + +/** + * @brief 注册URL处理回调函数(公共接口) + * @param callback 回调函数 + */ +void uapi_ws_register_url_callback(ws_url_callback_t callback) +{ + g_ws_callbacks.url_callback = callback; + if (callback != NULL) { + printf("[LN][WS] URL callback registered successfully\n"); + } else { + printf("[LN][WS] URL callback unregistered\n"); + } +} + +/** + * @brief 注册心跳处理回调函数(公共接口) + * @param callback 回调函数,负责时间判断和心跳发送,返回1表示发送了心跳,返回0表示未发送 + */ +void uapi_ws_register_heartbeat_callback(ws_heartbeat_callback_t callback) +{ + g_ws_callbacks.heartbeat_callback = callback; + if (callback != NULL) { + printf("[LN][WS] Heartbeat callback registered successfully\n"); + } else { + printf("[LN][WS] Heartbeat callback unregistered\n"); + } +} + +/** + * @brief 注册连接事件回调函数(公共接口) + * @param callback 回调函数,在连接状态变化时触发 + */ +void uapi_ws_register_event_callback(ws_event_callback_t callback) +{ + g_ws_callbacks.event_callback = callback; + if (callback != NULL) { + printf("[LN][WS] Event callback registered successfully\n"); + } else { + printf("[LN][WS] Event callback unregistered\n"); + } +} + +/* ============================ 回调函数管理 ============================ */ + + + +/* ============================ WebSocket关闭状态管理 ============================ */ + +/** + * @brief 带状态跟踪的WebSocket关闭函数 + * @param client_fd WebSocket客户端文件描述符 + * @return WebSocketClientClose的返回值 + */ +static int uapi_ws_close_with_status(int client_fd) +{ + if (client_fd < 0) { + printf("[LN][WS] Invalid client_fd for close operation\n"); + return -1; + } + + // 设置状态为开始执行 + g_ws_close_status = WS_CLOSE_STARTING; + printf("[LN][WS] WebSocketClientClose starting, fd=%d, status=%d\n", client_fd, g_ws_close_status); + + // 执行关闭操作 + int ret = WebSocketClientClose(client_fd); + + // 注意:成功状态由 ln_ws_on_close 回调函数设置,这里只处理失败情况 + if (ret != 0) { + g_ws_close_status = WS_CLOSE_NOT_EXECUTED; + printf("[LN][WS] WebSocketClientClose failed, fd=%d, ret=%d, status=%d\n", client_fd, ret, g_ws_close_status); + } else { + printf("[LN][WS] WebSocketClientClose call returned success, waiting for close callback\n"); + } + + return ret; +} + +/** + * @brief 获取当前WebSocket关闭状态 + * @return 当前关闭状态 + */ +static ws_close_status_t uapi_ws_get_close_status(void) +{ + return g_ws_close_status; +} + +/** + * @brief 重置WebSocket关闭状态 + */ +static void uapi_ws_reset_close_status(void) +{ + g_ws_close_status = WS_CLOSE_NOT_EXECUTED; + printf("[LN][WS] WebSocket close status reset to NOT_EXECUTED (%d)\n", g_ws_close_status); +} + +/* ============================ 公共接口函数 ============================ */ + +/** + * @brief 获取WebSocket关闭状态(公共接口) + * @return 当前关闭状态 + */ +int uapi_ws_get_close_status_public(void) +{ + return (int)uapi_ws_get_close_status(); +} + +/** + * @brief 打印WebSocket状态信息(调试用) + */ +void uapi_ws_print_status_info(void) +{ + printf("[LN][WS] === WebSocket Status Info ===\n"); + printf("[LN][WS] Connection State: %s (%d)\n", uapi_ws_get_connection_state_string(), g_ws_connected); + printf("[LN][WS] Close Status: %d (0=NOT_EXECUTED, 1=STARTING, 2=SUCCESS)\n", g_ws_close_status); + printf("[LN][WS] Client FD: %d\n", g_ws_client_fd); + printf("[LN][WS] Running: %d\n", g_ws_running); + printf("[LN][WS] Reconnect Count: %u\n", g_ws_reconnect_count); + printf("[LN][WS] ===============================\n"); +} + +/** + * @brief 进入休眠状态(公共接口) + * @return 0成功,-1失败 + */ +int uapi_ws_enter_sleep(void) +{ + printf("[LN][WS] Entering sleep mode\n"); + + if (!g_ws_running) { + printf("[LN][WS] WebSocket service not running, cannot enter sleep\n"); + return -1; + } + + // 如果当前有连接,先断开 + if (g_ws_client_fd >= 0) { + printf("[LN][WS] Disconnecting before entering sleep mode\n"); + uapi_ws_close_with_status(g_ws_client_fd); + } + + // 设置状态为休眠 + g_ws_connected = WS_STATE_SLEEP; + printf("[LN][WS] Sleep mode activated, all operations paused\n"); + + return 0; +} + +/** + * @brief 退出休眠状态(公共接口) + * @return 0成功,-1失败 + */ +int uapi_ws_exit_sleep(void) +{ + printf("[LN][WS] Exiting sleep mode\n"); + + if (g_ws_connected != WS_STATE_SLEEP) { + printf("[LN][WS] Not in sleep mode, current state: %s\n", uapi_ws_get_connection_state_string()); + return -1; + } + + // 设置状态为断开,让主线程重新开始连接 + g_ws_connected = WS_STATE_DISCONNECTED; + printf("[LN][WS] Sleep mode deactivated, resuming normal operations\n"); + + return 0; +} + + + diff --git a/code/sdk/zhihui/websocket/os_ws/haisi_websocket.h b/code/sdk/zhihui/websocket/os_ws/haisi_websocket.h new file mode 100644 index 000000000..513955ae4 --- /dev/null +++ b/code/sdk/zhihui/websocket/os_ws/haisi_websocket.h @@ -0,0 +1,73 @@ +/* ============================== WebSocket 客户端接口 ============================== */ + +#ifndef __WEBSOCKET_HAISI_H__ +#define __WEBSOCKET_HAISI_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* 消息处理回调函数类型 */ +typedef void (*ws_message_callback_t)(const char *raw_data, uint32_t timestamp); + +/* 二进制消息处理回调函数类型 */ +typedef void (*ws_binary_message_callback_t)(const uint8_t *raw_data, uint32_t timestamp, uint16_t data_len); + +/* URL构建回调函数类型 */ +typedef void (*ws_url_callback_t)(char *url, size_t url_size, char *header_buf, size_t header_size); + +/* 心跳处理回调函数类型 */ +typedef int (*ws_heartbeat_callback_t)(void); // 返回1表示需要发送心跳,返回0表示不需要 + +/* WebSocket连接事件类型 */ +typedef enum { + WS_EVENT_CONNECTING = 0, /* 开始连接 */ + WS_EVENT_CONNECTED, /* 连接成功 */ + WS_EVENT_DISCONNECTED /* 连接断开 */ +} ws_event_type_t; + +/* 连接事件回调函数类型 */ +typedef void (*ws_event_callback_t)(ws_event_type_t event_type); + +/* WebSocket回调函数结构体 */ +typedef struct { + ws_message_callback_t message_callback; /* 文本消息处理回调函数 */ + ws_binary_message_callback_t binary_callback; /* 二进制消息处理回调函数 */ + ws_url_callback_t url_callback; /* URL构建回调函数 */ + ws_heartbeat_callback_t heartbeat_callback; /* 心跳处理回调函数 */ + ws_event_callback_t event_callback; /* 连接事件回调函数 */ +} ws_call_backs_t; + + +/* WebSocket接口函数 */ +int uapi_ws_start(const ws_call_backs_t *callbacks); +int uapi_ws_send_text(const char *text); +int uapi_ws_stop(void); +int uapi_ws_stop_async(void); +int uapi_ws_force_reconnect(void); +int uapi_ws_enter_sleep(void); +int uapi_ws_exit_sleep(void); +int uapi_ws_send_BIN(uint8_t *data,int len); + +/* WebSocket状态查询接口 */ +int uapi_ws_get_connection_state(void); +const char* uapi_ws_get_connection_state_string(void); +int uapi_ws_get_close_status_public(void); +void uapi_ws_print_status_info(void); + +/* 回调函数注册接口 */ +void uapi_ws_register_message_callback(ws_message_callback_t callback); +void uapi_ws_register_binary_callback(ws_binary_message_callback_t callback); +void uapi_ws_register_url_callback(ws_url_callback_t callback); +void uapi_ws_register_heartbeat_callback(ws_heartbeat_callback_t callback); +void uapi_ws_register_event_callback(ws_event_callback_t callback); + +#ifdef __cplusplus +} +#endif + +#endif // ZHIHUI_WEBSOCKET_H \ No newline at end of file diff --git a/code/sdk/zhihui/websocket/src/zhihui_websocket.c b/code/sdk/zhihui/websocket/src/zhihui_websocket.c index e81ad925f..8b2fdb949 100644 --- a/code/sdk/zhihui/websocket/src/zhihui_websocket.c +++ b/code/sdk/zhihui/websocket/src/zhihui_websocket.c @@ -391,7 +391,7 @@ static void zhihui_ws_handle_received_data(zhihui_websocket_client_t *client, co case WS_TEXT: case WS_BINARY: if (client->on_message) { - client->on_message(client->client_fd, (const char*)payload, payload_len, header->fin); + client->on_message(client->client_fd, (const char*)payload, payload_len, header->fin,true); } break; -- 2.17.1