我想通过检查是否可以访问特定对等方来响应来电,并相应地拨打适当的号码。
目前我这样做了:
exten => 1200,1,Answer()
same => n,Set(reachable=${SHELL(asterisk -rx "sip show peers" | grep ^cedrich-phone.*OK)})
same => n,GotoIf($["${LEN(${reachable})}" = "0"]?extoffline)
same => n,Dial(SIP/cedrich-phone,20)
same => n(extoffline),Dial(SIP/another-phone,20,tr)
same => n,Hangup()
Run Code Online (Sandbox Code Playgroud)
你能告诉我这是否可以接受,是否可以通过使用最佳实践来改进?
在来电中执行星号外壳对我来说并不合适。它可能工作正常,但不应该已经知道对等点的状态吗?
我使用SIPPEER()您可以请求对等方状态的功能。如果前 3 个字符 (of OK (44 ms)) 是,OK则您可以调用对等方。您可以转发给另一个对等方的所有其他情况。
我做这样的事情:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Run Code Online (Sandbox Code Playgroud)
这会在我们前往之前检查状态Dial(),n(forward)如果对等方不可用、忙碌或其他不正常,则前往。
然而,这有一个小问题。当对等方拒绝呼叫(或由于其他原因不可用,例如他在我们下一次在线检查之前上线)时,呼叫不会接通。
DIALSTATUS我们可以在 之后使用一个函数Dial()来检查呼叫是否成功应答。所以在之后使用Dial()它,如果没有回答也做转发。(它在我做过的测试中起作用。拒绝BUSY在日志中给出的呼叫并转到下一个对等点)
你会得到这样的东西:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Log(NOTICE,Dial status: ${DIALSTATUS})
exten => _202,n,GotoIf($["${DIALSTATUS)}"="ANSWER"]?ok2:forward)
exten => _202,n(ok2),Log(NOTICE,Successfull call)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Run Code Online (Sandbox Code Playgroud)
我没有对最后一点(用DIALSTATUS)进行广泛的测试,所以你应该做一些测试,但在这里它似乎有效。