Донабор номера через АТА, как сделать ?
Сообщений: 5
|
Донабор номера через АТА, как сделать ?
Задача как всегда минимизировать расходы на межгород.
Есть центральный офис с * и несколько площадок в других городах с установленными АТАшками и офисными АТС.
Схема такая * ---SIP--->Cisco ATA 186 -->CO line Panasonic TE824---> городская АТС
При звонке на номер в другом городе должен быть отработан след. алгоритм
1. Набрать номер канала АТА в другом городе.
2. Дождаться ответа АТС или по истечении таймаута уйти на другой канал и на нем дождаться ответа АТС.
3. Подождать 1-2 секунды.
4. Донабрать security code.
5. Подождать 1-2 секунды.
6. Набрать код доступа к внешней линии у меня 9.
7. Дождаться ответа городской АТС.
8. Донабрать номер без кода города.
9. Соединить канал.
Сейчас это реализовано след. образом:
DEFTIMEOUT = 10
exten => _80572XXXXXX,1,Dial(SIP/8801,${DEFTIMEOUT},M(AddNum))
exten => _80572XXXXXX,1,Dial(SIP/8802,${DEFTIMEOUT},M(AddNum))
и т.д. сколько есть каналов
[macro-AddNum]
exten => s,1,SIPDtmfMode(rfc2833)
exten => s,2,Wait(2)
exten => s,3,SendDTMF(*хххххх) ;security code
exten => s,4,Wait(1)
exten => s,5,SendDTMF(9) ; выход на городск. линию
exten => s,6,Wait(5) ; тут надо бы не паузу а ожидание сигнала
; "готовность АТС", как это можно сделать ?
exten => s,7,SendDTMF(NNNNNN) ; номер котор. нужно набрать, его еще как то нужно
; в макрос передать, а как ?
В идеале хотелось бы иметь макрос в который передавались бы в качестве параметров номера каналов, и городской номер, а он бы случайно выбирал канал (а то у кого-то на площадке никогда позвонить не сложится из-за занятости линий :) и реализовывал вышеприведенный алгоритм.
у кого то есть идеи как такое сделать ?
|
Откуда: Киев
Сообщений: 749
|
Re: Донабор номера через АТА, как сделать ?
в теме я нашел три вопроса
1)готовность АТС", как это можно сделать ?
зависит от того что она выдает... если дтм то просто... если сигнал - хуже но тоже можно сделать поидее
2) в макрос передать, а как ?
${ARG1} ${ARG2} ... -аргументы макроса...
3)случайно выбирал канал
тривиально.. смотри show application radnom в консоли
если хошь могу написать весь макрос..
а шо мне за ето будет? :cool:
meral@bh.itmaster.com.ua
|
Сообщений: 5
|
Re: Донабор номера через АТА, как сделать ?
1) Сигнал "готовность атс" это просто тон, ты его слышить когда трубку снимаешь.
2)${ARG1} ${ARG2} ... -аргументы макроса, если вызывать его командой Macro, а если из Dial, как в примере, тогда как. Или я туплю ?
3) За Random спасибо, подходит
|
Откуда: Киев
Сообщений: 749
|
Re: Донабор номера через АТА, как сделать ?
exten => _80572XXXXXX,1,Dial(SIP/8801,${DEFTIMEOUT},M(AddNum))
[macro-addnum]
exten => s,1,SIPDtmfMode(rfc2833)
exten => s,2,read(code,,2,skip,1,2); read code not play file 2 digit max skip if noanswer wait 2 sec max
exten => s,3,noop('station return ${code}')
exten => s,4,Wait(1)
exten => s,5,SendDTMF(9) ; выход на городск. линию
exten => s,6,read(code1,,2,skip,1,2); read code1 not play file 2 digit max skip if noanswer wait 2 sec max
exten => s,7,noop('station return ${code1}')
exten => s,8,SendDTMF(${MACRO_EXTEN:5}; macro exten содержит екст с которого візван макро
мне интересно какая атс и что вывело...
надо астериск в режиме дебага пустить...
asterisk -vvvvvvgc
|
Откуда: Киев
Сообщений: 749
|
Re: Донабор номера через АТА, как сделать ?
можно юзать
WaitForSilence
если тишины нет - значит ответ атс был)
|
Сообщений: 5
|
Re: Донабор номера через АТА, как сделать ?
АТС обычная городкая, выдала предсказуемое User entered nothing.
Т.к. станция выдает 2 сигнала (Не DTMF)
1.) "Ответ станции" - Непрерывная передача, уровень от -6 до -30 дБ, частота 425 ± 25 Гц. - тут нужно номер набирать.
2.) "Занято" - Импульсный сигнал длительность импульса от 0,3 до 0,4 сек, паузы от 0,3 до 0,4 сек, уровень от -6 до -30 дБ, частота 425 ± 25 Гц. - тут нужно валить на другой порт АТАшки.
Команда есть чтоб такое детектить ?, должно что то быть, в частности для нормальной реализации Call back.
Соответственно WaitForSilence не подходит никак.
|
Сообщений: 5
|
Re: Донабор номера через АТА, как сделать ?
Еще проблема
exten => s,8,SendDTMF(${MACRO_EXTEN:5}
выдает Sep 9 19:34:46 WARNING[5823]: app_senddtmf.c:67 senddtmf_exec: SendDTMF requires an argument (digits or *#aAbBcCdD) Есть какая-то возможность ей переменную скормить, а то жестко цифры прописывать не получится
|
Откуда: Москва
Сообщений: 3421
|
Re: Донабор номера через АТА, как сделать ?
owlЕще проблема
exten => s,8,SendDTMF(${MACRO_EXTEN:5}
От s отнять 5 получится ничего :)
|
Откуда: Киев
Сообщений: 749
|
Re: Донабор номера через АТА, как сделать ?
а помочь слабо, litnimax?;) кстати macro_exten должно выдать EXTEN с которого вызван macros. ц меня так и работает во всех макросах. да ладно...
exten => _80572XXXXXX,1,setvar(number=${EXTEN:5})
exten => _80572XXXXXX,2,Dial(SIP/8801,${DEFTIMEOUT},M(AddNum))
соответственно в macro
exten => s,8,SendDTMF(${number})
переменная канал... точно работать будет на всех версиях *
насчет определения сигнала
http://voip-info.org/tiki-index.php?page=NVLineDetect
если получишь его от них - типа написано бесплатно..
|
Сообщений: 5
|
Re: Донабор номера через АТА, как сделать ?
exten => _8022XXX,1,setvar(number=${EXTEN:4})
exten => _8022XXX,2,Dial(SIP/8802,${DEFTIMEOUT},M(Test))
[macro-Test]
exten => s,1,SIPDtmfMode(rfc2833)
exten => s,2,Wait,2
exten => s,3,SendDTMF,*111111
exten => s,4,Wait,1
exten => s,5,SendDTMF(9)
exten => s,6,Wait,5
exten => s,7,SendDTMF,${Number}
Это не работает, скорее всего связано с тем, что setvar устанавливает переменныу для текущего exten, в нашем случае _8022XXX, соответственно имеем
== Parsing '/etc/asterisk/cdr_custom.conf': Found
-- Executing SetVar("SIP/8803-d776", "number=108") in new stack
-- Executing Dial("SIP/8803-d776", "SIP/8802|10|M(Test)") in new stack
-- Called 8802
-- SIP/8802-06c4 is ringing
-- SIP/8802-06c4 answered SIP/8803-d776
-- Executing SIPDtmfMode("SIP/8802-06c4", "rfc2833") in new stack
-- Executing Wait("SIP/8802-06c4", "2") in new stack
-- Executing SendDTMF("SIP/8802-06c4", "*5502847") in new stack
-- Executing Wait("SIP/8802-06c4", "1") in new stack
-- Executing SendDTMF("SIP/8802-06c4", "9") in new stack
-- Executing Wait("SIP/8802-06c4", "5") in new stack
-- Executing SendDTMF("SIP/8802-06c4", "") in new stack
Sep 12 23:35:11 WARNING[29751]: app_senddtmf.c:67 senddtmf_exec: SendDTMF requires an argument (digits or *#aAbBcCdD)
Все работает если использовать SetGlobalVar, но возникает вопрос, если у нас есть несколько каналов на площадку, и мы делаем что то вроде
exten => _8022XXX,1,ChanIsAvail(SIP/1&SIP/2&SIP/3)
exten => _8022XXX,2,Cut(Channel=AVAILCHAN,,1)
exten => _8022XXX,3,SetGlobalVar(number=${EXTEN:4})
exten => _8022XXX,4,Dial(Channel,${DEFTIMEOUT},M(Test))
Первый абонент набирает номер и ждет отработки макроса, в это время номер набирает второй абонент и numer принимает значение его номера соответственно будет подставлен первому абоненту, как такую проблему решить ?
Если сделать переменную уникальной, то как ее удалить после отработки макроса, а то забьет * всю память со временем, а время от времени перезагружать * не красиво.
|
|