2012-02-09 61 views
0

我正在写一个Asterisk的拨号方案,我需要实现书签功能。如果用户呼入并且呼叫被断开,则在重拨时必须将用户带到与呼叫最后被丢弃或断开的完全相同的剪辑。拨号方案(带书签功能)目前看起来像这样:拨号方案中的书签功能

[some-context] 
exten => 0,n,System(progressmarker.sh ${CALLERID(num)} ${CONTEXT}) 
exten => 0,1,Background(wav1) 
exten => 0,n,Background(wav2) 

有数百个这样的命令。 progressmarker接收上下文并将其放入文件中。当用户想要继续旧会话时,它从用户所处的上一个上下文开始。如果呼叫在wav1wav2之后下降,则用户应从wav1wav2开始,而不是从上一个上下文开始。

有这样的一种方法:

exten => 0,n(wav1),Background(wav1)&System(progressmarker.sh ${CALLERID(num)} ${CONTEXT} wav1) 

但是你可以看到这样不雅和繁琐特别是因为有好几百个这样的命令。有没有更好的方法来实现书签功能?

回答

0

执行此操作的一种方法是使用h扩展名。这是通道遇到挂断时被调用的扩展名。解决方案如下所示:

  1. 继续将优先级保存在全局变量中。
  2. 为每个上下文实现挂断扩展。通道变量(如上次上下文,扩展名和优先级)均可访问(与文档所述相反)。扩展看起来就像这样:

exten => h,1,System(<Execute a script here that saves the last context, extension and priority to a file that can be read later and control returned here.>)