注明:由于不知道原作者是哪位大侠,这位大侠也没有整理,所以特此转载整理一番
毫无疑问FreeSwitch百问的读者肯定是技术人员,他们可能是:
A. 对voip有兴趣没有基础的伙计
B.对FreeSwitch有兴趣站在门口的伙计
C.计划把FreeSwitch从实验所或者研发中心部署应用到实网系统中的伙计
D.准备使用FreeSwitch做IPPBX的伙计
E.准备开发IP呼叫中心的伙计
F.对FreeSwitch进行运营维护的伙计
假如你不开发应用,只是使用FreeSwitch,通常熟悉SIP就够。
假如要你开发应用,熟悉C/C++是必须的。
虽然FreeSwitch支持很多语言的开发接口,但是实际上基本都是在C/C++的接口上通过SWIG进行扩展的。通过swig 包装支持多种脚本语本语言控制呼叫流程,如perl php lua python ruby java tcl等。
事件套接字使用
Event Socket 可以使用任何其它语言通过Socket 方式控制呼叫流程、扩展FreeSWITCH 功能。通俗讲FreeSwitch是也是一个VOIP,目前主流的VOIP,甚至包括运营商的IMS毫无例外都是基于SIP协议的。因此要搞定FreeSwitch,SIP协议是必须的。
以太网络,这个是废话,没有这咋实现IP通信呢。
IP话机,相当于普通电话机,不过不是普通电话机的电话线
RJ11的接口而是网线
RJ45接口.
软电话,安装在电脑上的(通常是windows下)模拟ip话机的软件。当然安卓和linux下也有软电话。
SIP Server/IPPBX,完成VOIP交换的设备或者安装在pc上的软件。
IP网关,通常是完成VOIP网络到PSTN E1数字接口或者模拟电话线接口转换的设备。
IP协议广义上是包括SIP协议,RTP协议和SDP协议。他们的关系可以这样描述:SIP是信令控制,相当于电信里面的7号信令,或者相当于发号施令的领导角色,RTP 是媒体传输,相当于干体力活的民工角色。SDP 是媒体描述,相当于描述使用哪些或者哪种语音和视频编码进行协商。
举个例子
a 用户
使用电话打给b用户
,SIP是信令控制相当于a 举起电话机然后b的号码和通话之后挂机的动作。RTP是媒体传输相当于电话通了a 和b 语音通话的动作。SDP 是媒体描述相当于a 和b 都使用普通话进行对话。假如a 和b 没有一个共同的语言会导致协商不成功。就无法通话。比如a是中国人,b是英国人,a问:会说汉语吗。b听不懂,b 问:can you speak English?a 也不懂。最终只能放弃通话。
SIP是控制命令,是具有文本的,通过网络抓包是可以直接看出内容,这样调试排查问题就比较方便。SIP协议默认使用UDP协议。但是也支持TCP协议,有些变态的系统或者软电话只能支持TCP,比如微软的LYNC。SIP默认是使用5060端口。但是通常也可以指定其他端口。比如5061之类。有些软件,比如tom 版本的skype 启动之后也会使用5060端口,这样导致了其他软电话或者FreeSwitch启动失败。通常系统有很多线路可以并发使用,但是他们都是使用一个端口(默认是5060)进行信令控制的。
SIP使用模式有两种:一种是注册模式,大家每个人分配一个分机号码和密码,然后都注册到一个SIP SERVER /IPPBX 上。呼叫的时候只要呼叫分机号码就可以。另外一种是点对点模式:通过呼叫软电话的或者IP话机的IP+端口(默认5060)的模式。
标准的sip 地址格式是:sip:1234@IP:PORT
其中1234是号码。
RTP的默认端口是没有指定的,通常系统有很多线路可以并发使用,每一路通常都会占用两个端口一个是RTP 一个是RTCP,RTP 媒体传输的机器的IP 和SIP 的信令控制的IP可以不是同一个。虽然很多情况下他们是一个,表示信令控制和媒体传输都是一台机器上发起的。但是大的系统里面往往他们的ip 不是同一个。
e.g. 小系统:一个部门就是一个人,这个人既是领导(SIP)也是干苦力活的(RTP)。因为一个机器的cpu 毕竟计算能力有限。而一个大的系统相当于一个部门很多人,领导(SIP)通常一个就够,干苦力活的(RTP)需要很多人。
SIP的流量通常很少,但是RTP 的流量通常是巨大的,因为要传输语音流个视频流。所谓:领导一句话,手下干活累死人。RTP的语音流是一份一份(从时间上看是离散的)进行传输的。一份就是一个UDP包,通常情况下一个包包括了20ms或30毫秒的语音。每个包的负载大小根据语音编码器不同,在几十Byte 到几百Byte之间。这样的话,假如是20ms 一个包,1秒的语音要发50次,可见流量是很大的。
SDP 是对媒体的描述,描述了RTP 的IP 和端口PORT。说明自己这边有哪些编码器(相当于一个人会说哪些语言),也描述了是否支持视频(说白了就是有视频编码器)。也描述了是否支持按键。很多情况下呼叫建立不成功都是因为SDP 协商不成功导致(一般会提示错误Incompatible SDP)。没有提示的SDK则需要通过抓包才能看出。
SDP 的核心包含:
A.说明媒体的来源IP地址
B.说明媒体的来源的端口port
C.说明自己有哪些媒体能力(能说几个语言)
D.包括对dtmf 按键的是否支持是说明。
一旦两个软电话要对话,就要对比交换上面这些信息。
Windows 下常见的软电话有:Xlite/eyebeam,kapanga,linphone,jitsi,PJSIP等等
Linux下有Linphone,PJSIP等
安卓系统下常用的软电话有:sipdroid,CSipSimple,jPhoneLite,IMSDROID。
Windows 和Linux 下的软电话大多也支持视频。
Windows 下常见的软电话有:
Xlite/ eyebeam,kapanga,linphone,jitsi等等
Linux下有Linphone等
本人使用kapanga和Linphone 测试过FreeSwitch的视频通话。
- 常用的语音编码器有G.711 Ulaw 和Alaw。 这个是绝大多数的VOIP都支持的。G.711要是都不支持,就不能称为VOIP,所以刚刚开始测试使用某个系统或者软电话,使用G.711准没有错。
- G.729 这个是公网上使用最多的,但是由于有授权,有些软电话不支持,或者需要采购才能使用。
- iLBC 大多数软电话都支持,而且没有授权限制。
- SPEEX大多数软电话都支持,网络上也有源码,siri 和科大的语音识别的的语音传输就是使用这个编码,flash player 也支持这个编码。
- GSM
- H.263 最基本的视频,大多数的支持视频的软电话都支持。其中H.263 又细分为
- H.263 , H.263+/ H.263-1998等。
- MP4
- H.264 (MPEG-4 part 10)效果最好
PSTN是电路交换,是时分,话音质量是可靠的可控的,无论闲死还是忙死,话音质量都是一样的。VOIP 是数据包交换,话音质量有用以太网的天生属性,质量是不可靠的。通常网络情况下话音效果不错,但是一旦网络繁忙,话音质量就立刻下降。因此VOIP 的运营最大的难点是在于系统的稳定性。
常用的PSTN信令有ISDN PRI 和SS7。其中区别在于ISDN PRI 是一个E1(30路话路)使用其中的16时隙作为信令控制。SS7 是7号信令,是很多E1,最大可以到2^14 (4096)话路共用某个E1的某个时隙(通常是16时隙,作为信令LINK)作为信令控制,为了提高可靠性,通常使用两个E1线路上的时隙(即两个LINK)作为信令控制。
最常用的通常是网络抓包程序Ethereal + WinPcap或者wireshark + WinPcap
有用sip协议是文本字节流模式,抓包之后,直接使用工具里面的查看窗口直接查看。
在Capture 菜单中选择Option子菜单。然后在出现的对话框中选择网卡(Interface)。在Capture Filter 里面输入udp and host 192.168.11.105。UDP表示只是抓udp 的包,因为sip默认是基于UDP,RTP 也是基于UDP。Host 192.168.11.105 表示只抓
ip 是192.168.11.105的数据包(从本机器发给192.168.11.105,或者从192.168.11.105发给本机)。其中192.168.11.105也可以是本机地址。然后点start 开始抓包。
在Capture Filter 里面输入udp and port 5060。UDP表示只是抓UDP的包。Port 5060 表示只是抓5060 端口上的包。因为sip默认是基于UDP,默认是5060 端口。以上的命令就是只是抓sip信令控制的包。
本机的内地通信实际上没有经过网卡,因此Ethereal无法实现对本机内的通信进行抓包,比如本机的软电话呼叫本机上的FreeSwitch,就无法抓包。
一般情况下,假如A机器和B机器进行通信,而你要在C机器上对A机和B机的通信进行抓包,是抓不到包的。比如a机的软电话呼叫B本机上的软电话,你要在C机器上对他们的通信进行抓包,是抓不到包。
使用命令netstat -ano|findstr 5060查看端口5060的占用情况,可以看到占用PID是2552,然后可以通过任务管理器查到占用进程是FreeSwitchConsole.exe
VOIP的数据包包括SIP 数据包和RTP 数据包,SIP只是传输控制命令,跟RTP的语音媒体数据包比较起来简直就是九牛一毛,完全可以忽略不计。下面仅仅计算RTP的数据包,RTP的数据包=以太网地址+IP类型+IP包头+UDP包头+RTP包头+语音编码之后的负载。
以G.711 alaw 编码器为例:
以太网地址12字节,IP类型2字节。IP数据包头:20字节。UDP协议的报头: 8个字节。RTP包头是12字节。语音负载:160字节:一个包20ms,8K的采样频率,每个采样点使用alaw 编码之后是1个字节。因此20ms的语音在编码之后的负载是160 字节。总共是12+2+20+8+12+160=214字节。1秒的语音就是214*(1000/20)=214*50=10700字节,按照流量计算就是10700*8/1024=84Kpbs 左右。
以G.729 编码器为例:
假如是G.729. 一个包20ms其他不变,只是语音编码之后变成了8字节,因此语音负载是8字节,可以算出来:总共是12+2+20+8+12+8=62字节
语音就是62*(1000/20)=214*50=10700字节,按照流量计算就是10700*8/1024=24Kpbs左右。
一个10Mbps 带宽,有效的带宽能达到4-5M左右,以G.711 alaw为例子,一线需要的带宽是84Kbps.因此可以支持的线路数是:5*1000/84=60线左右。但是考虑到业务通常还有带宽需求,因此,30线是比较保险的。以G.729为例子,一线需要的带宽是24Kbps.因此可以支持的线路数是:5*1000/24=200线左右。但是考虑到业务通常还有带宽需求,比如CRM的弹屏通常包括了用户360度的信息和历史记录,数据量也是不小。因此,10M的带宽,100线是比较保险的。
另外要注意的是ADSL 的带宽上行和下行是不对称的,而VOIP的语音通话的开销是要求。上下行一样的带宽。因此假如并发使用的线路多了,而且碰到单边效果不好的情况,很可能的带宽不对称导致的。
有很多网站都可以提供带宽测试 http://www.speedtest.net/是比较好用的一个。host可以选择进行测试。根据本人测试的结果还是比较符合实际情况。
FreeSWITCH 是一个开源的电话交换平台,具有很强的可伸缩性,从一个简单的软电话客户端到运营商级的软交换设备。他可以是一个SIP SERVER,也可以通过他实现很多协议转换。也可以实现VOIP 的IVR 或者呼叫中心。
Anthony Minessale 在2005年的时候认为Asterisk 存在许多问题而修复这些问题需要很多时间。于是他想从头创建一个Asterisk 2.0后面就变成了FreeSWITCH,因此从某种意义上说FreeSWITCH是Asterisk 2.0。一开始没有人认真考虑他的问题,因此他就自己开发,牛人通常就是这样。呵呵
FreeSWITCH几乎无所不能可以用作,一个简单的交换引擎、一个PBX,一个媒体网关或媒体支持IVR 的服务器等。它支持SIP、H323、Skype、Google Talk,RTMP 等协议,支持板卡E1接口,这样就可以实现通过运营商打电话到手机或者固定电话之上。
FreeSwitch 跟其他系统集成基本上是通过他的支持的协议接口进行集成的。最主要的集成方式就是通过SIP协议。可以作为一个分机注册到其他系统上,也可以其他系统作为分机注册到FreeSwitch上以实现互通,甚至可以不通过注册直接使用点对点方式进行通讯。实际使用过程中:集成过以下第3方的系统或者设备,
FreeSwitch==SIP==毅航公司ISX1000/4000系列多媒体可编程交换机,ISX1000/4000系列的新驱动支持iLBC编码器,可以和FreeSwitch公网集成,从而实现FreeSwitch 的落地出口。
FreeSwitch==SIP==东进公司,Keygoe 系列多媒体可编程交换机
FreeSwitch==SIP==Dialogic公司,HMP多媒体可编程软交换系列
带上-nonat 参数启动比较安全。FreeSwitchConsole.exe -nonat。
FS_Cli 是FreeSwitch 一个客户端控制界面,可以在FS_Cli上对FreeSwitch进行管理,比如日志级别设置,查看日志,执行呼叫等操作。FS_Cli 是通过ESL 接口对FreeSwitch进行管理。FS_Cli也可以执行APP模拟进行发起呼叫,播放语音等功能。FS_Cli 有快捷按键,F1-F12,功能对应如下:
FS> originate sofia/profile/internal/1000 &echo (拨打1000并执行echo程序)
FS> originate user/1000 &echo (同上)
FS> originate sofia/profile/internal/1000 9999 (相当于在软电话1000上拨打9999)
FS> originate sofia/profile/internal/1000 9999 XML default (同上)
支持SIP、H323、Skype、Google Talk,RTMP 等协议。实际本人测试过sip 和RTMP
两个办法
1. FreeSwitch 通过SIP接到第三方的VOIP网关上,VOIP网关通过E1 接口接到PSTN上,通常VOIP网关可以支持ISDN PRI 和SS7 信令。比如上面提到的通过ISX1000/4000进行落地
2. 使用支持FreeSwitch的E1接口卡,在机器上插这种卡,安装卡驱动。然后安装FreeSwitch ,再进行协议配置才能使用
目前已知的sangoma板卡可以ISDN PRI和SS7信令。
如何在LINUX 的freeswitch 平台上安装sangoma 请参考:
http://www.voip88.com/article-1202-1.html
如何安装在Windows 的freeswitch 平台上安装sangoma 请参考:
http://wiki.sangoma.com/fs-windows-freeswitch-compile-isdn
SS7信令的支持软件是商业版本,是要额外收费的,根据了解,1个E1端口差不多是1K的授权费用,根据http://wiki.sangoma.com/wanpipe-freeswitch#sangoma-freetdm-ss7-library-libsngss7 上面的介绍,ss7不支持tup,仅仅支持isup:
Sangoma FreeTDM SS7 Library (libsng_ss7)
Features
Sangoma’s SS7 Library uses Continuous Computing’s (Trillium) MTP2/3 and ISUP stacks
to provide a commercial grade SS7 interface to FreeSWITCH, via the FreeTDM channel
driver.
List of supported variants
ISUP (ITU/ANSI)
MTP3 (ITU/ANSI)
MTP2 (ITU/ANSI)
SCCP API
39. FreeSwitch默认配置启动之后占用哪些端口?
FreeSwitch启动之后,占用以下这些端口:
SIP 5060 5080
RTP:16384-32768
TCP:1935 假如启动
mod_rtmp模块
8021 等
具体如下:
TCP 0.0.0.0:1935
TCP TCP
TCP 192.168.11.105:5060
TCP 192.168.11.105:5080
UDP 127.0.0.1:50621
UDP 127.0.0.1:50622
UDP 127.0.0.1:50623
UDP 127.0.0.1:50624
UDP 192.168.11.105:5060
UDP 192.168.11.105:5080
假如这些端口已经被占用,将可能导致启动错误。
主要目录:
mod 可加载模块sounds 声音文件,使用playback() 时默认的寻找路径,
log 日志,CDR ,recordings 录音,使用record() 时默认的存放路径,
conf 配置文件目录
在/conf目录下:
vars.xml文件:一些常用变量默认分机密码=1234,codec,sip ,ip,port等
/sip_profiles
/autoload_configs
/dialplan
/directory
/dialplan/default.xml—-缺省的拨号计划
/directory/default/*.xml—-SIP用户,每用户一个文件
/sip_profiles/internal.xml—-一个SIP profile,或称作一个SIP-UA,监听在本地IP及端口5060,一般供内网用户使用
/sip_profiles/externa.xml另一个SIP-UA,用作外部连接,端口5080
/autoload_configs/modules.conf.xml配置当FreeSWITCH启动时自动装载哪些模块。
在FS_CLI管理界面上:
FS>console loglevel 级别
FS>console loglevel 级别
从0-7,比如6设置成INFO 级别,基本越高日志越大比如设置成7,DEBUG级别。几乎每个操作都很多日志。
输入之后,会返回当前的级别提示如下:
FS> console loglevel 0
+OK log level 0 [0]
+OK console log level set to CONSOLE
FS> console loglevel 7
+OK log level 7 [7]
+OK console log level set to DEBUG
FS> console loglevel 6
+OK log level 6 [6]
+OK console log level set to INFO
假如要看sip 的详细日志,使用以下命令:
sofia profile internal siptrace on打开sip 日志
sofia profile internal siptrace off关闭sip 日志
在FS_CLI管理界面上:
FS>sofia status profile internal
(显示多少用户已注册)
假如刚刚启动,没有人注册上来:
提示如下:
ZRTP-PASSTHRU false
AGGRESSIVENAT false
STUN-ENABLED true
STUN-AUTO-DISABLE false
CALLS-IN 0
FAILED-CALLS-IN 0
CALLS-OUT 0
FAILED-CALLS-OUT 0
REGISTRATIONS 0
使用eyebeam测试,实际上开了两个软电话,注册两个上来。控制台看到是2注册上来。这里面还有sip 的ip,拨入和拨出系统的编码器等等很多有用信息。
在FS_CLI管理界面上:
FS> sofia status profile internal reg 显示哪些用户已注册
刚刚启动FreeSwitch,FS> sofia status profile internal reg提示如下:
FS> sofia status profile internal reg提示如下:
这个可以看到注册上来的机器的ip 地址分机号码等详细信息。
我使用eyebeam测试,实际上注册两个上来。控制台看到是2个注注册上来。
\db\ sofia_reg_internal.db 里面保存的是注册的信息。
假如碰到意外情况,可能存在有软电话注册上来之后,一直在里面的情况。看这个行:
Status: Registered(UDP)(unknown) EXP(2012-11-22 20:45:46) EXPSECS(3655)
最后的秒数目就是注册有效期。
FreeSwitch默认配置启动默认有1000-1019 20个帐号。他们的默认密码是1234.使用软电话可以注册上去进行呼叫。
FreeSwitch默认配置启动之后。下面的这些分机会经常用到
9196 echo,回音测试
9195 echo,回音测试,延迟5秒
5000 示例IVR
30xx电话会议比如
3000,3001.拨入之后假如是第一个人会听音乐
首先在conf/directory/default目录下增加一个用户配置文件,配置文件可以参考已经有的配置文件。然后修改拨号计划(Dialplan)使其它用户可以呼叫到它。最后重启FreeSwitch。
拨号计划使用perl的正则表达式。
常用的匹配模式如下:
^ 表示开始匹配,^123 表示匹配123开头
表示结束匹配456 表示匹配456结束
| 表示或者,匹配任何一个
[] 表示匹配其中的任意一个字符
[0-9] 等于匹配[0123456789]
\d等于匹配[0-9]
\d+ 等于匹配1 个或多个数字
\d* 等于匹配0 个或多个前面的字符
修改/conf/dialplan 目录下的default.xml文件。其中的destination_number 是分机号码。这个例子表示分机号码是1000-1199 共200个
使用show codec 命令可以看到系统加载的编码器。
FS> show codec
但是要注意,有加载不一定就能使用。具体能否使用还要看vars.xml里面的配置
上面说到系统加载了很多编码器,但是不一定能使用,具体能使用哪些编码器,要看conf/ vars.xml 配置文件里面的下面的参数:
global_codec_prefs是全局能使用的编码器。
outbound_codec_prefs 是FreeSwitch拨出的时候使用的编码器。
首先查看:conf\autoload_configs 目录下的modules.conf.xml 配置文件,看看是否有打开注释加载到系统,注释了就是没有加载的。比如mod_ilbc 默认是没有加载的。而mod_g729 默认是加载的。然后在conf/ vars.xml 配置文件里面的看下面的参数:
假如没有就加上:
保存、重启FreeSwitch就可以
有人说加了G729,但是还是不行,那是因为FreeSwitch 的G729只能支持透传的方式。不能转码,导致呼叫到IVR,或者两个软电话一个是G729一个不是G729 也不能话。要想使用G729通话,只能两个软电话都是G729的情况才行
上面说到系统加载了很多编码器,但是不一定能使用,具体能使用哪些编码器,要看conf/ vars.xml 配置文件里面的下面的参数:
global_codec_prefs是全局能使用的编码器。
outbound_codec_prefs 是FreeSwitch拨出的时候使用的编码器。
结合使用show codec 命令可以看到系统加载的编码器和
sofia status profile internal
或者假如是5080端口
sofia status profile external
大多数软电话上都能指定使用编码器。我们强烈建议在内网测试,只要指定G.711 alaw语音编码器就可以。简单明了,有问题也好查,因为SDP 的协商过程太过复杂,初学者很晕。以eyebeam为例子,在eyebeam上点右键,点setting然后点media,audio,advance。(通常情况下视频是不需要的,可以都去掉,只有当需要视频功能的时候才加上h.263)
FreeSwitch的默认配置是不进行转码的,比如软电话a 呼叫软电话b,a 只有G.711alaw,b只有G.711 ulaw。他们都注册到FreeSwitch上,注册是成功的,但是无论a 呼叫b 还是b 呼叫a 都是不行的。但是a 呼叫a 自己是可以的,b呼叫b自己也是可以的。要让FreeSwitch支持分机间能转码通话。需要修改:
conf\sip_profiles\ 目录下的
internal.xml或external.xml (5080端口上的)下面两个参数都设置为false:
要实现G.729的转码需要自己开发编码器,即在FreeSwitch的源码上进行修改。有人已经做成功这个事情。有编译好的二进制包可以使用。在群里面有做好的二进制安装包,我放到网络上:url下载地址:http://42.121.7.65/FreeSWITCH1.2.0-G729.rar。或者自己增加这个编码器。或者网络上购买别人做好的这个编码器。
根据Freeswitch 音视频编码支持上面的介绍:
以模块方式加载的编码在目录src\mod\codecs下面,所以如果我们想添加自己的编码,在此目录下参考其他实现即可,freeswitch对新编码的添加接口比较简单,自己增加编解码器步骤如下:
注册四个回调:
init
encode
decode
destroy
然后通过switch_core_codec_add_implementation把这几个回调的实现注册进去。
在conf/ vars.xml 配置文件里面修改下面的参数,增加H263或者H264编码:
保存、重启FreeSwitch就可以。要测试支持视频通话,软电话要支持。先要有视频的编码器,然后在eyebeam 里面还要设置。
另外:FreeSwitch 的视频通话是不支持转码的,因此使用的时候需要所有的软电话都设置为一样的视频编码器,比如都设置为H263编码器。
在两个网卡上不同的网段上,与运行两个网段上的软电话互通.这是一个实际应用环境中会经常碰到的问题。
比如:
192.168.1.X 5060 internal profile 1000 1002 register on 192.168.1.X 5060
1000==>1002 ok 1002==>1000 ok
192.168.11.X 5060 external profile 1000 1002 register on 192.168.11.X 5060
1000==>1002 fail 1002==>1000 ok
1000 register on internal 192.168.1.X 5060 1002 register on external
1000 register on internal 192.168.1.X 5060 1002 register on external
X
5060
external 1002 ==>internal 1000 ok
internal 1000==>external 1002 ok
结论只能呼叫在internal上注册的分机。
修改文件internal.xml和external.xml,位置:/usr/local/freeswitch/conf/sip_profiles
external.xml 修改内容:
internal.xml
修改sip的external与internal配置文件
打开sip_profile/external.xml文件,反注释下面的行:
打开sip_profile/internal.xml文件,反注释相同的行:
Flash phone 就是通过网页上的flash插件来实现语音媒体通话的功能。作为搞voip sip 的研发人员,了解这个有一定的必要性。我们认为支持rtmp协议能进行语音通话的系统都可以叫做flash phone。其代表是开源的red5phone ,它使用java 基于red5 媒体服务器上开发的实现flash到sip转换网关
Flash sip 或者flash phone 的优势是在浏览器里面使用flash player 插件不需要新安装插件
A.访问系统的用户是非特定的用户或者游客。他们通过网页上对系统进行访问。使用activeX 插件的形式,用户会不信任,也不会安装。因此可以通过Flash sip 或者flash phone来对系统进行语音访问。因为绝大多数的机器浏览器都安装了Flash player插件。通俗一点描述:用户浏览某个网站,对里面的某个产品有兴趣,可以点产品边上的电话按键马上和客服或者销售人员进行语音沟通。以前类似的业务是通过web 800 或者web call 让用户输入手机号码然后系统呼叫用户的手机跟坐席进行通话来实现的。许多用户不想泄漏手机,不会输入手机号码。
B.B/S结构的呼叫中心,系统的客服或者坐席是经常变换机器的,他们今天可能在公司上班,明天可能在家里上班。
C.有些地方的运营商不允许使用SIP 进行VOIP通讯。比如山东聊城联通的宽带就是禁止使用SIP 进行VOIP通讯。这个时候通过Flash phone作为媒体通讯是合适的。
flash phone使用adobe 公司的flash player插件,跟系统使用RTMP进行通信。RTMP 是基于TCP 协议开发的一种媒体协议。客户端就是flash player 或者基于AIR的应用程序,服务器可以说FMS,RED5, 和FreeSwitch 的MOD_RTMP
由于RTMP 是基于TCP 协议开发的一种媒体协议,TCP的协议网络影响特别大。因此使用flash phone 的时候需要注意:
A.系统的服务端和客户端最好能在一个运营商内使用。跨运营商带宽是不能保证的,延时也会明显加大。在使用tcp 进行媒体传输通讯的时候影响会显著放大。
B.假如要公众服务的系统,最好是架设在BGP的四线接入的机房内部,才能有效
保证接入的带宽和延时。
C.RTMP 默认是使用1935 端口。机器上要保证这个端口是没有进程其他占用的。
D.flash phone 测试呼叫9195延迟5秒的回音测试,是不行的,有BUG
FreeSwitch默认是不提供mod_rtmp模块需要自己编译。编译好mod_rtmp模块
之后通过修改 \conf\autoload_configs 目录下的modules.conf.xml 配置文件,打开的注释。保存、重启FreeSwitch 就可以使用
\conf\autoload_configs目录下的rtmp.conf.xml 就是这模块的配置文件。
其中的1935 就是rtmp 模块发默认端口。假如1935端口被占用,就要修改这个参数。
FreeSwitch的flash 配置文件如何配置不需要login就可以使用?
\conf\autoload_configs目录下的rtmp.conf.xml配置文件
参数改为:
然后不用flash phone 上login 就可以呼叫。但是这样是有风险的,我们建议除非是内网使用,否则不要设置为false
提供的支持rtmp的代码在\clients\flex 目录下。flash phone是基于FLEX 开发的目前支持Adobe Flash Builder 4.6开发
FreeSwitch 默认提供的代码很庞大,功能很多,尤其是JS部分,给初学者带来很大的困惑。实际上基本的通话功能只要很少的code,简化之后的code 只有300多行。整个demo 可以到http://42.121.7.65/fs_flex.rar上去下载
flash phone 连接connect到系统之后,可以呼叫已经注册到FreeSwitch上的分机。呼叫的方法是直接呼叫:sip:分机@FreeSwitch的IP
本人测试的1.2.1的版本由于FreeSwitch 的某个bug,导致某些情况下(比如flash phone客户端)通过iLBC编码呼叫其他系统,或者其他软电话分机的时候,INVITE 里面的SDP 是错误的。iLBC编码的RTP MAP 应该是98.在这里flash phone 默认的SPEEX的RTP MAP变成了98.而iLBC编码的RTP MAP变成了99.从而导致无法跟其他系统(比如毅航的ISX系列)集成使用,比如会造成单通。这个时候需要通过修改源码,重新编译mod_sofia 模块替换之后才能使用
具体修改的地方是sofia_glue.c文件里面的sofia_glue_set_local_sdp函数里面的下面部分:
在修改代码之后测试iLBC和speex@8000h@20i 不能同时设置到编码器里面,否则:eyebeam(软电话的)呼叫会导致ilbc 的rtpmat=97 ,speex 的rtpmap=98。flashphone的呼叫会导致speex 的rtpmap=97,ilbc 的rtpmat=98 导致不一致的错误。只能使用iLBC 或者SPEEX里面的一个。假如没有设置speex@8000h@20i ,flash呼叫内部分机的时候SDP不会出现:speex 的rtpmap=97。但是假如是flash 呼叫外部的没有注册上来的sip,那么会出现speex 的rtpmap=97的sdp 。呼叫sip:[email protected]:8286
flash phone 连接到FreeSwitch的MOD_RTMP之后。需要login 才能被呼叫。软电话分机要呼叫,需要修改拨号计划,在conf\dialplan目录下的default.xml 文件里面修改:
注意两条:
bridge 命令,因为测试发现nod_rtmp有bug,所以呼叫到flash 客户端有时候不成功。
continue_on_fail=true的情况下,万一bridge 不行,我们就再来一次bridge!不行甚至可以考虑再来一次
在conf\dialplan目录下的default.xml 文件里面修改
注意有3条bridge 命令,第一次是呼叫软电话的分机。要是没有软电话分机注册上,就呼叫flash client 的分机
修改:acl.conf.xml。比如允许192.168.11.X网段拨入到软电话或者flash client,acl.conf.xml修改如下,然后没有注册的呼叫注册的可以直接呼到默认的配置5080 端口就行
有两种情况会导致这个问题:
A.设置成了false
B.Invite 里面的from 1005@fs ip 地址发起的会导致被叫挂机,fs 不会转发挂机信号给主叫。因此跟第三方集成的时候,from 的地址要保证是对的
在conf\sip_profiles\external 目录下建立gw1.xml 内容如下:
其中ip 地址和端口是外拨网关的ip 和sip 的端口
然后在conf\dialplan\default 建立一个call_out.xml
内容如下:
表示拨打 9开头的号码都走外拨网关gw1的路由
在conf/dialplan/public目录下建立my_did.xml 文件,内容如下:
之后拨打你的接入号码就会到分机上
FreeSwitch运行在公网,意味着:
A.假如是对公众提供服务,软电话分机分布在全国各地,各个运营商都可能存在,因此各个运营商的接入带宽延时是要考虑的。我们建议部署在BGP 4线机房
B.意味这软电话在公司内网,需要NAT 穿透才能使用,因此需要去掉–nonat启动
除了考虑实网部署的问题之外,公网运营考虑的问题还有带宽核算和安全性,
带宽的问题主要是编码器的使用
G729 默认是没有转码的
因此考虑iLBC编码是合适的
联通WCDMA 3G数据通道
电信CDMA 2000 3G数据通道
电信宽带用户
联通宽带用户
长宽宽带用户
移动(铁通)宽带用户
客户软电话在公司内部通过WIFI上网的环境测试
修改文件/freeswitch/conf/autoload_configs/sofia.conf.xml
修改内容
该属性设置的目的是防止FS在检测到IP地址发生改变后,自动重启sofia模块
默认用户的认证密码和语音邮箱登陆密码都异常简单(默认为1234)。可以参考以下建议:
1、删除默认的静态XML配置,通过mod_xml_curl模块使用后台数据库中动态的数据。
2、手动修改配置文件中的用户名和密码。
3、通过运行scripts/perl/randomize-passwords.pl修改
Alaw 和ulaw 没有m=rtpmap 0/8000 之类的详细描述,导致呼叫到kapanga 上,kapanga接通就挂机。没有rtpmat 描述导致呼叫到red5 phone 等不行
跟其他的软电话之类的对比多了rtpmap=13静音的说明
基本的机器就可以,目前主流的双四核的CPU,8G内存配置的pc Server机器,可以支持300先线并发带转码。在P950 CPU 2G内存配置的笔记本上测试可以支持30路的转码(G.711–SPEEX)。假如内存不够,会导致FreeSwitch崩溃
在\conf\dialplan\default.xml 配置文件里面加上
其中的12396表示接入号码。之后,拨打12396 的号码就会到本地的8084端口的服务流程(用户自己控制的ivr)上
A.设置区别:
在\conf\dialplan\default.xml 配置文件里的章节里面:
异步模式参数:
同步模式参数:
B.使用区别:主要区别在于执行app 或者api 的时候异步模式是马上返回的。而同步模式是阻塞的。一直到条件满足函数才会返回的
C.例子:以播音举例
esl_execute(handle, “play_and_get_digits”, “1 12 1 15000 # intelno.wav” , NULL);
其中的”1 12 1 10000 # intelno.wav” 分别对应下面参数:
分别表示最小收1个按键最大收12个按键重复1次等15000毫秒,按#结束。提示语音是intelno.wav
异步模式下esl_execute执行之后马上返回,ivr可以进入处理收按键环节,用户开始听见intelno.wav的语音内容。在异步模式下,用户的按键处理条件可以是程序自己来处理。按键的结束条件也不仅仅只有上面几个,比如可以设置两个按键的间隔时间等参数。这样大大增加了灵活性
同步模式下,函数esl_execute执行就没有返回,除非用户按键达到12个,用户按了#键或语音播放结束超过15秒时间函数才会返回。表面上看同步模式比较简单,开发流程比较容易,但是一旦是多线并发,业务复杂的流程,比如使用esl 开发呼叫中心的流程,或者其他的复杂的流程,同步模式处理起来就吃力。简单就意味着不够灵活。为了系统将来的业务扩展支持,我们建议使用异步模式
播放文件的默认目录:
\sounds\en\us\callie
录音文件的默认目录:
\sounds\en\us\callie
可以在record 的时候写上绝对路径,比如 d:/record/1.wav
FreeSwitch的播音除wav文件之外,其他是根据文件扩展名来区分格式的
国内通常的ivr系统都是使用单声道的8000Hz alaw编码的语音格式
FreeSwitch 能支持这种格式的语音有两种办法:
A.文件名称的扩展名叫做.alaw
B.使用工具给这些文件加上wav 头,然后扩展名叫做.wav
假如是其他格式的语音类似参考修改
具体可以在fs_cli下使用show files 命令查看。然后使用合适的语音文件扩展名
国内通常的ivr系统都是使用单声道的8000Hz alaw编码的语音格式。要做到能录制到这种格式的语音,需要以下几个步骤:
首先在拨号计划里面加上来指定是8000HZ和单声道,默认是立体声的。
然后在uuid_record 或者record的时候,录音的时候指定是.alaw的扩展名,这样就指定是alaw编码的语音。假如是.wav扩展名则是线性16bit没有编码的语音
录音生成的WAV文件,和实际录音对比声音只是小一点点。使用cooledit 播放声音是几乎正常的。回放录音文件时发现声音很小,可以通过设置增益来实现
uuid_audio
,level参数从 -4 to 4, 0 是默认声音大小. 4是最大[start [read|write] [mute|level ]|stop]
FreeSwtich通过模块fsv支持视频的录制和播放,此模块提供两个APP(record_fsv和
play_fsv),一个录像,一个播放,实现源码文件:src\mod\applications\mod_fsv/mod_fsv.c
- 录像:
dialplan 中调用app record_fsv,,参数为录音文件名
- 播放视频:
dialplan中调用app play_fsv,,参数同样为文件名