воскресенье, 25 августа 2013 г.

Настройка смены полярности вместо callprogres и busydetect на аналоговых линиях.

Уже довольно давно передо мной стояла задача реализовать автоматизированную систему оповещения на базе asterisk. Для нормальной работы такой системы необходимы определенные условия. Одним из таких условий является однозначное определение факта подъема трубки на принимающей стороне. На аналоговых линиях астериск использует несколько алгоритмов для определения состояния звонка. Настройка callprogres и busydetect для интерфейса dahdi включает алгоритм определения звуковых сигнальных паттернов на линии для определения состояния звонка, этот метод очень популярен, практически все применяют именно его. Но, к сожалению, он не позволяет однозначно определить ровным счетом ничего, то есть нет никакой гарантии, что этот алгоритм не распознает определенную сигнализацию в определенных условиях, либо распознает ее слишком поздно, либо распознает ее там где ее не было. Еще одним недостатком этого подхода является необходимость точного описания паттернов для их обнаружения. Несмотря на то, что в России есть определенные стандарты сигнализации, не всегда операторы в точности их соблюдают, в первую очередь, эти сигналы предназначены для людей, а люди зачастую не предают значения небольшим отличиям в звуке длинного гудка ответа станции или его продолжительности.
Метод определения смены полярности разработан как раз для того, чтобы однозначно обозначить моменты, когда отвечающая сторона подняла трубку и положила ее. Я не буду здесь подробно описывать устройство этого типа сигнализации, информации на эту тему достаточно много в интернете, я сосредоточусь на описании настройки астериска для работы по этой системе и опишу некоторые нюансы.
Предположим в нашем распоряжении имеется сервер с установленным и работающим asterisk(версия 1.8) и настроенным интерфейсом dahdi(версия 2.4), одна, а возможно и несколько аналоговых плат с fxo портами соединенными с оператором. Первым делом необходимо выяснить поддерживает ли ваш оператор эту сигнализацию, а так же добиться от него ее включения на линии.
Проверить видит ли карта переполюсовку можно включив дебуг драйвера dahdi.
echo 1 > /sys/module/dahdi/parameters/debug
После этого действия можно совершить звонок и посмотреть dmesg.
[138842.534627] wctdm24xxp 0000:05:08.0: 4329602929 Polarity reversed (1 -> -1)
[138941.140486] wctdm24xxp 0000:05:08.0: 4329627581 Polarity reversed (-1 -> 1)
Для того, чтобы астериск начал реагировать на смену полярности, необходимо добавить следующие строчки в файл настройки каналов dahdi - chan_dahdi.conf :
answeronpolarityswitch = yes // определяем поднятие трубки при смене полряности
hanguponpolarityswitch = yes // определяем что трубку положили при смене полярности
И тут начинается самое интересное, дело в том, что настройки callprogres и busydetect начинают конфликтовать с настройками answeronpolarityswitch и hanguponpolarityswitch , то есть астериск начинает производить детект дозвона, поднятия трубки и разрыва соединения по всем разрешенным признакам и скорее всего 99% соединений будут разрываться сразу после поднятия трубки на другой стороне. Это означает, что пообщаться по телефону мы сможем только случайно :). Строки с настройками callprogres и busydetect необходимо закомментировать, а еще лучше явно указать запрет использования этих алгоритмов:
callprogres=no
busydetect=no
После всех выше перечисленных действий необходимо выгрузить и загрузить модуль chan_dahdi.so, для этого в консоли астериска набираем:
module unload chan_dahdi.so
module load chan_dahdi.so
К сожалению, использовать команду "module reload chan_dahdi.so" нельзя?! Хоть это и кажется странным и не логичным. "dahdi restart"?!
На сегодняшний день, смена полярности является единственным надежным методом сигнализации поднятия трубки и разрыва соединения для аналоговых линий. Так-же стоит обратить внимание на настройку сигнализации каналов dahdi, в этом примере я использую signalling=fxs_ks .

Комментариев нет: