智慧服务,成就美好体验 项目咨询

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > Windows Native SDK > 会议 会议管理

入门使用

会议管理

更新时间:2019-11-20

创建预约会议

描述

用户创建预约会议。

前提条件

  1. 鉴权登录成功。
  2. 会议环境参数已设置。

业务流程

图1 预约会议流程 
  1. UI调用tsdk_book_conference()预约会议,会议参数结构为TSDK_S_BOOK_CONF_INFO,SDK发送预约会议请求至会议服务器。
    说明: 
    1. 在预约会议时,会议方数(size)、会议类型(conf_type)、媒体类型(conf_media_type)和与会者信息(attendee_num&attendee_list)必选,其他参数可选。
    2. 按具体需求填写会议方数,当实际与会者数目多于设置的方数时,服务会自动扩大会议方数,当填写方数小于3时,服务器默认会议方数为3。
    3. 预约会议,会议类型应选TSDK_E_CONF_RESERVED。
    4. 服务器默认时间为UTC时间,在预约时需将预约时间转换为UTC时间。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_book_conference(bookConfInfo);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("book conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. SDK在收到服务器返回的会议预约结果响应后,向UI上报预约会议结果通知TSDK_E_CONF_EVT_BOOK_CONF_RESULT,对应的结果数据结构为TSDK_S_CONF_BASE_INFO。
    说明: 

    如果会议成功预约,其他用户可以通过“查询会议列表”或其他第三方方式获取该会议的信息:

    代码示例:
    //c code
    case TSDK_E_CONF_EVT_BOOK_CONF_RESULT:
    {
         LOG_D_CALL_INFO("book conf result");
         break;
    }
    
     

注意事项

无。

创建即时会议

描述

用户创建立即会议。

说明: 

立即会议创建成功后,用户的SIP号码自动入会,用户作为会议主席召集其他与会者加入会议。

前提条件:

  1. 鉴权登录成功;
  2. SIP号码已成功注册;
  3. 会议环境参数已设置。

业务流程

图2 创建立即会议流程 
  1. UI调用tsdk_book_conference()创建立即会议,会议参数结构为TSDK_S_BOOK_CONF_INFO;SDK发送创建会议请求至会议服务器。
    说明: 

    在创建即时会议时,会议方数(size)、会议类型(conf_type),媒体类型(conf_media_type)和与会者信息(attendee_num&attendee_list)必选,其他参数可选;

    1. 预约会议,会议类型应选TSDK_E_CONF_INSTANT。
    2. 会议开始时间不用指定。
    3. 服务器默认时间为UTC时间,在预约时需将预约时间转换为UTC时间。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_book_conference(bookConfInfo);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("book conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. SDK在收到服务器返回的立即会议创建响应后,向UI上报会议创建结果通知TSDK_E_CONF_EVT_BOOK_CONF_RESULT,对应的结果数据结构为TSDK_S_CONF_BASE_INFO,UI应提示创建会议成功。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_BOOK_CONF_RESULT:
    {
         LOG_D_CALL_INFO("book conf result");
         break;
    }
    
     
  3. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    说明: 
    1. 在加入会议时,会请求会议权限,若请求失败,则会向UI上报会议权限请求失败通知TSDK_E_CONF_EVT_REQUEST_CONF_RIGHT_FAILED,UI提示申请会控权限失败,若请求成功,则不上报。
    2. 若应用程序是以多流的方式(SVC)成功加入会议,则此结果通知中会携带SVC信息,包含 is_svc_conf (是否多流会议)、svc_label_count(可使用的多流Label数) 和 svc_label (多流Label 表),应用程序应保存多流“Label”信息,用于后继流程中“绑定SVC视频窗口”、"选看SVC与会者"和“设置SVC窗口和与会者关系”等操作。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:
    {
         if (TSDK_SUCCESS == param2)
         {
             CHECK_POINTER(data);
             TSDK_S_JOIN_CONF_IND_INFO* pResult = (TSDK_S_JOIN_CONF_IND_INFO*)data;
             TSDK_S_JOIN_CONF_IND_INFO* notifyInfo = new TSDK_S_JOIN_CONF_IND_INF
             memset(notifyInfo, 0, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             memcpy_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), pResult, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_RESULT, (WPARAM)notifyInfo, (LPARAM)param1);
          }
         else
         {
             maindlg->MessageBox(_T("join conf failed!"));
         }
         break;
    }
    
     
  4. SDK收到会议状态更新通知,向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例详见“更新会议状态信息和与会者列表”描述。

  5. 若会议包含数据会议能力,SDK会向UI上报获取数据会议参数结果TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT:
    {
         if (TSDK_SUCCESS != param2)
         {
             maindlg->MessageBox(_T("get data conf param failed!"));
         }
         else
         {
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_GET_DATA_CONF_PARAM, (WPARAM)param1, NULL);
         }
         break;
    }
    
     
  6. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference(),SDK发送创建会议请求至会议服务器。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_join_data_conference(confHandle);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("join data conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  7. SDK在收服务器加入数据会议响应后,向UI上报数据会议加入结果通知TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT,若成功,则UI刷新界面,提示加入数据会议成功,若失败,则提示加入数据会议失败。
    说明: 

    在加入数据会议后,会向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_join_data_conference(confHandle);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("join data conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     

注意事项

无。

查询会议列表

描述

用户查询自己“创建”的和“待参加”的预约会议信息。

前提条件:

  1. 鉴权登录成功;
  2. 会议环境参数已设置。

业务流程

图3 查询会议列表流程 
  1. UI调用tsdk_query_conference_list()查询会议列表,查询会议列表的请求信息结构为TSDK_S_QUERY_CONF_LIST_REQ。
    说明: 

    1、会议权限(conf_right)用于指定要查询的会议权限类型,包含查询创建的会议、待参加的会议或创建和待参加的会议,可选填;

    2、请求会议列表页索引(page_index),取值从1开始,建议与应用程序与会议列表的页签对应,必须要有明确值;

    3、会议列表每页的会议个数(page_size),建议与应用程序会议列表个数相同,必须要有明确值。

    4、返回来的时间为UTC时间,UI进行页面呈现之前需要将UTC时间转换为本地时间。

    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_query_conference_list(arg);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("get conf list failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. SDK在收到服务器返回的查询会议列表响应后,向UI上报查询会议列表结果通知TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT,对应的结果数据结构为TSDK_S_CONF_LIST_INFO。
    说明: 

    1、查询会议列表只返回会议的概要信息,如需查询会议详情(包括与会者信息),需要“查询会议详情”;

    2、会议的主席密码需要“查询会议详情”获取。

    代码示例:
    //c code
    case TSDK_E_CONF_EVT_QUERY_CONF_LIST_RESULT:
    {
         if (TSDK_SUCCESS == param1)
         {
             CHECK_POINTER(data);
             TSDK_S_CONF_LIST_INFO* pResult = (TSDK_S_CONF_LIST_INFO*)data;
             TSDK_UINT32 currentConfNum = pResult->current_count;
             if (currentConfNum > 0)
             {
                 TSDK_S_CONF_BASE_INFO* notifyInfo = new TSDK_S_CONF_BASE_INFO[currentConfNum];
                 memset(notifyInfo, 0, sizeof(TSDK_S_CONF_BASE_INFO)*currentConfNum);
                 for (unsigned int i = 0; i < currentConfNum; i++)
                 {
                      notifyInfo[i].size = pResult->conf_info_list[i].size;
                      strncpy_s(notifyInfo[i].conf_id, TSDK_D_MAX_CONF_ID_LEN + 1, pResult->conf_info_list[i].conf_id, _TRUNCATE);
                      strncpy_s(notifyInfo[i].subject, TSDK_D_MAX_SUBJECT_LEN + 1, pResult->conf_info_list[i].subject, _TRUNCATE);
                      strncpy_s(notifyInfo[i].access_number, TSDK_D_MAX_NUMBER_LEN + 1, pResult->conf_info_list[i].access_number, _TRUNCATE);
                      strncpy_s(notifyInfo[i].chairman_pwd, TSDK_D_MAX_CONF_PASSWORD_LEN + 1, pResult->conf_info_list[i].chairman_pwd, _TRUNCATE);
                      strncpy_s(notifyInfo[i].guest_pwd, TSDK_D_MAX_CONF_PASSWORD_LEN + 1, pResult->conf_info_list[i].guest_pwd, _TRUNCATE);
                      strncpy_s(notifyInfo[i].start_time, TSDK_D_MAX_TIME_FORMATE_LEN + 1, pResult->conf_info_list[i].start_time, _TRUNCATE);
                      strncpy_s(notifyInfo[i].end_time, TSDK_D_MAX_TIME_FORMATE_LEN + 1, pResult->conf_info_list[i].end_time, _TRUNCATE);
                      notifyInfo[i].conf_media_type = pResult->conf_info_list[i].conf_media_type;
                      notifyInfo[i].conf_state = (TSDK_E_CONF_STATE)pResult->conf_info_list[i].conf_state;
                      strncpy_s(notifyInfo[i].scheduser_account, TSDK_D_MAX_ACCOUNT_LEN + 1, pResult->conf_info_list[i].scheduser_account, _TRUNCATE);
                      strncpy_s(notifyInfo[i].scheduser_name, TSDK_D_MAX_DISPLAY_NAME_LEN + 1, pResult->conf_info_list[i].scheduser_name, _TRUNCATE);
                 }
                      CDemoMeetingDlg* mettingDlg = maindlg->GetDemoMeetingDlg();
                      CHECK_POINTER(mettingDlg);
                      ::PostMessage(mettingDlg->GetSafeHwnd(), WM_CONF_CTRL_GET_CONF_LIST_RESULT, (WPARAM)notifyInfo, (LPARAM)currentConfNum);
              }
          }
          else
          {
                maindlg->MessageBox(_T("get conf list failed!"));
          }
          break;
    }
    
     

注意事项

无。

查询会议详情

描述

用户查询指定会议的详细信息。

前提条件:

  1. 鉴权登录成功;
  2. 会议环境参数已设置。

业务流程

图4 查询会议详情流程 
  1. UI调用tsdk_query_conference_detail()查询会议详情,请求信息结构为TSDK_S_QUERY_CONF_DETAIL_REQ。
    说明: 

    请求消息结构TSDK_S_QUERY_CONF_DETAIL_REQ中,

    • conf_id:需要查询的会议ID,通过查询列表或其他方式获取;
    • page_index:请求与会者列表页索引,取值从1开始,建议与应用程序与会者列表的页签对应;
    • page_size:与会者列表每页的与会者个数,建议与应用程序与会者列表个数相同。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_query_conference_detail(arg);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("query conference detail failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. SDK在收到服务器返回的查询会议详情响应后,向UI上报查询结果事件TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT,对应的结果数据结构为TSDK_S_CONF_DETAIL_INFO。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_QUERY_CONF_DETAIL_RESULT:
    {
         if (TSDK_SUCCESS == param1)
         {
             CHECK_POINTER(data);
             TSDK_S_CONF_DETAIL_INFO* pResult = (TSDK_S_CONF_DETAIL_INFO*)data;
             TSDK_S_CONF_DETAIL_INFO* notifyInfo = new TSDK_S_CONF_DETAIL_INFO;
             memset(notifyInfo, 0, sizeof(TSDK_S_CONF_DETAIL_INFO));
             memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_DETAIL_INFO), pResult, sizeof(TSDK_S_CONF_DETAIL_INFO));
             CDemoMeetingDlg* mettingDlg = maindlg->GetDemoMeetingDlg();
             CHECK_POINTER(mettingDlg);
             ::PostMessage(mettingDlg->GetSafeHwnd(), WM_CONF_CTRL_GET_CONF_INFO_RESULT, (WPARAM)notifyInfo, NULL);
          }
          else
          {
              maindlg->MessageBox(_T("get conf detail failed!"));
          }
          break;
    }
    
     

注意事项

无。