Windows端集成

本文介绍了使用标准集成(无UI)方式接入Windows端的方法。适用于互动直播、互动课堂等场景产品。

前提条件

环境要求

集成步骤

第一步:下载SDK

打开低代码音视频工厂控制台>应用管理>标准集成,下载最新Windows端SDK。解压之后,文件结构如下图所示:

p369016

第二步:添加SDK依赖

  • 方式1:使用CMake进行工程管理,添加SDK依赖(推荐)

    在工程的CMakeList中添加如下代码:

    #添加低代码工厂SDK头文件路径
    include_directories(
    "${CMAKE_SOURCE_DIR}/your_deps_dir/meta/include"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/meta/include/rtc"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/meta/include/room"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/meta/include/wb"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/meta/include/meta"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/dps/public/include"
    "${CMAKE_SOURCE_DIR}/your_deps_dir/oss_sdk/include"
    
    )
    
    #根据编译方式指定要链接库的路径
    #oss_sdk为可选项,取决于是否要使用OSS进行二次开发,或者达到更精细的控制。
    #低代码工厂windows端sdk已经对oss_sdk进行了包装,实现了文档的上传功能。
    if(WIN32)
    
     if(CMAKE_BUILD_TYPE STREQUAL Debug)
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/meta/lib/win/Debug")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/meta/lib/win/Debug")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/oss_sdk/lib/win/Debug")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/OpenSSL/lib/win")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/curl/lib")
    
      set(MAINEXE_LIBRARIES 
       "meta.dll.lib"
       "libeay32.lib"
       "ssleay32.lib"
       "libcurl.lib"
       "atls.lib"
       "alibabacloud-oss-cpp-sdk.lib")
     else()
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/meta/lib/win/Release")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/meta/lib/win/Release")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/oss_sdk/lib/win/Release")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/OpenSSL/lib/win")
      link_directories("${CMAKE_SOURCE_DIR}/your_deps_dir/curl/lib")
    
      set(MAINEXE_LIBRARIES 
       "meta.dll.lib"
       "libeay32.lib"
       "ssleay32.lib"
       "atls.lib"
       "libcurl.lib"
       "alibabacloud-oss-cpp-sdk.lib")
     endif()
    endif()
    
    #指定你最终的目标要链接上面指定的MAINEXE_LIBRARIES
    target_link_libraries(your_target_exe
     ${MAINEXE_LIBRARIES}
     ${YOUR_OTHER_LIBS}
     )
  • 方式2:基于本地Visual Studio工程添加SDK依赖

    1. 指定头文件依赖路径。在Visual Studio目标工程右键,选择属性,找到图示的选项,增加以下配置。Debug和Release环境需要分开配置,例如Debug

      X:\your_deps_dir\meta\include
      X:\your_deps_dir\meta\include\rtc
      X:\your_deps_dir\meta\include\room
      X:\your_deps_dir\meta\include\wb
      X:\your_deps_dir\meta\include\meta
      X:\your_deps_dir\dps\public\include
      X:\your_deps_dir\oss_sdk\include
      X:\your_deps_dir\AliRTCSdk\include
      头文件引用目录
    2. 指定库依赖路径。在Visual Studio目标工程右键,选择属性,找到图示的选项,增加以下配置。Debug和Release环境需要分开配置,例如Debug

      X:\your_deps_dir\meta\lib\win\Debug
      X:\your_deps_dir\oss_sdk\lib\win\Debug
      X:\your_deps_dir\OpenSSL\lib\win
      X:\your_deps_dir\curl\lib
      X:\your_deps_dir\boost\lib
      低代码Windows端SDK库路径
    3. 指定需要链接的库。在Visual Studio目标工程右键,选择属性,找到图示的选项,增加以下配置。Debug和Release环境需要分开配置,例如Debug。

      meta.dll.lib
      libeay32.lib
      ssleay32.lib
      libcurl.lib
      atls.lib
      alibabacloud-oss-cpp-sdk.lib
      低代码工厂Windows端要链接的Lib

第三步:代码接入

此处以在main.cpp中以Qt框架集成SDK为例,实际请以自己业务为准。更多示例代码参考github开源Demo

#include <windows.h>
#include <QApplication>
#include <QDir>
#include <QWidget>
#include <mutex>
#include "meta_space.h"

using namespace alibaba::meta_space;

inline std::string GetDeviceId2() {

  static std::string id;
  if (!id.empty()) {
    return id;
  }
  char name[MAX_PATH];
  DWORD serno;
  DWORD length;
  DWORD file_flag;
  char file_name[MAX_PATH];
  BOOL ret = GetVolumeInformationA("c:\\", name, MAX_PATH, &serno, &length, &file_flag, file_name, MAX_PATH);
  if (ret) {
    id = std::to_string(serno);
  }
  return id;
}

class Const {
public:
  /**
   * kAppId (来自于阿里云控制台),考虑到安全问题,不建议写死在客户端,应通过业务服务器获取
   */
  const static std::string kAppId;

  /**
   * APP_KEY (来自于阿里云控制台),考虑到安全问题,不建议写死在客户端,应通过业务服务器获取
   */
  const static std::string kAppKey;

  /**
   * 验签公钥 (用户服务端按需选择),考虑到安全问题,不建议写死在客户端,应通过业务服务器获取
   */
  const static std::string kSignSecret;

  /**
   * 用户服务端链接地址 (接入时替换为自己的服务地址)
   */
  const static std::string kAppServerUrl;

};

#ifdef __cplusplus
extern "C" {
#endif
  int main(int argc, char* argv[]) {

    QApplication application(argc, argv);
    auto meta_space = MetaSpace::GetInstance();
    if (meta_space) {
      MetaSpaceContext ctx;

      ctx.app_id = Const::kAppId;
      ctx.app_key = Const::kAppKey;
      
      ctx.device_id = GetDeviceId2();
      QString path = QDir::currentPath()+ "/dps";
      std::string path_str = path.toStdString();
      QDir dir(path);
      
      if (!dir.exists()) {
        bool mk_success = dir.mkdir(path);
      }
      ctx.data_path = path.toStdString();
      ctx.env = (int32_t)alibaba::meta::EnvType::ENV_ONLINE;
     
      meta_space->Init(ctx, [&]() { 
      }, [&](const alibaba::dps::DPSError& err) {

        // 初始化失败,打日志
      });
      meta_space->SetLogHandler(alibaba::meta::LogLevel::LOG_LEVEL_DEBUG,
        [](alibaba::meta::LogLevel log_level,
          const std::string& log_content) {
   
        
      });
    }
    QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);

    //显示登录界面,可以在登录环节调用meta_space->Login,来进行用户登录,登录成功后可以进行rpc调用及事件的接收
    QWidget* login_window = new QWidget();
    login_window->show();
    //进入主循环
    application.exec();

    meta_space->SetLogHandler(alibaba::meta::LogLevel::LOG_LEVEL_DEBUG, nullptr);
    meta_space->Uninit();
    return 0;
  }
#ifdef __cplusplus
}
#endif