3G модем + asterisk. Часть 3: Настройки chan_dongle - проблемы и решения
Отсутствие голоса при звонках
Отсутствие голоса при звонках через asterisk и chan_dongle - одна из наиболее частых проблем при настройке, имеющая массу причин. Перечисленные здесь причины отсортированы от нижних уровней (железо) к более высоким (софт/настройки):
- Отключен звук в самой прошивке 3G модема.
- В прошивке голосовые функции есть, но голос отключен.
- Неверно указано устройство для передачи голоса.
- Слишком низкая громкость звука в настройках chan_dongle
Отключен звук в самой прошивке 3G модема
Как уже говорилось в первой части этой статьи, голосовые функции могут быть отключены в самой прошивке Вашего 3G модема. В этом случае никакая настройка не поможет, надо менять прошивку и/или разблокировать модем (активировать звук). Определить отключен ли звук в самой прошивке, можно косвенно - если никакие действия по включению звука не срабатывают, то вероятнее всего, что звук отключен в самой прошивке модема.
В прошивке голосовые функции есть, но голос отключен
Возможен также вариант - что в самой прошивке звуковые функции включены (предактивированы), однако при звонках с модема ничего не слышно. Проверить это, а также включить соответствующие функции можно с помощью AT команд посылаемых 3G модему. Как отправлять AT-команды на 3G модем в Windows, см. Приложение 2 "Работа с 3g модемом в Windows". Как отправлять AT-команды на 3G модем в Linux, см. Приложение 3 "Работа с 3g модемом в Linux".
В нашем же случае возможен немного более простой вариант: поскольку asterisk уже установлен и настроен, chan_dongle скомпилирован и тоже настроен, звонки проходят (модем может их принимать и может звонить сам), то с помощью asterisk CLI и команд dongle мы можем отправить модему (почти) любую AT команду и посмотреть ее результат. Почему почти любую? Потому что в командной строке asterisk не воспроизводится символ вопросительного знака - "?".
Для проверки, включены ли голосовые функции в модеме, необходимо отправить на 3G модем AT команду:
AT^CVOICE=?
Однако, из asterisk CLI мы этого сделать не можем, поскольку символ "?" не вводится в строку команд астериска. Поэтому для проверки поддержки голоса такие команды необходимо выполнять из Windows или из Linux.
Обратите внимание, что в этом случае chan_dongle (и любые другие сервисы, подключенные и использующие этот 3G модем) должны быть остановлены! Иначе они будут мешать обмену AT командами!
Из командной строки asterisk Вы можете попробовать сразу включить поддержку голоса. Для этого достаточно выполнить следующую команду (из asterisk CLI, при включенном, подключенном к 3G модему и настроенном chan_dongle):
dongle cmd <имя-донгла> AT^CVOICE=0
например:
dongle cmd dongle0 AT^CVOICE=0
В результате у Вас должно отобразиться сообщение, подобное этому:
[dongle0] 'AT^CVOICE=0' Command queued for execute
[dongle0] Got Response for user's command:'OK'
Если же Вы увидите подобное сообщение, значит произошла ошибка (возможно это значит, что голосовые функции модема отключены в самой прошивке):
[dongle0] Got Response for user's command: 'ERROR'
Узнать подробнее о команде AT^CVOICE Вы можете в Приложении 1 "AT команды для 3g модемов".
Неверно указано устройство для передачи голоса
Возможно, что у Вас просто неверно указано (в настройках chan_dongle) устройство для передачи голоса (ttyUSB...). В большинстве случаев при подключении 3G модемов в системе появляются 3 дополнительных устройства:
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
Одно из этих устройств отвечает за передачу голоса. Другое - за передачу AT команд (обмен данными с 3G модемом). Если Вы правильно определили, какое из устройств отвечает за передачу AT команд (в этом случае модем может принимать и совершать звонки), то просто попробуйте сменить имя устройства для передачи голоса в настройках dongle.conf - выставьте в качестве имени имя третьего ttyUSB устройства, которое Вы еще не использовали.
Слишком низкая громкость звука в настройках chan_dongle
За громкость звука, передаваемого через chan_dongle, отвечают параметры txgain и rxgain в секции defaults, либо в секции dongleX (где X - число от 0 до ...), всё это расположено в файле dongle.conf в настройках asterisk.
Возможен вариант, что выставлена слишком низкая громкость (отрицательные числа для параметров txgain и/или rxgain).
Другой вариант - громкость очень низкая изначально (по умолчанию), и ее надо увеличить - т.е. увеличить значения параметров txgain/rxgain, например txgain = 10 и rxgain=10.
Chan_dongle и DTMF
Итак, Вы установили и настроили астериск, собрали chan_dongle и интегрировали в астериск. Звонки проходят, голос слышен, но DTMF работает плохо: то некоторые цифры теряются (выпадают) при наборе номера, то наоборот, удваиваются или даже утраиваются: при каждом нажатии генерируется 2 или даже 3 цифры.
Здесь представлены варианты решений проблем с DTMF, которые могут быть использованы каждое по отдельности или в какой-либо комбинации:
- Сначала (независимо от вида проблемы с DTMF) настоятельно рекомендуем проверить (и попробовать улучшить, если есть необходимость) качество сигнала GSM (как это сделать см. "Диагностика chan_dongle" внизу статьи). Нередко это кардинальный способ решения проблемы, и (если есть такая возможность) начать следует именно с него. Если же все остальные действия не приведут к желаемому результату, то опять же, надо вернуться к попыткам усиления сигнала GSM.
- Увеличить/уменьшить громкость. В данном случае речь идет о параметре rxgain (получение звука от 3G модема / GSM сети) в файле dongle.conf. В разных условиях возможны совершенно противоположные варианты: где-то бывает необходимо незначительно уменьшить громкость (rxgain = -2), а где-то - увеличить, причем иногда даже значительно (rxgain = 20).
- Произвести настройку параметров распознавания DTMF: это параметры mindtmfgap, mindtmfduration, mindtmfinterval в файле dongle.conf. К примеру, по умолчанию mindtmfduration (это минимальная длительность DTMF в миллисекундах) в этом файле равен 80, в то время как стандарт DTMF поддерживает "цифры" длительностью от 40 мс.
- Попробовать изменить параметр dtmf в файле dongle.conf (по умолчанию dtmf=relax). Выставьте dtmf=inband и посмотрите, что получится.
- Отключить определение активности голоса (voice activity detection, vad). Для этого в файле codecs.conf выставьте следующий параметр:
vad=false
- Нужно пропатчить астериск, изменив [уже распознанные] DTMF коды, повысив их частоту, чтобы asterisk не мешал работе chan_dongle. Подробнее см ниже в статье "патч asterisk для работы chan_dongle и DTMF".
Теряются цифры при наборе DTMF в chan_dongle asterisk
Если у Вас DTMF работает (т.е. большая часть цифр распознается), но некоторые цифры пропадают, то в первую очередь попробуйте включить отладку DTMF (см. "Диагностика chan_dongle" внизу статьи). Т.е. Вам нужно убедиться, что нажатия цифр воспринимаются, но игнорируются. В данном случае рекомендуем несколько вариантов решения проблемы:
- увеличить/уменьшить громкость
- произвести настройку параметров распознавания DTMF
- если (вдруг) включено dtmf=inband, поменять на dtmf=relax
Удваиваются и утраиваются цифры при наборе номера в chan_dongle
Бывает также, что при нажатии части (или всех) цифр asterisk воспринимает каждую цифру, как будто она была нажата дважды (или даже трижды). В этом случае рекомендуем в первую очередь попробовать следующие решения:
- отключить определение активности голоса
- пропатчить астериск, изменив частоты распознанных DTMF
- увеличить/уменьшить громкость
Патч asterisk для работы chan_dongle и DTMF
Как написано в одном из постов на форуме, Бюджетное решение Asterisk <-> GSM [часть 1]:
"...DTMF [в chan_dongle] детектится кодом, который предоставляет ядро астериска, chan_dongle только вызывает или не вызывает этот код астериска в зависимости от опции.
Когда начало или конец символа определился кодом астериска, chan_dongle кидает его как специальный управляющий фрейм в восходящий канал.
Астериск ... воспроизводит этот фрейм на другую ногу звонка как НОВЫЙ DTMF и в тоже время пропускает его же на другую ногу в INBAND (т.е. прямо в звуке).
Если в канале есть эхо вот и начинается ...
Научите астериск не бросать явный DTFM в другую ногу и всё..."
В статье Changing DTMF tone frequency in Asterisk как раз и описано решение данной проблемы, т.е. патч астериска:
В исходниках asterisk, в файле dsp.c, найдите следующие строки:
И замените их на:
Эта замена увеличит частоты распознанных DTMF кодов на 40 Hz и этого будет достаточно для того, чтобы asterisk игнорировал эти (уже распознанные из потока) DTMF коды.
После этого Вам необходимо произвести пересборку asterisk. Для этого из каталога с исходными кодами asterisk выполните следующие команды:
make clean
make
make install
Сброс / переинициализация chan_dongle
Вы подключили 3G модем, установили и сделали все необходимые настройки chan_dongle, и всё работает. Но время от времени (раз в неделю или раз в месяц) так или иначе донгл "зависает": asterisk не поднимает трубку, либо абонент недоступен и т.д. Причем сама такая проблема не решается - любые попытки reload chan_dongle ни к чему не приводят.
В этом случае достаточно просто вытащить 3G модем из компьютера и подключить его снова. Но для серверных систем этот метод не подходит. Поэтому можно воспользоваться командой сброса модема:
dongle reset <имя-донгла>
например:
dongle reset dongle0
Обратите внимание: эта операция занимает довольно продолжительное время! Т.е. в течение нескольких минут 3G модем будет недоступен, asterisk будет выдавать сообщения об ошибках, и только по окончании инициализации модема chan_dongle успешно загрузится (автоматически).
Диагностика chan_dongle
Диагностика нажатий DTMF
Для включения диагностики DTMF обратимся к файлу logger.conf: Вы можете как в консоли, так и в файле логов asterisk (обычно это файл messages или full) включить диагностику DTMF следующим образом:
После этого необходимо перезагрузить модуль logger. Например, из asterisk CLI выполните команду:
logger reload
Проверка качества сигнала GSM
Для определения уровня сигнала GSM воспользуйтесь следующей командой в asterisk CLI:
dongle show device state <имя-устройства>
например:
dongle show device state dongle0
В строке RSSI указан уровень сигнала GSM, принимаемого Вашим 3G модемом. Это отрицательное число, и чем оно больше (напоминаю, что число -10 больше, чем -50), тем лучше уровень сигнала.
Данные о звонках через dongle
Для получения данных о звонках через dongle, например какие кодеки используются, какие переменные CDR передаются, и так далее и тому подобное, сделайте следующее:
- Выполните звонок извне на донгл
- Во время звонка в консоли asterisk выполните команду:
core show channel <имя канала>
помните, что можно использовать автодополнение: наберите "core show channels d" (без кавычек), а потом нажмите клавишу Tab. Имя канала выглядит примерно так:
Dongle/dongle0-010000000d
В строке NativeFormats указан кодек, используемый chan_dongle (slin).
Материалы, использованные при подготовке статьи
- Asterisk и DTMF при callback
- Asterisk and DTMF (TouchTone)
- Использование Asterisk для приема данных от охранных систем
- Бюджетное решение Asterisk <-> GSM [часть 1]
- Changing DTMF tone frequency in Asterisk
Вы читаете статью "3G модем + asterisk", состоящую из нескольких частей:
- 3G модем + asterisk. Часть 1: Подключение модема к компьютеру и перевод из режима "составное устройство" в режим "только модем".
- 3G модем + asterisk. Часть 2: Настройка chan_dongle и asterisk.
- 3G модем + asterisk. Часть 3: Настройки chan_dongle - проблемы и решения.
- 3G модем + asterisk. Приложение 1: AT команды для 3G модемов.
- 3G модем + asterisk. Приложение 2: Работа с 3G модемами в Windows.
- 3G модем + asterisk. Приложение 3: Работа с 3G модемами в Linux.
|