VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Как донабрать DTMF после соединения?..

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Ответить
darkpenguin
Сообщения: 3
Зарегистрирован: 05 мар 2015, 19:15

Как донабрать DTMF после соединения?..

Сообщение darkpenguin »

Извиняюсь, если уже было, но даже не могу придумать, как поисковый запрос составить...

Есть Астериск, в который воткнута древняя АТС-ка (наследие девяностых) "исходящими" портами через такой же древний четырёхпортовый шлюз (может и не из девяностых, но не сильно новее). То есть, юзеры с АТСки звонят в город через Астериск. Работает это всё отлично, как ни странно. :) А вот если кто-нибудь с Астериска (например, я со своим софтфоном) захочет позвонить какому-нибудь юзеру на АТСке, то тут придётся:

- Выбрать свободный порт;
- Позвонить на него, дождаться, когда АТСка "снимет трубку";
- Донабрать нужный номер расширения.

Сейчас мне приходится методом тыка звонить на одну из четырёх линий, ждать ответа и после этого вручную набирать номер расширения, но я хотел бы автоматизировать это дело.


Вопрос первый: как сделать Dial "на первый свободный эндпойнт"? Если я сделаю на все четыре сразу - типа, один из них ответит первым - это будет не очень элегантным решением (достаточно того что АТСка начнёт отвечать сразу на все линии, и потребуется довольно много времени, чтобы они со шлюзом разобрались в ситуации).

Вопрос второй - как сделать "позвонить на такой-то эндпойнт, а потом донабрать такой-то номер через DTMF"? Я пробовал сделать Dial(SIP/line1/${EXTEN}), но шлюз на такое сразу отвечает "Busy here". Я вообще сомневаюсь, что шлюзы предполагают ситуацию, в которой в них втыкают не телефоны, а АТС - так что неудивительно, что ему непонятна идея "звонить" куда-то после того как ожидамый пользователь снял трубку. Так что надо именно дождаться, когда АТС снимет трубку, и набрать нужный номер через DTMF.
ded
Сообщения: 15631
Зарегистрирован: 26 авг 2010, 19:00

Re: Как донабрать DTMF после соединения?..

Сообщение ded »

Ответ первый:
комбинация

Код: Выделить всё

=> _1XX,1,Dial(SIP/line1/${EXTEN})
=> _1XX,2,Dial(SIP/line1/${EXTEN})
=> _1XX,3,Dial(SIP/line1/${EXTEN})
=> _1XX,4,Dial(SIP/line1/${EXTEN})
даст набор не во все четыре сразу - а, типа, в тот, кто из них ответит первым.
darkpenguin
Сообщения: 3
Зарегистрирован: 05 мар 2015, 19:15

Re: Как донабрать DTMF после соединения?..

Сообщение darkpenguin »

Видимо, имелось в виду
exten => _1XX,1,Dial(SIP/line1/${EXTEN})
exten => _1XX,2,Dial(SIP/line2/${EXTEN})
exten => _1XX,3,Dial(SIP/line3/${EXTEN})
exten => _1XX,4,Dial(SIP/line4/${EXTEN})
?
И, видимо, не "кто ответит первым", а именно "кто из них окажется не занят"?..

А в таком случае если мне ответит первая линия, и мой собеседник после разговора повесит трубку... разве следующим шагом меня не перекинет на следующую линию?..

Попробовал - действительно, работает! Мне казалось, если собеседник положит трубку - то меня пустит дальше по диалплану.

Можно ещё внизу подписать Playback("everyone-is busy") - на случай, если все четыре заняты...

Остаётся вопрос - как сделать, чтобы сначала позвонить, а потом набрать номер?..
ded
Сообщения: 15631
Зарегистрирован: 26 авг 2010, 19:00

Re: Как донабрать DTMF после соединения?..

Сообщение ded »

darkpenguin писал(а):Видимо, имелось в виду
exten => _1XX,1,Dial(SIP/line1/${EXTEN})
exten => _1XX,2,Dial(SIP/line2/${EXTEN})
exten => _1XX,3,Dial(SIP/line3/${EXTEN})
exten => _1XX,4,Dial(SIP/line4/${EXTEN})
?
Да. Лень копировать/исправлять, чтобы объяснить.
darkpenguin писал(а):И, видимо, не "кто ответит первым", а именно "кто из них окажется не занят"?..

А в таком случае если мне ответит первая линия, и мой собеседник после разговора повесит трубку... разве следующим шагом меня не перекинет на следующую линию?...
Нет, не перекинет. Надо бы Вам почитать книгу про азбуку телефонии Астериск - книгу о будущем. Тогда таких вопросов точно не будет. Ответ на второй Ваш вопрос там же найдёте.
darkpenguin
Сообщения: 3
Зарегистрирован: 05 мар 2015, 19:15

Re: Как донабрать DTMF после соединения?..

Сообщение darkpenguin »

Я читал! :) Я "настоящий" новичок!)) Но читал я её перед тем как настраивать всё это, и тогда у меня такого вопроса не было, а теперь перечитал выборочно, но про такой изврат как донабор после Dial - ничего не нашёл...

Нашёл при более внимательном прочтении описания Dial :

Код: Выделить всё

Dial(SIP/line1,,D(201))
Работает. Звонит, ждёт снятия трубки, и посылает DTMF. Причём, видимо, посылает настолько быстро, что более чем в половине случаев АТС просто не успевает его расслышать.

Если в параметре D указано что-то кроме цифр, то мы получаем сообщение об ошибке:

Код: Выделить всё

Illegal DTMF character 'P' in string. (0-9*#aAbBcCdD allowed)
Про цифры и знаки всё понятно, но что делают aAbBcCdD - не написано ни в описании Dial, ни в Гугле. Однако, я наткнулся на кое-что ещё более недокументированное. Оказывается, несмотря на явное перечисление допустимых символов, можно использовать также символ w (именно маленькое!), который означает - "секундная пауза". Так что в результате - отлично работает вот так:

Код: Выделить всё

exten => _2XX,1,Dial(SIP/line1,,D(ww${EXTEN}))
 same => n,Dial(SIP/703,,D(ww${EXTEN}))
 same => n,Dial(SIP/702,,D(ww${EXTEN}))
 same => n,Dial(SIP/701,,D(ww${EXTEN}))
Спасибо!
Glukinho
Сообщения: 661
Зарегистрирован: 07 янв 2011, 20:05

Re: Как донабрать DTMF после соединения?..

Сообщение Glukinho »

darkpenguin писал(а):Вопрос второй - как сделать "позвонить на такой-то эндпойнт, а потом донабрать такой-то номер через DTMF"?
core show application Dial
[Syntax]
Dial(Technology/Resource[&Technology2/Resource2[&...]][,timeout[,options[,URL]]])
...

options
...
D([called][:calling[:progress]]): Send the specified DTMF strings
*after* the called party has answered, but before the call gets bridged.
The <called> DTMF string is sent to the called party, and the <calling>
DTMF string is sent to the calling party. Both arguments can be used
alone. If <progress> is specified, its DTMF is sent immediately after
receiving a PROGRESS message.
ded
Сообщения: 15631
Зарегистрирован: 26 авг 2010, 19:00

Re: Как донабрать DTMF после соединения?..

Сообщение ded »

darkpenguin писал(а): Оказывается, несмотря на явное перечисление допустимых символов, можно использовать также символ w (именно маленькое!), который означает - "секундная пауза". Так что в результате - отлично работает вот так:

Код: Выделить всё

exten => _2XX,1,Dial(SIP/line1,,D(ww${EXTEN})))
Ура-а! Я открыл удивительную новую страну! Даже не знаю какое ей дать название... назову Америкой!
darkpenguin, Вы 8931-й, кто её открыл. Вы на верном пути, читайте книгу, wiki, и смотрите встроенный синтаксис,
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH