跳到主要内容

MQTT推送

概述

摩云视讯平台支持通过MQTT推送技术,实时地将视频会议过程中的各种状态变化推送给调用方。

与CometD相比,MQTT提供了几乎支持所有主流编程语言的客户端实现。

可以在 https://mqtt.org/software/ 查看所有支持的客户端。

基本概念

MQTT:ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。

通道:MQTT中的核心概念,发布者发布消息到通道中,订阅者订阅通道来接收消息。详细见通道说明

推送消息流程

用户使用推送服务需要先登录MQTT服务器,需要使用参数account_tokensso_cookie

这里复用了平台业务API的登录逻辑,先通过AppKeyAppSecret获取account_token,再使用用户名及密码登录。

详细登录步骤请参考登录认证

得到account_tokensso_cookie后,sso_cookie将作为用户名,account_token作为密码,通过MQTT协议的登录请求,发送至平台1884端口。

收到登录成功的回调后,可以进行订阅操作,选择需要订阅的内容通道,当通道有更新内容时,会将更新消息推到客户端。

以Python为例:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
# rc为0时代表连接成功
# 0: 连接成功
# 1: 连接拒绝 - -– 协议版本错误
# 2: 连接拒绝 - -- 客户端身份验证错误
# 3: 连接拒绝 - -- 服务器不存在
# 4: 连接拒绝 - -- 用户名 / 密码错误
# 5: 连接拒绝 - -- 未授权错误
# 6-255: 连接拒绝 - -- 当前不可用
if rc == 0:
client.subscribe([("/userdomains/{user_domain_moid}/confs/+", 0)])

def on_subscribe(client, userdata, mid, granted_qos):
# granted_qos:(qos,qos,..)
# 0: 订阅成功, 最大可用QoS为0
# 1: 订阅成功,最大可用QoS为1
# 2: 订阅成功, 最大可用QoS为2
# 128: 订阅失败
print(granted_qos)

def on_message(client, userdata, msg):
print(msg.topic+' '+str(msg.payload))

if __name__ == '__main__':
client = mqtt.Client()
client.username_pw_set('{account_token}', '{sso_cookie}')
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.connect("172.16.xxx.xxx", 1884, 60)
client.loop_forever()

通道说明

这里的通道与会议业务API中的通道类似,需要在前面加上订阅的用户域moid信息,如下所示:

通道说明
/confs/{conf_id}会议信息
/confs/{conf_id}/cascades级联信息
/confs/{conf_id}/cascades/{cascade_id}/mts/{mtid}终端信息
/confs/{conf_id}/chairman主席
/confs/{conf_id}/speaker发言人
/confs/{conf_id}/dualstream双流源
/confs/{conf_id}/vad语音激励
/confs/{conf_id}/mixs/{mix_id}混音
/confs/{conf_id}/vmps/{vmp_id}画面合成
/confs/{conf_id}/poll会议轮询
/confs/{conf_id}/recorders/{rec_id}录像
/confs/{conf_id}/mtvmps/{mt_id}终端自主画面合成
/confs/{conf_id}/hduvmps/{hdu_id}电视墙自主画面合成
/confs/{conf_id}/hdus/{hdu_id}会议电视墙
/confs/{conf_id}/inspections/{mt_id}/{mode}终端选看
/confs/{conf_id}/upload上传终端
/confs/{conf_id}/monitor/{dst_ip}/{dst_port}监控

完整推送通道信息请参考推送接口概览

订阅通道时,可以仅订阅通道本身,也可以使用通配符来订阅通道的子通道。

订阅通道本身:

subscribe /channel

订阅一级子通道(如:/channel/a, /channel/b):

subscribe /channel/+

订阅所有层级子通道(如:/channel/a, /channel/a/1, /channel/b):

subscribe /channel/#

注意:通配符仅能在通道的最后一段中使用。

使用场景分析:

  1. 订阅某个会议的所有信息:

    subscribe /userdomains/{domain_id}/confs/001112/#

  2. 订阅会议列表更新信息:

    subscribe /userdomains/{domain_id}/confs/+

  3. 订阅本级终端列表:

    subscribe /userdomains/{domain_id}/confs/0001112/cascades/0/mts/+

  4. 订阅所有会议信息:

    subscribe /userdomains/{domain_id}/confs/#

订阅通配符通道时,服务器推送过来的消息内容中的通道是不带有通配符的具体通道。