本文介绍以标准集成(无UI)方式集成Windows端互动课堂的步骤。

前提条件

  • 客户端集成前,请确保已经通过控制台创建应用并获取客户端集成需要的信息(应用ID,APP Key)。创建指引请参见创建应用
  • 客户端集成前,请确保已经完成服务端集成。集成指引请参见集成服务端SDK
  • 环境中已安装Visual Studio 2017。
  • 建议Windows SDK 安装10.0.19041.0或以上版本。

背景信息

低代码音视频工厂Windows端SDK以C++接口的形式提供服务。Windows端SDK能力包含房间管理、互动、直播、RTC、白板、播放器。各能力之间可以自由组合。

标准集成(无UI)方式集成Windows端互动课堂的完整步骤如下:

  1. 集成SDK
  2. 接入代码
  3. 建立长连接

集成SDK

  1. 下载并解压SDK。
    1. 登录低代码音视频工厂控制台
    2. 应用管理页面找到创建好的应用,导航至操作列,点击标准集成打开标准集成页面。
    3. 导航至客户端下载,点击Windows SDK对应的版本下载并解压。
    执行结果
    解压之后,文件结构如下图所示:001
  2. 使用CMake工程或基于本地Visual Studio工程添加SDK依赖。
    注意 两种方式二选一即可,推荐使用CMake工程添加。

    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}
     )
    基于本地Visual Studio工程添加SDK依赖
    1. 在Visual Studio目标工程右键,选择属性,找到下图所示的选项:
      说明 Debug和Release环境的配置路径相似。
      002
    2. 分别为Debug和Release环境增加以下配置,指定头文件依赖路径。
      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
    3. 在Visual Studio目标工程右键,选择属性,找到下图所示的选项:
      说明 Debug和Release环境的配置路径相似。
      003
    4. 分别为Debug和Release环境增加以下配置,指定库依赖路径。
      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
    5. 指定需要链接的库。在Visual Studio目标工程右键,选择属性,找到下图所示的选项:
      说明 Debug和Release环境的配置路径相似。
      004
    6. 分别为Debug和Release环境增加以下配置,指定需要链接的库。
      meta.dll.lib
      libeay32.lib
      ssleay32.lib
      libcurl.lib
      atls.lib
      alibabacloud-oss-cpp-sdk.lib

接入代码

Windows端SDK完整的代码实现逻辑请参见Windows SDK标准集成(无UI)源码

以下示例代码以在main.cpp中用Qt框架集成SDK为例介绍接入代码的流程:
说明 示例代码含UI。
#include <windows.h>
#include <QApplication>
#include <QDir>
#include <QWidget>
#include <mutex>
#include "meta_space.h"

using namespace alibaba::meta_space;

inline std::string GetDeviceId() {

  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 = GetDeviceId();
      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

建立长连接

标准集成场景下,集中过程要求服务端搭建Token获取服务和房间创建服务,为客户端与服务端建立长连接准备。详情请参见准备建立长连接

客户端需要在此基础上实现建立长连接的逻辑。建立长连接后客户端方可调用低代码音视频工厂服务,实现客户端功能。

Windows端建立长连接示例代码
void GetLoginToken(alibaba::meta_space::TokenInfo& token_info){
  std::string access_token;
  std::string refresh_token;

  //服务端准备建立长连接时时获取的access_token以及refresh_token。二者的值均由获取长连接建连Token接口返回。
  
  token_info.access_token = access_token;
  token_info.refresh_token = refresh_token;
}

void Login(const std::string& uid){
  auto meta_space = alibaba::meta_space::MetaSpace::GetInstance();
  if (meta_space) {
    alibaba::meta_space::TokenInfo token_info;

    //1. 获取token自行依据业务场景实现
    GetLoginToken(token_info);

    //2. 登录
    std::string uid;
    meta_space->Login(uid, token_info, []() {},
     [](const alibaba::dps::DPSError& error_msg) {
    });
  }
}

API接口

Windows端API接口请参见Windows接口列表