четверг, 18 октября 2012 г.

Учим шлюзы завершать звонок самостоятельно.

Такое вот отступление.

Товарищи! Все мы с вами живем в России и прекрасно понимаем, как у нас тут все устроено. Не то, чтобы мне не нравилась наша страна, но случаются моменты, которые определенно бесят и не дают покоя (да-да, это крик души). Например, наши Городские АТС (в дальнейшем ГАТС) все работают по разным принципам и разным технологиям. Чем дальше на восток, тем старее оборудование нам приходится встречать. Цифровые АТС я  вообще могу пересчитать по пальцам, а иной раз встречаются ситуации, где тетенька переключает провода во время коммутации для того, чтобы связать двух клиентов - мне очень жаль этих тетенек и их клиентов.


Как оказалось, например, определение номера по технологии CAllerID (или ЕвроАОН) присутствует далеко не везде. В половине случаев до сих порт ГАТС может предоставить только АОН, что, как вы понимаете, мешает использовать шлюзы для работы в ТМ, а также создает дополнительную нагрузку на диспетчера. 

Отдельная тема - компетенция сотрудников ГАТС. Обсуждать я их не буду, скажу только, что достучаться до этих людей не получается и договариваться с ними обессмыслено. Наверняка у них есть люди, которые смогут говорить со мной на одном языке, однако их никто и никогда не видел, хотя может проблема и во мне.

Но сейчас вопрос не про CallerID и не про сотрудников вашей, а может и не вашей  ГАТС, а про реверс полярности или в простонародье переполюсовка. Данная функция, как понятно из названия, меняет полярность и не абы где, а на линии. Что это дает? А это дает нам возможность точно определить в какой момент времени абонент поднял/положил трубку. А что дает такое знание? А то, что мы точно можем понять, когда нам запускать проговаривание информации роботом или определить положил ли трубку человек, чтобы мы могли ее тоже положить. И в любой из шлюзов изначально заложена возможность распознавания такого средства распознавания.  Казалось бы, что вот и отлично и зачем тогда запарываться с данной статьей?

Все дело в том, что на моей память я могу вспомнить лишь один случай, когда ГАТС предоставляла такую услугу (на платных условиях конечно). Случалось и такое, что сотрудники ГАТС утверждали, что реверс полярности предоставляется всем клиентам, однако по факту ничего такого на линии не было и предоставить они его не могли. Проверяется наличие переполюсовки обычным тестером. В общем и целом нужно уяснить, что реверса полярности с вероятностью 99% у вас нет и придется искать другие варианты решения такой проблемы.

Решениями являются:
  • Купить специальный "отбойник", который цепляется на линию до шлюза и отбивает ее в случае занятости. 
  • "Научить шлюз" тоновым сигналам КПВ, после чего шлюз будет слушать линию на "занятость" и сбрасывать ее в случае, если обнаружит КПВ соответствующее заданным нами параметрам.
Да, в обоих случаях робот на исходящие звонки работать не будет. Это печально, но факт. Научить шлюз определять поднял ли конечный пользователь трубку у меня не получилось ни разу - либо руки кривые, либо руки кривые. В теории это возможно и, если у вас есть удачная практика на этот счет, то срочно звоните и пишите мне - хочу научиться. Так вот речь пойдет дальше о том, как научить шлюз понимать необходимые нам сигналы КПВ.

Для того, чтобы правильно приготовить данный лайфхак вам понадобится:
  1.  Собственно железяка, которую мы будем учить. VoIP-шлюз Nateks voicecom или VoIP-шлюз D-link DVG или VoIP-шлюз Grandstream (да и в принципе любой VOiP-шлюз работающий с аналоговыми линиями). В примере будет рассматриваться Nateks voicecom 115-1.
  2. Программулина Audacity
  3. Уже настроенный Октелл и подключенные к нему шлюз и софтфон/сипфон (данный шаг не обязателен и X-lite, например, можно подключить сразу к шлюзу). Хочу сказать, что все можно сделать и без Октелла, но мы же с вами знаем по какому поводу мы все тут собрались (а еще можно шапку почитать).

Итак, наши действия.

Сразу скажу, что настройка Nateks и D-link практически идентична, т.к. кто-то у кого-то слизал интерфейс. да и внешне они похожи.

Первое, что нужно сделать - это включить распознавание тоновых сигналов на каждой линии в шлюзе. Для этого необходимо зайти на шлюз, далее в Advanced Options (Дополнительные настройки) там увидите непримечательную ссылку Line Settings - смело нажимайте. И меняйте следующий параметр у всех линий на Ring Tone (сигнал КПВ):

Нажимаем Accept (Применить)

Далее звоним на линию, которая подключена к шлюзу. Принимаем звонок через любой софтфон  но предварительно отключите микрофон, чтобы не было лишних шумов (думаю не надо объяснять, что Октелл уже должен быть настроен).  Ждем секунд десять и кладем трубку, но НЕ на софтфоне, а на телефоне с которого звоним. По итогу мы должны слышать в софтфоне короткие гудки, а в Октелле продолжение коммутации (синие трубки в мониторинге), что и является знаком того, что шлюз не может сбросить линию. Слушаем короткие гудки и ждем еще с полминуты, затем сбрасываем звонок и на софтфоне.

Теперь нам необходимо найти запись данного "разговора". Она, вероятнее всего, если вы не меняли настройки записи в Октелле, лежит по пути c:\Program Files\oktell\Server\RecordedFiles\ . Там будет куча папок названных в честь даты записи. Зайдите в папку с текущей датой, найдите папку с названием, которое соответствует времени записи и хватайте файл mix*.wav - другие нас не интересуют. Нужно отметить, что запись разговора можно было произвести и с помощью X-lite'а, например, но мы с вами легких же путей не ищем, потому продолжим.

Запускаем заранее установленный Audacity и перетаскиваем в него наш файл. Вы должны увидеть что-то подобное (зависит от масштаба, конечно):

Для замерения перейдем в нижнюю часть программы и выбираем параметр Длительность, а также отображение в миллисекундах:

Теперь зайдите на шлюзе в настройку параметров КПВ - CPT/Cadence Settings. В группе Busy Tone Cadence Measurment обнулите все значения, которые там есть (а могли появится сами) и уберите все флаги Auto Learning. Теперь вы готовы заносить значения.

Вернитесь в Audasity и замерьте мышкой сигнал, после чего занесите его длину в миллисекундах в BTC#1 T_ON_1 на шлюзе, затем замерьте длину тишины и занесите ее в T_OFF_1 (значения можно округлять):

На шлюзе нажимаем Accept (Применить). И возвращаемся в CPT/Cadence Settings. В Audasity   снова выделяем сигнал и заходим в Анализ/построить график спектра. В появившемся графике наводим курсор на пиковую точку и записываем получившееся значение в поле Low Frequency строки Busy Tone блока CPT#1 на шлюзе.

Далее по строке в поле High Frequency ставим 0 (данное значение определяется в случае, если сигнал будет двухтактный, хотя таких я еще не встречал), в поля  T_ON_1 и T_OFF_1, заносим значения полученные ранее. По сути у вас должно получиться так:

Сохраняйте настройки и перезагружаете шлюз. Теперь он должен понимать занятость и через пару секунд сбрасывать звонок самостоятельно.
Так или иначе я категорически советую вам отказаться от аналоговых линий в пользу SIP'a, что позволит избежать таких заморачиваний. Есть еще вариант использовать VoIPGSM-шлюзы, там тоже нет проблем с определением поднятия трубки.
Дерзайте!