广告 《大道至简,给所有人看的编程课》 🔥

《FreeSWITCH参考手册》

1.21 mod_sonar

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


本书版权所有 © 杜金房及各位贡献者 2016-2023,仅供在线阅读,谢绝一切形式转载。 本书还在写作中,持续更新。 如果你也想写上几句,欢迎加入我们。 | 返回首页 |