# 1. 修改根目录编译配置文件 /CMakeLists.txt 增加以下内容 ~~~cmake {.line-numbers} if (COMPANION_APP_AUTH) add_definitions("-DCOMPANION_APP_AUTH") endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(AUTH_APP_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/extension/avs-app-auth/include" CACHE INTERNAL "") if (ASPMIC) add_subdirectory("extension/mic-asp-sdk") endif() add_subdirectory("extension/avs-app-auth") add_subdirectory("extension/avs-msg-sdk") ~~~ # 2. 增加CA认证功能 ## 2.1. 修改编译配置文件SampleApp/src/CMakeLists.txt,增加CA认证编译配置 ~~~cmake {.line-numbers} # 修改对应代码,增加CA认证库 if (COMPANION_APP_AUTH) target_link_libraries(LibSampleApp CAAuthDelegate app_auth ) else () target_link_libraries(LibSampleApp CBLAuthDelegate) endif () ~~~ ## 2.2. 增加以下目录以及目录下的所有源码文件 * SampleApp/Authorization/CAAuthDelegate/ * applications/acsdkCAAuthorizationDelegate/ * applications\acsdkSampleApplicationCAAuthRequester/ ## 2.3. 修改编译配置文件SampleApp/Authorization/CMakeLists.txt, 增加CA认证源码支持 ~~~cmake {.line-numbers} if (COMPANION_APP_AUTH) add_subdirectory("CAAuthDelegate") else () add_subdirectory("CBLAuthDelegate") endif () ~~~ ## 2.4. 修改编译配置文件applications/CMakeLists.txt, 增加CA认证源码支持 ### 2.4.1. 删除原配置 ~~add_subdirectory("acsdkCBLAuthorizationDelegate")~~ ### 2.4.2. 增加以下代码 ~~~cmake {.line-numbers} if (COMPANION_APP_AUTH) add_subdirectory("acsdkSampleApplicationCAAuthRequester") add_subdirectory("acsdkCAAuthorizationDelegate") else () add_subdirectory("acsdkSampleApplicationCBLAuthRequester") add_subdirectory("acsdkCBLAuthorizationDelegate") endif () ~~~ ## 2.5. 修改编译配置文件applications/acsdkDefaultSampleApplicationOptions/src/CMakeLists.txt, 增加CA认证源码支持 ~~~cmake {.line-numbers} target_link_libraries(acsdkDefaultSampleApplicationOptions acsdkCore acsdkManufactory acsdkNullMetricRecorder acsdkSampleApplicationInterfaces acsdkShared ) if (COMPANION_APP_AUTH) target_link_libraries(acsdkDefaultSampleApplicationOptions acsdkSampleApplicationCAAuthRequester CAAuthDelegate ) else () target_link_libraries(acsdkDefaultSampleApplicationOptions acsdkSampleApplicationCBLAuthRequester CBLAuthDelegate ) endif () ~~~ ## 2.6. 修改编译配置文件applications/acsdkPreviewAlexaClient/src/CMakeLists.txt, 增加CA认证源码支持 ~~~cmake {.line-numbers} if (COMPANION_APP_AUTH) SET(ACSDKAUTHORIZATIONDELEGATE_LIB acsdkCAAuthorizationDelegate) else () SET(ACSDKAUTHORIZATIONDELEGATE_LIB acsdkCBLAuthorizationDelegate) endif () ~~~ ## 2.7. 修改编译配置文件cmakeBuild/cmake/DefaultLibNames.cmake, 增加CA认证源码支持 ~~~cmake {.line-numbers} if (COMPANION_APP_AUTH) UseDefaultIfNotSet(ACSDKAUTHORIZATIONDELEGATE_LIB acsdkCAAuthorizationDelegate) elseif() UseDefaultIfNotSet(ACSDKAUTHORIZATIONDELEGATE_LIB acsdkCBLAuthorizationDelegate) endif() ~~~ ## 2.8. 修改源码 ### 2.8.1. applications/acsdkDefaultSampleApplicationOptions/include/acsdkDefaultSampleApplicationOptions/DefaultSampleApplicationOptionsComponent.h ~~~cpp {.line-numbers} #ifdef COMPANION_APP_AUTH #include #else #include #endif ...... using SampleApplicationOptionsComponent = acsdkManufactory::Component< std::shared_ptr, std::shared_ptr, std::shared_ptr, #ifdef COMPANION_APP_AUTH acsdkManufactory::Import>, #else acsdkManufactory::Import>, #endif acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>>; ~~~ ### 2.8.2. applications/acsdkDefaultSampleApplicationOptions/src/DefaultSampleApplicationOptionsComponent.cpp ~~~cpp {.line-numbers} #ifdef COMPANION_APP_AUTH #include #include #else #include #include #endif ...... #ifdef COMPANION_APP_AUTH using namespace authorization::caAuthDelegate; #else using namespace authorization::cblAuthDelegate; #endif ...... static acsdkManufactory::Component< std::shared_ptr, #ifdef COMPANION_APP_AUTH acsdkManufactory::Import>, #else acsdkManufactory::Import>, #endif acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>, acsdkManufactory::Import>> ...... return ComponentAccumulator<>() #ifdef COMPANION_APP_AUTH .addRetainedFactory(CAAuthDelegate::createAuthDelegateInterface) .addRetainedFactory(SQLiteCAAuthDelegateStorage::createCAAuthDelegateStorageInterface); #else .addRetainedFactory(CBLAuthDelegate::createAuthDelegateInterface) .addRetainedFactory(SQLiteCBLAuthDelegateStorage::createCBLAuthDelegateStorageInterface); #endif } ~~~ ### 2.8.3. applications/acsdkPreviewAlexaClient/include/acsdkPreviewAlexaClient/PreviewAlexaClientComponent.h ~~~cpp {.line-numbers} #ifdef COMPANION_APP_AUTH #include #include #else #include #include #endif ~~~ ### 2.8.4. applications/acsdkPreviewAlexaClient/src/PreviewAlexaClientComponent.cpp ~~~cpp {.line-numbers} #ifdef COMPANION_APP_AUTH #include #else #include #endif ...... #ifdef COMPANION_APP_AUTH using namespace acsdkSampleApplicationCAAuthRequester; #else using namespace acsdkSampleApplicationCBLAuthRequester; #endif ...... .addRetainedFactory(createUIManagerInterface) .addRetainedFactory(defaultClient::EqualizerRuntimeSetup::createEqualizerRuntimeSetupInterface) .addRequiredFactory(sampleApp::CaptionPresenter::createCaptionPresenterInterface) .addRetainedFactory(sampleApp::LocaleAssetsManager::createLocaleAssetsManagerInterface) .addRetainedFactory(sampleApp::SampleEqualizerModeController::createEqualizerModeControllerInterface) .addRetainedFactory(sampleApp::UIManager::create) #ifdef COMPANION_APP_AUTH .addUnloadableFactory(SampleApplicationCAAuthRequester::createCAAuthRequesterInterface) #else .addUnloadableFactory(SampleApplicationCBLAuthRequester::createCBLAuthRequesterInterface) #endif /// SQLite implementations of databases used by Capability Agents and other components. /// Applications may choose to replace these with their own database implementations. .addRetainedFactory(acsdkAlerts::storage::SQLiteAlertStorage::createAlertStorageInterface) .addRetainedFactory(acsdkBluetooth::SQLiteBluetoothStorage::createBluetoothStorageInterface) .addRetainedFactory(acsdkNotifications::SQLiteNotificationsStorage::createNotificationsStorageInterface) .addRetainedFactory(certifiedSender::SQLiteMessageStorage::createMessageStorageInterface) ~~~ ### 2.8.5. AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/AuthObserverInterface.h ~~~cpp {.line-numbers} AUTHORIZATION_PENDING, /// Client should slow down in the rate of requests polling for an access token. SLOW_DOWN, /// Internal error in client code. INTERNAL_ERROR, /// Client ID not valid for use with code based linking. INVALID_CLIENT_ID }; ...... case AuthObserverInterface::Error::AUTHORIZATION_PENDING: return stream << "AUTHORIZATION_PENDING"; case AuthObserverInterface::Error::SLOW_DOWN: return stream << "SLOW_DOWN"; case AuthObserverInterface::Error::INTERNAL_ERROR: return stream << "INTERNAL_ERROR"; case AuthObserverInterface::Error::INVALID_CLIENT_ID: return stream << "INVALID_CLIENT_ID"; } ~~~ ### 2.8.6. core/Authorization/acsdkAuthorization/include/acsdkAuthorization/LWA/LWAAuthorizationAdapter.h ~~~cpp {.line-numbers} #ifdef COMPANION_APP_AUTH bool authorizeUsingCA( const std::shared_ptr& observer) override; bool authorizeUsingCAWithCustomerProfile( const std::shared_ptr& observer) override; #else bool authorizeUsingCBL( const std::shared_ptr& observer) override; bool authorizeUsingCBLWithCustomerProfile( const std::shared_ptr& observer) override; #endif ...... #ifdef COMPANION_APP_AUTH bool authorizeUsingCAHelper( const std::shared_ptr& observer, bool requestCustomerProfile); #else bool authorizeUsingCBLHelper( const std::shared_ptr& observer, bool requestCustomerProfile); #endif ...... /// The interval to make token requests to LWA. std::chrono::seconds m_tokenRequestInterval; /// The observer that will respond to CBL related callbacks. #ifdef COMPANION_APP_AUTH std::shared_ptr m_cblRequester; #else std::shared_ptr m_cblRequester; #endif /// Whether to request extended customer profile information such as name and email. bool m_requestCustomerProfile; /// @} /// True if an authorization failure was reported for the current value of m_accessToken. bool m_authFailureReported; ~~~ ### 2.8.7. core/Authorization/acsdkAuthorization/include/acsdkAuthorization/LWA/LWAAuthorizationConfiguration.h ~~~cpp {.line-numbers} * @return The URL to use when getting the user profile. */ std::string getCustomerProfileUrl() const; std::string getManufacturerName() const; std::string getDescription() const; private: /** * Initialize the new instance. * * @param root The root level node of the raw configuration from which to populate this instance. * @param deviceInfo The deviceInfo instance. ~~~ ### 2.8.8. core/Authorization/acsdkAuthorization/src/LWA/LWAAuthorizationAdapter.cpp ~~~cpp {.line-numbers} case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CLIENT_ID: return result; // Retry Errors case AuthObserverInterface::Error::UNKNOWN_ERROR: ...... case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CLIENT_ID: return result; /// Retriable errors. case AuthObserverInterface::Error::SLOW_DOWN: ...... case AuthObserverInterface::Error::INVALID_REQUEST: if (!m_refreshTokenResponse.isRefreshTokenVerified) { error = AuthObserverInterface::Error::INVALID_CLIENT_ID; } // Falls through case AuthObserverInterface::Error::AUTHORIZATION_FAILED: ...... case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CLIENT_ID: { updateStateAndNotifyManager(AuthObserverInterface::State::UNRECOVERABLE_ERROR, error); return FlowState::IDLE; } ...... #ifdef COMPANION_APP_AUTH bool LWAAuthorizationAdapter::authorizeUsingCAHelper( const std::shared_ptr& observer, #else bool LWAAuthorizationAdapter::authorizeUsingCBLHelper( const std::shared_ptr& observer, #endif bool requestCustomerProfile) { if (!observer) { ACSDK_ERROR(LX("authorizeUsingCBLHelperFailed").d("reason", "nullObserver")); return false; } ...... #ifdef COMPANION_APP_AUTH bool LWAAuthorizationAdapter::authorizeUsingCA(const std::shared_ptr& observer) { return authorizeUsingCAHelper(observer, false); } bool LWAAuthorizationAdapter::authorizeUsingCAWithCustomerProfile( const std::shared_ptr& observer) { return authorizeUsingCAHelper(observer, true); } #else bool LWAAuthorizationAdapter::authorizeUsingCBL(const std::shared_ptr& observer) { return authorizeUsingCBLHelper(observer, false); } bool LWAAuthorizationAdapter::authorizeUsingCBLWithCustomerProfile( const std::shared_ptr& observer) { return authorizeUsingCBLHelper(observer, true); } #endif std::string LWAAuthorizationAdapter::getId() { // m_adapterId is const, no need to lock. ACSDK_DEBUG5(LX("getId").d("id", m_adapterId)); return m_adapterId; } ~~~ ### 2.8.9. core/Authorization/acsdkAuthorization/src/LWA/LWAAuthorizationConfiguration.cpp ~~~cpp {.line-numbers} std::string LWAAuthorizationConfiguration::getCustomerProfileUrl() const { return CUSTOMER_PROFILE_URL; } std::string LWAAuthorizationConfiguration::getManufacturerName() const { return m_deviceInfo->getManufacturerName(); } std::string LWAAuthorizationConfiguration::getDescription() const { return m_deviceInfo->getDeviceDescription(); } bool LWAAuthorizationConfiguration::initScopeData() { ACSDK_DEBUG5(LX("initScopeData")); ~~~ ### 2.8.10. 增加文件 core/Authorization/acsdkAuthorizationInterfaces/include/acsdkAuthorizationInterfaces/LWA/CAAuthorizationObserverInterface.h ### 2.8.11. core/Authorization/acsdkAuthorizationInterfaces/include/acsdkAuthorizationInterfaces/LWA/LWAAuthorizationInterface.h ~~~cpp {.line-numbers} #include #include #ifdef COMPANION_APP_AUTH #include "CAAuthorizationObserverInterface.h" #else #include "CBLAuthorizationObserverInterface.h" #endif ...... /** * Authorize using LWA and the Code Based Linking method. * * @param observer The CBL observer which will receive a callback to display information back to the user. * This will be be sent in an @c CBLAuthorizationObserverInterface callback. */ #ifdef COMPANION_APP_AUTH virtual bool authorizeUsingCA(const std::shared_ptr& observer) = 0; #else virtual bool authorizeUsingCBL(const std::shared_ptr& observer) = 0; #endif /** * Authorize using LWA and the Code Based Linking method. This API additionally requets customer profile information * (name, email). * * @attention THE USER MUST CONSENT (EX. UI DIALOG) BEFORE APPLICATION CAN REQUEST CUSTOMER PROFILE INFORMATION. * * @param observer The CBL observer which will receive a callback to display information back to the user. * This will be sent in an @c CBLAuthorizationObserverInterface callback. */ #ifdef COMPANION_APP_AUTH virtual bool authorizeUsingCAWithCustomerProfile( const std::shared_ptr& observer) = 0; #else virtual bool authorizeUsingCBLWithCustomerProfile( const std::shared_ptr& observer) = 0; #endif }; ~~~ ### 2.8.12. SampleApp/Authorization/CBLAuthDelegate/src/CBLAuthDelegate.cpp ~~~cpp {.line-numbers} case AuthObserverInterface::Error::UNSUPPORTED_GRANT_TYPE: case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CBL_CLIENT_ID: { setAuthState(AuthObserverInterface::State::UNRECOVERABLE_ERROR); return FlowState::STOPPING; } ...... case AuthObserverInterface::Error::INVALID_CODE_PAIR: case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CBL_CLIENT_ID: { setAuthState(AuthObserverInterface::State::UNRECOVERABLE_ERROR); return FlowState::STOPPING; } ...... case AuthObserverInterface::Error::AUTHORIZATION_PENDING: case AuthObserverInterface::Error::SLOW_DOWN: m_timeToRefresh = calculateTimeToRetry(m_retryCount++); break; case AuthObserverInterface::Error::INVALID_REQUEST: if (newRefreshToken) { setAuthError(AuthObserverInterface::Error::INVALID_CBL_CLIENT_ID); } // Falls through case AuthObserverInterface::Error::AUTHORIZATION_FAILED: case AuthObserverInterface::Error::UNAUTHORIZED_CLIENT: case AuthObserverInterface::Error::INVALID_VALUE: case AuthObserverInterface::Error::AUTHORIZATION_EXPIRED: case AuthObserverInterface::Error::UNSUPPORTED_GRANT_TYPE: case AuthObserverInterface::Error::INVALID_CODE_PAIR: case AuthObserverInterface::Error::INTERNAL_ERROR: case AuthObserverInterface::Error::INVALID_CBL_CLIENT_ID: { setAuthState(AuthObserverInterface::State::UNRECOVERABLE_ERROR); return FlowState::STOPPING; ~~~ ## 2.9. 增加以下目录以及子目录下所有新文件 * extension/avs-app-auth/ * extension/avs-msg-sdk/ # 3. 集成MIC语言采样SDK ## 3.1. 增加以下新文件 * cmakeBuild/cmake/AspMic.cmake * SampleApp/include/SampleApp/AspMicrophoneWrapper.h * SampleApp/src/AspMicrophoneWrapper.cpp ## 3.2. 修改编译配置文件 cmakeBuild/BuildDefaults.cmake,增加ASP MIC语音处理编译配置 ~~~cmake {.line-numbers} # Setup AspMic variables. include_once(AspMic) ~~~ ## 3.3. 修改编译配置文件 SampleApp/CMakeLists.txt,增加ASP MIC语音处理编译配置 ~~~cmake {.line-numbers} if (PORTAUDIO AND (GSTREAMER_MEDIA_PLAYER OR CUSTOM_MEDIA_PLAYER)) set(VALID TRUE) elseif (ASPMIC AND (GSTREAMER_MEDIA_PLAYER OR CUSTOM_MEDIA_PLAYER)) set(VALID TRUE) elseif (ANDROID_MEDIA_PLAYER AND ANDROID_MICROPHONE) set(VALID TRUE) elseif (AUDIO_INJECTION AND (GSTREAMER_MEDIA_PLAYER OR ANDROID_MEDIA_PLAYER OR CUSTOM_MEDIA_PLAYER)) set(VALID TRUE) endif() ~~~ ## 3.4. 增加以下目录以及子目录下所有新文件 * extension/mic-asp-sdk/ # 4. 集成KWD唤醒 ## 4.1 参考KWD集成文档