likes
comments
collection
share

Flutter 腾讯云 IMSDK 的 Signaling(信令) 知识总结

作者站长头像
站长
· 阅读数 33

一、需求来源

最近公司需求要做点对点音视频通话功能,于是实现了基于 Tencent Cloud Chat SDK的无UI集成方案的音视频通讯功能;

效果如下: Flutter 腾讯云 IMSDK 的 Signaling(信令) 知识总结

Flutter 腾讯云 IMSDK 的 Signaling(信令) 知识总结

二、组成

1、通知机制

A和B的信息交互是通过信令接口来实现的(信令接口是基于 IM 消息提供的一套邀请流程控制的接口);

2、音视频流

通过 tencent_trtc_cloud 创建一个房间,通过Plugin到原生实现的;可以下载官方 demo 仔细研究即可,不再重复,说再多不去研究代码都是不会懂的。

三、关于信令

1、官方文档:

信令管理

信令API

2、信令 API 组成很简单

模块名称模块功能简介
accept接收方接受邀请
addInvitedSignaling创建一个信令请求
addSignalingListener添加信令监听器
cancel邀请方取消邀请
getSignalingInfo获取信令信息
invite邀请某个人
inviteInGroup邀请群内的某些人
reject接收方拒绝邀请
removeSignalingListener移除信令监听器

3、信令模型 V2TimSignalingInfo

class V2TimSignalingInfo {
  late String inviteID; // 邀请的信令ID(可以理解为信令唯一id)
  late String inviter; // 邀请人(发起者)ID
  late List<dynamic> inviteeList;//信令被邀请人 ID 列表(实际是字符串数组)
  String? groupID; //发出信令的群组id
  String? data; //信令的自定义消息(信令主要信息都在这里面)
  int? timeout; //信令超时时间,默认30s
  late int actionType;
  late int? businessID; //一般是1,用不到
  late bool? isOnlineUserOnly; //通知相关
  late OfflinePushInfo? offlinePushInfo; //通知相关
  V2TimSignalingInfo({
    required this.inviteID,
    required this.inviter,
    required this.inviteeList,
    required this.actionType,
    required this.businessID,
    required this.isOnlineUserOnly,
    required this.offlinePushInfo,
    this.groupID,
    this.data,
    this.timeout,
  });

。。。
}

//信令状态
int actionType;

   //1:邀请方发起邀请
   //2:邀请方取消邀请
   //3:被邀请方接受邀请
   //4:被邀请方拒绝邀请
   //5:邀请超时

四、总结

1、信令一经发起 invite/inviteInGroup 就需要在超时时间内处理,发起方可以执行 cancel,被邀请方可以 reject,accept,超时后会监听器会受到超时回调。无法响应哪一种执行,此信令都被消费掉,不复存在。下次发起的会是一个全新的信令。和普通接口请求不一样,大家要体会中间的差异。(无论执行什么方法 data参数必传,否则弹 8010 错误。)
2、信令的处理方必须是发起者或者被邀请方,否则会报 8010 错误;
3、因为监听一般都是全局,所以要放在登录页之后的主页面下进行监听;在监听之前最好做一次移除,否则可能会抛出信令回调方法为空的错误;
/**************************** 信令监听 ****************************/
final _signalingManager = TencentImSDKPlugin.v2TIMManager.getSignalingManager();

/// 信令监听
V2TimSignalingListener? _signalingListener;
V2TimSignalingListener get signalingListener {
  return _signalingListener ??= V2TimSignalingListener(
    onInvitationCancelled: handleOnInvitationCancelled,
    onInvitationTimeout: handleOnInvitationTimeout,
    onInviteeAccepted: handleOnInviteeAccepted,
    onInviteeRejected: handleOnInviteeRejected,
    onReceiveNewInvitation: handleOnReceiveNewInvitation,
  );
}

/// 添加信令监听器
Future<void> addSignalingListener() async {
  removeSignalingListener();//可能会抛出信令回调位空的错误;
  await _signalingManager.addSignalingListener(listener: signalingListener);
}

// 移除信令监听器
Future<void> removeSignalingListener() async {
  await _signalingManager.removeSignalingListener(listener: signalingListener);
}
4、信令状态 actionType 大家可以定义为枚举,方便排查问题(纯数字容易混淆)
/// tencent_cloud_chat_sdk 信令操作类型
/// desc 为操作;
/// index 为定义 int 类型;
enum TIMSignalingActionType {
  /// 没有动作 0
  none(""),
  /// 邀请方发起邀请 1
  invite("邀请方发起邀请"),
  /// 邀请方取消邀请 2
  cancel("邀请方取消邀请"),
  /// 被邀请方接受邀请 3
  accept("被邀请方接受邀请"),
  /// 被邀请方拒绝邀请 4
  reject("被邀请方拒绝邀请"),
  /// 邀请超时 5
  timeout("邀请超时");


  const TIMSignalingActionType(this.desc);

  /// 消息类型描述
  final String desc;

}
转载自:https://juejin.cn/post/7283724142322696192
评论
请登录