2013-11-25 27 views
0

問題的實質。當設備busy.For例如重試不Datacard集團工作,如果2個調用文件立即開始只一會工夫,第二個屬於錯誤,不再試圖撥打:重試不適用於Datacard

[Nov 25 12:47:35] NOTICE[5801] pbx_spool.c: Call failed to go through, reason (0) Call Failure (not BUSY, and not NO_ANSWER, maybe 
Circuit busy or down?) 

這怎麼看起來通話記錄:

12:47:27 [74c414f9-b5b9-4c83-9ebd-79c7e417ca79]:{Type:1,Number:0038050xxxxxxx,Secret:xxx,Service:1} 
12:47:35 [27a262f5-70dc-42bf-b023-0878712ac6cb]:{Type:1,Number:0038050yyyyyyy,Secret:xxx,Service:1} 
12:47:49 [74c414f9-b5b9-4c83-9ebd-79c7e417ca79]: Call to +38050xxxxxxx ended with status OK. 

這裏是我的電話文件:

#! /usr/bin/bash 
CALL_SPOOL_DIR="/var/spool/asterisk/outgoing/" 
CALL="/var/spool/asterisk/tmp/alarm-iax.call" 


echo "Channel: Datacard/datacard0/$1">$CALL 
echo "CallerId: 666">>$CALL 
echo "MaxRetries: 10" >>$CALL 
echo "RetryTime: 45">>$CALL 
echo "WaitTime: 30">>$CALL 
echo "Context: monitoring-alarm">>$CALL 
echo "Extension: s">>$CALL 
echo "Priority: 1">>$CALL 
echo "Setvar: STATUS=$2">>$CALL 
echo "Setvar: SERVICE=$3">>$CALL 
echo "Setvar: NUM=$1">>$CALL 
echo "Setvar: UID=$4">>$CALL 
mv $CALL $CALL_SPOOL_DIR 

擴展

[monitoring-alarm] 
exten = s,1,Wait(0.5) 
exten = s,2,Set(VOLUME(TX)=-5) 
exten = s,3,Playback(${STATUS}) 
exten = s,4,Playback(ru_service) 
exten = s,5,Playback(${SERVICE}) 
exten = s,6,Hangup 
exten = h,1,System(echo ${STRFTIME(${EPOCH},"GMT-2","%a, %d %b %Y %H:%M:%S %z")}[${UID}]: Call to ${NUM} ended with status OK. >> 
/var/log/informer.log) 

回答

1

通過當地渠道嘗試:

更改呼叫文件

Channel: Local/[email protected]/n 
Set: datacardchan=datacard0 

加入的extensions.conf

[datacard] 
exten => _X.,1,Dial(Datacard/${datacardchan}/${EXTEN},,); dial 
exten => _X.,n,Dumpchan; to see variables. remove in production 
exten => _X.,n,Congestion; send congestion to pbx_spool 
+0

謝謝您的回答。 我不知道,我理解的語法正確,但我做了一切就像在你的答案,並得到: 通知[12958] chan_local.c:沒有這樣的擴展/上下文+ 38050xxx @ datacard呼叫本地頻道 通知[12958] channel.c:無法調用通道本地/ + 38050xxx @ datacard/n 通知[12958] pbx_spool.c:呼叫未通過,原因(0)呼叫失敗(不是BUSY,而不是NO_ANSWER,可能是Circui t忙碌還是宕機?) 通知[12958] pbx_spool.c:排隊呼叫本地/ + 38050xxx @ datacard/n 0嘗試後未完成過期 –

+0

替換_X。與_ + X。在上下文中。 – arheops

+0

現在它實際上打電話,但情況仍然相同 - 只有一個電話(第一個)。 警告[6629] channel.c:[datacard0]請求呼叫此時無法撥打電話的設備 警告[6629] app_dial.c:無法創建類型爲'Datacard'的頻道(原因44 - 請求的頻道不是可用 e) 通知[6628] pbx_spool.c:呼叫未能通過,原因(8)擁塞(電路繁忙) 通知[6628] pbx_spool.c:排隊呼叫本地/ + 38050xxx @ datacard/n過期無0嘗試後完成 點 通知[6622] pbx_spool.c:完成本地/ + 38050yyy @ datacard/n –

0

Arheops強迫我做了一些研究。爲此設計出新一代:

處理與Datacard集團重試,你應該基於一個瞬間調用公式最大數量設置呼叫文件WAITTIME值 * 2 *(播放時長 + 重試之間的延遲) 。在我的情況下,它的4-5個電話每個+ 20秒約10秒= 2 * 150 200-300秒就足夠了。如果你錯過了,當WaitTime熄滅時,你會得到DIALSTATUS == CANCEL或DIALSTATUS == CHANUNAVAIL。

[datacard] 
exten=_+X.,1,Set(ERROR_LOOP=0) 
exten=_+X.,n(call),Dial(Datacard/${datacardchan}/${EXTEN},,M(alert^${STATUS}^${SERVICE})) 
exten=_+X.,n(case1),GotoIf($[${HANGUPCAUSE} = 44]?error:case2) 
exten=_+X.,n(case2),GotoIf($[${HANGUPCAUSE} = 17]?error:end) 
exten=_+X.,n(error),System(echo ${STRFTIME(${EPOCH},"GMT-2","%a, %d %b %Y %H:%M:%S %z")}[${UID}]: Datacard is unavailable now. HANGUPCAUSE = ${HANGUPCAUSE}. ERROR_LOOP stage = ${ERROR_LOOP}. >> /var/log/informer-test.log) 
exten=_+X.,n,Set(ERROR_LOOP=$[${ERROR_LOOP} + 1]) 
exten=_+X.,n,Wait(20) 
exten=_+X.,n,GotoIf($[${ERROR_LOOP} <= 5]?call) 
exten=_+X.,n,GotoIf($[${DIALSTATUS} = CANCEL]?retry) 
exten=_+X.,n(end),Hangup 
exten=_+X.,n(retry),Hangup(21) 
exten=h,1,System(echo ${STRFTIME(${EPOCH},"GMT-2","%a, %d %b %Y %H:%M:%S %z")}[${UID}]: Calling process to ${NUM} ended with DIALSTATUS = ${DIALSTATUS}. >> /var/log/informer-test.log) 

[macro-alert] 
exten=s,1,Set(VOLUME(TX)=-5) 
exten=s,n,Wait(0.5) 
exten=s,n,Playback(${ARG1}) 
exten=s,n,Playback(ru_service) 
exten=s,n,Playback(${ARG2}) 

調用文件

#! /usr/bin/bash 
CALL_SPOOL_DIR="/var/spool/asterisk/outgoing/" 
CALL="/var/spool/asterisk/tmp/alarm-iax.call" 

echo "Channel: Local/[email protected]/n">$CALL 
echo "Set: datacardchan=datacard0">>$CALL 
echo "WaitTime: 300">>$CALL 
echo "Context: datacard">>$CALL 

mv $CALL $CALL_SPOOL_DIR