Архив метки: Linux

Asterisk. Соединение абонента с тем же оператором, при обрыве связи

Задача

Имеется небольшой call-центр. Все входящие звонки с разных линий и номеров сначала поступают на сервер Asterisk (FreeBSD+Asterisk 11.14.1), а он в свою очередь распределяет эти звонки между всеми операторами по определенному сценарию (queues).

При звонке, клиент сначала прослушивает голосовое приветствие, потом его сервер соединяет со свободным оператором, и начинается общение. Но часто бывает, что при плохой связи – звонок обрывает. Клиенту приходится заново перезванивать, слушать опять голосовое приветствие (которое порой может длиться до полуминуты), и попадает на оператора… на другого оператора. Приходится заново  рассказывать о своей проблеме другому оператору и решать все по новой. Порой “качество” связи (мобильной) может упасть на столько, что приходится перезванивать по 5-10 раз !!!

Поэтому было решено сделать так, что бы при обрыве, при повторном звонке, от одного и того же клиента – звонок шел без очереди на того же оператора, без голосовых приветсвий и т.д.

Решение

Решение оказалось довольно простым.

Будем использовать существующую базу Asterisk’а – CDRВ этой базе хранятся все записи и входящих и исходящих звонках нашего телефонного сервера.

Открываем файл /etc/asterisk/extensions.conf и правим нужный нам входящий канал. Добавляем такой блок:

 exten => 100,1,MYSQL(Connect connid IP_MYSQL ЛОГИН_MYSQL ПАРОЛЬ_MYSQL БАЗА_MYSQL)

 exten => 100,n,MYSQL(Query resultid ${connid} select dstchannel from cdr where clid like '%${CDR(src)}' and calldate like '${STRF TIME(${EPOCH},,%Y-%m-%d %H)}%')

 exten => 100,n,MYSQL(Fetch fetchid ${resultid} operator)

 exten => 100,n,GotoIf($["${operator}" = ""]?8:5)

 exten => 100,n,MYSQL(Clear ${resultid})

 exten => 100,n,MYSQL(Disconnect ${connid})

 exten => 100,n,Dial(SIP/${operator:-12:3},20,tT)

 exten => 100,n,Background(hello)

 exten => 100,n,Queue(support)

Что мы делаем

При входящем звонке, соединяемся с базой, делаем запрос, на поиск в таблице cdr в поле clid  по номеру водящего звонка (переменная %${CDR(src)} ) и время укажем последний текущий час (переменная ${STRF TIME(${EPOCH},,%Y-%m-%d %H)}%) в поле calldate.  Если звонок “новый” и еще не звонил в течении часа, то запрос вернет пустое значение в переменную operator, и звонок перекинется на проигрывание приветствия, и звонок поступит в очередь операторов, где на него ответит свободный оператор.

Пример cmd asterisk:

 -- Executing [100@local-phones:1] MYSQL("SIP/INPUT_MTS-0000006c", "Connect connid localhost aster password asterisk") in new stack

 -- Executing [100@local-phones:2] MYSQL("SIP/INPUT_MTS-0000006c", "Query resultid 3 select dstchannel from cdr where clid like '%099xxxxxxx' and calldate like '2017-09-06 09%'") in new stack

 -- Executing [100@local-phones:3] MYSQL("SIP/INPUT_MTS-0000006c", "Fetch fetchid 4 operator") in new stack

 -- Executing [100@local-phones:4] GotoIf("SIP/INPUT_MTS-0000006c", "1?8:5") in new stack

 -- Goto (local-phones,100,8)

 -- Executing [100@local-phones:8] BackGround("SIP/INPUT_MTS-0000006c", "hello") in new stack

 -- <INPUT_MTS-0000006c> Playing 'hello.slin' (language 'ru')

 -- Executing [100@local-phones:9] Queue("SIP/INPUT_MTS-0000006c", "support") in new stack

 -- Started music on hold, class 'default', on SIP/INPUT_MTS-0000006c

 == Using SIP RTP CoS mark 5

 -- SIP/971-0000006d is ringing

 -- SIP/971-0000006d answered SIP/INPUT_MTS-0000006c

 -- Stopped music on hold on SIP/INPUT_MTS-0000006c


Если же, клиент уже звонил и в базе cdr уже существует запись о том, что он звонил. Тогда в переменную operator вернется значение – SIP- номер оператора, с кем он разговаривал, и звонок уже вне очереди поступит напрямую к тому же оператору.

 -- Executing [100@local-phones:1] MYSQL("SIP/INPUT_MTS-0000006a", "Connect connid localhost aster password asterisk") in new stack

 -- Executing [100@local-phones:2] MYSQL("SIP/INPUT_MTS-0000006a", "Query resultid 1 select dstchannel from cdr where clid like '%099xxxxxxx' and calldate like '2017-09-06 09%'") in new stack 

 -- Executing [100@local-phones:3] MYSQL("SIP/INPUT_MTS-0000006a", "Fetch fetchid 2 operator") in new stack

 -- Executing [100@local-phones:4] GotoIf("SIP/INPUT_MTS-0000006a", "0?8:5") in new stack

 -- Goto (local-phones,100,5)

 -- Executing [100@local-phones:5] MYSQL("SIP/INPUT_MTS-0000006a", "Clear 2") in new stack

 -- Executing [100@local-phones:6] MYSQL("SIP/INPUT_MTS-0000006a", "Disconnect 1") in new stack

 -- Executing [100@local-phones:7] Dial("SIP/INPUT_MTS-0000006a", "SIP/971,20,tT") in new stack



2017-09-06T10:41:35
Asterisk

Как пользоваться Linux

В интернете существует множество инструкций, о том как установить Linux на компьютер, как установить его с несколькими другими системами, как настроить определенные аспекты работы, как делать те или иные действия, но нет дельной статьи о том, как пользоваться Linux, какие действия и когда стоит выполнять, зачем это нужно и как все делать правильно.

Мы поговорим о настройке системы, безопасности, обновлениях, журналах, очистке, резервном копировании и других подобных вещах. Я не претендую на звание эксперта в этой области. Я так делаю в своей системе и предлагаю делать вам, но это всего лишь мое мнение, вы и другие пользователи могут считать по-другому. Статья использование linux ориентирована на обычных пользователей, а не системных администраторов и программистов. Но я думаю, что вы можете найти что-то полезное для себя в этой статье.

Читать

🐧 Опасные команды Linux

Операционная система Linux  с открытым исходным кодом нарастила обороты со временем, но все таки ее еще нельзя назвать по настоящему популярной.

Многих останавливает проблема обучения Линукс, или просто момент перестройки с привычного Windows.

Так же, работа в “никсах” предполагает различые манипуляции с командной строкой.

Но если вы не используете команды Linux полностью отдавая отчет в своих действиях, вы можете потерять свои данные, или повредить свою ОС

В этой статье я собираюсь предоставить информации о опасных командах, на которые необходимо обратить внимание при использовании Linux. Читать

Входящие звонки по времени в FreePBX

Работу системы FreePBX можно организовать таким образом, чтобы телефония работала по разной логике в различное время суток. Например, можно сделать разделение на дневной и ночной режимы работы. В данной статье будет рассмотрен заворот входящей маршрутизации в правила по времени.

Постановка задачи


Рассмотрим следующую ситуацию (разделени на дневной и ночной режимы): необходимо чтобы днем все входящие звонки заворачивались на IVR с приветствием и возможностью выбора подменю и донабора внутренних номеров сотрудников, а в нерабочее время уже озвучивалось другое IVR в котром будет отключена возможность прямого донабора и по таймауту будет переход, например, на голосовую почту, чтобы звонивший мог оставить сообщение.

Изначально необходимо создать два разных IVR и назвать их, например, IVR-day и IVR-night. (Более подробно о составлении IVR можно посмотреть здесь)

Создание временной группы


Далее создаются необходимые временные группы. Настройки производятся на вкладке Applications>Time Groups: в поле Description вводится описание временной группы — целесообразно в описании указывать временной диапазон, который будет использоваться. Затем настраиваются параметры времени: Time to start/Time to finish — время начала/окончания работы группы (время можно выставлять с точностью до минуты), Week Day start/Week Day finish — день недели началы/окончания работы. Для примера возьмем с понедельника по пятницу с 9:00 до 18:00.

После сохранения настроек созданные временные группы отображаются в правом верхнем углу окна. Здесь же находится кнопка Add Time Group при нажатии на которую открывается страница добавления новой временной группы.

 

Создание правил по времени


Теперь можно перейти на страницу создания Временных правил: Applications>Time Conditions. В поле Time Condition name задается имя правила, например, worktime. В поле Time Group выбирается созданная на предыдущем шаге временная группа. Поле Destination if time matches (Назначение если время совпадает) — соответственно выставляет назначение куда будет направлен входящий звонок при совпадении времени — в данном случае будет завернут в IVR-day. Поле Destination if time does not match (Назначение если время не совпадает) — соответственно выставляет назначение куда будет направлен входящий звонок при не совпадении времени — в данном случае будет завернут в IVR-night.

 

Заворот входящих звонков в правило по времени


Теперь необходимо завернуть входящие маршруты на только что созданное правило по времени. Вкладка Connectivity>Inbound Route. Создается маршрут для AnyDID/AnyCID и заворачивается на созданное правило по времен: в поле Set Destination указывается Time Conditions, затем выбирается необходимое правило.

На этом настройка перенаправление входящей маршрутизации на правила по времени закончена.



2017-07-28T16:32:58
Asterisk

Как установить MyDLP Linux

MyDLP – простое и открытое DLP (data loss prevention) решение, лицензируемое под GPLv3.

Устроен MyDLP  на основе Ubuntu Server.

Включает в себя : защиту пользовательских записей, защиту конфиденциальных файлов,контроль за осуществлением потока данных.

Читать

5 отличных альтернатив Steam для Linux

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

Однако не всем в сообществе Linux нравится Steam. Они видят в коммерческой игровой платформе угрозу свободе софта, так как она содержит много DRM. В результате многие любители игр в Linux ищут альтернативу, обходящуюся без использования DRM. Ниже представлен список из пяти таких платформ.

1. Itch.io

Это солидная альтернатива Steam. Itch.io имеет хорошо проработанный декстопный клиент для Linux с аналогичной функциональностью в плане покупки и запуска игр.

Читать