Страница 1 из 1
IAX2 и DTMF
Добавлено: 05 фев 2011, 17:37
akTula
имеется IAX2 транк с провайдером, при получении входящего соединения выполняем:
iax.conf
[prov]
type = user
host = X.X.X>X
transfer=no
trunk=yes
context = incommingIAX
jitterbuffer=no
sip.conf
[incommingIAX]
exten => _7XXXXX,1,GoTo(incomming70,199,2)
[incomming70]
exten => 199,1,Answer
exten => 199,2,Set(TIMEOUT(digit)=5)
exten => 199,3,Set(TIMEOUT(response)=20)
exten => 199,4,Background(otvet70)
exten => 199,5,WaitExten(5)
...
соединение проходит успешно, фраза проговаривается, но донабор от пользователя не проходит.
если соединение делать по SIP - всё работает нормально.
дебаг iax2 показывает отсутствие пакетов с типом DTMF от провайдера
попытался загнать IAX в тот-же астериск по SIP, чтоб там проанализировался тон, но получил loop detected, Now forwarding и опять недетектящийся тон.
какие возможны варианты решения проблемы?
Re: IAX2 и DTMF
Добавлено: 05 фев 2011, 18:46
akTula
проблема как раз в том, что анализируя логи соединений инициируемых мной и провайдером - вижу разницу
когда идет соединение от меня - то
[Feb 5 18:28:07] DTMF[10708]: channel.c:2466 __ast_read: DTMF begin '2' received on SIP/1001-00000913
[Feb 5 18:28:07] DTMF[10708]: channel.c:2476 __ast_read: DTMF begin passthrough '2' on SIP/1001-00000913
Tx-Frame Retry[000] -- OSeqno: 013 ISeqno: 012 Type: DTMF_B Subclass: 2
Timestamp: 21594ms SCall: 19820 DCall: 02386 [X.X.X.X:4569]
то есть - услышали DTMF на канале, и был сгенерирован пакет с типом DTMF в iax обмене
при соединении по инициативе провайдера - пакетов с типом DTMF нет
при этом на слух - тональный сигнал слышен в обоих случаях.
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 11:22
akTula
провел следственный эксперимент
сделал в ответе на звонок приходящий по IAX от провайдера звонок на SIP шлюз, который скроссирован парой с другим шлюзом, принявшим звонок по аналоговой соотв паре, загнавший его в SIP и вернувший в тот-же астериск... так вот - в этом SIP траффике распознаывание DTMF - 100%.
то есть внутри голосового трафика в IAX - DTMF передаются без искажений, только asterisk их не анализирует,ожидая от провайдера служебный iax пакетов с типом DTMF, которых провайдер не генерирует.
как заставить asterisk ловить DTMF в голосовм траффике IAX так-же как и в RTP от SIP?
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 12:51
akTula
всё дело в том что оно штатным способом в IAX вообще не анализируется. в самой спецификации протокола написано что DTMF передается out of band то есть не внутри голосовго траффика, а отдельным IAX служебным пакетом. и ловля DTMF и генерация этих пакетов лежит на той стороне, которая заворачивает траффик в IAX
пока вижу два варианта - добиваться от провайдера генерации этих пакетов
или как-то выдернуть траффик из IAX в SIP и там уже нормально отловить пакеты.
но как корректно завернуть звонок сам на себя, так что при этом произошла перекодировка из IAX в SIP пока непонятно.
пока в chan_sip.c отключил проверку на loop, и научил его не отрубать звонки самому себе
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 13:13
ded
akTula писал(а):имеется IAX2 транк с провайдером, при получении входящего соединения выполняем:
iax.conf
[prov]
type = user
host = X.X.X>X
transfer=no
trunk=yes
context = incommingIAX
jitterbuffer=no
sip.conf
[incommingIAX]
exten => _7XXXXX,1,GoTo(incomming70,199,2)
[incomming70]
exten => 199,1,Answer
exten => 199,2,Set(TIMEOUT(digit)=5)
exten => 199,3,Set(TIMEOUT(response)=20)
exten => 199,4,Background(otvet70)
exten => 199,5,WaitExten(5)
...
Это явно не sip.conf, как указано, а extensions.conf
akTula писал(а):но как корректно завернуть звонок сам на себя, так что при этом произошла перекодировка из IAX в SIP пока непонятно.
Принимайте IAX транк в спец контекст где
exten => _X.,1,Dial(SIP/${EXTEN}@localhost)
или чуть сложнее - содайте специальный SIP пир localhost.
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 15:31
akTula
ded писал(а): Это явно не sip.conf, как указано, а extensions.conf
ну да, точно
ded писал(а):
akTula писал(а):но как корректно завернуть звонок сам на себя, так что при этом произошла перекодировка из IAX в SIP пока непонятно.
Принимайте IAX транк в спец контекст где
exten => _X.,1,Dial(SIP/${EXTEN}@localhost)
в Dial(SIP... - принимал. получаем loop detected и принимается в результате не SIP а IAX
я в первоначальном сообщении это писал -
"попытался загнать IAX в тот-же астериск по SIP, чтоб там проанализировался тон, но получил loop detected, Now forwarding и опять недетектящийся тон."
ded писал(а):
или чуть сложнее - содайте специальный SIP пир localhost.
а вот про специальный пир - если можно поподробнее
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 18:17
ded
loop detected - ответ вполне ясный. Петля создана на уровне логики extensions.conf а не на уровне технологий. Пришедший звонок запетлёван через Goto. Мы тут этого не видим, так как приведён не весь диал план. Где-то там includes наставлены?
iax.conf
[prov]
type = user
host = X.X.X>X
transfer=no
trunk=yes
context = incomming70
jitterbuffer=no
extensions.conf
[incomming70]
exten => _7XXXXX,1,Dial(SIP/${EXTEN}@localhost)
Принятый через IAX2 звонок уйдёт в SIP/localhost и принимается в SIP какой контекст?
В нём и прописать:
exten => _7XXXXX,1,Answer
exten => _7XXXXX,2,Set(TIMEOUT(digit)=5)
exten => _7XXXXX,3,Set(TIMEOUT(response)=20)
exten => _7XXXXX,4,Background(otvet70)
exten => _7XXXXX,5,WaitExten(5)
Re: IAX2 и DTMF
Добавлено: 06 фев 2011, 19:52
akTula
ded писал(а):loop detected - ответ вполне ясный. Петля создана на уровне логики extensions.conf а не на уровне технологий. Пришедший звонок запетлёван через Goto. Мы тут этого не видим, так как приведён не весь диал план. Где-то там includes наставлены?
iax.conf
[prov]
type = user
host = X.X.X>X
transfer=no
trunk=yes
context = incomming70
jitterbuffer=no
extensions.conf
[incomming70]
exten => _7XXXXX,1,Dial(SIP/${EXTEN}@localhost)
Принятый через IAX2 звонок уйдёт в SIP/localhost и принимается в SIP какой контекст?
В нём и прописать:
exten => _7XXXXX,1,Answer
exten => _7XXXXX,2,Set(TIMEOUT(digit)=5)
exten => _7XXXXX,3,Set(TIMEOUT(response)=20)
exten => _7XXXXX,4,Background(otvet70)
exten => _7XXXXX,5,WaitExten(5)
в [default] принимается
именно так и было сделано.
диалплан был бехз всяких инклюдов, чисто для отладки, самый что ни есть простой для решения проблемы
в версии астериска 1.4.39 - DTMF не детектились, в 1.8.2.3 - работает, но почему-то в ней не отображается в консоли определенный DTMF, хотя в logger.conf явно указано
console => notice,warning,error,dtmf
но это уже мелочи