You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
6.3 KiB
JavaScript
201 lines
6.3 KiB
JavaScript
/*
|
|
* @Description: JSSIP
|
|
* @Autor: 飘泊客
|
|
* @Date: 2022-02-16 14:47:05
|
|
* @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
|
|
* @LastEditTime: 2023-07-11 18:13:17
|
|
*/
|
|
import JsSIP from 'JsSIP'
|
|
import store from '../store'
|
|
import { Message } from 'element-ui'
|
|
export default {
|
|
RTC: {
|
|
ua: null,
|
|
session: null,
|
|
isestablish: false,
|
|
sip: 'sip.hzdaba.cn:63003'
|
|
// sip: 'sip.hzdaba.cn:61964'
|
|
},
|
|
// 初始化的数据或者执行的方法
|
|
init() {
|
|
if (this.RTC.ua) {
|
|
this.RTC.ua.stop()
|
|
this.RTC.session = null // 会话id清空
|
|
store.commit('webrtc/SET_HOLDSTATUS', { local: false, remote: false }) // 全局状态 挂起初始化
|
|
setTimeout(() => {
|
|
store.commit('webrtc/SET_CALLSTATUS', '') // 电话状态初始化
|
|
}, 1000)
|
|
}
|
|
},
|
|
// 初始化login 疑问
|
|
initwebRtc(siptel, password) {
|
|
// siptel = '458936'
|
|
console.log('连接状态:', this.RTC.isestablish)
|
|
console.log('fs状态:', store.getters.fsStatus)
|
|
// JsSIP.debug.enable('JsSIP:*')
|
|
if (this.RTC.isestablish === false) {
|
|
console.log('初始化成功')
|
|
this.init()
|
|
const socket = new JsSIP.WebSocketInterface('wss://sip.hzdaba.cn:7447')
|
|
const configuration = {
|
|
sockets: [socket],
|
|
// 分机号注册 格式 sip: + 分机号码 + @ + FS注册地址
|
|
uri: `sip:${siptel}@${this.RTC.sip}`,
|
|
// FS 密码
|
|
password: password,
|
|
// this.RTC.sip sip.xxxx.cn:61964 Fs的 ws协议地址
|
|
contact_uri: 'sip:' + siptel + '@' + this.RTC.sip + ';transport=wss',
|
|
register: true // 指示启动JSSIP用户代理是否自动注册
|
|
// autostart: true // 自动连接
|
|
}
|
|
this.RTC.ua = new JsSIP.UA(configuration)
|
|
this.setUAEvent()
|
|
this.RTC.ua.start()
|
|
}
|
|
},
|
|
// 绑定ua事件
|
|
setUAEvent() {
|
|
// 状态回调
|
|
this.RTC.ua.on('connected', e => {
|
|
this.RTC.isestablish = true
|
|
console.log('ws连接完毕')
|
|
})
|
|
this.RTC.ua.on('disconnected', e => {
|
|
console.log('ws连接失败')
|
|
this.RTC.isestablish = false
|
|
})
|
|
this.RTC.ua.on('registered', e => {
|
|
console.log('--------已注册-------')
|
|
store.commit('webrtc/SET_FSSTATUS', 'registered')
|
|
})
|
|
this.RTC.ua.on('unregistered', e => {
|
|
console.log('------未注册--------')
|
|
store.commit('webrtc/SET_FSSTATUS', 'unregistered')
|
|
})
|
|
this.RTC.ua.on('registrationFailed', e => {
|
|
console.error('SIP注册失败,请联系管理员', e)
|
|
store.commit('webrtc/SET_FSSTATUS', 'registrationFailed')
|
|
Message.error('SIP注册失败,请联系管理员')
|
|
// setTimeout(() => {
|
|
// store.commit('webrtc/SET_FSSTATUS', '')
|
|
// }, 1000)
|
|
})
|
|
this.RTC.ua.on('newMessage', e => {
|
|
console.log('------im新消息事件------')
|
|
})
|
|
this.RTC.ua.on('newRTCSession', e => {
|
|
console.log('------接通返回-------', e)
|
|
const session = e.session
|
|
this.RTC.session = session
|
|
if (e.originator === 'remote') {
|
|
console.log('------触发接通------')
|
|
session.answer({
|
|
media: {
|
|
constraints: {
|
|
audio: true,
|
|
video: false
|
|
},
|
|
render: {}
|
|
}
|
|
})
|
|
}
|
|
session.on('confirmed', e => {
|
|
if (e.originator === 'remote') {
|
|
store.commit('webrtc/SET_CALLSTATUS', 'accepted')
|
|
}
|
|
})
|
|
session.on('ended', e => {
|
|
console.log('------电话已挂断,开始问卷------', e)
|
|
store.commit('webrtc/SET_CALLSTATUS', 'ended')
|
|
Message.error('电话已挂断')
|
|
// 挂机后 嘟一声挂断了
|
|
})
|
|
session.on('failed', mdata => {
|
|
this.RTC.session = null
|
|
Message.error('来电被拒接')
|
|
store.commit('webrtc/SET_CALLSTATUS', 'failed')
|
|
console.log('------来电的时候 拒接或者 还没接听对方自己就挂断了------')
|
|
})
|
|
// 接听成功
|
|
session.on('accepted', (response, cause) => {
|
|
store.commit('webrtc/SET_CALLSTATUS', 'accepted')
|
|
Message({
|
|
message: '正在呼叫中',
|
|
type: 'success'
|
|
})
|
|
})
|
|
// 通话被挂起
|
|
session.on('hold', (data) => {
|
|
const org = data.originator
|
|
if (org === 'local') {
|
|
console.log('通话被本地挂起:', org)
|
|
} else {
|
|
console.log('通话被远程挂起:', org)
|
|
}
|
|
})
|
|
// 通话被继续
|
|
session.on('unhold', (data) => {
|
|
const org = data.originator
|
|
if (org === 'local') {
|
|
console.log('通话被本地继续:', org)
|
|
} else {
|
|
console.log('通话被远程继续:', org)
|
|
}
|
|
})
|
|
})
|
|
},
|
|
/**
|
|
* 登出
|
|
*/
|
|
logout() {
|
|
this.RTC.ua.unregister() // 注销
|
|
this.RTC.ua.stop({ register: true })
|
|
this.RTC.isestablish = false
|
|
store.commit('webrtc/SET_FSSTATUS', '')
|
|
},
|
|
/**
|
|
* 挂断
|
|
*/
|
|
hangUp(callback) {
|
|
if (this.RTC.session && this.RTC.session.isEnded() === false) {
|
|
this.RTC.session.terminate()
|
|
this.RTC.session = null
|
|
callback('succest')
|
|
} else {
|
|
callback('fail')
|
|
}
|
|
},
|
|
/**
|
|
* 拨打
|
|
* @param {*} phoneNumber 拨打号码
|
|
*/
|
|
call(phoneNumber, callback) {
|
|
const options = {
|
|
eventHandlers: {
|
|
progress(e) {
|
|
console.log('------正在呼叫:', e)
|
|
store.commit('webrtc/SET_CALLSTATUS', 'calling')
|
|
},
|
|
failed(e) {
|
|
console.log('------呼叫失败: ', e)
|
|
Message.error('呼叫失败,请重试拨打')
|
|
this.RTC.session = null
|
|
store.commit('webrtc/SET_CALLSTATUS', 'failed')
|
|
callback('failed', e)
|
|
},
|
|
ended(e) {
|
|
console.log('------呼叫结束:' + e.originator === 'remote' ? '对方挂断' : '自己挂断', e)
|
|
store.commit('webrtc/SET_CALLSTATUS', 'ended')
|
|
},
|
|
confirmed(e) {
|
|
console.log('------呼叫接受' + e.originator === 'remote' ? '自己已接受' : '对方已接受', e)
|
|
store.commit('webrtc/SET_CALLSTATUS', 'accepted')
|
|
callback('accepted', e)
|
|
}
|
|
},
|
|
mediaConstraints: { 'audio': true, 'video': false }
|
|
}
|
|
this.RTC.ua.call(`sip:${phoneNumber}`, options)
|
|
}
|
|
}
|