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();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios禁止页面下拉

document.querySelector(body).addEventListener(touchmove, function(e) { e.preventDefault();})此类事件是手机touchmove默认事件行为,可以通过js代码禁止默认事件:转载于:https://www.cnblogs.com/zhouyx/p/8145182.html

android中虚拟程序停止,为什么我的在虚拟机运行后出现应用程序停止运行

源自:9-2 使用ToggleButton按钮实现开关效果为什么我的在虚拟机运行后出现应用程序停止运行package com.example.sss;import com.example.android4_0.R;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuIt…

android layout(l, t, r, b);,服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题...

导航:网站首页 >服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题相关问题:匿名网友:我们知道,屏幕的分辨率往往以“像素数 x 像素数”的格…

python里else中文意思_Python循环语句中else的用法总结

前言本文讨论Python的for…else和while…else等语法,这些是Python中最不常用、最为误解的语法特性之一。Python中的for、while等循环都有一个可选的else分支(类似if语句和try语句那样),在循环迭代正常完成之后执行。换句话说,如果我们不是以除…

go语言 方法

go 语言中没有类,但是是有方法。 方法的定义: func (recevier type) methodName(参数列表)(返回值列表){ } type School struct {Name stringAddr string }func NewSchool(name, addr string) *School {return &School {Name:name,Addr:addr,} }fun…

android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

本文实例讲述了Android开发获取传感器数据的方法。分享给大家供大家参考,具体如下:package mobile.android.sensor;import java.util.List;import android.app.Activity;import android.hardware.Sensor;import android.hardware.SensorEvent;import and…

ocp oracle 考试报名_获得Oracle认证对拓展职业前景的影响

知识就是力量通过考试和考试成绩固然很重要,但您在学习过程中所掌握的知识才是您职业成功的坚实基础。在备考过程中,获得的知识和经验才是您真正的财富。Oracle Certified Associate (OCA):专员级别的认证能够证明学员具备基本技能&#xff0…

SpringMVC(2)—SpringMVC整合Spring的HelloWorld

一、这是一个SpringMVC框架的案例HelloWorld 功能&#xff1a;HelloWorld 二、SpringMVC运行流程 1.流程 请求——>springDispatcherServlet的url-pattern检查SpringMVC中是否存在对应的映射无&#xff1a;检查是否配置的<mvc:default-servlet-handler/>无&#xff…

mac android 录屏软件下载,苹果录屏app下载 苹果录屏 for Android V2.1.3 安卓手机版 下载-脚本之家...

苹果录屏是一款不错的手机录屏软件&#xff0c;该软件能帮助你录制流畅清晰视频&#xff0c;实现屏幕内容实时同步录制&#xff0c;录制视频流畅清晰不卡顿&#xff0c;需要的朋友可以下载使用。应用介绍苹果录屏&#xff0c;是一款免费屏幕录制软件&#xff0c;能帮助你录制流…

火箭技术术语_仿真优化火箭发动机 3D 打印制造工艺

台湾工业技术研究院(ITRI)为台湾创新空间(TiSPACE)提供增材制造(也称 3D 打印技术)服务&#xff0c;包括原始设计制造、重新设计和仿真等。TiSPACE 的固液火箭发动机中使用的燃料喷射器组件的 3D 打印过程为&#xff1a;首先&#xff0c;激光将第一层粉末熔化并融合到构建板上&…

车林通购车之家--购车计算器模块--保险

//car-calculator-bx.twig {{ include(jsq-nav.twig) }} <div class"switch-item active" id"bodya"><div class"top-layer2 clearfix"><div class"tit"><span>新车保险市场价</span></div><…

麒麟710f能否升级到鸿蒙系统,定了!麒麟710以上支持升级鸿蒙系统,荣耀也可以升级...

原标题&#xff1a;定了&#xff01;麒麟710以上支持升级鸿蒙系统&#xff0c;荣耀也可以升级华为Mate X2发布会上&#xff0c;余承东表示4月份推送手机版鸿蒙系统&#xff0c;距离首发日期越来越近。不少朋友关心&#xff0c;哪些机型支持鸿蒙系统&#xff0c;荣耀手机可以更新…

我的奇思妙想机器人消防员_我是小小消防员(绘画篇)|来啊~斗图啊~看一场奇思妙想SHOW!...

点击上方 “四川消防119” 关注我们来&#xff0c;来&#xff0c;来快来进入孩子们脑洞大开的世界吧&#xff01;自今年6月以来&#xff0c;我们火热开展了“暑期消防安全教育专项行动”之“我是小小消防员”儿童消防绘画、作文竞赛活动&#xff0c;吸引了全省幼儿园小盆友、小…

mysql数据备份(windows,linux)

今天我有个朋友让我帮他在windowServer服务器上备份一下mysql的数据库&#xff0c;于是花了一天的时间完成了一个每天定时备份数据库的功能&#xff0c;小编在这里为大家记录一下&#xff1a; 首先对于mysql命令行的导入导出作一个简单的梳理 一、导入 ①mysql -h主机 -u账号 -…

android5.1.1移植教程,iTOP4412开发板Android5.1.1移植教程

对于传统的操作系统来说&#xff0c;普通的 I/O 操作一般会被内核缓存&#xff0c;这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存&#xff0c;数据直接在磁盘和应用程序地址空间进行传输&#xff0c;所以该文件访问的机制称作为直接 I/O。Linux …

岗位po是什么意思_劳务派遣是什么意思,劳务派遣和正式员工区别在哪

劳务派遣也是劳动活动的一种&#xff0c;虽然性质相对于临时工&#xff0c;但是劳务派遣仍然属于劳动合同法所调整的&#xff0c;不过与正式员工存在一定区别。因此接下来将由找法网小编为您介绍关于劳务派遣是什么意思&#xff0c;劳务派遣和正式员工区别在哪及其相关方面的知…

Android对性能要求,Android性能管理

管理Android设备的功耗和性能有助于确保应用程序在各种硬件上始终如一地顺畅运行。在Android 7.0及更高版本中&#xff0c;OEM可以实现对持续性能提示的支持&#xff0c;使应用程序能够保持一致的设备性能&#xff0c;并指定专属核以提高CPU密集型前台应用程序的性能。持续性能…

BZOJ 1878: [SDOI2009]HH的项链 | 莫队

题解: http://www.lydsy.com/JudgeOnline/problem.php?id1878 题解: 莫队板子题 核心思想是对区间的询问离线之后按照合理的顺序来优化复杂度 一般的做法是先分块,以左端点所在块为第一关键字,右端点位置为第二关键字排序 用两个指针来跑,这样可以证明的是时间复杂度为O(n√n)…

layui导航栏页面滚动固定_帮你搞定长滚动网页的设计!这5种设计策略需谨记!...

网站中的内容再好&#xff0c;总得让用户能看到&#xff0c;才有价值&#xff0c;而矛盾在于&#xff0c;首屏的空间始终是有限的。所以&#xff0c;我们总希望用户能够滚动页面向下看&#xff0c;从某种意义上来说&#xff0c;长滚动页面和无限滚动的设计&#xff0c;如此地受…

hdata datax交流总结

http://blog.csdn.net/zlm838687/article/details/74781522 hdata datax交流总结 今天和阿里云的同学就数据同步做了简要的交流&#xff0c;下面就交流的内容做一个总结 分片相关 datax目前可以支持单机(standalone)和集群模式(cluster).目前开源的是单机版本。无论是单机版本还…