After-sales service
开发文档
-
单点登录接口
-
录播对接规范
-
互动对接规范
-
软件下载
-
单点登录接口
1. 单点登录的应用场景
1. 用户登录XX平台门户。
2. XX平台保存用户会话信息,在浏览器COOKIE中保存用户TGC信息。
3. 用户在XX平台选择应用,XX平台将用户重向至应用。
4. 用户在应用内访问受保护资源,应用将用户重定至XX平台。
5. XX平台从浏览器中获取用户TGC信息,并根据TGC校验用户会话。
6. XX平台生成ST,并携带ST将用户从XX平台重定向至应用。
7. 应用使用ST请求平台校验。
8. 平台向应用返回校验结果及用户信息。
1.1. 单点登录配置
说明:以下给出的配置是通用的客户端配置Demo,只适合跳转地址固定的场景。如有其他特殊需求,需客户端程序自己实现。
Java语言客户端配置(示例-ssotest 项目)
1.1.1. ssotest 项目说明
ssotest 项目是由maven管理的javaweb项目,项目所依赖的jar文件包都在项目根目录下的pom.xml 文件内定义,文件内除com.sanbu.shiro jar包外均为maven仓库的官方jar包。
1.1.2. 在项目web.xml文件添加以下内容
登出配置
shiroFilter过滤器
本过滤器用于过滤项目中需要使用单点登录的服务信息。
1.1.3. Spring配置详见
1.1.4. 配置cas.properties
参数说明
序号
参数名称
说明
1
cas.server.url.prefix
单点登录认证服务地址
2
Cas.service
客户端认证服务地址
3
login.url
登陆拦截认证跳转地址
1.1.5. 取得用户的信息
用户登录后,可以通过接口取得用户信息,这些信息包含在java.util. map对象中。
例如:
取得登录用户的信息
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.PrincipalCollection;
public class LoginUserUtil {
public static Map getLoginUser(){
Map<?, ?> userMap = null;
Subject subject = SecurityUtils.getSubject();
PrincipalCollection principals = subject.getPrincipals();
if(principals!=null&&!principals.isEmpty()){
List<?> list=principals.asList();
if(!list.isEmpty()){
userMap = (Map<?, ?>) list.get(1);
}
}
return userMap;
}
... ...
}
数据说明:
序号
字段名(Map的Key)
类型
说明
1
id
string
用户识别ID
2
username
string
用户名
3
usertype
string
用户类型
4
schoolid
string
用户学校识别ID
5
platmark
string
用户平台识别ID
6
schoolgroupid
string
用户学校组识别id
2. 接口参考
2.1. 单点登录
2.1.1. 单点登录接口
单点登录接口用于显示登录界面,登录成功后,单点登录平台生成票据信息ticket,单点登录客户应用携带票据信息ticket,并重定向到service参数所指定的地址 。
参数说明
序号
参数名称
是否必须
类型
描述
1
service
必选
string
登录成功后重定向的应用的目标地址即应用的入口地址。
例如:http://ip:port/ssotest/
返回说明
登录成功后获取票据信息ticket数据并缓存,然后重定向到目标地址。
2.1.2. Ticket验证接口
验证Ticket,验证成功后并返回当前登录用户信息。
接口说明
url
http://10.1.53.100/middlecas/serviceValidate
协议
http
请求方式
post
格式
xml
接口方向
应用à平台
参数说明
序号
参数名称
是否必须
类型
描述
1
ticket
必选
string
单点登录成功后生成的票据信息
2
serivce
必选
string
http://ip:port/ssotest/
例:
http://10.1.53.100/middlecas/serviceValidate?ticket=SO6YEWI93093UTYDVXBZ4513&service=http://ip:port/ssotest/
返回说明
序号
字段名
约束
类型
说明
1
cas:serviceResponse
必选
1.1
cas:authenticationSuccess
必选
1.1.1
cas:user
必选
String
用户标识ID
1.1.2
cas:attributes
必选
1.1.2.1
cas:truename
必选
String
用户真实名称
1.1.2.2
cas:mobile
可选
String
手机号
1.1.2.3
cas:usertype
必选
String
用户类型
1.1.2.4
cas:schoolgroupid
必选
String
用户学校分组标识ID
1.1.2.5
cas:password
可选
String
用户密码
1.1.2.6
cas:schoolid
必选
String
归属机构\学校ID
1.1.2.7
cas:name
必选
String
用户名
1.1.2.8
cas:groupleader
可选
String
是否是组长
1.1.2.9
cas:registertype
可选
String
用户注册方式
1.1.2.10
cas:id
必选
String
用户标识ID,与1.1.1一致
1.1.2.11
cas:usercode
可选
String
用户编码
1.1.2.12
cas:platmark
必选
String
用户平台ID
1.1.2.13
cas:email
可选
String
用户邮件地址
示例:验证通过报文
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<!—用户ID -->
<cas:user>6769bc63-636e-423b-9d19-e6b8a9f13227</cas:user>
<!—附加信息 -->
<cas:attributes>
<!—用户真实名称 -->
<cas:truename>XXXX</cas:truename>
<!—手机号 -->
<cas:mobile/>
<!—用户类型 -->
<cas:usertype>e9f46d6c-c44d-463b-a6ff-80b74cd3edee</cas:usertype>
<!用户学校分组标识ID -->
<cas:schoolgroupid/>
<cas:password/>
<!—归属机构\学校ID -->
<cas:schoolid>a57f69f6-89ff-4a1d-aa69-799d5db1b15d</cas:schoolid>
<!—用户名 -->
<cas:name>jssadmin</cas:name>
<!—是否是组长 -->
<cas:groupleader>0</cas:groupleader>
<!—用户注册方式 -->
<cas:registertype>0</cas:registertype>
<!—用户ID -->
<cas:id>6769bc63-636e-423b-9d19-e6b8a9f13227</cas:id>
<cas:usercode/>
<!—用户平台ID -->
<cas:platmark>e7fcf0e4-6fd7-49a0-9343-847d86be2822</cas:platmark>
<!—用户邮箱 -->
<cas:email/>
<cas:username>6769bc63-636e-423b-9d19-e6b8a9f13227</cas:username>
</cas:attributes>
<!—附加结束 -->
</cas:authenticationSuccess>
</cas:serviceResponse>
验证不通过的报文:
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationFailure code="INVALID_REQUEST">必须同时提供'service'和'ticket'参数</cas:authenticationFailure>
</cas:serviceResponse>
客户端解释XML报文对验证通过的报文中取得<cas:id>节点的值,得到当前登录的用户标识ID。
客户端收到校验通过后的报文,取得用户标识ID,根据ID建立本地的用户会话。会话时间默认的保持时间为30分钟;或根据需要具体配置,客户端再根据ID调用平台接口取得当前用户的用户信息。
2.2. OAuth接口
XX用户平台集成了OAuth接口,用于提供给非WEB应用系统。非WEB应用系统可以使用OAuth接口,访问平台的资源数据。
2.2.1. OAuth接口的使用
平台中封装了OAuth接口的调用。要使用OAuth接口,必须使用平台提供的jar包:
middleware.core-1.0.3.A.8-pg.jar.zip
系统封装了com.3bu.middle.util.OAuthClient对象,用于访问OAuth接口。
2.2.2. OAuthClient对象说明
构造函数
序号
参数名称
数据类型
说明
1
serverUrl
String
平台服务应用的URL
2
authorizeUrl
String
认证地址,一般是/oauth2/authorize
3
redirectUrl
String
重定向地址,使用null的缺省值: /oauth2/access_token
登录
l 方法名: login
l 参数说明:
序号
参数名称
数据类型
说明
1
platformId
String
平台ID
2
username
String
用户名
3
password
String
密码
4
clientId
String
客户ID, 通常使用常量
"6b4cfaea-7016-11e5-bd19-68f728833c05"
l 返回说明:json类型:
序号
参数名称
数据类型
说明
1
access_token
String
令牌
l 异常:
HttpException, IOException, JSONException, Exception
调用POST接口
l 方法名: callPost
l 参数说明:
序号
参数名称
数据类型
说明
1
postUrl
String
API地址
2
params
Map<String, String>
参数
3
contentType
String
数据类型
l 返回类型:
Object类型,JSONObject/JSONArray,视具体接口而定
l 异常:
IOException
调用GET接口
l 方法名: callGet
l 参数说明:
序号
参数名称
数据类型
说明
1
getUrl
API地址
2
params
Map<String, String>
参数
3
contentType
String
数据类型
l 返回类型:
Object类型,JSONObject/JSONArray,视具体接口而定
l 异常:
IOException
调用GET接口(重载方法)
l 方法名: callGet
l 参数说明:
序号
参数名称
数据类型
说明
1
getUrl
API地址
2
params
Map<String, String>
参数
3
header
Map<String, String>
HTTP定制HEAD
l 返回类型:
Object类型,JSONObject/JSONArray,视具体接口而定
l 异常:
IOException
2.3. 调用示例
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.3bu.middle.util.OAuthClient
/**
* OAuth访问示例类
*/
public class TestCenterOAuthCaller {
//平台服务应用的URL
final static String ServiceApp =
"https://dev.3bu.com:8443/middlecenter";
final static String AuthorizeUrl="/oauth2/authorize";
public static void main(String[] args) throws Exception {
OAuthClient client=new OAuthClient(ServiceApp, AuthorizeUrl, null);
//平台租户ID
String platformId = "29a5350d-aee2-4c30-894e-47124f4c6084";
String username = "xxxx"; //用户名
String password = "yyyyyy"; //密码
String clientID = "6b4cfaea-7016-11e5-bd19-68f728833c05" ; //常量
JSONObject json = client.login(
platformId, username, password, clientID);
//API路径
final String apiUrl ="/service/api/v1/auth/area/areaTree/";
Map<String,String> para = new HashMap<>();
para.put("nodeid", "1");
JSONArray data=(JSONArray)client.callPost(
apiUrl, para, MediaType.APPLICATION_FORM_URLENCODED);
System.out.println(data);
}
}
-
录播对接规范
此文档仅用于实现用户的应用场景使用,其它任何人都不能用于其它用途。
1. 前言
1.1. 背景
此文档仅用于实现用户的应用场景使用,其它任何人都不能用于其它用途。
三步TSCloud平台控制第三方录播流程图:
1.1. 基础信息
品牌
产品负责人:
研发负责人:
产品型号:
软件版本:
其它:
备注:
1. 为方便对接以上信息要求真实可靠;
2. 如果用户现场环境中软件版本与填表不一至,必须同步提交该软件版本;
2. 连接通讯
2.1. 基本通讯
需要提供:品牌及型号识别、传输协议、数据传输格式、验证方式、通讯端口等信息,
功能说明
条件
发送
返回
其它
例如:
tcp客户端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* TCP链接
*/
public class TCPClient {
/* 日志 */
private Logger logger = LoggerFactory.getLogger(TCPClient.class);
/* socket实例 */
private Socket s;
private DataOutputStream out
private DataInputStream in;
/**
* 连接设备
* @param ddr 地址
* @param port 端口
*/
public void connect(String ddr, int port) {
try {
s = new Socket(ddr, port);
if (s.isConnected()) {
logger.info("连接录播 :" + ddr + " 端口:" + port + "成功");
}
} catch (UnknownHostException e) {
logger.error("错误的地址" + e.getMessage(), e);
} catch (IOException e) {
logger.error("建立连接失败" + e.getMessage(), e);
}
}
/**
* 发送消息
* @param msg 指令
*/
public void sendMag(String msg) {
try {
out = new DataOutputStream(s.getOutputStream());
byte[] bt = msg.getBytes();
out.write(bt);
} catch (IOException e) {
logger.error("发送消息失败" + e.getMessage(), e);
}
}
/**
* 返回信息
*/
public String response() {
StringBuffer result = new StringBuffer();
try {
in = new DataInputStream(s.getInputStream());
byte[] buf = new byte[2048];
int readLen = 0;
while ((readLen = in.read(buf)) != -1) {
String s1 = new String(buf,0,readLen,"UTF-8");
result.append(s1);
}
out.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
String rest = result.toString().trim();
return rest;
}
}
/**
* mc1000客户端
*/
public class MC1000 {
private Logger logger = LoggerFactory.getLogger(MC1000.class);
public TCPClient TCPClient;
public MC1000(){
TCPClient = new TCPClient();
TCPClient.connect("10.1.0.81", 11092);
TCPClient.sendMag("<CMD id=\"login_req\"><userid>admin</userid><passwd>admin</passwd><need_db></need_db></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 打开录制
* @param rec_mode 录制模式(0:电影模式,1:资源模式,2:电影+资源)
*/
public void startRecord(String rec_mode) {
TCPClient.sendMag("<CMD id=\"start_rec\"><rec_mode>" + rec_mode + "</rec_mode></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 关闭录制
*/
public void stopRecord() {
TCPClient.sendMag("<CMD id=\"stop_rec\"></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 设置录制模式
* @param recMode 录制模式(0:电影模式,1:资源模式,2:电影+资源)
*/
public void setRecMode(String rec_mode) {
TCPClient.sendMag("<CMD id=\"set_rec_mode\"><rec_mode>" + rec_mode + "</rec_mode></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 设置自动跟踪
* @param trackMode 跟踪(0:自动跟踪 1:手动跟踪)
*/
public void setTrackMode(String trackMode) {
TCPClient.sendMag("<CMD id=\"set_track_mode\"><track_mode>" + trackMode + "</track_mode>");
logger.info("设备返回信息" + TCPClient.response());
}
}
2.2. 网络连接
用来连接设备,连接时会传用户名和密码给设备。连接上设备才可以操作设备,需要提供如何通过网络指令登录录播设备、如何心跳、如何进行验证方法等。
功能说明
条件
发送
返回
其它
备注:
1. 如果录播没有心跳功能,建议指定个查询状态用于心跳连接;
2. 建议此用户名或密码具有一定的权限,用户无法更改密码;
一段代码分别标注包含以上信息。
public MC1000(){
TCPClient = new TCPClient(); //初试化客户端时new一个TCP连接对象
TCPClient.connect("10.1.0.81", 11092);//连接上ip为10.1.0.81的设备
TCPClient.sendMag("<CMD id=\"login_req\"><userid>admin</userid><passwd>admin</passwd><need_db></need_db></CMD>");//发送验证信息给设备(包括用户名,密码)
logger.info("设备返回信息" + TCPClient.response());//验证成功,设备返回信息(需要处理的信息)
}
备注:登录成功后,设备会返回所有设备相关信息。
3. 管理功能
3.1. 在线状态
提供如何获取录播的在线状态、录制状态、直播状态、文件上传状态、硬盘剩余空间等状态,
功能说明
发送
返回
其它
例如:
/**
* 心跳
*/
public void heartBeaten() {
TCPClient.sendMag("<CMD id=\"heart_beaten\"></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:mc1000支持心跳,心跳指令heart_beaten,会返回设备状态(比如:在线状态、录制状态、直播状态、画面状态等)
3.2. 开关机
通过网络指令实现对录播设备开机或关机,如果不能返回状态需要说明是否可以重复发送。
功能说明
发送
返回
其它
一段代码分别标注包含以上信息。
例如:
/**
* 关机/重启
* @param poweroff 0:关机 1:重启
*/
public void reboot(String poweroff) {
TCPClient.sendMag("<CMD id=\"reboot\"><poweroff>" + poweroff + "</poweroff>");//发送指令给设备,参数poweroff(0:关机 1:重启)
logger.info("设备返回信息" + TCPClient.response());//设备返回信息(需要处理)
}
3.3. 查询录播详情
可以查询录制、直播、接口等参数的详情。
功能说明
条件
发送
返回
其它
备注:mc1000会主动推送设备详情
4. 基本录直播功能
4.1. 录制功能
包括录制的开始、暂停、结束,如果录制开始需要传参数,请详细说明传哪些参数。
功能说明
条件
发送
返回
其它
/**
* 打开录制
* @param rec_mode 录制模式(0:电影模式,1:资源模式,2:电影+资源)
*/
public void startRecord(String rec_mode) {
TCPClient.sendMag("<CMD id=\"start_rec\"><rec_mode>" + rec_mode + "</rec_mode></CMD>");//打开录制需要传入录制模式
logger.info("设备返回信息" + TCPClient.response());//这里会返回设备当前录制信息(比如:录制状态,录制时间,录制开始时间,录制模式...)
}
备注:mc1000打开录制,需要传入参数录制模式(0:电影模式,1:资源模式,2:电影+资源)。
/**
* 关闭录制
*/
public void stopRecord() {
TCPClient.sendMag("<CMD id=\"stop_rec\"></CMD>");//发送关闭录制指令即可
logger.info("设备返回信息" + TCPClient.response());//返回录制信息
}
4.2. 录制模式
包括电影、资源、电影+资源模式,需要说明更改的条件,例如录制开始时不允许更改、或部分场景下不允许更改等。
功能说明
条件
发送
返回
其它
/**
* 设置录制模式
* @param recMode 录制模式(0:电影模式,1:资源模式,2:电影+资源)
*/
public void setRecMode(String rec_mode) {
TCPClient.sendMag("<CMD id=\"set_rec_mode\"><rec_mode>" + rec_mode + "</rec_mode></CMD>");//设置录制模式(参数:0:电影模式,1:资源模式,2:电影+资源)
logger.info("设备返回信息" + TCPClient.response());//返回录制模式
}
4.3. 画面分屏
可以设置的画面分屏模式,例如单屏、画中画等。
功能说明
条件
发送
返回
其它
/**
* 设置画面分屏
* @param policy_id 分屏策略(0:互动单屏、1:互动(无VGA)、2:互动(无学生)、3:互动四分屏、4:精品课堂-三分屏、5:学生+VGA、6:精品课堂单屏、7:老师+VGA(画中画)、8:老师+VGA(左右)、9:老师+学生(画中画)、10:老师+学生(左右)、11:听课课堂)
* pip_pos 画中画小画面位置(lu:左上、ld:左下、ru:右上、rd:右下)
*/
public void splitScreen(String policy_id,String pip_pos) {
TCPClient.sendMag("<CMD id=\"set_pic_policy\"><pic_id>0</pic_id><policy_id>" + policy_id + "</policy_id><pip_pos>" + pip_pos + "</pip_pos><save_it>1</save_it><use_it>1</use_it></CMD>");
//policy_id 分屏策略(0:互动单屏、1:互动(无VGA)、2:互动(无学生)、3:互动四分屏、4:精品课堂-三分屏、5:学生+VGA、6:精品课堂单屏、7:老师+VGA(画中画)、8:老师+VGA(左右)、9:老师+学生(画中画)、10:老师+学生(左右)、11:听课课堂) pip_pos 画中画小画面位置(lu:左上、ld:左下、ru:右上、rd:右下)
logger.info("设备返回信息" + TCPClient.response());//返回画面状态
}
备注:mc1000分屏主要两个重要参数policy_id(分屏策略)、pip_pos(画中画小画面位置),其他的参数设置默认参数即可。
4.4. 画面切换
可以切换老师、学生、课件等某个画面到主画面或预览画面。
功能说明
条件
发送
返回
其它
/**
* 设置主画面
* @param major 主画面(tq:老师全景、tt:老师特写、bk:板书、sq:学生全景、st:学生特写、vga:vga、 hd:互动远端、-1:自动)
*/
public void setMajor(String major) {
TCPClient.sendMag("<CMD id=\"set_major\"><major>" + major + "</major></CMD>");//设置主画面(参数:tq:老师全景、tt:老师特写、bk:板书、sq:学生全景、st:学生特写、vga:vga、 hd:互动远端、-1:自动)
logger.info("设备返回信息" + TCPClient.response());//返回画面状态
}
备注:mc1000主画面支持老师全景(tq)、老师特写(tt)、板书(bk)、学生全景(sq)、学生特写(st)、vga(vga)、互动远端(hd)、自动(-1)。
4.5. 直播功能
控制录播直播的配置,例如可配置直播开关、推流地址、协议、分辨率等。
功能说明
条件
发送
返回
其它
备注:
1. 如果录播提供多种直播类型,需要标注出RTMP协议的设置及配置方法;
2. 录播支持多路不同码流的直播时需要标注支持哪些类型;
3. 直播是否有前置条件必须要明确说明;
/**
* 设置直播参数
* @param params 直播相关参数(bwud:超清直播码率 、 bwhd:高清直播码率 、bwsd:标清直播码率 、resud:超清直播分辨率 、reshd:高清直播分辨率 、ressd:标清直播分辨率 、urlud:超清直播地址、urlhd"高清直播地址、urlsd:标清直播地址)
*/
public void setBroadParam(Map<String,Object> params) {
TCPClient.sendMag("<CMD id=\"set_broad\"><res_ud>" + params.get("res_ud") + "</res_ud><res_hd>" + params.get("res_hd") + "</res_hd><res_sd>" + params.get("res_sd") + "</res_sd><bw_ud>" + params.get("bw_ud") + "</bw_ud><bw_hd>" + params.get("bw_hd") + "</bw_hd><bw_sd>" + params.get("bw_sd") + "</bw_sd><url_ud>" + params.get("url_ud") + "</url_ud><url_hd>" + params.get("url_hd") + "</url_hd><url_sd>" + params.get("url_sd") + "</url_sd></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:mc1000支持推3路直播流,所以可设置三路直播参数。
/**
* 打开直播
* @param isOuter 直播类型(0:本地直播 、 1:平台直播)
*/
public void setLiveOn(String isOuter) {
TCPClient.sendMag("<CMD id=\"start_live\"><isOuter>" +isOuter + "</isOuter></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 关闭直播
* @param isOuter 直播类型(0:本地直播 、 1:平台直播)
*/
public void setLiveOn(String isOuter) {
TCPClient.sendMag("<CMD id=\"stop_live\"><isOuter>" +isOuter + "</isOuter></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:mc1000可以支持平台直播和本地直播,对应我们平台的需求,所以都会控制。
5. 跟踪相关功能
5.1. 跟踪开关
通过录播控制跟踪的指令,必须包含控制老师、学生、板书跟踪的开启与关闭,同时提供同步状态方法。
功能说明
条件
发送
返回
其它
备注:mc1000支持设置老师学生分开控制,也支持同步控制。
1. 建议如果支持老师、学生分开控制提供分开控制方法;
/**
* 设置学生跟踪
* @param st_manual 学生跟踪(0:自动跟踪开、1:自动跟踪关)
*/
public void setStudentTrackMode(String st_manual) {
TCPClient.sendMag("<CMD id=\"set_track_mode\"><st_manual>" + st_manual + "</st_manual></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
/**
* 设置老师跟踪
* @param tt_manual 老师跟踪(0:自动跟踪开、1:自动跟踪关)
*/
public void seTeacherTrackMode(String tt_manual) {
TCPClient.sendMag("<CMD id=\"set_track_mode\"><tt_manual>" + tt_manual + "</tt_manual></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:学生跟踪和老师跟踪的参数都是(0:自动跟踪开、1:自动跟踪关)
2. 需要同步说明跟踪关后是否还会画面切换 。
/**
* 设置跟踪
* @param trackMode 跟踪(0:自动跟踪开、1:自动跟踪关)
*/
public void seTeacherTrackMode(String trackMode) {
TCPClient.sendMag"<CMD id=\"set_track_mode\"><track_mode>" + trackMode + "</track_mode></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:这个是mc1000总体设置跟踪,参数trackMode(0:自动跟踪开、1:自动跟踪关)
5.2. 跟踪状态
通过录播获取老师、学生、板书、课件的状态,即需要通过接口能够自动获取到目标的状态,建议是发生动作后自己上报状态。
功能说明
条件
发送
返回
其它
备注:mc1000会推送设备状态
5.3. 摄像机控制
通过录播控制老师、学生、板书三个摄像机的云台控制、变焦、预置位等控制操作。
功能说明
条件
发送
返回
其它
/**
* 摄像机控制
* @param params 摄像机控制相关参数
* cameraIndex:相机编号或者镜头选择
* camAction:摄像机具体控制(left / right / up / down /zoom_in(特写) / zoom_out(全景))
* turnDuration:摄像机运动时长
*/
public void CameraControl(Map<String,Object> params) {
TCPClient.sendMag("<CMD id=\"move_pan\"><ptzcam_idx>" + params.get("cameraIndex") + "</ptzcam_idx><action>" + params.get("camAction") + "</action><speed>30</speed></CMD>");
//mc1000操控摄像机后,摄像机执行持续时间turnDuration
try {
Thread.sleep(Integer.parseInt((String)params.get("turnDuration")));
} catch (InterruptedException e) {
}
//mc1000操控摄像机后,会一直执行下去,所以需要下面的代码来终止操作
TCPClient.sendMag("<CMD id=\"move_pan\"><ptzcam_idx>" + params.get("cameraIndex") + "</ptzcam_idx><action>stop</action><speed>30</speed></CMD>");
}
/**
* 预制位设置
*
* @param params 设置预制位相关信息
* operatePos:具体操作预制位参数 recall_preset(调用预制位)、clear_preset(删除预制位)、set_preset(保存预制位)
* cameraIndex:相机编号或者镜头选择
* pos:预制位信息
*/
public void setPreset(Map<String, Object> params) {
TCPClient.sendMag("<CMD id=\""+ params.get("operatePos") +"\"><ptzcam_idx>" + params.get("cameraIndex") + "</ptzcam_idx><pos>" + params.get("pos") + "</pos></CMD>");
}
6. 文件管理功能
6.1. 文件管理
提供录播获取录制文件列表的查询、修改、删除操作。
功能说明
条件
发送
返回
其它
备注:
1. 获取文件列表时建议提供详细的文件名称、讲课老师、录制时间、科目等详细的信息;
6.2. 文件上传或获取
提供录播录像文件上传的方法,如果没有上传功能,需要提供获取录播录像文件的方法,通过平台先获取再上传。
功能说明
条件
发送
返回
其它
备注:
1. 如果录播支持自动上传(如FTP)功能,需要提供自动上传的方法及配置方案。
2. 自动上传的任务状态需要给出相应的解决方案。
/**
* 设置ftp文件上传
* @param ftp_ip 文件服务器地址
* user_id 文件服务器用户名
* passwd 文件服务器密码
* auto_upload 是否自动上传(0:不自动上传、1:自动上传)
*/
public void setFTP(String ftp_ip,String user_id,String passwd,String auto_upload) {
TCPClient.sendMag("<CMD id=\"set_ftp_svr\"><ftp_ip>" +ftp_ip + "</ftp_ip><user_id>" +user_id + "</user_id><passwd>" +passwd + "</passwd><auto_upload>" +auto_upload + "</auto_upload></CMD>");
logger.info("设备返回信息" + TCPClient.response());
}
备注:设置自动上传后,文件录制完成后会自动上传都我们的文件服务器。
7. 其它特有功能
其它录播厂商认为自己的特色功能,或用户强烈要求的功能,可在此进行详细的功能说明及控制接口说明。
-
互动对接规范
三步TSCloud平台控制第三方MCU流程图:
1. 连接通讯
1.1. 基本通讯
需要提供:品牌及型号识别、传输协议、数据传输格式、验证方式、通讯端口等信息,
功能说明
条件
发送
返回
其它
示例代码:
<?xml version="1.0" encoding="UTF-8"?>
<TRANS_MCU>
<ACTION>
<LOGIN>
<MCU_IP>
<IP>127.0.0.1</IP> //MCUIP
<LISTEN_PORT>80</LISTEN_PORT> //MCU端口
<HOST_NAME />
</MCU_IP>
<USER_NAME>UNAME</USER_NAME> //登录名
<PASSWORD>PWORD</PASSWORD> //登录密码
<COMPRESSION>true</COMPRESSION>
</LOGIN>
</ACTION>
</TRANS_MCU>
发送XML给MCU。
2. 管理功能
2.1. 设备状态
提供如何获取MCU的在线状态、序列号、软件版本、总资源数、剩余资源数等状态,
功能说明
发送
返回
其它
示例代码:
<TRANS_RSRC_REPORT>
<ACTION>
<GET_CARMEL_REPORT/> //获取资源数
</ACTION>
</TRANS_RSRC_REPORT>
<TRANS_MCU>
<ACTION>
<GET_CFS /> //获取序列号
</ACTION>
</TRANS_MCU>
发送XML给MCU。
2.2. 模版状态
包括模版列表的获取、模版的新增、模版的删除等
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_RES_LIST>
<ACTION>
<GET_PROFILE_LIST> //获取模版列表
<OBJ_TOKEN>-1</OBJ_TOKEN>
</GET_PROFILE_LIST>
</ACTION>
</TRANS_RES_LIST>
发送XML给MCU。
2.2.1. 创建模版
创建一个新的模版。
功能说明
条件
发送
返回
示例代码:
<TRANS_RES_1>
<ACTION>
<START>
<RESERVATION>
<OBJ_TOKEN>-1</OBJ_TOKEN>
<CHANGED>true</CHANGED>
<NAME>dairb_routing</NAME>
<ID>-1</ID>
<REMARK />
<NETWORK>h320_h323</NETWORK>
<MEDIA>video_audio</MEDIA>
<PASSWORD />
<VIDEO_SESSION>continuous_presence</VIDEO_SESSION>
<VIDEO_PROTOCOL>auto</VIDEO_PROTOCOL>
<TRANSFER_RATE>1920</TRANSFER_RATE>
<AUDIO_RATE>auto</AUDIO_RATE>
<VIDEO_FORMAT>auto</VIDEO_FORMAT>
<FRAME_RATE>auto</FRAME_RATE>
<ATTENDED_MODE>ivr</ATTENDED_MODE>
<AV_MSG>Conference IVR Service</AV_MSG>
<RESTRICT_MODE>derestricted</RESTRICT_MODE>
<T120_RATE>none</T120_RATE>
<ENTRY_TONE>false</ENTRY_TONE>
<EXIT_TONE>false</EXIT_TONE>
<END_TIME_ALERT_TONE>5</END_TIME_ALERT_TONE>
<STAND_BY>false</STAND_BY>
<PEOPLE_AND_CONTENT>false</PEOPLE_AND_CONTENT>
<ANNEX_N>false</ANNEX_N>
<ANNEX_P>false</ANNEX_P>
<ANNEX_F>false</ANNEX_F>
<OPERATOR_CONF>false</OPERATOR_CONF>
<SAME_LAYOUT>false</SAME_LAYOUT>
<DUO_VIDEO>false</DUO_VIDEO>
</RESERVATION>
</START>
</ACTION>
</TRANS_RES_1>
发送XML给MCU。
2.2.2. 删除模版
删除一个模版。
功能说明
条件
发送
返回
示例代码:
<TRANS_RES_2>
<ACTION>
<TERMINATE_PROFILE>
<ID>0</ID> //会议ID
</TERMINATE_PROFILE>
</ACTION>
</TRANS_RES_2>
发送XML给MCU。
3. 会议功能
3.1. 创建会议
需要说明创建会议的流程,包含创建会议是否设定参数信息、调取MCU存储的参数等详细过程及接口。
功能说明
条件
发送
返回
示例代码:
<TRANS_RES_1>
<ACTION>
<START>
<RESERVATION>
<OBJ_TOKEN+>-1</OBJ_TOKEN>
<CHANGED>true</CHANGED>
<NAME />
<ID>-1</ID>
<REMARK />
<NETWORK>h320_h323</NETWORK>
<MEDIA>video_audio</MEDIA>
<PASSWORD />
<VIDEO_SESSION>continuous_presence</VIDEO_SESSION>
<VIDEO_PROTOCOL>auto</VIDEO_PROTOCOL>
<TRANSFER_RATE>384</TRANSFER_RATE>
<AUDIO_RATE>auto</AUDIO_RATE>
<VIDEO_FORMAT>auto</VIDEO_FORMAT>
<FRAME_RATE>auto</FRAME_RATE>
<ATTENDED_MODE>ivr</ATTENDED_MODE>
<AV_MSG />
<RESTRICT_MODE>derestricted</RESTRICT_MODE>
<T120_RATE>none</T120_RATE>
<ENTRY_TONE>false</ENTRY_TONE>
<EXIT_TONE>false</EXIT_TONE>
<END_TIME_ALERT_TONE>5</END_TIME_ALERT_TONE>
<STAND_BY>false</STAND_BY>
<PEOPLE_AND_CONTENT>false</PEOPLE_AND_CONTENT>
<ANNEX_N>false</ANNEX_N>
<ANNEX_P>false</ANNEX_P>
<ANNEX_F>false</ANNEX_F>
<OPERATOR_CONF>false</OPERATOR_CONF>
<SAME_LAYOUT>false</SAME_LAYOUT>
<DUO_VIDEO>false</DUO_VIDEO>
</RESERVATION>
</START>
</ACTION>
</TRANS_RES_1>
发送XML给MCU。
3.1.1. 可召开的会议模式
设置会议模式。比如:
1. 可设置所有终端看相同画面,
2. 所有终端看除自己之外的其他终端画面,
3. 指定某个终端看其他终端画面,其他终端均看该的终端画面,
功能说明
条件
发送
返回
3.1.2. 创建级联会议
需要说明会议级联的方案,建议是级联的逻辑有TSCloud平台实现,只需要提供创建级联会议的方法及接口文档即可。
备注:
1. 如果MCU自带级联方案,只需要提供接口即可;
2. 级联点需要特别说明;
3.2. 会议管理
3.2.1. 会议信息
获取指定MCU上的会议列表。
功能说明
条件
发送
返回
示例代码:
<TRANS_CONF_LIST>
<ACTION>
<GET_LS>
<OBJ_TOKEN>-1</OBJ_TOKEN> //获取会议列表
</GET_LS>
</ACTION>
</TRANS_CONF_LIST>
发送XML给MCU。
3.2.2. 删除会议
删除指定MCU上的某个会议
功能说明
条件
发送
返回
示例代码:
<TRANS_CONF_2>
<ACTION>
<TERMINATE_CONF>
<ID>0</ID> //要删除的会议的ID
</TERMINATE_CONF>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3. 会议控制
3.3.1. 获取终端信息
获取指定会议终端某个终端的详细信息
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_PARTY>
<ACTION>
<GET>
<CONF_ID>1</CONF_ID> //会议ID
<PARTY_ID>1</PARTY_ID> //终端ID
</GET>
</ACTION>
</TRANS_PARTY>
发送XML给MCU。
3.3.2. 添加终端
通过IP地址、H323短号、SIP短号呼叫各类视频会议终端
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_1>
<ACTION>
<ADD_PARTY>
<ID>157</ID>
<PARTY>
<NAME>1955558</NAME>
<ID>0</ID>
<INTERFACE>h323</INTERFACE>
<CONNECTION>dial_out</CONNECTION>
<MEET_ME_METHOD>party</MEET_ME_METHOD>
<NUM_TYPE>taken_from_service</NUM_TYPE>
<BONDING>auto</BONDING>
<MULTI_RATE>auto</MULTI_RATE>
<NET_CHANNEL_NUMBER>auto</NET_CHANNEL_NUMBER>
<VIDEO_PROTOCOL>auto</VIDEO_PROTOCOL>
<CALL_CONTENT>framed</CALL_CONTENT>
<ALIAS>
<NAME />
<ALIAS_TYPE>323_id</ALIAS_TYPE>
</ALIAS>
<IP>192.167.2.42</IP>
<SIGNALING_PORT>1720</SIGNALING_PORT>
<VOLUME>5</VOLUME>
<BONDING_PHONE />
<SERVICE_NAME />
<SUB_SERVICE_NAME />
<AUTO_DETECT>false</AUTO_DETECT>
<RESTRICT>false</RESTRICT>
<ENHANCED_VIDEO>false</ENHANCED_VIDEO>
<VIDEO_BIT_RATE>automatic</VIDEO_BIT_RATE>
</PARTY>
</ADD_PARTY>
</ACTION>
</TRANS_CONF_1>
发送XML给MCU。
3.3.3. 挂断终端
挂断指定会议中的某个终端
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_CONNECT>
<ID>1</ID> //会议ID
<CONNECT>false</CONNECT> //true:连接,false:挂断
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_CONNECT>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.4. 删除终端
将指定会议终端某个终端从会议中踢出
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<DELETE_PARTY>
<ID>1</ID> //会议ID
<PARTY_ID>1</PARTY_ID> //终端ID
</DELETE_PARTY>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.5. 静音
指定会议终端某个终端静音,静音后,其他终端无法听到该终端的声音
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_VIDEO_MUTE>
<ID>1</ID> //会议ID
<AUDIO_MUTE>true</AUDIO_MUTE> //true:静音,false:非静音
<VIDEO_MUTE>true</VIDEO_MUTE> // true:阻塞,false:非阻塞
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_VIDEO_MUTE>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.6. 取消静音
指定会议终端某个终端取消静音,取消静音后,其他终端可听到该终端的声音
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_VIDEO_MUTE>
<ID>1</ID> //会议ID
<AUDIO_MUTE>true</AUDIO_MUTE> //true:静音,false:非静音
<VIDEO_MUTE>true</VIDEO_MUTE> // true:阻塞,false:非阻塞
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_VIDEO_MUTE>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.7. 闭音
指定会议终端某个终端闭音,闭音后,该终端无法听到其他终端的声音
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_BLOCK>
<ID>1</ID> //会议ID
<AUDIO_BLOCK>true</AUDIO_BLOCK> //true:闭音,false:非闭音
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_BLOCK>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.8. 取消闭音
指定会议终端某个终端取消闭音,取消闭音后,该终端可听到其他终端的声音
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_BLOCK>
<ID>1</ID> //会议ID
<AUDIO_BLOCK>true</AUDIO_BLOCK> //true:闭音,false:非闭音
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_BLOCK>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.9. 阻塞视频
指定会议终端某个终端阻塞视频,阻塞后,该终端画面不可见
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_VIDEO_MUTE>
<ID>1</ID> //会议ID
<AUDIO_MUTE>true</AUDIO_MUTE> //true:静音,false:非静音
<VIDEO_MUTE>true</VIDEO_MUTE> // true:阻塞,false:非阻塞
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_VIDEO_MUTE>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.10. 取消阻塞视频
指定会议终端某个终端取消阻塞视频,取消后,该终端画面可见。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUDIO_VIDEO_MUTE>
<ID>1</ID> //会议ID
<AUDIO_MUTE>true</AUDIO_MUTE> //true:静音,false:非静音
<VIDEO_MUTE>true</VIDEO_MUTE> // true:阻塞,false:非阻塞
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_AUDIO_VIDEO_MUTE>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.11. 双流者
指定会议终端某个终端的为双流者,指定后此会议中只有该终端才可发送双流。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_EXCLUSIVE_CONTENT>
<ID>1</ID> //会议ID
<PARTY_ID>1</PARTY_ID> //终端ID
</SET_EXCLUSIVE_CONTENT>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.12. 取消双流者
取消当前会议中的双流者。取消双流者后,会议中所有的终端都可发送双流
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<REMOVE_EXCLUSIVE_CONTENT>
<ID>1</ID> //会议ID
</REMOVE_EXCLUSIVE_CONTENT>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.13. 设置演讲者
可以设置会议的演讲者。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_1>
<ACTION>
<SET_LECTURE_MODE>
<ID>1</ID> //会议ID
<LECTURE_MODE>
<ON>true</ON>
<LECTURE_NAME></LECTURE_NAME> // 演讲者名称
<LECTURE_ID>-1</LECTURE_ID> //演讲者ID
</LECTURE_MODE>
</SET_LECTURE_MODE>
</ACTION>
</TRANS_CONF_1>
发送XML给MCU。
3.3.14. 设置会议分屏
可以设置的会议分屏模式,如单屏、两分屏、四分屏,并指定分屏中每个位置的显示内容。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_1>
<ACTION>
<SET_VIDEO_LAYOUT>
<ID>1</ID> //会议ID
<FORCE>
<LAYOUT>1x1</LAYOUT> //分屏样式
</FORCE>
</SET_VIDEO_LAYOUT>
</ACTION>
</TRANS_CONF_1>
发送XML给MCU。
3.3.15. 设置终端分屏
可以设置某个终端的分屏,如单屏、两分屏、四分屏,并指定分屏中每个位置的显示内容。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_1>
<ACTION>
<SET_PARTY_VIDEO_LAYOUT_EX>
<ID>1</ID> //会议ID
<PARTY_ID>1</PARTY_ID> //终端ID
<LAYOUT_TYPE>personal</LAYOUT_TYPE>
<FORCE>
<LAYOUT>1x1</LAYOUT> //分屏样式
</FORCE>
</SET_PARTY_VIDEO_LAYOUT_EX>
</ACTION>
</TRANS_CONF_1>
发送XML给MCU。
3.3.16. 轮询
可以设置的会议的轮询终端数量、轮询顺序和轮询间隔。
功能说明
条件
发送
返回
其它
示例代码:
<TRANS_CONF_2>
<ACTION>
<SET_AUTO_SCAN_ORDER>
<ID>1</ID> //会议ID
<AUTO_SCAN_ORDER>
<PARTY_ORDER>
<ID>1</ID> //终端ID
<ORDER>0</ORDER> //轮询位置
</PARTY_ORDER>
<PARTY_ORDER>
<ID>0</ID> //终端ID
<ORDER>1</ORDER> //轮询位置
</PARTY_ORDER>
</AUTO_SCAN_ORDER>
</SET_AUTO_SCAN_ORDER>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
3.3.17. 字幕或会场名称设置
提供会议过程中对字幕或会场名称设置的参数。
功能说明
条件
发送
返回
其它
示例代码:
会场名:
<TRANS_CONF_2>
<ACTION>
<SET_MESSAGE_OVERLAY>
<ID>1953</ID>
<MESSAGE_OVERLAY>
<ON>true</ON>
<MESSAGE_TEXT>11</MESSAGE_TEXT>
<MESSAGE_FONT_SIZE>small</MESSAGE_FONT_SIZE>
<MESSAGE_COLOR>white_font_on_light_blue_background</MESSAGE_COLOR>
<NUM_OF_REPETITIONS>3</NUM_OF_REPETITIONS>
<MESSAGE_DISPLAY_SPEED>slow</MESSAGE_DISPLAY_SPEED>
<MESSAGE_DISPLAY_POSITION>bottom</MESSAGE_DISPLAY_POSITION>
<MESSAGE_DISPLAY_POSITION_INT>10</MESSAGE_DISPLAY_POSITION_INT>
<MESSAGE_FONT_SIZE_INT>24</MESSAGE_FONT_SIZE_INT>
<MESSAGE_TRANSPARENCE>50</MESSAGE_TRANSPARENCE>
</MESSAGE_OVERLAY>
</SET_MESSAGE_OVERLAY>
</ACTION>
</TRANS_CONF_2>
字幕:
<TRANS_CONF_2>
<ACTION>
<SET_MESSAGE_OVERLAY>
<ID>1953</ID>
<MESSAGE_OVERLAY>
<ON>true</ON>
<MESSAGE_TEXT>11</MESSAGE_TEXT>
<MESSAGE_FONT_SIZE>small</MESSAGE_FONT_SIZE>
<MESSAGE_COLOR>white_font_on_light_blue_background</MESSAGE_COLOR>
<NUM_OF_REPETITIONS>3</NUM_OF_REPETITIONS>
<MESSAGE_DISPLAY_SPEED>slow</MESSAGE_DISPLAY_SPEED>
<MESSAGE_DISPLAY_POSITION>bottom</MESSAGE_DISPLAY_POSITION>
<MESSAGE_DISPLAY_POSITION_INT>10</MESSAGE_DISPLAY_POSITION_INT>
<MESSAGE_FONT_SIZE_INT>24</MESSAGE_FONT_SIZE_INT>
<MESSAGE_TRANSPARENCE>50</MESSAGE_TRANSPARENCE>
</MESSAGE_OVERLAY>
</SET_MESSAGE_OVERLAY>
</ACTION>
</TRANS_CONF_2>
发送XML给MCU。
4. 其它
其它MCU厂商认为自己的特色功能,或用户强烈要求的功能,可在此进行详细的功能说明及控制接口说明。
-