在 Linux 上运行的命令行 Perl 应用程序中,我需要拨打电话 (SIP),播放音频文件,然后等待并接收来自被叫方的 DTMF 输入。
我无法运行任何 GUI 应用程序,因此大多数 Linux SIP 客户端都被淘汰出局。
目前我正在使用 pjsua,不幸的是,这有一些我想避免的问题。
实现这一目标的最佳方法是什么?
是否有任何适用于 Linux 的完全可编写脚本的命令行 SIP 客户端?有没有可以使用的健全的图书馆?
在 Linux 上运行的命令行 Perl 应用程序中,我需要拨打电话 (SIP),播放音频文件,然后等待并接收来自被叫方的 DTMF 输入。
我无法运行任何 GUI 应用程序,因此大多数 Linux SIP 客户端都被淘汰出局。
目前我正在使用 pjsua,不幸的是,这有一些我想避免的问题。
实现这一目标的最佳方法是什么?
是否有任何适用于 Linux 的完全可编写脚本的命令行 SIP 客户端?有没有可以使用的健全的图书馆?
尽量不要在 Perl 中实现您自己的 SIP 客户端。这将是一个 PITA 和浪费时间,因为那里有现成的实现。
例如,您可以为此使用Asterisk。凭借其脚本功能,它非常灵活。它有一个很棒的社区并且有很好的文档记录——你可以在网上找到很多例子。
与 Asterisk 相媲美的其他解决方案是Yate和FreeSwitch。
在 Asterisk 中,你基本上会:
拨号方案脚本示例:
[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
大约一年前,我研究过使用可用的 CPAN 模块来实现类似的 SIP 客户端。
但是最后我决定使用SIPp。它并不完全直观(我花了很多时间在 Wireshark 中调试调用流),但最终它完成了我需要做的所有事情,甚至更多。
我强烈推荐 FreeSWITCH。它实际上带有一个 Perl API,因此您可以从您的 Perl 程序与 FreeSWITCH 服务器通信并发起呼叫、发送/接收 DTMF、播放音频文件等。
例如,还有一种方法可以让 FreeSWITCH 在来电时调用您的 Perl 程序。