如何将Asterisk呼叫的呼叫持续时间插入到我自己的数据库中?

时间:2012-06-24 10:32:39

标签: asterisk

我有自己的数据库来记录星号中的调用。我需要将每个调用的呼叫持续时间插入表中。我怎样才能做到这一点?我可以在拨号方案中这样做吗?

1 个答案:

答案 0 :(得分:7)

您没有提供有关您想要使用的db后端的更多信息,以及您是否询问如何自己编写呼叫持续时间或如何配置星号来编写有问题的cdr。

所以,一般说,你有3种可能的选择(见下文)。对于选项 2 3 ,您必须自己打开与数据库的连接,编写插入/更新所需行,处理错误等所需的查询。对于选项 1 ,您只需配置星号即可完成工作。

1)Asterisk可以通过将每次调用的CDR(呼叫详细记录)写入后端来默认执行此操作。此后端可以是csvmysqlpgsqlsqlite以及cdr_odbc模块中的其他数据库。您必须配置 cdr.conf (并根据您选择的后端, cdr_mysql.conf cdr_odbc.conf cdr_pgsql .conf 包含您的后端信息,如凭据,表名等)。

CDR将默认写入一些内容,即CDR变量(取自the predefined asterisk variable list

  

如果频道有cdr,那个cdr记录有自己的一套   可以像通道变量一样访问的变量。该   以下内置变量可用,除非另有说明,   只读的。

此时你感兴趣的是:

${CDR(duration)}     Duration of the call.
${CDR(billsec)}  Duration of the call once it was answered.
${CDR(disposition)}  ANSWERED, NO ANSWER, BUSY

当处置是答案时, billsec 将包含要计费的秒数(通话的总“回答时间”),持续时间将包含通话的总时间,包括非收费时间。

2)另一方面,如果你不是在询问cdr,而是想自己写一个通话时间,那么你可以在发出AGI之后有一个dial()脚本,读取 CDR(billsec)变量,或 ANSWEREDTIME (由Dial()命令设置):

${DIALEDTIME} * Time for the call (seconds)
${ANSWEREDTIME} * Time from dial to answer (seconds)

3)通过让AMI客户端监听变量 ANSWEREDTIME 的事件 VarSet ,您也可以获得相同的结果。有问题的事件将包含已为其设置此变量的频道。

因此,如果您已经拥有自己的控制/处理呼叫的AGI脚本或AMI客户端,则选项2和3显然更有用,而选项1更通用但可能稍微不灵活。

希望它有所帮助!