Sonar译为声纳,又译声呐,其英文全称为『Sound Navigation And Ranging』,是一种利用声波在水下的传播特性,通过电声转换和信息处理,完成水下探测和通讯任务的电子设备。它有主动式和被动式两种类型,属于声学定位的范畴。 声纳系统的音频从次声波到超音波都有。
mod_sonar
类似于一个真正的声纳。它的工作原理是这样的——首先你在远端启动一个服务器,能将收到的来话信息中的音频原样返回(可以使用FreeSWITCH中的echo
App实现)。然后在本地的FreeSWITCH上产生一些铃音,发送到远端的服务器上再反射回来,然后使用VAD检测功能可以检测这些铃音,从而可以在某种程度上确定网络的质量。
加载该模块后,将会在日志中看到如下的消息:
[NOTICE] switch_loadable_module.c:269 Adding Application ‘sonar'
可见,该模块只实现了一个sonar
App。
为进行测试,我在一台远端的FreeSWITCH服务器上使用如下Dialplan做了一个Echo服务:
<extension name=“public_dialplan_echo">
<condition field="destination_number" expression="^(echo)$">
<action application="answer"/>
<action application="echo"/>
</condition>
</extension>
然后,在笔者的电脑上使用如下的命令进行测试(其中x.x.x.x
为笔者的远端服务器的IP地址):
originate sofia/internal/echo@x.x.x.x:5080 &sonar
日志输出如下:
[DEBUG] switch_ivr_async.c:3087 TONE ping HIT 1/1
[DEBUG] switch_ivr_async.c:3093 TONE ping DETECTED
[NOTICE]`mod_sonar`.c:87 Sonar ping took 379 milliseconds
[NOTICE]`mod_sonar`.c:87 Sonar ping took 140 milliseconds
[NOTICE]`mod_sonar`.c:87 Sonar ping took 380 milliseconds
...
[INFO]`mod_sonar`.c:179 Sonar Ping (in ms):
min:140 max:380 avg:303 sdev:103 mdev:83 sent:5 recv: 5 lost:0 lost/send:0.00%
从日志中可以看出,sonar这个App向远端发送了5次ping请求(实际上发送5次音频数据),然后收到(检测到)5次反射回来的音频,最小时长是140ms,最大是380ms,平均值是303ms,其它的值是均方差等。看起来还算不错。
当然,为了测试更准确一些,也可以给sonar一个参数,表示你想测试的次数,如,下列命令将测试10次:
originate sofia/internal/echo@x.x.x.x:5080 &sonar(10)
下面是笔者用操作系统的ping命令得到的结果,可以看出,操作系统的ping包平均只需要28ms就能走一个来回。
7 packets transmitted, 7 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 16.233/28.495/80.739/21.465 ms