客户端需要从阿里云申请融合通信账号后才能接入,为了保证安全性,融合通信SDK通过服务端下发的临时token作为身份标识与服务进行交互。临时token可通过融合通信服务pop接口从阿里云获得(详见服务端接入文档),并且具有时效性。SDK在token即将失效或其他需求而需要更新token时,会通过回调通知接入方,接入方需自行实现接口获取最新token并传递给SDK。
推荐的交互流程如下:
二、获取SDK
npm安装:
npm install aliyun-voip-web-sdk -S
开源Demo项目:
VoIP Web SDK的Demo项目已开源至Github社区,您可通过Demo演示快速进入开发,VoIP Web Demo。
三、快速开始
1、创建实例
import AlicomRTC from 'aliyun-voip-web-sdk'
/**
* 创始实例
*/
var rtc = new AlicomRTC()
2、设置参数与回调(可选)
/**
* 设置服务监听
*/
rtc.setServiceListener({
/**
* 服务连接成功,当前处于可用状态
*/
onServiceAvailable: function () {
// 此时可以开始呼叫操作
},
/**
* 服务连接失败、或者连接断开了,当前处于不可用状态,服务正在销毁。
* @param errCode {number} 错误码
* @param errMsg {string} 错误描述
*/
onServiceUnavailable: function (errCode, errMsg) {
},
/**
* 服务闲时
* @param errCode {number} 错误码
* @param errMsg {string} 错误描述
*/
onServiceIdle: function (errCode, errMsg) {
},
})
/**
* 可选,设置默认的呼叫超时时间
*/
rtc.setDefaultCallTimeout(30)
3、连接服务
/**
* 使用RtcId初始化AlicomRTC实例
*/
rtc.initWithRtcId('RTCID', {
updateToken: function (tokenHandler) {
var token = {} // todo: 通过服务端接口获取Token
tokenHandler.setToken(token)
}
})
4、始初化通话实例
当ServiceListener
中的onServiceAvailable
回调被唤起时,表示服务已经连接成功,此时可以开始创建VoIP2PSTN通话实例,设置并开始通话:
/**
* 创建Call实例,每一次通话都需要生成一个Call实例
*/
var pstnCall = rtc.createVoIP2PstnCall('被叫号显', '被叫号码')
/**
* 开启服务端录音(可选)
*/
pstnCall.setServerRecordEnabled(true)
/**
* 本地禁音(可选)
*/
pstnCall.muteLocalAudio()
/**
* 本地取消禁音(可选)
*/
pstnCall.unmuteLocalAudio()
5、通话状态管理
/**
* 设置Call状态监听
*/
pstnCall.setCallListener({
/**
* 电话已通知到被叫方,被叫振铃中
* @param talk {Talk} 通话对象
*/
onCalleeRinging: function (talk) {},
/**
* 被叫已接听电话,正在连接中
* @param talk {Talk} 通话对象
*/
onCalleeConnecting: function (talk) {},
/**
* 电话拨通了可以正常通话了。被叫已接听
* @param talk {Talk} 通话对象
*/
onActive: function (talk) {},
/**
* 对端传来DTMF信息,每次回调只传入一个字符,如果是一连串输入的话则会多次回调,需要接入方自行根据时间戳处理
* @param dtmf {string} 对端传入的DTMF信息
* @param timestamp {number} 时间戳
* @param talk {Talk} 通话对象
*/
onDtmfData: function (dtmf, timestamp, talk) {},
})
6、开始呼叫
pstnCall.start()
7、停止呼叫/通话
pstnCall.stop()
8、销毁实例
rtc.destroy()
四、类型定义
export = AlicomVoIP
export as namespace AlicomVoIP
declare namespace AlicomVoIP {
/**
* 网络质量
*/
export enum NetworkQuality {
/**
* 好
*/
HIGH,
/**
* 中
*/
MEDIUM,
/**
* 差
*/
LOW,
}
/**
* RTC Token,由服务端返回
*/
export type Token = {
tokenData: string,
cleansession: boolean,
clientId: string,
conferenceTopic: string,
host: string,
sdkClientPort: number,
serverId: string,
meetingEventKeepAliveInterval: number,
phoneTopic: string,
port: number,
reconnectTimeout: number,
registerTime: number,
sgwServerTopic: string,
tlsport: number,
useTLS: boolean,
username: string,
password: string,
vRtcId: string,
}
/**
* 通话角色:被叫
*/
export type Callee = {
isPstn: boolean,
phoneNumber: string,
showNumber: string,
uuid: string,
}
/**
* 所有类型通话事件监听回调的基类,定义了所有通话的公共事件回调。。
* @see CallListener
*/
export interface TalkListener {
/**
* 通话成功连接到媒体服务器
* @param talk
*/
onConnected(talk: Talk): void
/**
* 通话正在断开
* @param errCode 错误码
* @param errMsg 错误消息
* @param talk 通话对象
*/
onStoppping(errCode: number, errMsg: String, talk: Talk): void
/**
* 通话已结束
* @param errCode 错误码
* @param errMsg 错误消息
* @param talk 通话对象
*/
onStopped(errCode: number, errMsg: string, talk: Talk): void
/**
* 通话中网络质量消息
* @param quality 质量
* @param talk 通话对象
*/
onNetworkQuality(quality: NetworkQuality, talk: Talk): void
/**
* 通话中的监控数据回调
* @param monitorStats 监控数据
* @param talk 通话对象
*/
onMediaStatistics(monitorStats: any, talk: Talk): void
}
/**
* 电话生命周期中的所有回调
* @see Call
*/
export interface CallListener extends TalkListener {
/**
* 电话已通知到被叫方,被叫振铃中
* @param talk 通话对象
*/
onCalleeRinging(talk: Talk): void
/**
* 被叫已接听电话,正在连接中。(拨打类型为PSTN与呼叫中心的电话时无此回调)
* @param talk 通话对象
*/
onCalleeConnecting(talk: Talk): void
/**
* 电话拨通了可以正常通话了。主叫中代表被叫已接听,被叫中表示电话已接听
* @param talk 通话对象
*/
onActive(talk: Talk): void
/**
* 对端传来DTMF信息,每次回调只传入一个字符,如果是一连串输入的话则会多次回调,需要接入方自行根据时间戳处理
* @param dtmf 对端传入的DTMF信息
* @param timestamp 时间戳
* @param talk 通话对象
*/
onDtmfData(dtmf: string, timestamp: number, talk: Talk): void
}
export interface Talk {
/**
* 开始呼叫
*/
start(): void
/**
* 终止呼叫
*/
stop(): void
/**
* 禁音
*/
muteLocalAudio(): void
/**
* 取消禁音
*/
unmuteLocalAudio(): void
/**
* 本地是否禁音
*/
isLocalAudioMuted(): boolean
/**
* 发送dtmf
* @param dtmf dtmf信息,只能是0-9、*、#,最大长度不超过32位
*/
sendDtmfData(dtmf: string): boolean
}
/**
* 表示具体的一通点对点音频通话。
* 生命周期从创建实例开始,至通话停止结束,不能重复使用。
* 通话生命周期中的事件会在回调{@link CallListener}中体现
* @see CallListener
*/
export interface Call extends Talk {
/**
* 获取被叫信息
*/
getCallee(): Callee
/**
* 设置通话状态Listener
* @param callListener
*/
setCallListener(callListener: CallListener): void
setServerRecordEnabled(enabled: boolean): void
}
/**
* 整个服务生命周期的回调。在服务连接成功或者断开时回调。
*/
export interface ServiceListener {
/**
* 服务连接成功,当前处于可用状态
*/
onServiceAvailable(): void
/**
* 服务连接失败、或者连接断开了,当前处于不可用状态,服务正在销毁,此时不能调用init操作。
* @param errCode 错误码
* @param errMsg 错误描述
*/
onServiceUnavailable(errCode: number, errMsg: string): void
/**
* 服务闲时
* @param errCode 错误码
* @param errMsg 错误描述
*/
onServiceIdle(errCode: number, errMsg: string): void
}
/**
* 用户成功获取token后调用{@link TokenHandler#setToken(Token)}设置token
* @see TokenUpdater
*/
export interface TokenHandler {
/**
* 将已获取的token传入给alicomRTC
* @param token token以及其他必要的初始化参数
*/
setToken(token: Token): void
}
/**
* 需要接入方实现的获取{@link Token}的具体实现
* @see Token
*/
export interface TokenUpdater {
/**
* 通知客户更新token
* @param tokenHandler
*/
updateToken(tokenHandler: TokenHandler): void
}
/**
* AlicomRTC
*/
export class AlicomRTC {
/**
* 设置监听回调。用于监听服务在整个生命周期中的事件通知。
* @param listener
*/
setServiceListener(listener: ServiceListener): void
/**
* 创建VoIP2PSTN呼叫
* @param calleeShowNumber 被叫号显
* @param calleePhoneNumber 被叫号码
* @param extend
*/
createVoIP2PstnCall(calleeShowNumber: string, calleePhoneNumber: string, extend?: string): Call
/**
* 使用云通信音视频账号模式初始化服务并开始连接。连接的结果会在回调{@link ServiceListener}中体现。使用结束后需调用{@link AlicomRTC#destroy()}释放资源
* @param rtcId 云通信音视频账号id
* @param tokenUpdater 接入方传入的获取token的具体实现
*/
initWithRtcId(rtcId: string, tokenUpdater: TokenUpdater): void
/**
* 设置默认的呼叫超时时间,限制在30-90秒之间
* @param seconds 呼叫超时时间,单位为秒
*/
setDefaultCallTimeout(seconds: number): void
/**
* 停止服务并销毁
*/
destroy(): void
}
}
四、错误码
错误码 | 数值 | 原因 |
---|---|---|
ERROR_MQTT_CONNECT_FAIL | 1000100 | mqtt连接失败 |
ERROR_UPLOAD_TOKEN_FAIL | 1000104 | token上传失败 |
ERROR_LOCAL_STOP | 2000000 | 本地主动挂断 |
ERROR_REMOTE_HANGUP | 2000099 | 对端主动挂断 |
ERROR_CALL_SELF | 2000100 | 拨打自己 |
ERROR_CALL_EMPTY | 2000101 | 拨打电话为空 |
ERROR_REMOTE_REFUSE | 2000106 | 主叫时,对端拒绝应答 |
ERROR_NO_ANSWER | 2000108 | 被叫无人接听 |
ERROR_SERVICE_UNAVAILABLE | 2000113 | AlicomRTC服务不可用 |
ERROR_LOCAL_DESTROY | 2000116 | 本地主动销毁服务 |
ERROR_TIME_OUT | 2000102 | joinChannel超时 |
ERROR_NETWORK_INVALID | 2000121 | 网络异常 |
ERROR_MICROPHONE_NO_PERMISSION | 2000131 | 麦克风无权限 |
ERROR_SERVER_BASE | 3000000 | 服务端返回业务异常的错误基准 |
ERROR_SERVER_KICKED | 3110000 | 账号被登录或被踢 |
ERROR_SERVER_UNAVAILABLE | 3110001 | 服务异常 |
ERROR_MEDIA_BASE | 4000000 | 媒体SDK返回异常的错误基准 |
- 本页导读 (1)