2012-11-30 23 views
3

我在C中有一個遺留的Asterisk應用程序,它使用MySQL進行用戶身份驗證,路由和計費。我將它保留在Asterisk 1.4.21中,因爲沒有任何CDR數據在新版本的Asterisk中返回。chan-> cdr從Asterisk升級後沒有數據1.4.21

1.4.22 https://issues.asterisk.org/jira/browse/ASTERISK-13064顯然已經發生了一些變化,這些變化徹底改變了CDR-s的處理方式。不幸的是,沒有提供有關如何正確遷移現有代碼的有用信息。

它們改變了執行順序,調用'h'擴展名並重置CDR數據。

我的代碼:

 

ast_log(LOG_NOTICE,"Dialing string: '%s'\n", dialstr); 

app = pbx_findapp("Dial"); 
if (app) 
     res = pbx_exec(chan, app, dialstr); 

ast_log(LOG_NOTICE,"Return from pbx_exec '%i', Disposition: '%s'\n", res, ast_cdr_disp2str(chan->cdr->disposition)); 

代碼手柄chan-> CDR-> billsec等的其他部分,但它總是給0值。

一個成功的電話後,我總是得到這個日誌從CLI:

Return from pbx_exec '-1', Disposition: 'NO ANSWER'
而相同的代碼工作於1.4.21

一個解決方案,我聽到罰款撥號前使用ast_reset(),但我不知道怎麼樣執行它。 如何適應此應用程序的任何幫助?

回答

2

您可以獲取DIALSTATUS變量,這對於您的應用程序來說已經足夠了,並且將在未來的版本中得到支持。

pbx_builtin_getvar_helper(chan, "DIALSTATUS"); 
+0

謝謝arheops!我在這裏失去了希望! DIALSTATUS實際上完成了呼叫處理的工作,但我有興趣從Dial()返回後獲得CDR,這就是C處理的其他3000行...... 關於此事的任何想法?我知道我可以使用'撥號'和'g'選項來改變呼叫流程,在星號調用'h'擴展名之前返回代碼並獲取CDR詳細信息(billsec最重要)。但我能相信嗎?有沒有更乾淨的方法來做到這一點? –

+0

我推薦你使用「傳統」方式。你總是可以問變量CDR(billsec)或ANSWEREDTIME。我不認爲你可以使用低級魔法來使用變量。 – arheops

相關問題