Asterisk игнорирует DTMF во время всех вызовов - не может использовать функции нажатия клавиш

Астериск 1.4.21.2 под uClinux на ATCOM IP01. (РЕДАКТИРОВАТЬ: между прочим, я не думаю, что возможно обновить Asterisk до более новой версии, чем 1.4 на uClinux, но если кто-нибудь знает способ, мне было бы интересно узнать. Но я не думаю, что проблема зависит от версии.)

Карта функций в features.conf выглядит следующим образом, но нажатие клавиш во время вызова не имеет никакого эффекта.

[featuremap]
blindxfer => *#         ; Blind transfer  (default is #)
disconnect => ***0              ; Disconnect  (default is *)
;automon => *1                  ; One Touch Record a.k.a. Touch Monitor
atxfer => *0                    ; Attended transfer
;parkcall => #72                ; Park call (one step parking)

CLI показывает, что настроенная карта функций вступила в силу:

IP0x*CLI> feature show channels
No feature channels in use

IP0x*CLI> feature show
Builtin Feature           Default Current
---------------           ------- -------
Pickup                    *8      *8
Blind Transfer            #       *#
Attended Transfer                 *0
One Touch Monitor
Disconnect Call           *       ***0
Park Call

Dynamic Feature           Default Current
---------------           ------- -------
(none)

Call parking
------------
Parking extension   :   700
Parking context     :   parkedcalls
Parked call extensions: 701-750

Используются разные телефоны (Grandstream BT-200, Panasonic KX-TGP500, X-Lite 4), но всегда одна и та же проблема. Все телефоны настроены на использование rfc2833, который является режимом DTMF Asterisk по умолчанию; также попытался явно установить dtmfmode=rfc2833 в sip.conf.

Никакие клавиши, нажатые во время звонка, никогда не получают ответа от Asterisk. Клавиши * и # всегда распознаются Asterisk, когда не происходит вызов (в диалплане или во время голосовой почты).

Если ведение журнала DTMF включено с помощью full => verbose,debug,dtmf или full => verbose,error,warning,dtmf, в журнале не появляются записи DTMF, несмотря на нажатие множества клавиш во время вызова.

В чем может быть проблема?


РЕДАКТИРОВАТЬ: теперь следует дополнительная информация, показывающая команду Dial, используемую в диалплане.

РЕДАКТИРОВАТЬ: я обнаружил, что проблема все еще возникает без использования этого макроса ael, просто имея exten=261,1,Dial(SIP/261) в extensions.conf. Поэтому я удалил аэль из вопроса, чтобы не загромождать его.

Теперь я попытался добавить canreinvite = no и relaxdtmf=yes в sip.conf, но проблема остается.

Я также обнаружил, что регистрация DTMF действительно происходит во время вызова по каналу ZAP (в отличие от каналов SIP, которые я пробовал раньше). Но DTMF по-прежнему не запускает функции. Ниже приведен пример журнала DTMF.

[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 180 ms
[May 22 08:25:46] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 160 ms
[May 22 08:25:46] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 140 ms
[May 22 08:25:47] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '0' received on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '0' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2116 __ast_read: DTMF end '0' received on SIP/251-01354004, duration 280 ms
[May 22 08:25:47] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '0' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '0' on SIP/251-01354004
IP0x*CLI>

person Reg Edit    schedule 20.05.2014    source источник
comment
Какую команду Dial вы используете в диалплане?   -  person moonstruck    schedule 20.05.2014
comment
Я отредактировал вопрос, чтобы включить подробности.   -  person Reg Edit    schedule 20.05.2014
comment
Об обновлении не может быть и речи? 1.4 был EOL в 2012 году, wiki.asterisk.org/wiki/display/AST/ Asterisk+Versions — не так много установок 1.4, с которыми можно сравнивать.   -  person dougBTV    schedule 20.05.2014
comment
Обновление @dougBTV было бы неплохо, но я не думаю, что можно перейти на более высокую версию, чем 1.4, под uClinux? Я отредактировал вопрос, чтобы упомянуть об этом.   -  person Reg Edit    schedule 05.07.2015
comment
@RegEdit Я бы рекомендовал установить его из исходного кода. На самом деле это довольно просто, и есть приятный интерфейс ncurses для выбора нужных модулей. Ознакомьтесь с каноническими инструкциями @ wiki.asterisk.org/wiki/ дисплей/АСТ/   -  person dougBTV    schedule 06.07.2015


Ответы (1)


Наконец взломал это.

Это правда, что настройка canreinvite=no не позволяет SIP-телефонам согласовывать прямое соединение между собой после того, как Asterisk первоначально установила вызов, поэтому Asterisk остается на пути передачи мультимедиа (и, таким образом, знает о любом DTMF, который они посылают).

Но даже в этом случае, чтобы Asterisk фактически отвечал на DTMF и вызывал настроенные функции передачи, вы должны явно включить передачу для каждого вызова, передав опции T и/или t в качестве параметров команды Dial.

Более новые версии features.conf обращают на это внимание:

;atxfer => *2                   ; Attended transfer  -- Make sure to set the T and/or t option in the Dial() or Queue()  app call!

Итак, исправление заключалось в том, что мне пришлось изменить свой код AEL, чтобы добавить параметры T и/или t везде, где код использует команду Dial.

Единственная оставшаяся загадка, с которой я тогда остался, заключалась в том, как прервать перенос с участием; например, если не было ответа, из-за чего было утомительно ждать тайм-аута, или передача начала переходить на голосовую почту, что потенциально делает желательным вместо этого вернуться к другой стороне. Путем экспериментов я в конце концов обнаружил, что функция использования нажатия клавиши для отключения вызова также работает для прерывания перевода:

;disconnect => *0               ; Disconnect  (default is *)  

Более новые версии features.conf содержат расширенный комментарий, хотя и не относящийся к переводам:

;disconnect => *0               ; Disconnect  (default is *) -- Make sure to set the H and/or h option in the Dial() or Queue() app call!

Что я обнаружил, так это то, что даже без передачи параметров H и/или h команде Dial функцию отключения можно использовать для прерывания переноса с участием оператора. И нет никакого конфликта между этим и передачей параметров H и/или h команде набора номера: если вы хотите сделать это и использовать эту функцию для любого типа отключения, она остается эффективной для прерывания передачи без отключения всего вызова (хотя использование тогда может потребоваться что-то другое, кроме значения по умолчанию *, так как любые последовательности, начинающиеся с *, теперь вместо этого обрывают вызов!).

Команда Dial в моем коде AEL для исходящих вызовов на Zap/1 теперь выглядит так:

Dial(Zap/1/${number},,T);

И все функции передачи теперь работают нормально.

person Reg Edit    schedule 01.06.2014