Кто звонил?
Добавлено: 27 фев 2014, 14:41
Всё сделанное основано на статье http://habrahabr.ru/post/213669/
Как обычно я пытался наскоком быстро сделать всё но не получилось. Так-что опишу свои действия ибо у каждого могут быть свои препоны как в путях и именах файлов так и в самом диалплане.
Поехали.
Устанавливаю.
Правлю файл /usr/local/etc/odbcinst.ini
Далее /usr/local/etc/odbc.ini
Обращайте внимание на пути и имена библиотек, файлов. У меня FreeBSD voip.stniva.ru 9.2-STABLE
Проверяю
Смотрю ошибки в файлах если не получилось.
Продолжаю.
Правлю файл /usr/local/etc/asterisk/res_odbc.conf добавляя в конец
и файл /usr/local/etc/asterisk/func_odbc.conf так-же добавляя в конец
Дальше самое интересное, я выношу эксклюзивные настройки, голосовые меню в отдельный файл. Дабы не засорять и без того большой файл extensions.conf
Тачу файл mobile.ru
Шлёпаю в extensions.conf
В самом верху врубаю новорождённый файл
На входе, у меня это секция [default] отправляю номер 5696 к mobile.ru
5696 Это номер на который ссылается внешний городской на шлюзе. Если всё отлично с АОН то вообще всё прекрасно.
Ну и отправляюсь создавать код в файл mobile.ru. На него я потратил много времени, подгибая под себя и исправляя ошибки из оригинальной статьи, На выходе он у меня получился такой.
Разберём его попорядку.
1) Поднимаем трубку
2) Подключаемся к базе mysql
3) Выполняем запрос (тут я искал строки с номером вызывающего абонента в которых присутствовало-бы ANSWER, NO ANSWER, BUSY. Да и обратите внимание на '8${CALLERID(number)}', у меня LDK300 не отдаёт полностью АОН вызывающего абонента и пришлось подставлять костыли таким макаром.)
4) Получаем результат пишем в var
5) Освобождаем память от запроса
6) Отключаемся от БД
7) Убираем всё лишнее в результате.
8) Индекс для цикла ( Тут на любителя, мне понравилось, что вызывающему абоненту говорится номер внутренний того кто его вызывал, если кому не нравится можете убрать соответствующие строки.)
9) Получаем длину внутреннего номера который нужно произнести
10) Пока индекс меньше длины номера
11) Произносим текущую цифру номера (Укажите путь где есть файлы у вас с медиа файлами озвучки цифр, у меня это оказался /usr/local/etc/asterisk/IT)
12) Увеличиваем индекс на один
13) Заканчиваем цикл
14) Соединяем абонентов (Я отправил в секцию [office] так как у меня там собраны include всех секций в диалплане, вы куда хотите туда посылайте)
15) Кладём трубку ( У меня если поиск не выполнялся успешно, а именно внутреннего номера небыло найдено, то звонок чудным образом начинал уходить по кругу на номер 5696, и asterisk падал. А если трубку класть то при таком повороте вещей вам говорят, что такого номера нет. Типа вам никто не звонил. )
Ну вот как-то так.
Рестартим Астериск, тестим звонки
Пробуйте, сделаете что-то новое напишите как и что, буду благодарен .
Да и вообще пишите вопросы если, что не понятно.
Как обычно я пытался наскоком быстро сделать всё но не получилось. Так-что опишу свои действия ибо у каждого могут быть свои препоны как в путях и именах файлов так и в самом диалплане.
Поехали.
Устанавливаю.
Код: Выделить всё
voip# whereis mysql-connector-odbc
mysql-connector-odbc: /usr/ports/databases/mysql-connector-odbc
voip# cd /usr/ports/databases/mysql-connector-odbc
voip# make install clean
voip#
Код: Выделить всё
[MySQL]
Description = ODBC for MySQL
Driver = /usr/local/lib/libmyodbc5.so
Setup = /usr/local/lib/libodbc.so.2
FileUsage = 1
Код: Выделить всё
[asterisk-connector]
Description=MySQL connection to 'asterisk' database
Driver=MySQL
Server=localhost
Database=БАЗА_АСТЕРИСКА
UID=ЛОГИН_С_ПРАВАМИ_ПОДКЛЮЧЕНИЯ
PWD=ПАРОЛЬ
Port=3306
SOCKET=/tmp/mysql.sock
Проверяю
Код: Выделить всё
voip# isql -v asterisk-connector
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> quit
voip#
Продолжаю.
Правлю файл /usr/local/etc/asterisk/res_odbc.conf добавляя в конец
Код: Выделить всё
[asterisk2mysql]
enabled => yes
dsn => asterisk-connector
pre-connect => yes
Код: Выделить всё
[FROMMOBILE]
dsn=asterisk2mysql
readsql=SELECT channel FROM cdr WHERE dst=${ARG1} ORDER BY calldate DESC LIMIT 1
Тачу файл mobile.ru
Код: Выделить всё
voip# cd /usr/local/etc/asterisk
voip# touch mobile.ru
voip#
В самом верху врубаю новорождённый файл
Код: Выделить всё
#include "mobile.ru"
Код: Выделить всё
exten => 5696,1,Goto(mobile_ru,s,1)
Ну и отправляюсь создавать код в файл mobile.ru. На него я потратил много времени, подгибая под себя и исправляя ошибки из оригинальной статьи, На выходе он у меня получился такой.
Код: Выделить всё
[mobile_ru]
exten => s,1,Answer()
exten => s,2,MYSQL(Connect connid localhost ЛОГИН ПАРОЛЬ БАЗА)
exten => s,3,MYSQL(Query resultid ${connid} SELECT `channel` FROM `cdr` WHERE `dst`='8${CALLERID(number)}' AND `disposition`="NO ANSWER" OR `dst`='8${CALLERID(number)}' AND `disposition`="BUSY" AND `billsec` < "4" ORDER BY `calldate` DESC LIMIT 1)
sition`="BUSY" AND `billsec` < "4" ORDER BY `calldate` DESC LIMIT 1)
exten => s,4,MYSQL(Fetch fetchid ${resultid} var)
exten => s,5,MYSQL(Clear ${resultid})
exten => s,6,MYSQL(Disconnect ${connid})
exten => s,7,Set(CHAN=${SHELL(echo ${var} |tr -d '\n' |sed -e 's/.*\/\(.*\)\-.*/\1/g' |tr -d '\n')})
exten => s,8,Set(i=0)
exten => s,9,Set(COUNTER=${LEN(${CHAN})})
exten => s,10,While($[${i} < ${COUNTER}])
exten => s,11,Playback(/usr/local/etc/asterisk/IT/${CHAN:${i}:1})
exten => s,12,Set(i=$[${i} + 1])
exten => s,13,EndWhile()
exten => s,14,Goto(office,${CHAN},1)
exten => s,15,Hangup()
1) Поднимаем трубку
2) Подключаемся к базе mysql
3) Выполняем запрос (тут я искал строки с номером вызывающего абонента в которых присутствовало-бы ANSWER, NO ANSWER, BUSY. Да и обратите внимание на '8${CALLERID(number)}', у меня LDK300 не отдаёт полностью АОН вызывающего абонента и пришлось подставлять костыли таким макаром.)
4) Получаем результат пишем в var
5) Освобождаем память от запроса
6) Отключаемся от БД
7) Убираем всё лишнее в результате.
8) Индекс для цикла ( Тут на любителя, мне понравилось, что вызывающему абоненту говорится номер внутренний того кто его вызывал, если кому не нравится можете убрать соответствующие строки.)
9) Получаем длину внутреннего номера который нужно произнести
10) Пока индекс меньше длины номера
11) Произносим текущую цифру номера (Укажите путь где есть файлы у вас с медиа файлами озвучки цифр, у меня это оказался /usr/local/etc/asterisk/IT)
12) Увеличиваем индекс на один
13) Заканчиваем цикл
14) Соединяем абонентов (Я отправил в секцию [office] так как у меня там собраны include всех секций в диалплане, вы куда хотите туда посылайте)
15) Кладём трубку ( У меня если поиск не выполнялся успешно, а именно внутреннего номера небыло найдено, то звонок чудным образом начинал уходить по кругу на номер 5696, и asterisk падал. А если трубку класть то при таком повороте вещей вам говорят, что такого номера нет. Типа вам никто не звонил. )
Ну вот как-то так.
Рестартим Астериск, тестим звонки
Пробуйте, сделаете что-то новое напишите как и что, буду благодарен .
Да и вообще пишите вопросы если, что не понятно.