JsSIP的基本使用

本文详细介绍了如何使用JsSIP库在WebRTC环境中通过WebSocket建立连接,开启和注册,以及进行呼叫、接听、挂断和注销操作,包括设置超时时间、媒体约束等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、建立连接

webrtc的连接就是一个webscoket,遵循的是tcp协议

在jssip中,jssip定义了一个JsSIP对象,其包含一个WebSocketInterface方法用来使用webscoket

WebSocketInterface(url)

  • url:websocket连接地址
JsSIP.C.SESSION_EXPIRES=120 //websocket超时时间,默认值60
JsSIP.C.MIN_SESSION_EXPIRES=120 //websocket最小超时时间,默认值60

let url = '' //websocket地址(包含端口)

let socket = new JsSIP.WebSocketInterface('wss://' + url + '/ws')

scoket.via_transport = 'WS'

2、开启/注册

JsSIP.UA(option)

option参数

  • sockets:创建的websocket连接,是一个数组
  • uri:sip的注册地址,例如:sip:1001@example.com
  • password:分机的注册密码
  • register:是否开启自动注册,默认值是false,如果使用默认值或者指定了false,那么需要单独去掉用register()函数进行注册

以上三个参数的必填的参数,其他非必填参数请参考JsSIP官网文档:https://jssip.net/

let configuration = {
    sockets: [ socket ],
    uri: 'sip:'+sip+'@'+host+':'+port,
    password : password,
    authorization_user:sip,
    display_name:sip,
    register: true, //是否启用自动注册,默认值是false
    registrar_server:'sip:'+ host,
    session_timers: false,
    pcConfig:{url:'stun:1.1.1.1:3478'},//示例地址,无效,请更换自己的stun服务器地址
    user_agent:'jssip'
}

let sip_scoket = JsSIP.UA(configuration)

如果设置了register参数为true,同时会触发registered事件,如果设置为false,或者没有传递register参数,使用了默认值,那么就不会触发registered事件,需要等到调用了register()方法后才会触发registered事件

sip_scoket.on('registered',(data) => {
    console.log('======注册完成======', data)
})

3、注册

register()

上面说的是通信的开启,如果设置了register参数为true,那么就会自动进行注册,不需要手动执行了,但是设置了false或者说没有传递register参数,那么默认会使用false,这时就需要手动进行注册了。

sip_scoket.register()

在执行该方法后会触发registered事件

sip_scoket.on('registered',(data) => {
    console.log('======注册完成======', data)
})

4、呼叫

call(target, option)

  • target:呼叫的对象

  • option:其他额外的参数(这里主要说明一下mediaConstraints,这个是必须要传递的,不然会没有声音)

    mediaConstraints是一个对象,包含2个参数,一个是audio,一个是video,表明指定当前通话是使用音频还是视频,也可以指定一个,也可以全部都指定,默认值为true,就是即使用音频也使用视频

sip_socket.call(
	'1001',
    mediaConstraints:{audio:true}
)

呼叫成功后会触发newRTCSession事件,需要在这里进行音频流的处理(我这里以音频流为例),newRTCSession事件的返回值中有一个originator参数,如果值为remote那么表明这是一个呼入,如果是local那么表明这是一个外呼,呼入和外呼对于音频流的处理 位置也是不一样的,如果是外呼直接在newRTCSession的返回值的

sip_socket.on("newRTCSession", (e) => {
    console.log("===========newRTCSession==========", e)
    session = e.session
    if(e.originator == 'remote'){
        session.on("peerconnection", (data) => {
            addTrack(data,'incomming')
        })
    } else {
        addTrack(e.session._connection,'outcomming')
    }
}
              
//添加音频流函数
function addTrack(data, type) {
	console.log("========addTrack==============")
     if (type == "incomming") {
          data.peerconnection.ontrack = () => {
            let remoteStream = new MediaStream();
            let receivers = session._connection.getReceivers();
            receivers.forEach((recevier) => {
              if (recevier.track.kind == "audio") {
                remoteStream.addTrack(recevier.track);
                document.getElementById("remoteAudio").srcObject = remoteStream;
              }
            });
          };
        } else {
            data.ontrack = () => {
                let remoteStream = new MediaStream()
                let receivers = session._connection.getReceivers()
                receivers.forEach((recevier) => {
                    if (recevier.track.kind == "audio") {
                        remoteStream.addTrack(recevier.track)
                        document.getElementById("remoteAudio").srcObject = remoteStream
                    }
                })
            }
        }
      }

5、挂断

terminate()

挂断调用terminate()方法,挂断后会触发ended事件。在ended事件中,可以通过返回值的originator获得是本地挂断还是被叫挂断,如果originator的值为local那么就是本地挂断或者叫主叫挂断,如果originator的值为remote,那么就是被叫挂断。同时,返回值的cause会返回挂断的原因。

session.terminate()

session.on('ended', (data) => {
    if(data.originator == 'local') {
        console.log('主叫挂断')
    }
    
    if(data.originator == 'remote') {
        console.log('被叫挂断')
    }
})

6、接听

answer(option)

option的参数主要说明一下mediaConstraints

mediaConstraints是一个对象,包含2个参数,一个是audio,一个是video,表明指定当前通话是使用音频还是视频,也可以指定一个,也可以全部都指定,默认值为true,就是及使用音频也使用视频

session.answer({
    mediaConstraints: { audio: true }
})

接听完成后会触发accepted事件,可以根据事件返回值的originator参数来获得是主叫接听还是被叫接听,如果值为remote那么就是被叫接听,如果是local那么就是主叫接听。

session.on('accepted', (data) => {
    if(data.originator == 'remote') {
        consloe.log('被叫接听')
    }
    
    if(data.originator == 'local') {
        consloe.log('主叫接听')
    }
})

7、注销

注销实际上就是直接关闭当前连接就可以了,使用stop()方法

sip_scoket.stop()

注销后会触发unregistered事件,整个注销过程为固定的2秒钟,如果在注销后又其他逻辑运行,建议2秒钟后再执行其他逻辑。

sip_socket.on('unregistered', (e) => {
    consloe.log('======注销======', e)
})

以上内容是JsSIP的基本使用,后续会逐渐的汇总每一个步骤所涉及到的具体细节性的内容。

03-11
<think>好的,用户想了解如何使用jsSIP进行WebRTC开发,特别是库的使用和文档。首先,我需要回忆一下jsSIP基本信息。jsSIP是一个基于JavaScript的SIP协议库,用于在浏览器中实现实时通信,比如语音和视频通话,通常与WebRTC结合使用。 接下来,用户可能需要知道如何开始使用jsSIP,包括安装、配置和基本用法。根据引用中的信息,比如引用[3]提到需要安装libsrtp库,但jsSIP可能不需要这个,不过可能需要其他依赖。需要确认jsSIP的官方文档是否有说明。 然后,用户可能需要示例代码来快速上手。需要提供一个简单的初始化示例,包括创建用户代理,注册到SIP服务器,处理来电和拨打电话。同时,需要确保代码语法正确,比如使用JavaScript的语法,并注释清楚每个步骤的作用。 另外,文档和资源部分也很重要。需要指引用户到jsSIP的官方网站,查看API文档和示例。可能还需要提到相关的教程或视频,但引用中提供的链接是关于Volley库的,可能不适用,所以可能需要忽略,或者寻找其他资源。不过用户提供的引用中有关于Android的信息,但用户的问题是WebRTCJavaScript,可能需要调整引用部分,比如引用[4]提到JavaScriptWebRTC相关技术,可能可以关联起来。 注意事项方面,需要强调跨浏览器兼容性,比如不同浏览器对WebRTC的支持情况,安全协议如HTTPS的必要性,以及SIP服务器的配置。可能还需要提到调试工具,如浏览器控制台和Wireshark抓包分析。 生成相关问题需要考虑用户可能的后续问题,比如如何处理SIP消息、安全机制、与后端集成、错误处理等。确保问题覆盖常见开发难点和进阶主题。 最后,检查引用是否恰当。例如,引用[3]提到的libsrtp可能与WebRTC的加密有关,但jsSIP是否直接依赖这个库需要确认。如果jsSIP本身不需要,可能不需要引用,但用户提供的引用中没有其他相关的内容,可能需要调整引用来源。不过根据用户提供的引用列表,引用[3]是关于SRTP的,可能与WebRTC的媒体加密有关,所以可以提及。 总结步骤:介绍jsSIP,安装方法,基本用法示例,文档资源,注意事项,相关问题。确保使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要。检查LaTeX语法是否正确,但同样可能不适用。最后生成相关问题,帮助用户深入理解。</think>### jsSIP WebRTC开发指南 #### 1. **jsSIP简介** jsSIP是一个基于JavaScript的SIP(Session Initiation Protocol)协议库,专为浏览器环境设计,支持实时音视频通信(WebRTC)功能。它提供简洁的API,适用于构建在线会议、即时通信等应用[^4]。 #### 2. **安装与配置** - **安装方法**:通过npm或直接引入CDN: ```bash npm install jssip ``` 或 ```html <script src="https://cdn.jsdelivr.net/npm/jssip@3.10.0/dist/jssip.min.js"></script> ``` - **依赖项**:需配合WebRTC支持的浏览器(如Chrome、Firefox)和SIP服务器(如Asterisk、Kamailio)[^3]。 #### 3. **基本用法示例** ```javascript // 初始化用户代理 const socket = new JsSIP.WebSocketInterface('wss://sip.example.com:8089/ws'); const configuration = { sockets: [socket], uri: 'sip:alice@example.com', password: 'password' }; const ua = new JsSIP.UA(configuration); // 注册到SIP服务器 ua.start(); // 处理来电 ua.on('newRTCSession', (data) => { const session = data.session; session.on('peerconnection', (event) => { const remoteVideo = document.getElementById('remoteVideo'); remoteVideo.srcObject = event.stream; }); }); // 发起呼叫 const call = ua.call('sip:bob@example.com', { mediaConstraints: { audio: true, video: true } }); ``` #### 4. **文档与资源** - **官方文档**:[jsSIP官网](https://jssip.net/)提供完整的API说明和示例。 - **示例项目**:参考GitHub仓库的`examples`目录,包含注册、呼叫、消息发送等场景。 - **调试工具**:使用浏览器开发者工具检查SIP信令,或通过Wireshark抓包分析。 #### 5. **注意事项** - **跨浏览器兼容性**:需测试不同浏览器的WebRTC支持(如Safari需启用标志位)。 - **HTTPS要求**:WebRTC强制使用安全协议,需部署有效的SSL证书。 - **SIP服务器配置**:确保服务器支持WebSocket传输(如FreeSWITCH配置`wss`端口)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值