日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue项目调用jssip_JsSIP和FreeSWITCH整合

發布時間:2025/3/15 vue 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue项目调用jssip_JsSIP和FreeSWITCH整合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面:FreeSWITCH作為服務器,通過SIP協議,Web端使用jssip+webrtc和其他軟電話進行通信

一、先配置FreeSWITCH(用的版本1.6.20)的配置:

1 、修改vars.xml文件,找到下面字段,并設置

2、修改 autoload_configs/acl.conf.xml文件,增加acl選項

在配置文件 sip_profiles/internal.xml 增加如下配置

默認情況下建立連接失敗,提示下面錯誤,并呼叫失敗

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [WARNING] switch_core_media.c:3451 NO candidate ACL defined, Defaulting to wan.auto

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] switch_core_media.c:3481 Save audio Candidate cid: 1 proto: udp type: host addr: 10.10.21.32:52786

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] switch_core_media.c:3523 Searching for rtp candidate.

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] switch_core_media.c:3523 Searching for rtcp candidate.

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] switch_core_media.c:3567 sofia/internal/82s6ps5e@80ug9oo63ltj.invalid no suitable candidates found.

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] switch_core_media.c:4767

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [NOTICE] sofia.c:8240 Hangup sofia/internal/82s6ps5e@80ug9oo63ltj.invalid [CS_CONSUME_MEDIA] [INCOMPATIBLE_DESTINATION]

5fe89e1d-bb0c-473b-8877-d3648acd4076 2018-08-09 20:28:15.217384 [DEBUG] switch_core_codec.c:248 sofia/internal/1009@192.168.20.78 Restore previous codec PCMA:8.

a21d347d-5622-451b-a1db-d241ca823e4d 2018-08-09 20:28:15.217384 [DEBUG] sofia.c:1453 Channel is already hungup.

在配置文件 sip_profiles/internal.xml 增加如下配置,解決這個問題

二、編寫Web客戶端

樣式如下:

不是專業前端,沒有做布局

啟動之后,就和正常的SIP軟終端一致了,通過FreSWITCH撥打其他軟終端,測試正常。

源代碼:基于JsSIP的客戶端,參考網上,并自己修改并調試通過

JsSIP 對接 FreeSWITCH

style="width: 424px; height: 260px; background-color: #f2f4f4; border: 1px solid grey; padding-top: 4px">

SIP URI:
SIP Password:
WSS URI:
SIP Phone Info:

初始化

注冊

注銷

呼叫

掛斷

var outgoingSession = null;

var incomingSession = null;

var currentSession = null;

var videoView = document.getElementById('videoView');

var constraints = {

audio: true,

video: false,

mandatory: {

maxWidth: 640,

maxHeight: 360

}

};

URL = window.URL || window.webkitURL;

var localStream = null;

var userAgent = null;

function testStart() {

var sip_uri_ = document.getElementById("sip_uri").value.toString();

var sip_password_ = document.getElementById("sip_password").value.toString();

var ws_uri_ = document.getElementById("ws_uri").value.toString();

console.info("get input info: sip_uri = ", sip_uri_, " sip_password = ", sip_password_, " ws_uri = ", ws_uri_);

var socket = new JsSIP.WebSocketInterface(ws_uri_);

var configuration = {

sockets: [socket],

outbound_proxy_set: ws_uri_,

uri: sip_uri_,

password: sip_password_,

register: true,

session_timers: false

};

userAgent = new JsSIP.UA(configuration);

//注冊成功

userAgent.on('registered', function (data) {

console.info("registered: ", data.response.status_code, ",", data.response.reason_phrase);

});

//注冊失敗

userAgent.on('registrationFailed', function (data) {

console.log("registrationFailed, ", data);

//console.warn("registrationFailed, ", data.response.status_code, ",", data.response.reason_phrase, " cause - ", data.cause);

});

//注冊超時

userAgent.on('registrationExpiring', function () {

console.warn("registrationExpiring");

});

userAgent.on('newRTCSession', function (data) {

console.info('onNewRTCSession: ', data);

//通話呼入

if (data.originator == 'remote') {

console.info("incomingSession, answer the call----------------------");

incomingSession = data.session;

data.session.answer({

'mediaConstraints': {

'audio': true,

'video': false,

mandatory: {maxWidth: 640, maxHeight: 360}

}, 'mediaStream': localStream

});

} else {

console.info("outgoingSession");

outgoingSession = data.session;

outgoingSession.on('connecting', function (data) {

console.info('onConnecting - ', data.request);

currentSession = outgoingSession;

outgoingSession = null;

});

}

data.session.on('accepted', function (data) {

console.info('onAccepted - ', data);

if (data.originator == 'remote' && currentSession == null) {

currentSession = incomingSession;

incomingSession = null;

console.info("setCurrentSession - ", currentSession);

}

});

data.session.on('confirmed', function (data) {

console.info('onConfirmed - ', data);

if (data.originator == 'remote' && currentSession == null) {

currentSession = incomingSession;

incomingSession = null;

console.info("setCurrentSession - ", currentSession);

}

});

data.session.on('sdp', function (data) {

console.info('onSDP, type - ', data.type, ' sdp - ', data.sdp);

});

data.session.on('progress', function (data) {

console.info('onProgress - ', data.originator);

if (data.originator == 'remote') {

console.info('onProgress, response - ', data.response);

}

});

data.session.on('peerconnection', function (data) {

console.info('onPeerconnection - ', data.peerconnection);

data.peerconnection.onaddstream = function (ev) {

console.info('onaddstream from remote ----------- ', ev);

videoView.src = URL.createObjectURL(ev.stream);

};

});

});

userAgent.on('newMessage', function (data) {

if (data.originator == 'local') {

console.info('onNewMessage , OutgoingRequest - ', data.request);

} else {

console.info('onNewMessage , IncomingRequest - ', data.request);

}

});

console.info("call register");

userAgent.start();

}

// Register callbacks to desired call events

var eventHandlers = {

'progress': function (e) {

console.log('call is in progress');

},

'failed': function (e) {

console.log('call failed: ', e);

},

'ended': function (e) {

console.log('call ended : ', e);

},

'confirmed': function (e) {

console.log('call confirmed');

}

};

function testCall() {

var sip_phone_number_ = document.getElementById("sip_phone_number").value.toString();

var options = {

'eventHandlers': eventHandlers,

'mediaConstraints': {

'audio': true, 'video': false,

mandatory: {maxWidth: 640, maxHeight: 360}

},

'mediaStream': localStream

};

outgoingSession = userAgent.call(sip_phone_number_, options);

}

function reg() {

console.log('register----------->');

userAgent.register();

}

function unReg() {

console.log('unregister----------->');

userAgent.unregister(true);

}

function hangup() {

console.log('hangup----------->');

userAgent.terminateSessions();

}

總結

以上是生活随笔為你收集整理的vue项目调用jssip_JsSIP和FreeSWITCH整合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。