Внутренний абонент asterisk вызывает внешнего. Когда внешний абонент
перезванивает на городскую линию asterisk, его вызов направляется
непосредственно на ранее звонившего внутреннего абонента.
Идея состоит в том, что когда наши внутренние абоненты звонят внешним,"запоминать" кому они звонили и потом использовать это при входящем звонке. Для этого я буду использовать базу данных и func_odbc.
В сети я встречал пару статей по Dynamic Clip Routing, но там предлагалось использовать Asterisk MYSQL cmd. Но под большой нагрузкой, в частности при использовании в нагруженном контакт-центре, Asterisk MYSQL cmd показал свою ненадежность. Поэтому я рекомендую использовать func_odbc для подобных запросов в базу. Проверено под большой нагрузкой !
Пример исходной задачи:
Есть офис, сотрудники которого, для выхода в PSTN используют один "пилотный номер" либо вообще один единственный канал связи. Не важно используем ли мы выход через PRI, SIP транк, собственный GSM шлюз, либо какой-то другой вид каналов. Исходящую связь в таком случае организовать не составляет труда, но что насчет входящих?
Приступим к конфигурированию:
если у Вас "чистый" 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
[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.
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 - Ваш "пилотный номер"
Для Исходящих звонков:
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, который будет чистить данную таблицу каждую ночь.
Идея состоит в том, что когда наши внутренние абоненты звонят внешним,"запоминать" кому они звонили и потом использовать это при входящем звонке. Для этого я буду использовать базу данных и 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;
dsn=asteriskcdrdb
writesql=${VALUE}
3) В консоли asterisk выполняем команду
module load func_odbc.so
4) В файле /etc/asterisk/modules.conf добавляем строку
load => func_odbc.so
5) Изменяем входящий и исходящий диалплан
Пример:
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
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;
`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}
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, который будет чистить данную таблицу каждую ночь.
Комментариев нет:
Отправить комментарий