Category

开发者博客

SIP VoIP入门 – SIP协议的基础介绍

By | VoIP技术 | No Comments

SIP VoIP 入门

要了解SIP首先要清楚系统是如何定义终端(endpoint)位置的。SIP中使用三种部分以定位一个终端,SIP URI,联络地址和媒体地址。SIP URI用于标识SIP用户,而不是位置,它与电子邮件类似,实际上看起来和电子邮件地址是一样的。典型的SIP URI地址包含电话号码,甚至MAC地址,可能看起来是4042265555@voipdomain.com,但可能是anything@anydomain.net。联系地址反映了你的身份和地址。ATA或IP电话上注册过程中需要联系人的地址,可能是4042265555@192.168.1.120,其中192.168.1.120就是终端的IP地址。媒体地址用来接收媒体或语音(RTP)和终端可以是相同的192.168.1.120。

注册

启动VoIP的第一步就是注册。SIP注册过程如下:

sip_register

注册过程是指终端发SIP REGISTER请求给VoIP服务提供商(SIP服务器),告诉服务器自身的具体位置,以便当有人请求此用户时服务器能够找到它。该请求中包含了用户的联系人列表。用户注册过程包含三个步骤,首先是用户发送请求,之后SIP服务器将发回指令,要求用户正确相应(一般为要求用户提供有效用户名和密码)的SIP服务器用户验证,验证通过后系统将用户登记在本地的联系人数据库。最后服务器返回200 OK给客户,其中在Contact Header中包含客户的当前联络地址列表。

通过一定周期的注册过程,UA(用户代理,及终端)将所在地址发给SIP服务器,以便当服务器收到针对此终端的INVITE请求时,能够将次请求正确的转发到相应的地址。由于UA已经与服务器完成了认证,再次发送请求时会提供验证信息,服务器则不会发挥一个要求验证的407错误。

SIP用于设置和管理IP网络上的媒体会话(例如最典型的RTP语音流),在请求 – 响应的模式下运作。

通过SIP建立一个通话

SIP =Session Initiation Protocol 会话初始化协议,

sip_call_basic

上述例子是两个SIP端点之间的基本呼叫演示。两个UA之间直接通信,主叫方发送呼叫邀请给被叫方进行通话呼叫。媒体流建立后表示双方开始进行语音会话,两方通话终止后,媒体流也随即停止。

通过 SIP Header 设置 坐席话机自动应答

By | VoIP技术 | No Comments

通过 SIP Header 设置 坐席话机自动应答

自动应答指当坐席话机接到呼叫请求时,无需任何操作,话机自动应答,场景主要适用于

  • 点击拨号
    • 点击拨号时系统首先会拨打坐席电话,使用自动应答避免了坐席摘记或者接听操作 *部分软电话有自动应答功能
  • 预拨号
    • 预拨号指系统首先接通客户号码,然后转接到队列,使用自动应答可以避免客户在队列中等待

当使用 IP 话机时,我们可以通过 SIP 协议中的 Call-Info 头信息来告诉话机希望这个通话能够被自动应答,在 asterCC 呼叫中心系统 中,我们可以在坐席组中设定在什么情况下启用该设置,使用范围包含 坐席, 预拨号, 点击拨号

话机自动应答设置

自动应答SIP消息设置

当启用自动应答设置时, 可以看到呼叫的 Invite 请求里多了一行  Call-Info: ;answer-after=0

话机自动应答设置

由于设备限制,测试过支持此方法的 IP话机 包括

值得注意的是,部分网关不支持该方法,当启用自动应答时,网关收到 Invite 呼叫请求后,没有任何反应,此时应该关闭此选项。

 

 

asterisk direct media 配置

By | 其他asterisk相关 | No Comments

asterisk direct media 配置

在 VoIP 通话中, direct media指通话两方的语音流(RTP包)不经过第三方直接通信,一般这里的第三方指外呼服务器(Outbound Proxy),在 asterisk 系统中,一般 asterisk 会同时处理信令(SIP)和媒体(RTP),例如提供等待音乐,解决NAT问题等,但在某些情况下,我们希望通话双方直接通信而不经过asterisk转发,以提高整个系统的处理能力,这里我们介绍一下 asterisk 的 direct media 配置。

首先的参数是 sip.conf 中的 derectmedia, 默认为 no, 既默认所有通话的rtp包都会经由 asterisk 转发. 在 asterisk 1.6.2 以前的版本中, 这个参数名称为 canreinvite

其次需要注意的是拨号命令 Dial 中使用的参数, 当 Dial 包含以下参数时  ”t”, ”T”, “h”, “H”, “w”, “W” or “L”, asterisk 不会支持 directmedia, 例如 Dial(SIP/1001,45,t)

查看是否有媒体流经过 asterisk 可以使用命令

asterisk cli> rtp set debug on

asterisk direct media

 

asterisk 语音编码转换

By | 其他asterisk相关 | No Comments

asterisk 语音编码转换

asterisk作为VoIP系统,其一大特性是对RTP媒体流的处理能力,由于开源解码器的存在,以及可以运行在价格低廉的X86硬件系统上,经常被用于完成不同系统间的语音编码转换,以取代价格相对昂贵的硬件设备。

常见的编码转换场景例如 局域网内使用ulaw,alaw或者g722编码,外呼时使用g729编码以节省带宽

asterisk 中支持的语音编码

查看 asterisk 支持的编码格式命令为

core show translation

asterisk 语音编码转换图中看到的数字表示两种编码转换所需要的时间,数值越小,则表示转码速度越快,-表示不支持此种编码转换

使用 module load codec_ tab键 可以查看/加载系统支持的语音编码

astercc_us*CLI> module load codec_<tab>
codec_a_mu.so codec_adpcm.so
codec_alaw.so codec_dahdi.so
codec_g722.so codec_g726.so
codec_gsm.so codec_lpc10.so
codec_ulaw.so codec_g729-ast16-icc-glibc-x86_64-pentium4.so

加载和卸载 asterisk 模块的命令分别为  module load .so 以及 module load .so,例如

astercc_us*CLI> module unload codec_g729-ast16-icc-glibc-x86_64-pentium4.so
Unloaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so
== Unregistered translator 'lintog729' from format slin to g729
== Unregistered translator 'g729tolin' from format g729 to slin
astercc_us*CLI> module load codec_g729-ast16-icc-glibc-x86_64-pentium4.so
Loaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so
== Registered translator 'g729tolin' from format g729 to slin, cost 1000
== Registered translator 'lintog729' from format slin to g729, cost 5999
Loaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so => (g729 Coder/Decoder, based on IPP)

http://asterisk.hosting.lv/ 上可以下载针对不同 asterisk 版本和CPU编译的 g729 g723 so文件, cpu类型可以通过以下命令查看

cat /proc/cpuinfo

文件需要下载到相应的 asterisk 库目录, 一般为 /usr/lib/asterisk/modules 或者 /usr/lib64/asterisk/modules

在 asterisk 系统中,当需要连接的两个终端使用的编码没有交集而asterisk又支持这两种编码的转换,这时 asterisk 就会进行编码转换。

使用 sip show peer 名称 命令,可以查看该系统中为该终端设定的编码及顺序

astercc_us*CLI> sip show peer astercc-5000
....
Defaddr->IP : 0.0.0.0 Port 5060
Prim.Transp. : UDP
Allowed.Trsp : UDP
Def. Username:
SIP Options : (none)
Codecs : 0x28010e (gsm|ulaw|alaw|g729|h263|h264)
Codec Order : (ulaw:20,alaw:20,gsm:20,g729:20)
Auto-Framing : No
100 on REG : No
....

修改编码可以通过修改 sip 配置文件实现,例如我们改为仅支持729编码

[astercc-5000]
callerid=5000 <5000>
accountcode=1235430313
secret=temp321
callgroup=1
pickupgroup=1
language=cn
type=friend
qualify=yes
port=5060
nat=yes
host=dynamic
dtmfmode=rfc2833
context=hosted-dialout
directmedia=no
call-limit=1
disallow=all
allow=g729

保存,重载 asterisk sip配置

astercc_us*CLI> sip reload
Reloading SIP
== Parsing '/etc/asterisk/sip.conf': == Found
== Parsing '/etc/asterisk/sip_general_astercc.conf': == Found
== Parsing '/etc/asterisk/sip_hostedpbx_registrations.conf': == Found
== Parsing '/etc/asterisk/sip_custom.conf': == Found
== Parsing '/etc/asterisk/sip_hostedpbx_devices.conf': == Found
== Parsing '/etc/asterisk/sip_hostedpbx_trunks.conf': == Found
== Parsing '/etc/asterisk/users.conf': == Found
== Using SIP TOS bits 96
== Using SIP CoS mark 4
== Parsing '/etc/asterisk/sip_notify.conf': == Found

再次查看 会发现该终端的编码已经改变

astercc_us*CLI> sip show peer astercc-5000
....
Defaddr->IP : 0.0.0.0 Port 5060
Prim.Transp. : UDP
Allowed.Trsp : UDP
Def. Username:
SIP Options : (none)
Codecs : 0x100 (g729)
Codec Order : (g729:20)
Auto-Framing : No
100 on REG : No
....

常见的 SIP中继外呼失败原因 及解决办法

By | VoIP技术 | No Comments

SIP中继外呼失败原因 及解决办法

在asterCC系统中,配置外呼中继最简单的配置方法是将该中继分配给一个团队,这样该团队所有的对外呼叫都会被默认经由此中继外呼,如图:

配置完成后,使用软电话注册一个该团队下的分机,就可以进行外呼测试了。

问题一: 外呼振铃后, 电话一接听即挂断(SIP错误 488 )

问题现象

电话外呼后被叫号码会振铃,但是当接通时,通话挂断.

SIP错误代码

当使用抓包工具时可以看到错误编码为 488 not acceptable here

SIP/2.0 488 Not acceptable here
Via: SIP/2.0/UDP 192.168.0.57:5060;branch=z9hG4bK644461b7;received=192.168.0.57;rport=5060
From: "aziz" <sip:157@192.168.0.254>;tag=350164683297
To: "Alice" <sip:57@192.168.0.254:5060>;tag=as3f160681
Call-ID: 728007708208@192.168.0.57
CSeq: 2 INVITE
Server: FPBX-2.8.1(1.8.11.0)
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Content-Length: 0

 

问题原因

一般由于电话编码和中继编码不匹配,且系统无法进行编码转换的原因造成。

解决办法

检查终端,系统,中继三者是否设定了相同的语音编码,如果没有,则需要确认系统有语音编码转换功能.

问题二: 无法外呼 (SIP 错误 404)

问题现象

电话无法外呼

SIP错误代码

当使用抓包工具时可以看到错误编码为 404 Not Found

SIP/2.0 404 Not Found
Via: SIP/2.0/UDP 192.168.1.5:5060;branch=z9hG4bK-u2p6nv;rport
Record-Route: <sip:siproxd@192.168.1.1:5060;lr>
From: "Ticket1" <sip:000000@173.234.33.58>;tag=xm2wi9
To: "11" <sip:11@173.234.33.58;user=phone>;tag=18412430722368
Call-ID: k39e75bxg5
CSeq: 18331 INVITE
Content-Length: 0

问题原因

一般原因是被叫号码格式错误

解决办法

请确保被叫号码格式是中继指定的格式,部分中继会要求设定号码前缀等.

问题三: 无法外呼 (SIP 错误 500 或 603 )

问题现象

电话无法外呼

SIP错误代码

当使用抓包工具时可以看到错误编码为 500 Internal Error 或者 603 Decline

问题原因

一般原因是验证错误

解决办法

确保使用了正确的用户名密码, 部分中继要求使用特定的 SIP From Header 请阅读 网路中继教程之-asterisk-sip中继配置 , 或者 要求使用指定的主叫号码 主叫号码callerid的管理 .

问题四: 无法外呼 (SIP 错误 408 )

问题现象

电话无法外呼

SIP错误代码

当使用抓包工具时可以看到错误编码为 408 Timeout

问题原因

电话无法连接到系统或者系统无法连接到对方网络

解决办法

  • 确定电话正确配置,即软电话能够正常注册到asterisk/astercc服务器
    • 当使用非标准端口时,注册地址需要填写端口号码,例如 sip.astercc.org:8060
  • 确定电话请求可以抵达服务器
  • 确定服务器中继配置使用了正确的ip地址和端口

问题五: 呼入错误

问题现象

拨打系统上的DID号码后,没有反应或者直接被挂断

问题原因

中继没有正确的注册

解决办法

  • 如果是中继注册,请确认已将系统公网IP和端口提供给供应商 并且对方已经正确配置
  • 如果是用户名密码注册, 请确认填写了正确的注册串 阅读 网路中继教程之-asterisk-sip中继配置

网路中继教程之 asterisk SIP中继配置

By | 呼叫中心教程 | No Comments

asterisk SIP中继配置: IP中继对接

IP对接即IP认证,适用于系统拥有固定IP的情况,落地端会要求提供系统的IP,并提供落地端的IP和端口,在asterCC系统中,IP对接的配置如下,详情中填写

host=192.168.1.170
post=5060

其中192.168.1.170为对方IP地址(也可以使用域名),5060为端口号

asterisk SIP中继配置 ip sip中继对接

对应的asterisk中sip.conf中的相应配置如下

[siptoE170]
host=192.168.1.70
port=5060
type=friend
insecure=port,invite
directmedia=no
qualify=yes
context=hosted-dialin
disallow=all
allow=ulaw

asterisk SIP中继配置: 用户名密码对接

使用用户名密码对接时,分为呼入和呼出两部分,呼出配置,asterCC中配置如图所示

asterisk SIP中继配置 用户名密码SIP中继对接

相对应的asterisk中sip.conf中相应的配置如下

[siptoE170]
host=192.168.1.70
username=myusername
secret=mysecret
port=5060
type=friend
insecure=port,invite
directmedia=no
context=hosted-dialin
dtmfmode=rfc2833
qualify=yes
disallow=all
allow=ulaw,alaw,gsm,g729

部分中继要求指定的From Header,因此需要设置fromuser和fromdomain

asterisk SIP中继配置 用户名密码SIP中继对接

相对应的asterisk中sip配置如下

[siptoE170]
host=192.168.1.70
fromdomain=192.168.1.70
username=myusername
fromuser=myusername
secret=mysecret
port=5060
type=friend
insecure=port,invite
directmedia=no
context=hosted-dialin
dtmfmode=rfc2833
qualify=yes
disallow=all
allow=ulaw,alaw,gsm,g729

中继注册

如果该中继还用于接受呼叫(呼入),对于使用用户名密码的中继需要填写注册串,IP认证的中继则不需要,asterCC中配置如图所示

asterisk SIP中继配置 中继注册

格式为 username:password@ip:port

相对应的asterisk中sip.conf中配置如下,注意要写在所有自定义section之前

register=myusername:mysecret@192.168.1.70:5060

astercc界面上能够看到中继状态asterisk SIP中继配置 SIP中继注册状态

呼叫中心模块安装,升级,下载和出现问题的解决办法

By | 呼叫中心使用技巧 | No Comments

呼叫中心模块安装

asterCC商业版呼叫中心系统采用模块化设计,针对呼叫中心不同的业务,用户可以选择安装不同的模块来实现。

正常来说,系统安装完毕后,以管理员账户登录,通过左侧菜单进入 系统模块管理 页面,就可以看到系统提供的模块。

当本机已经下载了相应的模块时,我们可以看到安装按钮,点击安装系统会自动安装。

呼叫中心模块安装 呼叫中心模块安装

呼叫中心模块升级

同样,当系统发布了新的版本,且服务器上有升级包时,我们会看到升级按钮,点击升级按钮系统会完成升级。

呼叫中心模块升级

呼叫中心模块下载

如果我们能够看到新版本,但是服务器上没有可用的安装(升级)包,我们会看到下载按钮,此时我们需要在服务器上下载安装(升级)包,首先获得安装(升级)包的地址,

ssh到服务器,进入目录/var/www/html/asterCC/data/_cache/

cd /var/www/html/asterCC/data/_cache/

使用wget下载安装(升级)包

 wget http://download3.astercc.org/packages/core/core-2.1-rc2-patch-x86_64.tar.gz

呼叫中心模块下载 查找升级包地址 呼叫中心模块下载 下载升级包

看不到任何模块怎么办?

系统需要连接到asterCC升级服务器以获取版本信息, 如果你在呼叫中心模块管理中看不到任何模块信息,首先请确认服务器有互联网权限.

测试网络,如果系统返回

[root@astercc01 ~]# ping update.astercc.org
ping: unknown host update.astercc.org

表明系统无法解析域名,一般是由于系统没有设置DNS服务器造成,编辑/etc/resolve.conf文件,配置DNS服务器,如果不清楚ISP提供的DNS服务器地址,可以使用googole DNS,修改后的resolve.conf文件格式如下

[root@astercc01 ~]# cat /etc/resolv.conf
nameserver 8.8.8.8

保存后再次执行,确认域名可以解析

[root@astercc01 ~]# ping update.astercc.org
PING update.astercc.org (8.38.33.10) 56(84) bytes of data.
64 bytes from 8.38.33.10: icmp_seq=1 ttl=52 time=54.9 ms
64 bytes from 8.38.33.10: icmp_seq=2 ttl=52 time=66.4 ms

重启php服务

service php-fpm restart

刷新页面,问题解决

电话销售系统教程 之 模块安装 数据导入 和 点击拨号

By | 呼叫中心使用技巧 | No Comments

电话销售系统教程 之 模块安装 数据导入 和 点击拨号

在完成系统基础设置之后(账号,分机,中继,坐席,坐席组) 我们开始设置一个外呼任务。

模块安装

首先确定我们安装了外呼营销模块,以管理员账号登陆,左侧菜单点击 “系统模块管理”,如图所示。

systemupdate_modules_campaign

如果您没有安装该模块,可以点击右侧的安装按钮执行安装,如果看不到模块,请参考 呼叫中心模块安装,升级,下载和出现问题的解决办法

建立外呼任务

campaign_create

建立一个新的外呼任务, 我们仅需要填写任务名称, 其他参数使用默认值即可, 注意选择正确的坐席组.

campaign_list

数据导入

点击任务前的导入按钮,进入导入界面,上传要导入的文件,系统会列出文件中前十条数据供参考。

campaign_import_init

 

选择即导即用功能, 系统会自动建立相应的字段,这样节省了自定义字段的时间。

campaign_import_start

即导即用功能会自动匹配电话号码类型,对于其他类型我们可以根据需要进行调整,对于不需要的字段,我们可以选择 -选择字段-,这样该字段就不会被导入了。

campaign_import_remove_column

点击”将数据导入表”按钮,如果导入文件名与任务名称不匹配,系统会出现警告提示,点击确定继续。

campaign_import_confirm

 

系统成功创建导入计划后会显示计划编号

campaign_import_importid

点击确定进入导入计划页面,这里可以看到该导入任务的处理情况

campaign_import_done

数据导入成功后 我们需要将客户分配给坐席

管理员分配数据

按比例/数字分配

campaign_auto_assign

按条件查询分配

campaign_manually_assign

坐席自动获取

除管理员分配外,也可以设置为坐席获取这种方式

campaign_agent

点击拨号

坐席可以通过调整表头 列出关心的数据

campaign_agent_customer_list

双击数据打开客户资料页面

campaign_agent_popup

 

签入坐席,点击号码后面的拨号按钮拨号

campaign_dialing

自动应答

系统在开始拨打客户号码前首先要接通坐席分机,如果使用的软电话,我们可以开启自动应答功能,这样坐席点击拨号后,软电话会自动应答

xlite_auto_answer

 

如果您的软电话不支持自动应答功能,您可以在这里下载免费的xlite软电话

如果您使用的IP电话,asterCC会在SIP头中添加自动应答请求,大部分IP电话均支持该选项,您也可以在坐席组管理中关闭此功能

agentgroups_sip_header

 

 

VoIP调试 使用tcpdump和wireshark调试VoIP通话

By | VoIP技术, 呼叫中心使用技巧 | No Comments

VoIP调试

之前的 如何利用ngrep调试sip系统 适用于SIP包的快速分析,有些情况下系统环境比较复杂,我们希望能获取完整的通话信息(SIP+RTP,即完整的语音通话),这时我们可以使用tcpdump获取网络数据,使用wireshark进行进一步分析。

tcpdump

安装

yum install -y tcpdump

命令基本格式如下

tcpdump -i  -s 65535 -w

例如

tcpdump -i any -s 65535 -w internal.pcap

表示将任意网络接口收到的包保存到internal.pcap文件

 

tcpdump voip调试

开始tcpdump抓包

命令执行后系统会停在这里,这时候我们可以打一个电话,然后使用Ctrl+c结束

tcpdump voip调试

中断tcpdump抓包

tcpdump会输出一些抓包的信息,这样tcpdump的使命就完成了,下载pcap文件,轮到wireshark出场了。

Wireshark

wireshark可以从http://www.wireshark.org/download.html下载,安装完毕后,运行wireshark,打开下载到的internal.pcap文件

wireshark VoIP调试

wireshark中查看VoIP通话

 

这里我们可以看到tcpdump抓到了各式各样的包,使用Telephony下的VoIP Calls,系统会自动归纳总结期间的通话, 便于进一步完成VoIP调试.

wireshark VoIP调试

wireshark中选择要查看的VoIP通话

选取一个通话,点击Flow按钮,wireshark会使用一个图形来表示参与通话的地址,点击相应的步骤,我们可以看到对应的IP包信息

wireshark VoIP调试

wireshark中查看VoIP通话的SIP流程

 

对于包含RTP语音的通话,点击 Player 按钮,我们还可以试着收听通话内容

wireshark VoIP调试

Wireshark 解码VoIP通话中的RTP流

 

对于G711编码的通话,wireshark自带解码器,点击 Play 按钮进行播放。在这个图中我们有三段RTP,我们可以分别收听,合成起来就是一个正常的通话了

wireshark VoIP调试

Wireshark 播放VoIP通话

VoIP带宽计算 语音编码选择

By | VoIP技术, 常见问题解答 | No Comments

什么是语音编码

语音编码就是对模拟的语音信号进行编码,将模拟信号转化成数字信号。当你开始设计一个需要承载语音的网络时,一个最为重要的因素就是容量计划,通俗的说就是该系统想要承载多少路并发通话,以及你想要获取到什么样的语音质量。

这里我们介绍一下VoIP世界中经常使用的语音编码,以及如何计算带宽。

VoIP带宽计算

编码名称比特率(Kbps)MOS值带宽说明
G.71164 Kbps4.187.2 Kbps固话质量
G.7298 Kbps3.9231.2 Kbps国际长途质量
G.723.16.3 Kbps3.921.9 Kbps
G.723.15.3 Kbps3.820.8 Kbps
G.72632 Kbps3.8555.2 Kbps
G.72624 Kbps47.2 Kbps
G.72816 Kbps3.6131.5 Kbps
G72264 Kbps4.1387.2 KbpsHD高清
MOS可以理解为对音质的评分,1分最低5分最高,对于语音通话要求MOS值高于3.3

编码选择

G 711,G711包含两种规格G711.a和G711.u,一般写为alaw和ulaw,能够达到传统的电话线路的质量。

G729,G729编码能够在保证一定通话质量的同时大幅度降低带宽需求,适用于带宽受限的情况。

G722,G722提供了高清音频,但不是所有的电话都支持该编码。

编码转换

当两个系统支持编码使用不同编码时,asterCC能够进行编码转换,例如某些软电话只支持711编码而中继要求使用729编码,这时asterCC会将711压缩为729出局。

录音时asterCC默认会使用711编码,即使电话和中继都支持729编码,开启录音时asterCC仍然会进行编码操作。

编码设置

asterCC系统中可以通过模板或者单独设置某个设备详情来限制该终端使用的编码。一般使用方式为

disallow=all
allow=ulaw,g729

表示该终端使用ulaw和g729编码,两者都支持时,ulaw优先。在系统默认的模板中,所有编码都是开启的:

codec

当我们想限定某个中继使用的编码时,我们可以在相应的详情里进行修改

trunk_detail_codec

索克维尔旗下产品 · CXMind AI联络中心 · WCC全渠道联络中心