我有自己的数据库来记录 astreisk 中的调用。我需要将每次通话的通话时长插入表中。我怎样才能做到这一点?我可以在我的拨号方案中这样做吗?
1 回答
您没有提供太多关于您想使用什么数据库后端的信息,以及您是否在询问如何编写自己的通话持续时间或如何配置星号来编写相关的 cdr。
所以,一般来说,你有 3 种可能的选择(见下文)。对于选项2和3,您必须自己打开与数据库的连接,编写插入/更新所需行、处理错误等所需的查询。而对于选项1,您只需要配置星号即可工作。
1) 默认情况下,Asterisk 可以通过将每次调用的 CDR(调用详细记录)写入后端来自行执行此操作。这个后端通过cdr_odbc模块可以是csv、mysql、pgsql、sqlite等数据库。您必须配置您的cdr.conf(并且取决于您选择的后端,cdr_mysql.conf、cdr_odbc.conf、cdr_pgsql.conf以及您的后端信息,如凭据、表名等)。
CDR 将默认写入一些内容,即 CDR 变量(取自预定义的星号变量列表)
如果通道有 cdr,则该 cdr 记录有它自己的一组变量,可以像通道变量一样访问这些变量。以下内置变量可用,除非指定,否则为只读变量。
在这一点上,你感兴趣的是:
${CDR(duration)} Duration of the call.
${CDR(billsec)} Duration of the call once it was answered.
${CDR(disposition)} ANSWERED, NO ANSWER, BUSY
当 disposition 为 ANSWER 时,billsec将包含计费秒数(呼叫的总“应答时间”),duration 将保存呼叫的总时间,包括未计费时间。
2) 另一方面,如果您不是询问 cdr,而是想自己编写通话持续时间,您可以使用AGI脚本,在发出dial()后读取CDR(billsec)变量,或者ANSWREDTIME (由Dial ()命令设置):
${DIALEDTIME} * Time for the call (seconds)
${ANSWEREDTIME} * Time from dial to answer (seconds)
3) 您还可以通过让AMI客户端监听变量 ANSWEREDTIME 的事件 VarSet 来实现相同的结果。有问题的事件将包含已设置此变量的通道。
因此,如果您已经有一个 AGI 脚本或您自己的控制/处理调用的 AMI 客户端,那么选项 2 和 3 显然更有用,而选项 1 更通用但可能稍微不那么灵活。
希望能帮助到你!