Приветствую Вас на моем блоге. Здесь Вы встретите описание моих наработок, в основном связанных с VoIP на базе asterisk, CUCM. Также увлечение python не будет опущено.

среда, 7 марта 2018 г.

asterisk Dynamic Clip Routing

Внутренний абонент asterisk вызывает внешнего. Когда внешний абонент перезванивает на городскую линию asterisk, его вызов направляется непосредственно на ранее звонившего внутреннего абонента.
Идея состоит в том, что когда наши внутренние абоненты звонят внешним,"запоминать" кому они звонили и потом использовать это при входящем звонке. Для этого я буду использовать базу данных и func_odbc. 


В сети я встречал пару статей по Dynamic Clip Routing, но там предлагалось использовать Asterisk MYSQL cmd. Но под большой нагрузкой, в частности при использовании в нагруженном контакт-центре, Asterisk MYSQL cmd показал свою ненадежность. Поэтому я рекомендую использовать func_odbc для подобных запросов в базу. Проверено под большой нагрузкой !

Пример исходной задачи:
Есть офис, сотрудники которого, для выхода в PSTN используют один "пилотный номер" либо вообще один единственный канал связи. Не важно используем ли мы выход через PRI, SIP транк, собственный GSM шлюз, либо какой-то другой вид каналов. Исходящую связь в таком случае организовать не составляет труда, но что насчет входящих? 
Представим что сотрудник офиса с внутренним номером 1000  решил позвонить на номер  0441234567, вышел он в город под "пилотным номером" 0440000000 и через какое-то время, этот абонент (с номером 0441234567) решил перезвонить нашему сотруднику.

Приступим к конфигурированию:

__________________________________________________________________________________
если у Вас "чистый" asterisk

1) Нужно создать базу данных и связать ее с asterisk с помощью odbc. Как это делается можно почитать в отличной статье
Далее, в этой базе создаем таблицу

CREATE TABLE `recall` (
  `calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src` varchar(80) NOT NULL DEFAULT '',
  `dst` varchar(80) NOT NULL DEFAULT '',
  KEY `src` (`src`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


2) Добавляем в файл /etc/asterisk/func_odbc.conf  следующее содержимое:

[GET_SRC]
dsn=asteriskcdrdb
readsql=SELECT src FROM recall WHERE dst LIKE '%${ARG1}%' ORDER BY calldate DESC LIMIT 1;
[SET_SRC]
dsn=asteriskcdrdb
writesql=${VALUE}


3) В консоли asterisk выполняем команду
module load func_odbc.so

4) В файле /etc/asterisk/modules.conf добавляем строку 
load => func_odbc.so

5) Изменяем входящий и исходящий диалплан
 Пример:

[PSTN-IN]
exten => _0XXXXXXXXX,1,NoOp(PSTN IN)
same => n,Set(DEST=${ODBC_GET_SRC(${CALLERID(num)})})
same => n,ExecIf($["${DEST}" != ""]?Dial(SIP/${DEST})) 
same => n,Hangup

[PSTN-OUT]
exten => _0XXXXXXXXX,1,NoOp(PSTN OUT)
same => n,Set(ODBC_SET_SRC()=${SQL_ESC(INSERT INTO recall (src,dst) VALUE ("${CALLERID(num)}","${EXTEN}"))})
same => n,Set(CALLERID(num)=0440000000); Укажите свой пилотный номер !
same => n,Dial(SIP/${EXTEN}@YourTrunk); Укажите имя своего транка
same => n,Hangup

6) В консоли выполяем команду
asterisk -rx 'dialplan reload'


__________________________________________________________________________________
если у Вас FreePBX

1) Создаем таблицу в базе asteriskcdrdb.

 CREATE TABLE `recall` (
  `calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src` varchar(80) NOT NULL DEFAULT '',
  `dst` varchar(80) NOT NULL DEFAULT '',
  KEY `src` (`src`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8



2) Создаем  файл /etc/asterisk/func_odbc.conf со следующим содержимым:

[GET_SRC]
dsn=asteriskcdrdb
readsql=SELECT src FROM recall WHERE dst LIKE '%${ARG1}%' ORDER BY calldate DESC LIMIT 1;
[SET_SRC]
dsn=asteriskcdrdb
writesql=${VALUE}

3) Задаем правильные права на созданный файл: 
chown asterisk.asterisk /etc/asterisk/func_odbc.conf
chmod 664 /etc/asterisk/func_odbc.conf

  
В консоли asterisk выполняем команду
module load func_odbc.so

 
4) В файле /etc/asterisk/modules.conf добавляем строку 
load => func_odbc.so
  
Для Входящих звонков:

5) В веб интерфейсе создаем Custom Destination (Admin/Custom Destinations), где 0440000000 - Ваш "пилотный номер"




6) В connectivity/Inbound Routes направляем звонки в ранее созданный Custom Destination (PSTN-IN)
* (Надеюсь Ваш транк имеет входящий контекст from-trunk) 
 


Для Исходящих звонков: 

7) Настраиваем исходящие звонки через Custom Destination
        a) В веб интерфейсе создаем Custom Destination (Admin/Custom Destinations)    

 


        б) В Connectivity/Outbound Routes [Add Route]  создаем исходящий маршрут

 

8) В файле /etc/asterisk/extensions_custom.conf
Добавляем

[PSTN-IN]
exten => _0XXXXXXXXX,1,NoOp(PSTN IN)
same => n,Set(DEST=${ODBC_GET_SRC(${CALLERID(num)})})
same => n,GotoIf($["${DEST}" != ""]?from-internal,${DEST},1)
same => n,Hangup

[PSTN-OUT]
exten => _0XXXXXXXXX,1,NoOp(PSTN OUT)
same => n,Set(ODBC_SET_SRC()=${SQL_ESC(INSERT INTO recall (src,dst) VALUE ("${CALLERID(num)}","${EXTEN}"))})
same => n,Set(CALLERID(num)=0440000000); Укажите свой пилотный номер !
same => n,Dial(SIP/${EXTEN}@YourTrunk); Укажите имя своего транка !
same => n,Hangup()

9) В консоли выполняем команду
asterisk -rx 'dialplan reload'

__________________________________________________________________________________

Теперь если наш внутренний абонент 1000 будет звонить на номер 0441234567, то в таблице recall появится запись

 

Если же абонент с номером 0441234567 решит перезвонить, то произойдет запрос в базу, мы получим номер 1000 и направим на него звонок от абонента. Если же запрос не даст никакого результата, то сработает Hangup. В свою очередь Hangup  можно заменить на тотже номер секретаря, IVR.
Также можно настроить cron, который будет чистить данную таблицу каждую ночь.

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

Отправить комментарий