Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${retval}) и данные о том отплавляет он обычно факсы или нет (${faxval}). В случае отсутствия клиента в базе ретвал возвращается 0 или 3 если какая та ошибка и он пихается в очередь к операторам. Если факсвал равен 1 то клиенту предлагается отправить факс. во всех других случаях в очередь. После отправки факса, записываем переменную в базу и тоже в очередь. После того как он отстоит в очереди и прежде чем вызвать оператора мы проверяем отправлял ли он факс. Если да, то резервируем оператора(ставим на паузу в очереди или вообще выводим из очереди, не важно), печатаем факс, говорим клиетну, что сейчас оператор обрабатывает его факс и паркуем клиента. Оператор в это время получает факс (печатает, электронка, тоже не важно), и снимает после того как готов говорить с клиентом его с парковки и начинает душевную беседу. Если нет факса, то начинается беседа, но оператор может в любой момент переключить клиента на факс. При переключении оператор паркуется. Клиент отправив факс, забирает с парковки своего оператора, а сам слышит фразу о том что его факс обрабатывается оператором и ставиться на парковку. Оператор при готовности, снимает клиента с парковки. По хенгапу оператор опять ставиться в очередь, и печатается факс, если он не был распечатан. В принципе всё :-) чуть короче диалплана получилось :-) А вот собственно сам диалплан курсив
;==============================================================================
;
; Основной алгоритм
;
;====================================================================================
exten => Remzova,1,NoOp(Звонок с номера 2697-550)
same => n,Set(_phone_num=${CALLERID(num)})
same => n,Set(__ret_val=0)
same => n,Set(__fax_val=0)
;same => n,Answer()
same => n,PlayBack(_116,noanswer)
same => n,Set(popytka=1)
same => n,Goto(read)
same => n(r0),Gotoif($[${popytka}>3]?rv1)
same => n,Read(pass_val,_18,5,,1,8)
same => n,Goto(set)
same => n(read),Read(pass_val,_17,5,,3,5)
same => n(set),Set(popytka=[${popytka}+1])
same => n(agi),AGI(agi://localhost/stored_procedure_call.agi,Asterisk_identification,${pass_val},${phone_num},out,ret_val,fax_val)
same => n,NoOp(${ret_val}, ${fax_val})
same => n,GotoIf($[${ret_val} = 0]?r0)
same => n,GotoIf($[${ret_val} = 3]?rv1)
same => n,Goto(fax)
same => n(rv1),Set(__ret_val=0000000003)
same => n(r1),PlayBack(_19)
same => n(q1),Set(CALLERID(name)=${ret_val}${fax_val})
same => n,Queue(Remzova,tTkK)
same => n,Goto(call_from_queue_remzova,,p0)
same => n,NoOp(выход из очереди Remzova)
same => n,HangUp()
same => n(fax),GotoIf($[${fax_val} = 1]?:q1)
same => n,Read(you_want_to_send_a_fax,_11,1,,1,10)
same => n,GotoIf($[${you_want_to_send_a_fax} = 1]?:q1)
same => n,Macro(fax_remzova,0)
same => n,PlayBack(_14)
same => n,Goto(r1)
;exten => h,1,NoOp(связь прекращена по какой либо причине)
;exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
;====================================================================================
;
; Звонки из очереди Remzova
;
;====================================================================================
[call_from_queue_remzova]
exten => _[1-9]XX,1,NoOp(Звонок из очереди Remzova)
same => n,NoOp(${CALLERID(name)})
same => n,Set(GOTO_ON_BLINDXFR=call_from_queue_remzova,${EXTEN},p0)
same => n,Set(__fax_val=${CALLERID(name):-1})
same => n,Set(__ret_val=${CALLERID(name):0:10})
same => n,Set(__TRANSFER_CONTEXT=fax_from_queue_remzova)
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Set(__CALLINGPRES=${ret_val}${fax_val}${PARKINGEXTEN})
same => n,Set(__operator_line=Local/${EXTEN}@call_from_queue_remzova)
same => n,RemoveQueueMember(Remzova,${operator_line})
same => n,Macro(channel,${EXTEN})
same => n(echo),System(echo ${ret_val} > /home/Remzova/DAHDI_${EXTEN})
same => n,GotoIf($[${fax_val} = 2]?:agent)
same => n,Playback(_117)
same => n(p0),NoOp(${DIALSTATUS})
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)
same => n(agent),Dial(${channel},60,tTg)
;same => n,PauseQueueMember(Remzova,${operator_line})
same => n,Goto(p0)
;====================================================================================
;
; Возможность оператору переключить на факс клиетна во время разговора
;
;====================================================================================
[fax_from_queue_remzova]
exten => 0,1,NoOp(Переключение оператором на факс)
same => n,NoOp(${CALLINGPRES})
same => n,Set(__fax_val=${CALLINGPRES:10:1})
same => n,Set(__ret_val=${CALLINGPRES:0:10})
same => n,Set(__PARKINGEXTEN=${CALLINGPRES:-4})
same => n,Macro(fax_remzova,${ret_val})
same => n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
same => n,Set(__print_fax = 1)
same => n,NoOp(${PARKINGEXTEN},${fax_val},${ret_val})
same => n,PlayBack(_117)
;same => n,NoOp(${channel})
;same => n,Dial(${channel},1)
;same => n,Park(120,,,,s)
;same => n(agent),Dial(${channel},60,tT)
same => n,ParkedCall(${PARKINGEXTEN})
exten => h,1,NoOp(проверка не забыли ли распечатать факс и снятие оператора с паузы в очереди)
exten => h,n,GotoIf($[${print_fax} = 1]?h1)
exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
exten => h,n(h1),NoOp(факса либо не было либо он напечатан)
exten => h,n,AddQueueMember(Remzova,${operator_line})
exten => h,n,NoOp(оператор снят с паузы)
;====================================================================================
;
; Макрос оперделения линии DAHDI оператора по внутреннему номеру
;
;====================================================================================
[macro-channel]
exten => s,1,NoOp(Макрос определение канала DAHDI по EXTEN)
same => n,GotoIf($[${ARG1} = 260]?D144)
same => n,GotoIf($[${ARG1} = 261]?D145)
same => n,GotoIf($[${ARG1} = 503]?D503)
same => n,GotoIf($[${ARG1} = 512]?D512)
same => n,HangUp(Какая та ошибка)
same => n(D144),Set(__channel=DAHDI/144)
same => n,MacroExit()
same => n(D145),Set(__channel=DAHDI/145)
same => n,MacroExit()
same => n(D503),Set(__channel=DAHDI/130)
same => n,MacroExit()
same => n(D512),Set(__channel=DAHDI/125)
same => n,MacroExit()
;====================================================================================
;
; Макрос прием факса
;
;====================================================================================
[macro-fax_remzova]
exten => s,1,NoOp(Макрос приема факса платного угла)
same => n,NoOp(${TRANSFER_CONTEXT},${PARKINGEXTEN},${channel},${fax_val},${ret_val},${CALLERID(name)})
same => n,Set(__fax_remzova_name=/home/FAX_Remzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1})
same => n,ReceiveFAX(${filename}.tif)
same => n,System(/usr/bin/tiff2pdf ${filename}.tif -o ${filename}.pdf)
same => n,Set(__ret_fax_name=${ARG1}.pdf)
same => n,GotoIf($[${ARG1} =! 0 & ${ARG1} =! 3]?:f1)
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_write_fax,${ARG1},${ret_fax_name},out,write_val)
same => n(f1),PlayBack(_13)
same => n,MacroExit()
*курсив*
А проблем собственно две. 1. Все переменные которые мы назначаем до постановки клиента в очередь, при постановки теряются. Это решилось передачей всех необходимых параметров через переменную ${CALLERID(name)}. Но после её переназначения при выходи из очереди она не изменяется почему та. То есть остается ровно такой какая была до очереди. Это не удобно. 2. При выполнение Dial как только оператор подымает трубку срабатывает экстеншен h. Собственно поэтому он и был убран в другой контекст. И после того как оператор переключает клиента на факс, сам он сбрасывается, хотя по идее должен парковаться. Уже неделю бьюсь над этим. Если кто может, подскажите пожалуйста, куда копать. Спасибо.
P.S. У меня есть другой контекст, где в принципе всё это реализовано и работает, но там нет Queue. Вот он.
;==================================================================================== ; ; Прозвон клиентов из формса ; ;====================================================================================
exten => s,1,Set(_PARKINGEXTEN=${parkn})
;exten => s,2,Dial(SIP/now/${nomer_val},30,tT)
;same => n,Goto(asteroid,${nomer_val},1)
same => n,Set(CALLERID(all)=2697551)
same => n,Dial(DAHDI/g1/${nomer_val},30,tT)
same => n,NoOp(${DIALSTATUS})
same => n,GotoIf($[${DIALSTATUS} = ANSWER]?:s1)
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)
exten => 0,1,NoOp(${PARKINGEXTEN})
same => n,Set(popytka=0)
;same => n,Set(ret_val=5)
same => n,Goto(v1)
same => n(v0),Set(popytka=[${popytka}+1])
same => n,Gotoif($[${popytka}>3]?v3)
same => n(v1),Read(pass_val,_110,5,,3,5)
same => n,NoOp(${PARKINGEXTEN})
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_control_password,${pass_val},${nomer_val},out,ret_val)
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,Gotoif($[${ret_val}=1]?v2)
same => n,PlayBack(_111)
same => n,Goto(v0)
same => n(v2),PlayBack(_112&_113)
same => n(v3),ParkedCall(${PARKINGEXTEN})
*курсив*
P.S. Поправил. Ответа так и не нашел.
для диалпланов такой длины не стоит ожидать нормального ответа комьюнити. ибо мало у кого етсь время это ПРОЧИТАТЬ.
старайтесь выкладывать только важные куски.
а по проблеме.. рекомендую послушать евенты. и везде расставить Dumpchan и __ перед переменными. так навскидку ничего не увидишь- дебажить надо. в любом случае дебаг займет больше часа даже с доступом по ssh. не похоже что это решается через форум.
Задан: 2011-04-28 12:56:44 +0400
Просмотрен: 1,354 раз
Обновлен: Oct 25 '11
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.