星号中的普通文件i / o操作

时间:2010-11-22 11:25:44

标签: file-io asterisk

我使用星号来实现语音服务器。我有以下两个问题:

  1. 我希望能够读/写文件以传授一些额外的功能。有没有办法在星号中这样做?我注意到写入输出的正常函数如cout等被抑制了。

  2. 有没有办法调试用星号编写的应用程序?我的意思是类似于星号的gdb?

  3. 欢迎任何有关上述问题的帮助 谢谢,
    斯利拉姆。

3 个答案:

答案 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)

  1. 您使用AGI吗?当然,使用AGI,您可以读/写文件。

  2. 您可以使用-vvvvvvv命令行选项使星号详细。更多v使星号更加详细。对我来说,调试拨号方案就足够了。如果我想调试AGI,那么我使用日志记录到一些日志文件,或者为了简化任务,我使用了伪agi_lib(适用于没有真正AGI的单元测试)。