如何从Perl进行SIP调用并接收DTMF输入?

时间:2012-05-02 06:04:11

标签: linux perl monitoring sip

在Linux上运行的命令行Perl应用程序中,我需要拨打电话(SIP),播放音频文件,然后等待并接收来自被叫方的DTMF输入。

我无法运行任何GUI应用程序,因此大多数Linux SIP客户端都不在竞争中。

目前我正在使用pjsua,不幸的是,这有一些我想避免的问题。

实现这一目标的最佳方式是什么?

是否有适用于Linux的完全可编写脚本的命令行SIP客户端? 有没有可以使用的理智的图书馆?

3 个答案:

答案 0 :(得分:1)

尽量不要在Perl中实现自己的SIP客户端。这将是一个PITA并浪费时间,因为那里有现成的实现。

例如,您可以使用Asterisk。凭借其脚本功能,它非常灵活。它有一个很棒的社区,并且有很好的文档记录 - 你可以在网上找到很多例子。

与Asterisk相比的其他解决方案是YateFreeSwitch

在Asterisk中,你基本上可以:

  1. 通过将call file放在假脱机目录中来启动呼叫。
  2. 将新的拨出电话连接到特殊的“扩展名”(基本上是一个脚本块):
  3. 示例拨号脚本:

    [specialstuff]
    exten => s,1,Wait(1)                  ; wait a second before playback
    exten => s,2,Playback(yourfile.wav)   ; play your file
    exten => s,3,AGI(yourscript.pl)       ; run your script with AGI interface
           ; in "yourscript.pl" you can wait for / receive DTMF and react on it
    

    或者,您可以在Asterisk中完全实现DTMF。这称为IVR(交互式语音响应)。网上有很多例子。

    [specialstuff]
    exten => s,1,Wait(1)                  ; wait a second before playback
    exten => s,2,Playback(yourfile.wav)   ; play your file
    exten => s,3,WaitExten(10)            ; wait 10 seconds for DTMF input
    
    exten => 1,1,System(/your/script.pl one)   ; callee pressed DTMF 1
    exten => 1,2,Playback(thanks)              ; give feedback
    
    exten => 2,1,System(/your/script.pl two)   ; callee pressed DTMF 2
    exten => 2,2,Playback(goodbye)             ; give feedback
    
    exten => 3,1,System(/your/script.pl three) ; callee pressed DTMF 3
    exten => 3,2,Playback(something)           ; give feedback
    

答案 1 :(得分:1)

大约一年前,我看过使用可用的CPAN模块实现这样的SIP客户端。

但最后我决定使用SIPp。它不是完全直观的(我花了很多时间在Wireshark中调试调用流程)但最终它完成了我需要做的所有事情以及更多。

答案 2 :(得分:1)

我强烈推荐FreeSWITCH。它实际上带有Perl API,因此您可以从Perl程序与FreeSWITCH服务器通信并发起呼叫,发送/接收DTMF,播放音频文件等。

例如,还有一种方法可以让FreeSWITCH在拨打电话时拨打您的Perl程序。