1

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

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

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

非常欢迎对上述问题提供任何帮助。
谢谢,
斯里拉姆。

4

3 回答 3

3

我注意到在您对迈克尔回答的评论中,您说您使用的是 C/C++。

您绝对可以使用 C 或 C++(或任何语言)在 Asterisk 中进行文件 I/O。Asterisk 支持四种主要类型的应用程序:

拨号计划:默认的 Asterisk 脚本语言。任何代码extensions.conf都是拨号计划。您可以使用这种语言来控制呼入电话,并做一些事情。对于文件 I/O,拨号计划提供了一个System命令,以及一个AGI命令,它们都允许您运行其他软件(如 bash 脚本、C 二进制文件等等)。然后在您的 bash 脚本、C 程序等中,您可以像在命令行上自己运行程序一样执行普通的文件 I/O。前任:

[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)。

于 2010-12-04T01:52:59.810 回答
2

也许我遗漏了一些东西,但它是否需要比 Asterisk 自己的内置FILE函数更复杂?

例子:

读取文件的全部内容。

Set(foo=${FILE(/tmp/test.txt)})

读取文件的第 3 行。

Set(foo=${FILE(/tmp/test.txt,3,1,l)})

用“cat”替换文件的最后一行

Set(FILE(/tmp/foo.txt,-1,,l)=cat)

用换行符将“dog”附加到文件中

Set(FILE(/tmp/foo.txt,,,al)=dog)

拨号方案示例:

exten => 800,n,Set(FILE(/tmp/cid.txt,,,al)=${CALLERID(num)})
于 2015-11-15T22:15:48.793 回答
0
  1. 你使用 AGI 吗?当然,使用 AGI 你可以读/写文件。

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

于 2010-11-22T11:56:43.533 回答