异步Vad认证
authorxue <2144439972@qq.com>
Wed, 26 Nov 2025 02:16:03 +0000 (10:16 +0800)
committerxue <2144439972@qq.com>
Wed, 26 Nov 2025 02:16:03 +0000 (10:16 +0800)
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index 342d5e1..61f21c2 100644 (file)
@@ -1129,6 +1129,11 @@ void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type)
         push_audio_recording_end_notification();
         break;
     }
+    case WS_CMD_VAD_INITIALIZED:
+    {
+        push_vad_initialized_notification();
+        break;
+    }
     default:
     {
         printf("[WS] Unknown command=%s\n", cmd_str ? cmd_str : "");
index 9548315..1e61baa 100644 (file)
@@ -14,6 +14,8 @@
 #include "audio_base_type.h"
 #if ENABLE_VAD_SERVER
 #include "vad_server.h" // Added for VAD processing
+#include "imsl_vad.h"   // Added for AuthInfo and auth_vad
+#include "dmp_api.h"    // Added for dmp_read_dev_token and dmp_aut_login
 #endif
 // 功能开关宏定义
 #define ENABLE_BINARY_DATA_INTERRUPT_CHECK 1  // 启用二进制数据间隔检查
@@ -99,6 +101,7 @@ static volatile bool g_audio_initialized = false;
 /* VAD 服务器状态标志位 */
 static volatile bool g_vad_server_enabled = false;
 static volatile bool g_vad_server_initialized = false;
+static volatile bool g_vad_server_auth_success = false;
 
 /* 回调函数结构体 */
 static ws_call_backs_t g_ws_callbacks = {0};
@@ -1168,6 +1171,10 @@ void ln_ws_audio_init(void)
         if (ret == ERRCODE_SUCC) {
             g_vad_server_initialized = true;
             LN_WS_INFO("VAD server initialized successfully\n");
+            // 通知 UI VAD 服务器初始化完成,取消等待提醒
+            if (g_ws_message_callback != NULL) {
+                g_ws_message_callback(NULL, WS_CMD_VAD_INITIALIZED);
+            }
         } else {
             LN_WS_ERROR("Failed to initialize VAD server: %d\n", ret);
         }
@@ -1296,6 +1303,85 @@ bool ln_ws_is_vad_server_initialized(void)
 {
     return g_vad_server_initialized;
 }
+
+/**
+ * @brief 获取 VAD 服务器认证成功状态
+ * @return true=已认证成功,false=未认证成功
+ */
+bool ln_ws_is_vad_server_auth_success(void)
+{
+    return g_vad_server_auth_success;
+}
+
+/**
+ * @brief 执行 VAD 认证
+ * @return 0成功,-1失败
+ * @note 此函数由 custom_cmd_service 异步调用,无需创建后台任务
+ */
+int ln_ws_vad_auth(void)
+{   
+    LN_WS_INFO("Starting VAD authentication...\n");
+    // 使用静态变量,避免重复认证
+    static uint8_t task_dmp_auth = 0;
+    static uint8_t task_dmp_auth_retry_count = 0;
+    const uint8_t MAX_AUTH_RETRY = 5; // 最多重试1次
+    
+    if(task_dmp_auth == 0 && task_dmp_auth_retry_count < MAX_AUTH_RETRY)
+    {
+        task_dmp_auth_retry_count++;
+        
+        char dmp_token[64] = {0};
+        if(dmp_read_dev_token(dmp_token))
+        {
+            struct AuthInfo auth_info;
+            memset(&auth_info, 0, sizeof(auth_info));
+            strcpy(auth_info.dmp_token, dmp_token);
+            int ret = auth_vad(&auth_info);
+            LN_WS_INFO("VAD auth result: %d, token: %s\n", ret, auth_info.dmp_token);
+            task_dmp_auth = 1; // 无论成功失败都标记为已尝试,避免重复
+            return (ret == 1) ? 0 : -1; // auth_vad 返回1表示成功
+        }
+        else
+        {
+            if(dmp_aut_login())
+            {
+                // 登录成功后重新尝试读取token
+                if(dmp_read_dev_token(dmp_token))
+                {
+                    struct AuthInfo auth_info;
+                    memset(&auth_info, 0, sizeof(auth_info));
+                    strcpy(auth_info.dmp_token, dmp_token);
+                    int ret = auth_vad(&auth_info);
+                    LN_WS_INFO("VAD auth result after login: %d, token: %s\n", ret, auth_info.dmp_token);
+                    task_dmp_auth = 1;
+                    g_vad_server_auth_success = true;
+                    return (ret == 1) ? 0 : -1; // auth_vad 返回1表示成功
+                }
+                else
+                {
+                    LN_WS_ERROR("VAD auth failed: failed to read token after login\n");
+                    task_dmp_auth = 1; // 标记为已尝试,避免重复
+                    return -1;
+                }
+            }
+            else
+            {
+                LN_WS_ERROR("VAD auth failed: dmp_aut_login failed, retry_count=%d\n", task_dmp_auth_retry_count);
+                // 如果网络失败,也标记为已尝试,避免无限重试
+                if(task_dmp_auth_retry_count >= MAX_AUTH_RETRY)
+                {
+                    task_dmp_auth = 1; // 达到最大重试次数,不再尝试
+                }
+                return -1;
+            }
+        }
+    }
+    else
+    {
+        LN_WS_INFO("VAD authentication already attempted, skipping\n");
+        return 0; // 已经尝试过,返回成功(避免重复执行)
+    }
+}
 #endif /* ENABLE_VAD_SERVER */