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.
byhl-scrm/src/utils/JSsip.js

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)
}
}