2

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

我无法运行任何 GUI 应用程序,因此大多数 Linux SIP 客户端都被淘汰出局。

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

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

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

4

3 回答 3

1

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

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

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

在 Asterisk 中,你基本上会:

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

拨号方案脚本示例:

[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
于 2012-05-02T07:25:43.597 回答
1

大约一年前,我研究过使用可用的 CPAN 模块来实现类似的 SIP 客户端。

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

于 2012-05-02T08:12:57.467 回答
1

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

例如,还有一种方法可以让 FreeSWITCH 在来电时调用您的 Perl 程序。

于 2012-06-16T20:20:13.847 回答