Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Проблемы с Dial и переменными после Queue

0

Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${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. Поправил. Ответа так и не нашел.

удалить закрыть спам изменить тег редактировать

спросил 2011-04-28 12:56:44 +0400

andy77 Gravatar andy77
1 1 2
http://www.cmlt.ru/

обновил 2011-10-25 12:40:46 +0400

Comments

код поправь, там есть кнопка для кода специальная cvieri ( 2011-04-28 16:18:16 +0400 )редактировать
не читается. Похоже автору тема уже не интересна. aleokos ( 2011-04-29 11:49:30 +0400 )редактировать

1 Ответ

0

для диалпланов такой длины не стоит ожидать нормального ответа комьюнити. ибо мало у кого етсь время это ПРОЧИТАТЬ.

старайтесь выкладывать только важные куски.

а по проблеме.. рекомендую послушать евенты. и везде расставить Dumpchan и __ перед переменными. так навскидку ничего не увидишь- дебажить надо. в любом случае дебаг займет больше часа даже с доступом по ssh. не похоже что это решается через форум.

ссылка удалить спам редактировать

ответил 2011-10-25 18:44:32 +0400

meral Gravatar meral flag of Ukraine
21228 23 18 169
http://pro-sip.net/

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2011-04-28 12:56:44 +0400

Просмотрен: 768 раз

Обновлен: Oct 25 '11

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.