Метод определения смены полярности разработан как раз для того, чтобы однозначно обозначить моменты, когда отвечающая сторона подняла трубку и положила ее. Я не буду здесь подробно описывать устройство этого типа сигнализации, информации на эту тему достаточно много в интернете, я сосредоточусь на описании настройки астериска для работы по этой системе и опишу некоторые нюансы.
Предположим в нашем распоряжении имеется сервер с установленным и работающим 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)Для того, чтобы астериск начал реагировать на смену полярности, необходимо добавить следующие строчки в файл настройки каналов dahdi - chan_dahdi.conf :
[138941.140486] wctdm24xxp 0000:05:08.0: 4329627581 Polarity reversed (-1 -> 1)
answeronpolarityswitch = yes // определяем поднятие трубки при смене полряностиИ тут начинается самое интересное, дело в том, что настройки callprogres и busydetect начинают конфликтовать с настройками answeronpolarityswitch и hanguponpolarityswitch , то есть астериск начинает производить детект дозвона, поднятия трубки и разрыва соединения по всем разрешенным признакам и скорее всего 99% соединений будут разрываться сразу после поднятия трубки на другой стороне. Это означает, что пообщаться по телефону мы сможем только случайно :). Строки с настройками callprogres и busydetect необходимо закомментировать, а еще лучше явно указать запрет использования этих алгоритмов:
hanguponpolarityswitch = yes // определяем что трубку положили при смене полярности
callprogres=noПосле всех выше перечисленных действий необходимо выгрузить и загрузить модуль chan_dahdi.so, для этого в консоли астериска набираем:
busydetect=no
module unload chan_dahdi.soК сожалению, использовать команду "module reload chan_dahdi.so" нельзя?! Хоть это и кажется странным и не логичным. "dahdi restart"?!
module load chan_dahdi.so
На сегодняшний день, смена полярности является единственным надежным методом сигнализации поднятия трубки и разрыва соединения для аналоговых линий. Так-же стоит обратить внимание на настройку сигнализации каналов dahdi, в этом примере я использую signalling=fxs_ks .