Flutter 腾讯云 IMSDK 的 Signaling(信令) 知识总结
一、需求来源
最近公司需求要做点对点音视频通话功能,于是实现了基于 Tencent Cloud Chat SDK的无UI集成方案的音视频通讯功能;
效果如下:
二、组成
1、通知机制
A和B的信息交互是通过信令接口来实现的(信令接口是基于 IM 消息提供的一套邀请流程控制的接口);
2、音视频流
通过 tencent_trtc_cloud 创建一个房间,通过Plugin到原生实现的;可以下载官方 demo 仔细研究即可,不再重复,说再多不去研究代码都是不会懂的。
三、关于信令
1、官方文档:
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