增加联网后自动vad认证
authorxue <2144439972@qq.com>
Fri, 21 Nov 2025 08:43:17 +0000 (16:43 +0800)
committerxue <2144439972@qq.com>
Fri, 21 Nov 2025 08:43:17 +0000 (16:43 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index f9560ce..816a194 100644 (file)
 #include "ai_media.h"
 #include "ConfigModelC.h"
 #include "ConfigModel.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "imsl_vad.h"
+#include "dmp_api.h"
+#ifdef __cplusplus
+}
+#endif
  #define JUHEPINGTAI 0
  #if JUHEPINGTAI
  #include "websocket_server_manager.h"
                         // 检查是否在对话界面
                         if (currentView == THUNDERBIRD_DIALOGUEVIEW && (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)) {
                             // 检查是否是在对话模式进入时因为WebSocket未连接而显示的提醒
+                            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
                             ThunderBirdPresenter *presenter = ThunderBirdPresenter::GetInstance();
                             if (presenter && presenter->isDialogueing) {
                                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,隐藏网络断开提醒,进入对话模式");
                                 }
                                 // 如果在对话界面,初始化音频
                                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,在对话界面,初始化音频");
-                                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
+                               
                             }
                         }
                     }
                     uapi_init_all_websocket_servers();
                     uapi_start_all_websocket_servers(0); // 连接服务器
                     #endif
+                    
+                    // VAD 认证初始化(只尝试一次,避免网络失败时重复重试导致死机)
+                    static uint8_t dmp_auth = 0;
+                    static uint8_t dmp_auth_retry_count = 0;
+                    const uint8_t MAX_AUTH_RETRY = 1; // 最多重试1次
+                    
+                    if(dmp_auth == 0 && dmp_auth_retry_count < MAX_AUTH_RETRY)
+                    {
+                        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);
+                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth result: %d, token: %s", ret, auth_info.dmp_token);
+                            dmp_auth = 1; // 无论成功失败都标记为已尝试,避免重复
+                        }
+                        else
+                        {
+                            // 只有在网络正常时才尝试登录,避免网络失败时阻塞
+                            if(HasNetwork() && 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);
+                                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth result after login: %d, token: %s", ret, auth_info.dmp_token);
+                                    dmp_auth = 1;
+                                }
+                                else
+                                {
+                                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth failed: failed to read token after login");
+                                    dmp_auth = 1; // 标记为已尝试,避免重复
+                                }
+                            }
+                            else
+                            {
+                                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth failed: dmp_aut_login failed or no network, retry_count=%d", dmp_auth_retry_count);
+                                // 如果网络失败,也标记为已尝试,避免无限重试
+                                // 但允许在下次网络恢复时再试一次(通过 retry_count 控制)
+                                if(dmp_auth_retry_count >= MAX_AUTH_RETRY)
+                                {
+                                    dmp_auth = 1; // 达到最大重试次数,不再尝试
+                                }
+                            }
+                        }
+                    }
                     init_falg = true;
                 }