Тема: Asterisk для профи
в общем есть Астер, настроенный, входящие принимает, звонки совершает,
есть база данных sql в которой есть список номеров людей.
нужно при поступлении звонка на спец номер Астериска проверять номер звонящего с номерами в этой базе и по результату (номер есть, номера нет) включать на этом номере звуковой файл либо 1 либо 2…
Номер я создал, аудио дорожки есть. теперь вопрос в том как написать этот скрипт по условию (на подключение к SQL скрипт тоже есть) и выбору определенного файла...
Может кто реализовывал? в линухе вообще профан.
Здравствуйте, для осуществления задуманного не обязательно использовать SQL базу данных, достаточно воспользоваться БД встроенной в Asterisk (AstDB). В частности ее функцией DB_EXISTS.
Используя функцию CALLERID с параметром num можно получить номер вызывающего абонента.
Используя приложение Playback можно воспроизвести Ваши файлы.
Описание функции DB_EXISTS: http://www.voip-info.org/wiki/view/Asterisk+func+db_exists
Описание функции CALLERID: http://www.voip-info.org/wiki/view/Asterisk+func+callerid
Описание приложения Playback: http://www.voip-info.org/wiki/view/Asterisk+cmd+Playback
Итого:
[newcontext]
exten => 100,1,Ringing()
exten => 100,n,Wait(3)
exten => 100,n,Answer()
exten => 100,n,GotoIf(${DB_EXISTS(allowed/${CALLERID(num)})}?newcontext,${EXTEN},play)
exten => 100,n,Playback(file2.gsm)
exten => 100,n,Hangup()
exten => 100,n(play),Playback(file1.gsm)
exten => 100,n,Hangup()
КОД НЕ КОПИРОВАТЬ! ДУМАТЬ!
newcontet - контекст в котором находится Ваш волшебный номер.
100-Ваш волшебный номер
allowed - family в БД астериск (по-русски: таблица БД) в которой хранятся номера
play - метка приоритета, на которой происходит воспроизведение файла №1
Что произошло?
Посылаем пользователю гудки.
Ждем 3 секунды (идут гудки, чтобы люди не пугались вашему файлу №1-2 выстрелившему им в ухо).
Отвечаем на вызов.
Если номер абонента А существует в БД, то перейдем на метку play для проигрывания фала №1 (переход по метке минует проигрывание файла №2).Если номер А не найден в БД, проигрываем файл №2 и кладем трубку.
Кладем трубку.
Перед проверкой необходимо добавить номера в БД. Это можно сделать из CLI Asterisk выполнив команду database put <family> <key> <value>.
Согласно моему примеру я добавил в БД так: database put allowed XXXXXX 1
Окс спасибо за подробное объяснение...
счас буду изучать...
единственное что без SQL мне никак не обойтись... т.к. туда уже пишутся номера автоматом с другой программы... а дублировать их я не вижу смысла.
Какая СУБД используется?
Можно напрямую отправить SQL запрос на выборку (вместо запроса DB_EXISTS) и обработать полученные данные.
Microsoft SQL server 2005
К сожалению, по MSSQL ответ дать не могу, т.к. не пробовал работать с ним.
Но раз Вы можете соединяться с базой данных, то и запрос выполнить сумеете.
Общий алгоритм может быть похож на этот (пример для MYSQL):
[newcontext]
exten => 100,1,Ringing()
exten => 100,n,Wait(3)
exten => 100,n,Answer()
exten => 100,n,MYSQL(Connect connid host login password database)
exten => 100,n,MYSQL(Query resultid ${connid} SELECT COUNT(id) FROM Telephones WHERE Number=${CALLERID(num)})
exten => 100,n,MYSQL(Fetch fetchid ${resultid} phonenumbervalue)
exten => 100,n,MYSQL(Clear ${resultid})
exten => 100,n,MYSQL(Disconnect ${connid})
exten => 100,n,GotoIf(${phonenumbervalue})}?newcontext,${EXTEN},play)
exten => 100,n,Playback(file2.gsm)
exten => 100,n,Hangup()
exten => 100,n(play),Playback(file1.gsm)
exten => 100,n,Hangup()
Например, если у Вас такая таблица БД:
+-------+--------------+----------+
| id Number Name |
+-------+--------------+----------+
| 1 587963 Ivanov |
+-------+--------------+----------+
| 2 698536 Petrov |
+-------+--------------+----------+
Выполнив запрос:
"SELECT COUNT(`id`) FROM `Telephones` WHERE `Number` = 'CALLERID_FROM_ASTERISK'"
Вы получите значение 0 или 1 в случае если номер отсутствует или присутствует соответственно.
Переход к воспроизведению файлов можно осуществить функцией GotoIf из предыдущего примера.
Окс
Огромное спасибо... осталось все это заточить под нас. 😊 ну и понять куда это все впихнуть 😊
Примеры, это части Вашего диалплана - пихать в extensions.conf (хотя это зависит от версии/сборки Вашей Asterisk).
Есть еще один способ решения проблемы (скорее всего самый верный), воспользоваться интерфейсом AGI, но придется написать маленький скрипт/программу на php/perl/pascal/python. Если совсем будет тяжко, помогу с реализацией.