问题描述
我需要在发生以下事件时执行 AGI 脚本:
- 来电(很简单,只需调用
AGI()
函数)。 - 呼叫“正在响铃”时(我不知道!)。
<-- Problem,how to do this?
- 当电话被“接听”时(我使用
U(answer^${CALLID})
中的Dial()
选项)。 - 当电话挂断时(我使用
h
特殊分机)。
我的拨号方案如下所示:
[from_origin]
exten => _X.,1,NoOp(${CALLER_USERNAME} from ${CHANNEL(pjsip,remote_addr)})
same => n,AGI(agi://127.0.0.1/incoming)
same => n,Dial(${DIALSTR},45,U(answer^${CALLID}))
exten => h,AGI(agi://127.0.0.1/hangup,${CDR(uniqueid)})
[answer]
exten => s,Set(theCallID=${ARG1})
same => n,AGI(agi://127.0.0.1/answered)
same => n,Return()
看,我调用了 3
fast-agi
脚本:incoming
、answered
和 hangup
。现在我需要在被叫方“振铃”时调用类似 ringing
的脚本。如何实现这一目标?
解决方法
振铃状态是频道的状态(chan_pjsip.so),它没有发送到频道外代码。
所以不,您无法在 Dial 应用程序中获取它。因为某些频道类型无法获取它,而 Dial 仍然适用于这些类型。
对于某些频道,您可以在 NewState 事件的事件侦听循环中通过 AMI 获取它。但是没有保证它会在您收到响铃 sip 消息的同一时间。
https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+ManagerEvent_Newstate