我正在使用星号来实现语音服务器。我有以下两个问题:
我希望能够读/写文件以赋予一些额外的功能。有没有办法在星号中这样做?我注意到用于写入输出的正常功能(例如 cout 等)被抑制了。
有没有办法调试用星号编写的应用程序?我的意思是像星号的gdb?
非常欢迎对上述问题提供任何帮助。
谢谢,
斯里拉姆。
我注意到在您对迈克尔回答的评论中,您说您使用的是 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)。
也许我遗漏了一些东西,但它是否需要比 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)})
你使用 AGI 吗?当然,使用 AGI 你可以读/写文件。
您可以使用-vvvvvvv
命令行选项使星号变得详细。更多v
使星号更详细。对我来说,调试拨号方案就足够了。如果我想调试 AGI,那么我会使用日志记录到某个日志文件,或者对于更简单的任务,我会使用假 agi_lib(适用于没有真正 AGI 的单元测试)。