不管是覆盖率测试还是语音质量测试,我们都需要通过SIP服务器来对全球或者全国各大主要城市的电话发起呼叫。
在本文档中,我们使用的是一款开源的SIP服务器——FreeSWITCH,该服务器内置lua脚本支持,因此我们可以使用lua脚本来自动化发起语音呼叫。
其中具体执行呼叫的方法体如下:
function call( callee )
--呼叫字符串
local callStr = "这里是具体的呼叫字符串"
--呼叫时长限制 单位秒
local timeout = 20
--日志打印呼叫字符串
freeswitch.consoleLog("err",callStr)
--建立会话
local callSession = freeswitch.Session(callStr)
--支持sched_hangup 在指定的时长之后,终止会话
callSession:execute("sched_hangup","+"..timeout.." alloted_timeout")
--会话建立成功或者失败的分支处理
if( callSession:ready() ) then
freeswitch.consoleLog("notice", "call success\n");
callSession:execute("echo");
else
local cause = callSession:hangupCause();
local causeQ850 = callSession:getVariable("hangup_cause_q850") or '';
freeswitch.consoleLog("notice", "call fail,cause:"..cause..",causeQ850:"..causeQ850.."\n");
end
end
上面的方法体使用echo(回声)来对RTP流进行处理,也就是对面说了什么内容,即以同样的内容返回,并且设置了通话20秒后自动挂断,如果呼叫失败则输出相应的失败信息。大家可以根据自己的实际需要,来对脚本进行相应的修改。
在lua脚本中,我们配置需要呼叫的号码,然后采用串行或者并行的方式,来执行呼叫任务。
FreeSWITCH的应用路径下,有一个scripts目录,将lua脚本放置在这个目录下,然后进入FreeSWITCH控制台(fs_cli),输入luarun lua脚本名
,回车即可执行lua脚本。
要对上述的呼叫进行覆盖率以及语音质量方面的分析,我们首先需要获取相关的SIP报文,以及承载音视频内容的RTP(Real-time Transport Protocol,实时传输协议)报文。
使用tcpdump或者wireshark自然是可以进行抓包的,但是将所有的会话报文抓取在一起,并不利于我们对单个会话的分析,而我们的覆盖率以及语音质量都是以会话为基本单位进行的。
我们可以使用pcapsipdump这款开源的抓包软件,此软件以会话为单位进行抓包,单个会话的SIP、RTP报文在一个pcap文件中。(关于pcapsipdump的安装请参考官方文档,本文档不做具体展开)
使用如下命令即会监听eth0网卡,并将pcap文件写在/home/admin/pcap目录下
sudo pcapsipdump -i eth0 -d /home/admin/pcap
有了上述报文,我们就可以获取每一个会话的结束状态,比如正常挂断、未应答、拒接、号码错误、用户繁忙、无权限呼叫、服务端错误等
我们使用tshark(wireshark的命令行版本,安装wireshark后就自带该命令)来分析pcap文件
使用下面的命令,可以查看该会话的所有SIP信息
tshark -Y sip -r pcapFile
# output
# 1 0.000000 198.xxx.xxx.xxx -> 202.xxx.xxx.xxx SIP/SDP 1137 Request: INVITE sip:390115170171@202.xxx.xxx.xxx:5060 |
# 2 0.159216 202.xxx.xxx.xxx -> 198.xxx.xxx.xxx SIP 351 Status: 100 Trying |
# 3 1.774173 202.xxx.xxx.xxx -> 198.xxx.xxx.xxx SIP/SDP 765 Status: 183 Session Progress |
# 4 2.992899 202.xxx.xxx.xxx -> 198.xxx.xxx.xxx SIP/SDP 765 Status: 183 Session Progress |
# 5 8.581402 202.xxx.xxx.xxx -> 198.xxx.xxx.xxx SIP/SDP 776 Status: 200 OK |
# 6 8.582468 198.xxx.xxx.xxx -> 202.xxx.xxx.xxx SIP 458 Request: ACK sip:390115170171@202.xxx.xxx.xxx:5060 |
# 7 15.702624 202.xxx.xxx.xxx -> 198.xxx.xxx.xxx SIP 417 Request: BYE sip:gw+gwName@198.xxx.xxx.xxx:5080;transport=udp;gw=gwName |
# 8 15.703204 198.xxx.xxx.xxx -> 202.xxx.xxx.xxx SIP 477 Status: 200 OK |
而一般情况下,我们只需要获取最终状态即可,可以使用如下命令对内容进行筛选
tshark -Y sip -r pcapFile|grep 'Status'|tail -n 1|awk -F '[:|]' '{print $2}'
# output
# 200 OK
除了获取该会话的最终状态,该会话的呼叫号码也是很重要的一个信息,我们依然可以从SIP信息中筛选中呼叫号码
tshark -Y "sip.Method == INVITE" -r pcapFile|head -n 1|awk -F '[:@+]' '{print $3}'
# output
# 390115170171
有了呼叫号码以及对应的会话最终状态,写一个小程序来分析统计各个国家或者各个省市的呼叫成功率,失败率,失败原因自然不是什么难事。