我现在遇到的一个问题是,如果我连续多次呼叫星号服务器使用同一部手机,可能会断开连接。Asterisk 会记录以下消息:
[Aug 14 10:24:56] NOTICE[20537]: chan_sip.c:19477 handle_request_invite: Failed to authenticate device <sip:[email protected]:5070>;tag=781ab8fb-co19342-INS016
就像世界上任何一部电话只能拨打一次 Aterisk 服务器。然后我需要做一个
> sip reload
从 Asterisk 终端让他们再次呼入。
我也可以像这样执行 shell 命令来重新加载 sip
星号-rx‘sip重新加载’
但是当我将此命令添加到 crontab 中每分钟运行一次时,它不起作用。只有我手动运行它,shell 命令才有效。
有人能告诉我如何让呼叫者多次呼叫我的星号服务器吗?这是我的 sip.conf 和 extensions.conf(所有其他文件均未动)。
配置文件
[general]
register => mysipuser:mysippass@localhost:5071
context=default
[mysipuser]
type=friend
secret=mysippass
username=mysipuser
host=111.111.111.111
port=5071
fromuser=mysipuser
canreinvite=no
insecure=very
qualify=2000
dtmfmode=inband
nat=no
context=default
扩展配置文件
[default]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(vm-extension)
exten => s,n,WaitExten()
exten => 0011,1,Goto(outbound,s,1)
exten => 11,1,Dial(SIP/mysipuser/5555555555) ;calls 555-555-5555
exten => 11,n,Hangup ; this line never gets executed
exten => 77,1,Dial(SIP/mysipuser/1111111111) ;calls 111-111-1111
exten => 77,n,Hangup ; this line never gets executed
[outbound]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(vm-extension)
exten => s,n,WaitExten()
exten => _NXXNXXNXXX,1,Dial(SIP/mysipuser/${EXTEN})
exten => _NXXNXXNXXX,n,Hangup
额外细节 我注意到,每次我在 extensions.conf 中执行 Dial() 命令时,即使双方都挂断电话,它后面的任何一行都不会被触发。例如:
exten => 11,1,Dial(SIP/mysipuser/5555555555)
exten => 11,n,System(echo 'hello world'>test.txt) ; this line and any line below do not fire
exten => 11,n,Hangup
代码在 Dial() 命令之后停止执行...这也许可以解释为什么我不能连续呼叫...是因为线路仍然处于活动状态?
答案1
这是我的新 extensions.conf,它似乎已经解决了这个问题
[default]
exten => s,1,System(asterisk -rx 'sip reload') ; hack to force sip reload
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(vm-extension)
exten => s,n,WaitExten()
exten => 0011,1,Goto(outbound,s,1)
exten => 11,1,Dial(SIP/mysipuser/5555555555,30,g) ;calls 555-555-5555
exten => 11,n,Goto(closechannel,s,1)
exten => 77,1,Dial(SIP/mysipuser/1111111111,30,g) ;calls 111-111-1111
exten => 77,n,Goto(closechannel,s,1)
[outbound]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(vm-extension)
exten => s,n,WaitExten()
exten => _NXXNXXNXXX,1,Dial(SIP/mysipuser/${EXTEN})
exten => _NXXNXXNXXX,n,Hangup
[closechannel]
exten => s,1,System(asterisk -rx 'sip reload')
exten => s,n,Hangup()
因此,我所做的三项更改是添加了语句exten => s,1,System(asterisk -rx 'sip reload')
、[closechannel]
上下文和,30,g
Dial() 命令。每次有人尝试呼叫时,System 命令都会强制重新加载 sip。该,g
标志告诉 asterisk 在呼叫方断开连接后继续执行代码。
这似乎在“大多数”时候都有效。