使用Twilio的中继服务,Asterisk SIP呼叫在2分钟后结束

Mikey A.Leonetti

我有一个托管在DigitalOcean上的Asterisk服务器,使用Twilio的中继服务,在恰好120秒后通话中断。值得注意的是,直接连接的软电话不会掉线。端口5060在防火墙上应有的状态是打开的。

有一个自动值班人员接听电话并将其传递给脚本,但这在不使用sip网络电话挂断电话的情况下可以完全正常工作。我给Twilio发了电子邮件,他们说问题可能是因为Asterisk没有发送180振铃,我可以理解这是因为我没有拨打电话,而是立即应答。

真正切断电话的是什么?

sip.conf

[twilio]
type=peer
secret=secret
username=user
host=host.domain.com
dtmfmode=rfc2833
canreinvite=no
disallow=all
allow=ulaw
insecure=port,invite
fromuser=+15555555555
fromdomain=from-domain.domain.com
context=incoming
deny=0.0.0.0/0
permit=x.x.x.x/32
permit=x.x.x.x/32
permit=x.x.x.x/32
permit=x.x.x.x/32

extensions.ael上下文

+15555555555 => {
        Answer();
        EAGI(tincan.js);
        AGI(agi://127.0.0.1/saytext,"Goodbye.");
        Hangup();
}

开始呼叫数据包捕获

21  4.827782    (Them)  (Us)    SIP/SDP 1341    Request: INVITE sip:[email protected] | 
22  4.831487    (Us)    (Them)  SIP 819 Status: 100 Trying | 
23  4.833205    (Us)    (Them)  SIP/SDP 1112    Status: 200 OK | 

通话结束包捕获

16066   124.821787  (Them)  (Us)    SIP 650 Request: BYE sip:[email protected]:5060 | 
16067   124.822736  (Us)    (Them(  SIP 700 Status: 200 OK |
Mikey A.Leonetti

Twilio报告了此问题,因为我们的服务器没有在较长时间内发送任何RTP数据,因此连接超时。我正在使用的Dialplan运行了一个自定义的EAGI脚本,该脚本将在电话中无限期地记录此人。该过程在另一端超时。

我非常骇人的解决方案如下:

  1. 我没有使用RECORD FILE命令,而是使用GET OPTION命令播放10秒钟的静音,等待井号(#)键。
  2. 我使用EAGI stderr + 1 fd通过脚本手动将音频捕获到文件中。
  3. 我使用STREAM FILE命令将录音回放给用户确认。

反复发送10秒钟的静默时间可防止服务器超时。我可以想象发送1秒钟的静音会完成同样的事情并节省带宽,但是您的里程可能会有所不同。

我的Node.js脚本函数代替了WAIT FOR DIGIT或RECORD FILE函数:

/**
 * Loop playing silence until interrupted
 * @param done =function( timedout ) Callback when the silence has been interrupted
 * @param maxRecordTime Length of time to be able to record max. Leave blank for no timeout.
 * @param stopTime Timestamp when the recording should be stopped
 */
Index.prototype.loopSilenceUntilInterrupted = function( done, maxRecordTime, stopTime ) {
    var that = this;

    // Set the stopTime?
    if( maxRecordTime!==undefined && stopTime===undefined )
        stopTime = Date.now()+maxRecordTime;

    this.context.getOption( "silence/10", "#", 10, function( error, response ) {
        if( response.result==35 )
            done( false ); // We have been diggery
        else if( stopTime!==undefined && Date.now()>=stopTime )
            done( true ); // We have timed out!
        else
            that.loopSilenceUntilInterrupted( done, maxRecordTime, stopTime ); // Do it again
    },
    0 ); // No cooldown
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

2分钟后,Nodejs和Express服务器关闭连接

1-2分钟后,req.user使用password.js清除

如何使用户的点击等待2分钟后再处理?

短时间(1分钟)后,服务被终止

约20分钟后服务器崩溃

GCMNetorkManager PeriodicTask只能使用1分钟,而不能使用2分钟

使用php 1分钟后自动注销

等待响应2分钟后的ajax net :: ERR_EMPTY_RESPONSE-node.js服务器

Azure应用服务:收到2个瞬时错误后,响应尖峰持续5-10分钟

生产几分钟(5分钟)后,Rails 5服务器做出响应

使用时间格式()选择+-2分钟

从请求开始1分钟后REST服务没有响应

运行60分钟后如何关闭Linux服务器?

后台服务java.net.SocketTimeoutException:10分钟后连接失败

5分钟后Apache服务器var / www变得不可用

15-20分钟的空闲时间后,服务器上的RPCS消失

在1分钟后使用Hangfire和Azure Service Bus重试作业

Windows 7:使用组策略在10分钟后禁用锁定工作站

使用RTL8821AE在约5分钟后Wifi掉线

10分钟后使用ssh超时执行远程脚本

使用EOF 10分钟后,smtp.SendMail失败

如何在5分钟的间隔后使用autoit检查文件更新?

笔记本电脑使用超过40分钟后发出短促的蜂鸣声

5分钟后通过使用PHP和FuelPHP框架比较2个日期时间来发送电子邮件

安装SP2后10分钟不使用计算机时,Server 2008将我拒之门外

Twilio SIP 中继和 Sip 域

30分钟后编程开始和结束

使用DATEADD加0分钟

WSO2-AM:发布Web服务需要很长时间(> 3分钟)