Dtmf inband что это
DTMF и его настройка. Часть1. Теория
По умолчанию Gateway отсылает DTMF в потоке RTP (in-band), это прекрасно работает при использовании кодека high-bit-rate G.711, т.е. если голосовой поток не подвергается сжатию.
Основная проблема с DTMF возникает при использовании алгоритмов сжатия, например кодека G.729. Дело в том, что при сжатии качество голового потока заметно ухудшается, и хотя это почти не сказывается на способности абонентов понимать друг друга, DTMF тон уже не достаточно четкий и воспринимается неправильно.
Данная проблема решается с помощью DTMF Relay, при котором сигналы DTMF транспортируются отдельно от потока RTP или out-of-band.
Рассмотрим несколько примеров.
На рисунке изображена схема подключения телефонии через шлюз H.323.
На участке PSTN DTMF отдается in-band, т.е. там даже нет понятия DTMF Relay, поскольку это аналоговая линия.
DTMF relay становится нужным только на участке VoIP, где возможно применения методов компрессии.
Также можно сказать, что:
— in-band DTMF relay будет идти внутри потока RTP, т.е. на рисунке по красной линии RTP.
— out-of-band DTMF relay будет идти вместе с сигнализацией, т.е. по зеленым линиям на рисунке.
На участках телефон-CUCM и CUCM-H.323Gateway используется разная сигнализация, и значит различные методы DTMF relay. Со стороны телефона приходит SCCP messages, содержащие DTMF в своей кодировке, со стороны H.323 gateway сигнализация вместе с DTMF идет H.245 messages.
CUCM в нашем случае выступает как DTMF Forwarder между различными типами сигнализаций.
На участке телефон-CUCM у нас будет возможна только out-of-band, поскольку SCCP-шный телефон не поддерживает in-band.
На участке CUCM-H.323Gateway возможны методы как in-band, так и out-of-band. При этом в случае SCCP-шного телефона, для включения in-band потребуется использование MTP.
В зависимости от протокола сигнализации (H.323, SIP, MGCP, SCCP), существуют различные методы для осуществления DTMF Relay. В любом случае, Call Manager CUCM изначально пытается некоциировать общий для всех метод. Если ощий метод найден не был, предпринимается попытка использовать MTP.
H.323 DTMF Support
Cisco Gateways поддерживает следующие методы DTMF Relay:
Дебаг:
В одном из источников рекомендуется debug voice rtp session named-event, но у меня не сработало.
Результат дал только этот дебаг: debug h245 asn1
Дебаг: debug h245 asn1
Дебаг: debug h245 asn1
Дебаг: debug h245 asn1
На маршрутизаторе Cisco доступны следующие команды:
Лучшая практика:
На диалпире лучше всего давать команды следующим образом:
В этом случае обе стороны могут негоциировать подходящий метод dtmf-relay между собой.
Для определения выбранного DTMF relay method:
show call active voice
Таким образом, CUCM автоматически проверяет какой метод DTMF подойдет обоим сторонам.
Касательно H.323 Gateway в CUCM, там настроек DTMF нет. CUCM принимает настройку другой стороны.
MGCP DTMF Support
Для MGCP доступны следующие методы DTMF Relay:
MGCP использует DTMF relay только для low-rate codecs (G729, iLBC, GSM, etc). Для bit-rate codecs G711 DTMF будет отослано in-band.
В случае с MGCP мы можем выбрать будут ли настройки DTMF диктоваться Call Agent-ом (CUCM) или же будут использованы те что выставлены на Gateway.
Зайдем на CUCM: Device > Gateway, выбираем соответствующий MGCP Gateway.
Нас интересует раздел Type of DTMF Relay.
При выборе Current GW Config, будет использована настройка которая стоит на шлюзе.
На IOS Gateway мы можем выставить DTMF следующей командой:
Если мы выставим на CUCM другой выбор, например cisco, соответствующая вышеприведенная команды будет введена автоматом (механизмами MGCP).
С MGCP был замечен баг:
CSCta69407 Bug Details (When using any type of inband DTMF signaling (RTP-NTE, NSE, or Cisco Proprietary) DSP’s aren’t turning off OOB dtmf signaling using mgcp packets. There fore duplicate digits will be seen on the terminating GW as one coming from rtp and other coming from CUCM)
Workaround: Use mgcp dtmf-relay type out-of-band.
SIP DTMF Support
По умолчанию SIP отсылает DTMF in-band, но мы можем использовать следующие опции:
Здесь мы видим несколько доступных методов, с для работы с CUCM годятся только
— RTP-NTE (NTE или RFC 2833);
— SIP-NOTIFY;
— SIP-KPML.
Не передаются нажатия клавиш в IVR в asterisk
Столкнулся с неожиданной проблемой при подключении нового транка от MANGO. При входящем звонке абонент попадает в голосовое меню, где ему проигрывается приветствие. В это время можно набрать внутренний номер сотрудника и сразу позвонить ему, не дожидаясь ответа секретаря. Так вот набор внутреннего номера как раз и не работал, хотя с другими транками все было в порядке.
Вообще, Манго достаточно странная система. Если у других sip операторов ты покупаешь номер, и тебе присылают учетки и пример конфигурации под asterisk, то тут не все так просто. По факту ты покупаешь услугу виртуальной АТС и тебе дают к ней доступ. А дальше ты уже сам все настраиваешь в ней. По идее, это даже удобно и круто, но не совсем. Например, по-умолчанию, после покупки нового номера и создания первого пользователя, если вы захотите позвонить на него, то попадете на факс. Да, по-умолчанию у них так устроено. Если руками не указать принимать звонок новому пользователю, то примет его факс. Сам бы я не догадался, позвонил в техподдержку, там объяснили.
Рассказать я хотел не об этом. При входящих звонках от манго у меня не работал тональный набор. Причем я не сразу понял, что проблема именно в нем. В логе астера было странное предупреждение:
Я грешил на него и долго пытался понять, что это такое и с чем связано. Но реально не смог понять до конца, о чем тут идет речь и в чем проблема. Полный лог больше ничего подозрительного не показывал и это навело на мысль, что причина все же не в этом сообщении. Смущало то, что в астериске вообще не было никакой реакции на тоновый набор, как-будто сигнал просто не доходил. Как только я это понял, сразу стало очевидно, куда копать.
Я человек не глупый, фразу не рекомендуется понимаю буквально и не использую. В итоге у меня стояло dtmfmode=inband. После того, как поменял на rfc2833 все заработало. В конечном счете у меня работает Манго (Mango office) с asterisk с такими настройками пира:
Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.
Subnets.ru blog
Сети, настройка оборудования, сетевые сервисы.
Asterisk и DTMF при callback
Статья: Asterisk: автообзвон (auto-dial out) и обратный звонок (callback) с использованием AGI
Проблема
При организации функции callback на Asterisk`е, когда Asterisk перезванивает и ты пытаешься ввести тоном номер, то нажатые тобой цифры начинают задваиваться, а то и затраиваться.
Причем это могло происходить не всегда и не зависело от аппарата, на котором набирали тоном.
Так же после многочисленных тестов стало точно понятно, что когда идет звонок из «города» на Asterisk, то подобных проблем не возникает, только если сам Asterisk звонит в «город».
VoIP соединение идет так:
E1 Cisco AS5350 (c5350-js-mz.124-15.T11.bin) Asterisk (версия 1.4.29_2)
Попробую более менее внятно рассказать о процессе нашего разбора с этой проблемой и последовательности действий, а вдруг кому ещё пригодится кроме меня, если я захочу освежить память по этому вопросу через какое то время.
Начали разбор полетов
Пока опыт работы с Asterisk не такой большой как хотелось бы, посему прибегнули к помощи гугла, через минут пять выяснили:
Открываем файл logger.conf и там ищем строчку:
В нее дописывем dtmf, получаем:
Сохраняем файл, входим в консоль Asterisk`а:
И в консоле даем команду:
asterisk*CLI> logger reload
После чего, в той же консоле, задаем уровень дебага, я делал так:
asterisk*CLI> core set debug 3
Далее, для того что бы потестить нажатие кнопок, я внес нехитрые изменения в dialplan:
Т.е. поднимаем трубку, ждем ввода 11-ти цифр, а затем проговариваем все что набрали, собственно в этот контекст я перенаправил callback вызовы.
Подготовились, значит можно начинать.
Делаю callback на свою мобилку, начинаю давить цифири на мобиле, в консоле Астериска вижу:
и т.д. Во, то что надо, дебаг нажатия кнопок есть.
На одно нажатие в дебаге 4-ре строки. Чем дальше я смотрел в дебаг тем больше понимал, что я нажимаю цифирь один раз, а в дебаге она могла появиться и 2 и 3 раза (т.к. после одного нажатия появлялось более 4-х строк).
Смотрим что вообще мы можем «потрогать» в Астериске на тему DTMF.
Открываем файл sip.conf :
Это глобальные настройки, кроме них так же можно указать dtmfmode и для конкретного пира в его контексте.
Меняли режимы, ситуация не изменялась. Как работало через раз, так и продолжало работать.
Раз так, то смотреть нужно с обоих сторон, т.е. в какой то момент привлекли и девайс Cisco.
Смотрим что же у нас указано в dial-peer:
В voice-class перечислены кодеки:
Решили ужать выбор кодеков до alaw и ulaw, т.к. тот же режим inband работет только с этими кодеками.
Verifying SIP DTMF Support
To verify SIP DTMF support, perform the following steps as appropriate (commands are listed in alphabetical order).
1. show running-config
2. show sip-ua retry
3. show sip-ua statistics
4. show sip-ua status
5. show sip-ua timers
6. show voip rtp connections
7. show sip-ua calls
Благодаря команде show sip-ua calls видно какой режим DTMF выбран в данный момент:
Итак теперь видно что происходит с двух сторон и какой режим выбирается и снова пробовали разнообразные режимы.
В Инете (в частности на www.voip-info.org/wiki/view/Asterisk+DTMF) иногда народ советовал прям в dialplan указывать режим DTMF перед набором чего-либо, сделать это можно командой SIPdtmfmode:
Но это как то тоже не очень спасало. После многочасовых разборок решили глянуть, а что у Asterisk`а на тему vad есть.
Решение
В файле codecs.conf :
Таксссс.. опять же народ в Инете, при разборках с DTMF, советует с первую очередь гасить vad к чертям, делаем это:
Changing the DTMF tones
The Asterisk module dsp.c contains the definitions for DTMF tones. Just look for a part of the source code that says:
And change that to:
This will raise all detected DTMF codes by some 40Hz, enough for Asterisk to become completely tone-blind to existing DTMF codes.
Once you made the change, you must recompile Asterisk by:
Note that you still can send Asterisk DTMF codes to transfer the call, start monitoring or what else — as long as you use the new DTMF tone matrix you just input. This is pretty easy to do with most industrial-grade call handling equipment.
«Ну что ж, не грех попробовать» — сказали мы и выполнили как написано.
Диалпир на циске был приведен к виду:
Наконец то оно заработало, заработало как надо. По крайней мере, после многочасовых тестов, ни одного сбоя в наборе тоном не было. Надеемся что и далее не будет проблем.
Я решил написать все это для того, что бы если кто-то тоже заморочится с этой темой и не будет знать как к этому подступиться, ну и если я вернусь к этому вопросу позднее, чтобы не вспоминать что уже было сделано :).
Авторы: Панфилов Алексей (lehis (at) subnets.ru), Николаев Дмитрий (virus (at) subnets.ru)
Похожие статьи:
Поделиться ссылкой:
Эта статья размещена virus 12.04.2010 в 19:06 в рубриках Asterisk, VoIP. Метки: Asterisk, DTMF, SIP, vad. Вы можете оставить отзыв или trackback с вашего собственного сайта. Отслеживайте все отзывы и комментарии к этой статье при помощи новостной ленты RSS.
комментария 3
mh сказал:
Мы тоже сейчас занимаемся IP телефонией на asterisk’e… спасибо за статью!
admin сказал:
пжалста, значит был прав, что может пригодится не только мне 🙂
xfiles сказал:
Спасибо за подсказки!
Появился еще вопрос, можно ли логгировать дтмф коды которые прожимали в ivr?
Например, в /etc/asterisk/extensions_override_freepbx.conf можно добавить что-то вроде:
[ext-queues]
exten => h,1,DumpChan() — дамп всех переменных, дтмф тут нет
exten => h,1,ExecIf($[«$
exten => h,2,Macro(hangupcall,)
в результате скрипт send_msg.sh обрабатывает пропущенные вызовы, но хотелось бы дополнить уведомления информацией о том, какое именно меню клиент выбирал в IVR, или несколько раз нажимал.
Добавить комментарий
Вам следует авторизоваться для размещения комментария.
Метки
Рубрики
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
---|---|---|---|---|---|---|
« Фев | ||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Ссылки
Свежие записи
Свежие комментарии
Ratings
Самые читаемые статьи
Unable to display Facebook posts.
Show error
Dtmf inband что это
Модератор: april22
asterisk не понимает DTMF при исходящем на транке Мультифона
Приветствую всех!
Имеется следующая проблема на asterisk 13.11.2 (чистом, без FreePBX и прочего, из неродных модулей тока chan_dongle):
В цепочке » SIP-телефон => asterisk => Мультифон (транк) => сотовый » все участники процесса имеют заданный dtmfmode=inband, а SIP-телефон имеет соответствующую настройку для передачи тонов в inband. Однако сигналы DTMF принимаются asterisk’ом только со стороны этого самого SIP-телефона (в консоли появляются соответствующие сообщения), а нажатия со стороны сотового игнорируются. При прослушивании записи отчетливо слышно тоны как со стороны SIP-телефона, так и мобильника без искажений и эха. Трансферы, функции IVR отрабатывают только у SIP-телефона.
В обратной цепочке » сотовый => Мультифон (транк) => asterisk => SIP-телефон » сигналы DTMF обрабатываются нормально в обе стороны и точно также слышны в голосовом потоке. Трансферы, функции IVR отрабатываются четко у обоих.
Кодеки используются alaw, ulaw, gsm в транке и пользователях.
Код: выделить все disallow = all
allow = alaw,ulaw,gsm
Успешный DTMF, принимаемый с входящего по транку Мультифона имеет следующий вид
Код: выделить все [2016-10-27 12:29:49] DTMF[15402][C-00000049]: channel.c:4057 __ast_read: DTMF begin ‘1’ received on SIP/trunk_1-0000016e
[2016-10-27 12:29:49] DTMF[15402][C-00000049]: channel.c:4068 __ast_read: DTMF begin passthrough ‘1’ on SIP/trunk_1-0000016e
[2016-10-27 12:29:50] DTMF[15402][C-00000049]: channel.c:3971 __ast_read: DTMF end ‘1’ received on SIP/trunk_1-0000016e, duration 306 ms
[2016-10-27 12:29:50] DTMF[15402][C-00000049]: channel.c:4012 __ast_read: DTMF end accepted with begin ‘1’ on SIP/trunk_1-0000016e
[2016-10-27 12:29:50] DTMF[15402][C-00000049]: channel.c:4041 __ast_read: DTMF end passthrough ‘1’ on SIP/trunk_1-0000016e
ТП мультифона отсылает к настройке asterisk о всеми вопросами на основании того, что (привожу примерный ход диалога):
— Мы вам голос передали?
— Ага.
— Тон слышите?
— в принципе слышим.
— Вот и разбирайтесь со своими сигналами и АТС, развелись тут умники, мы тут не при делах.
Собственно, не совсем понятно куда на самом деле копать в этой ситуации, буду рад любой помощи и совету.
Настройка голосового меню (IVR) на Asterisk
Интерактивное голосовое меню, или голосовое дерево, IVR меню или просто, IVR используется для возможности позвонившему подключиться к конкретному сотруднику компании или соединиться с линией поддержки определенной категории. Также, с помощью IVR можно получить необходимую информацию без ответа со стороны оператора, выбрав интересующую информацию. Другими словами, это система, взаимодействующая с абонентом и реагирующая на его команды.
Принцип настройки
IVR настраивается в плане набора Aterisk (dialplan) — в конфигурационном файле extensions.conf.
Сначала мы проигрываем запись с голосовым приветствием и предложением ввести номер в тональном режиме. В том же файле мы обрабатываем вводимую информацию, перекидывая абонента на другие диалплан, очередь или конкретного сотрудника.
Базовая настройка
Открываем конфигурационный файл:
[outcaling]
.
exten => 222,1,Answer()
same => n,Background(basic-pbx-ivr-main)
exten => _XXX,1,Dial(SIP/$
* в данном примере, при звонке на номер 222 нам проигрывается голосовая запись basic-pbx-ivr-main (из каталога /var/lib/asterisk/sounds/ ). Когда мы вводим трехзначный добавочный номер, нас соединяет Asterisk с этим номером. Предполагается, что наш основной диалплан называется outcaling.
Перезапускаем настройки диалплана:
Голосовое дерево
Теперь настроим возможность выбора отдела, с которым абонент захочет соединиться.
Приводим наш диалплан к следующему виду:
exten => 333,1,Answer()
exten => 333,2,Background(basic-pbx-ivr-main)
exten => 333,3,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)
[managers]
exten => s,1,Ringing
same => n,Wait(1)
same => n,Background(/var/lib/asterisk/sounds/wav/managers)
same => n,Waitexten(5)
exten => 1,1,Dial(SIP/201)
exten => 2,1,Dial(SIP/202)
exten => 0,1,Goto(outcaling,333,1)
[support]
exten => s,1,Ringing
same => n,Wait(1)
same => n,Background(/var/lib/asterisk/sounds/wav/support)
same => n,Waitexten(5)
exten => 1,1,Dial(SIP/101)
exten => 2,1,Dial(SIP/102)
exten => 0,1,Goto(outcaling,333,1)
Перечитываем настройки диалплана:
Таймаут по времени ожидания и неправильные действия
Добавим обработку неправильно введенной цифры и превышение времени ожидания. В вышеуказанном примере просто происходит отбой звонка.
Данное поведения указывается в диалплане с помощью ключей t и i. Добавим их в наш конфиг:
exten => 333,1,Answer()
same => n,Background(basic-pbx-ivr-main)
same => n,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)
exten => t,1,Dial(SIP/101)
exten => i,1,Background(invalid)
same => n,Goto(outcaling,333,3)
* где t,1,Dial(SIP/101) — позвонить по номеру 101, если будет превышен таймаут ожидания; i,1,Background(invalid) — сообщить о том, что введен неправильный номер.
Если не работает донабор
Если во время тестирования возникнут проблемы при донаборе внутреннего номера, необходимо проверить режим DTMF. В двух словах, это аналоговый сигнал для набора телефонного номера. Он может отправляться разными способами: inband, rfc2833 / rfc4733, info. При возникновении проблем, попробуйте в настройках клиента выставить rfc2833 или inband.
На стороне Asterisk также можно настроить sip-пир на определенный способ передачи DTMF:
* настройка может быть задана на глобальном уровне, уровне шаблона или для конкретного пира.
Примеры настроек
Рассмотрим некоторые дополнительные примеры настроек диалплана, которые будут полезны при конфигурировании автоинформатора.
1. Расписание
а) Мы можем вызывать различные контексты диалплана в зависимости от времени суток. Для этого вызываем приложение GotoIfTime:
* в данном примере при звонке с 08 до 20:00 в будние дни нас перекинет в контекст working_hours, иначе — в not_working_hours.
б) Чтобы во время нашей работы в рабочие часы мы могли проверить работу автоинформатора в нерабочее время, можно задать исключение для определенного номера:
* в данном примере мы добавили строку с проверкой исходящего номера. Если мы звоним с телефона 9062504869, то звонок всегда перекидывать в контекст not_working_hours.
в) Также мы можем менять направление диалплана в зависимости от времени:
exten => s,1,NoOp(Разные пути в зависимости от времени и дня)
same => n,GotoIfTime(10:00-13:59,mon-fri,*,*?true:false)
same => n(true),NoOp(TRUE)
same => n,Background(wav/true)
same => n,Hangup()
same => n(false),NoOp(FALSE)
same => n,Background(wav/false)
same => n,Hangup()
* в данном примере мы проиграем файл wav/true, если звонок будет совершен в будние дни с 10 до 14, и wav/false — в любое другое время.