2017-04-04 122 views
1

我正在一家電信公司工作。我們想要開發一個帶有JsSIP庫的SIP電話。但我們不能這樣做。我們創建一個基本測試形式,如下所示:JsSIP實施

var socket = new JsSIP.WebSocketInterface('*****'); 
var configuration = { 
    sockets : [ socket ], 
    uri  : '*****', 
    password : '*****' 
}; 

var ua = new JsSIP.UA(configuration); 

ua.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 with cause: '+ e.data.cause); 
    }, 
    'ended': function(e) { 
    console.log('call ended with cause: '+ e.data.cause); 
    }, 
    'confirmed': function(e) { 
    console.log('call confirmed'); 
    } 
}; 

var options = { 
    'eventHandlers' : eventHandlers, 
    'mediaConstraints' : { 'audio': true, 'video': true } 
}; 

var session = ua.call('680', options); 

上面的代碼正在工作。我們可以打電話到任何地方,但呼叫用戶的聲音不會來到我們身邊。我怎樣才能做到這一點?我們該做什麼?有沒有人有這個項目的示例代碼?

回答

0

如果呼叫已建立,但沒有音頻路徑,則呼叫方/被叫方的SDP端點可能無法互相訪​​問。

在這種情況下,呼叫將斷開連接,並顯示「RTP超時」原因。

這裏有一些提示:

  1. 打開JSSIP控制檯調試通過運行JsSIP.debug.enable( 'JsSIP:*');

  2. 重新加載頁面。

  3. 撥打電話,然後檢查瀏覽器上的控制檯日誌以獲取更多詳細信息。

更多關於它:http://jssip.net/documentation/3.0.x/api/debug/

如果您看到了錯誤的設定SDP的IP地址,外出或進來的,那麼ICE候選人是不正確或不恰當順序。

在這種情況下,需要調整STUN和其他配置設置。 http://jssip.net/documentation/0.3.x/api/ua_configuration_parameters/

此外,請參閱jssip演示頁面,查看源代碼以及查看附加配置應用的內容/方式。 https://tryit.jssip.net/

1

如果您正在查找示例代碼,請隨時查看react-sip(幫助將JsSIP嵌入React應用程序的包)的實現。特別是,即使不使用React,您也會發現the source of <SipProvider/> component有用。

也許,您聽不到用戶聲音的原因是因爲您的頁面上沒有HTML5 <audio/> DOM元素,該元素附加到您的JsSIP實例。

這裏大約是你應該添加什麼:

// in the beginning, e.g. before you create an instance of JsSIP.WebSocketInterface 
var remoteAudio = window.document.createElement('audio'); 
window.document.body.appendChild(remoteAudio); 

// inside rtcSession.on('accepted', function() {...}) 
remoteAudio.src = window.URL.createObjectURL(
    rtcSession.connection.getRemoteStreams()[0] 
); 
remoteAudio.play(); 
// rtcSession comes from an argument in 
// ua.on('newRTCSession', ({ originator, session: rtcSession }) => {}); 

// when no longer need to make calls (e.g. on user logout) 
delete remoteAudio;