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

《FreeSWITCH案例大全》

1.2 leg_timeout是怎么工作的?

Seven

FreeSWITCH呼叫字符串可以用“|”隔开实现顺振,并可以通过leg_timeout控制第一路由的超时时间,如:

freeswitch> originate [leg_timeout=20]sofia/gateway/gw1/$dest_number|sofia/gateway/gw2/$dest_number

那这个20秒超时跟什么有关呢?我们做了一个实验:

1.2.1 对方不返回100 Trying

freeswitch> bgapi originate [leg_timeout=20]sofia/internal/test@192.168.7.7|sofia/internal/test@sipsip.cn &echo

# 执行结果
send 1397 bytes to udp/[192.168.7.7]:5060 at 13:30:44.174430:
   INVITE sip:test@192.168.7.7 SIP/2.0

send 1393 bytes to udp/[121.40.231.235]:5080 at 13:31:05.038922:
   INVITE sip:test@sipsip.cn SIP/2.0

其中,我们让超时时长为20秒,并且192.168.7.7是一个不通的IP地址,因此,第一个INVITE不会有任何响应,FreeSWITCH发送第二个INVITE的时间大约是20秒后。

1.2.2 返回100 Trying,但不返回180

为了能让对方返回100 Trying但不返回180,可以在对端FS上构造如下路由:

<extension name="test">
   <condition field="destination_number" expression="^sleep(.*)$">
      <action application="sleep" data="$1"/>
   </condition>
</extension>

接下来我们呼叫对端的FS 192.168.7.6,对端会sleep 30秒后再返回:

freeswitch> bgapi originate [leg_timeout=20]sofia/internal/sleep30000@192.168.7.6|sofia/internal/test@sipsip.cn &echo

# 执行结果
send 1439 bytes to udp/[192.168.7.6] at 13:42:41.362829:
   INVITE sip:sleep30000@192.168.7.6 SIP/2.0

recv 400 bytes from udp/[192.168.7.6] at 13:42:41.363968:
   SIP/2.0 100 Trying

send 388 bytes to udp/[192.168.7.6] at 13:43:02.020060:
   CANCEL sip:sleep30000@192.168.7.6 SIP/2.0

send 1393 bytes to udp/[121.40.231.235]:5080 at 13:43:02.040098:
   INVITE sip:test@sipsip.cn SIP/2.0

可以看出,FreeSWITCH在20秒后发了CANCEL终止了请求,并向第二个服务器sipsip.cn发起请求。

1.2.3 让对端返回180,然后30s内不返回任何其它消息

把们把对端的Dialplan修改如下:

<action application="ring_ready" data=""/>
<action application="sleep" data="$1"/>
send 1719 bytes to udp/[192.168.7.6] at 13:52:27.392158:
   INVITE sip:sleep30000@192.168.7.6 SIP/2.0

recv 400 bytes from udp/[192.168.7.6] at 13:52:27.395370:
   SIP/2.0 100 Trying

recv 1035 bytes from udp/[192.168.7.6] at 13:52:27.426464:
   SIP/2.0 180 Ringing

send 388 bytes to udp/[192.168.7.6] at 13:52:48.018667:
   CANCEL sip:sleep30000@192.168.7.6 SIP/2.0

send 1393 bytes to udp/[121.40.231.235]:5080 at 13:52:48.109543:
   INVITE sip:test@sipsip.cn SIP/2.0

可见,FreeSWITCH即使收到了180,也会在20秒后发送CANCEL。

FreeSWITCH只会在收到183(SDP)或200后才认为呼叫成功,不再尝试第二路由。读者可以自行尝试一下。



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