/* * @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) } }