【问题标题】:chan->cdr no data after upgrade from Asterisk 1.4.21从 Asterisk 1.4.21 升级后 chan->cdr 没有数据
【发布时间】:2012-11-30 11:02:12
【问题描述】:

我有一个旧的 C 语言 Asterisk 应用程序,它使用 MySQL 进行用户身份验证、路由和计费。我将它保留在 Asterisk 1.4.21 中,因为在较新版本的 Asterisk 中没有返回任何 CDR 数据。

显然,在 1.4.22 https://issues.asterisk.org/jira/browse/ASTERISK-13064 中有一些更改完全改变了 CDR-s 的处理方式。遗憾的是,没有提供有关如何正确迁移现有代码的有用信息。

他们改变了执行顺序,调用了'h'扩展并重置了CDR数据。

我的代码:

ast_log(LOG_NOTICE,"拨号字符串:'%s'\n", dialstr); app = pbx_findapp("拨号"); 如果(应用程序) res = pbx_exec(chan, app, dialstr); ast_log(LOG_NOTICE,"从 pbx_exec '%i'返回, 处置: '%s'\n", res, ast_cdr_disp2str(chan->cdr->disposition));

代码的其他部分处理 chan->cdr->billsec 等,但它总是给出 0 值。

成功调用后,我总是从 CLI 获取此日志:

从 pbx_exec '-1' 返回,处置:'NO ANSWER'
而相同的代码在 1.4.21 上工作正常

我听说的一个解决方案是在 Dial 之前使用 ast_reset() ,但我不确定如何实现它。 有关如何调整此应用程序的任何帮助?

【问题讨论】:

    标签: c migration asterisk billing cdr


    【解决方案1】:

    您可以只获取 DIALSTATUS 变量,这对您的应用程序来说已经足够了,并且将在未来的版本中得到支持。

    pbx_builtin_getvar_helper(chan, "DIALSTATUS");
    

    【讨论】:

    • 谢谢arheops!我对此失去了希望! DIALSTATUS 实际上完成了获得呼叫处置的工作,但我有兴趣在从 Dial() 返回后获得 CDR,这就是 C 的其他 3000 行所处理的......关于这个问题的任何想法?我知道我可以使用“Dial”和“g”选项更改呼叫流程,在星号调用“h”扩展之前返回代码并获取 CDR 详细信息(最重要的是 billsec)。但我能相信吗?有没有更清洁的方法来做到这一点?
    • 我建议您使用“传统”方式。您总是可以询问变量 CDR(billsec) 或 ANSWEREDTIME。我认为你没有对可以使用变量的东西使用低级魔法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多