我使用星号来实现语音服务器。我有以下两个问题:
我希望能够读/写文件以传授一些额外的功能。有没有办法在星号中这样做?我注意到写入输出的正常函数如cout等被抑制了。
有没有办法调试用星号编写的应用程序?我的意思是类似于星号的gdb?
欢迎任何有关上述问题的帮助
谢谢,
斯利拉姆。
答案 0 :(得分:3)
我注意到,在你对迈克尔答案的评论中,你说你使用的是C / C ++。
你绝对可以使用C或C ++(或任何语言)在Asterisk中进行文件I / O. Asterisk支持四种主要类型的应用程序:
拨号计划:默认的Asterisk脚本语言。 extensions.conf
中的任何代码都是拨号计划。您可以使用此语言来控制入站呼叫,并执行操作。对于文件I / O,拨号计划提供System
命令,以及AGI
命令,它们都允许您运行其他软件(如bash脚本,C二进制文件,真正的任何东西)。然后在您的bash脚本,C程序等中,您可以像在自己的命令行上运行程序一样执行普通的文件I / O. EX:
[some_context]
exten => s,1,System(/bin/echo "hello, world" >> /tmp/test.txt)
exten => s,n,Return()
[launch_an_agi]
exten => s,1,AGI(/var/lib/asterisk/agi-bin/my_c_program,optional_cmd_line_arguments,to,pass)
exten => s,n,Hangup()
AGI:Asterisk AGI(从拨号计划代码启动)允许您运行外部程序(C程序或其他),并向您的C程序传递一些有关当前正在处理的调用的Asterisk变量,您的程序可以使用。您可以在此处使用常规编码工具来执行您想要的任何文件I / O,例如:
/* some_c_agi_program */
include <stdio.h>
int main(void) {
FILE *f = fopen("/tmp/test.txt", "w");
(void)fprintf(f, "MY FILE IO WORKS! THANKS STACKOVERFLOW!\n");
fclose(f);
return 0;
}
AMI:AMI是Asterisk提供的网络API。您可以使用它来编写在另一台服务器上运行的程序,这些程序可以创建,控制和显示Asterisk服务器上的调用状态。想法是通过TCP套接字连接到程序中的星号服务器,然后发送命令并回读响应。我不会展示一个例子,因为它将是C中的一个巨大的程序。但是你明白了。
现在,进行调试!
根据您编写的应用程序类型,有多种方法可供调试。如果您熟悉单元测试的概念,则可以编写单元测试,并确保它们针对我将要描述的任何方法运行。对于通用调试(如果您正在编写AGI或AMI程序),可以使用普通的C调试器(GDB)。
答案 1 :(得分:2)
也许我错过了一些东西,但它是否需要比Asterisk自己的内置FILE功能更复杂?
读取文件的全部内容。
Set(foo=${FILE(/tmp/test.txt,3,1,l)})
读取文件的第3行。
Set(FILE(/tmp/foo.txt,-1,,l)=cat)
用&#34; cat&#34;
替换文件的最后一行Set(FILE(/tmp/foo.txt,,,al)=dog)
追加&#34;狗&#34;到换行符的文件
exten => 800,n,Set(FILE(/tmp/cid.txt,,,al)=${CALLERID(num)})
拨号方案示例:
if (Meteor.isClient) {
dataReadyHold = LaunchScreen.hold();
Router.onBeforeAction('loading');
Router.onBeforeAction('dataNotFound');
}
答案 2 :(得分:0)
您使用AGI吗?当然,使用AGI,您可以读/写文件。
您可以使用-vvvvvvv
命令行选项使星号详细。更多v
使星号更加详细。对我来说,调试拨号方案就足够了。如果我想调试AGI,那么我使用日志记录到一些日志文件,或者为了简化任务,我使用了伪agi_lib(适用于没有真正AGI的单元测试)。