我有自己的数据库来记录 astreisk 中的调用。我需要将每次调用的调用持续时间插入到表中。我该怎么做?我可以在我的拨号计划中执行此操作吗?
您没有提供有关要使用的数据库后端的太多信息,以及您是否询问如何为自己编写调用持续时间或如何配置星号来编写有问题的 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
当处置为 ANSWER 时,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 更通用,但灵活性可能稍差。
希望对您有所帮助!