Форумы  ·  Войти  · 

Тема: Asterisk для профи

15.09.11 5:23   heaven84  (39/12.10.10)  

в общем есть Астер, настроенный, входящие принимает, звонки совершает,
есть база данных sql в которой есть список номеров людей.
нужно при поступлении звонка на спец номер Астериска проверять номер звонящего с номерами в этой базе и по результату (номер есть, номера нет) включать на этом номере звуковой файл либо 1 либо 2…

Номер я создал, аудио дорожки есть. теперь вопрос в том как написать этот скрипт по условию (на подключение к SQL скрипт тоже есть) и выбору определенного файла...

Может кто реализовывал? в линухе вообще профан.

[ #1 ]  15.09.11 8:47   Окс  EXPERT  

Здравствуйте, для осуществления задуманного не обязательно использовать 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

[ #2 ]  15.09.11 9:32   heaven84  (39/12.10.10)  

Окс спасибо за подробное объяснение...
счас буду изучать...
единственное что без SQL мне никак не обойтись... т.к. туда уже пишутся номера автоматом с другой программы... а дублировать их я не вижу смысла.

[ #3 ]  15.09.11 10:48   Окс  EXPERT  

Какая СУБД используется?
Можно напрямую отправить SQL запрос на выборку (вместо запроса DB_EXISTS) и обработать полученные данные.

[ #4 ]  15.09.11 11:09   heaven84  (39/12.10.10)  

Microsoft SQL server 2005

[ #5 ]  15.09.11 11:30   Окс  EXPERT  

К сожалению, по 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 из предыдущего примера.

[ Изменено: 15.09.11 12:08 Окс ]
[ #6 ]  15.09.11 11:42   heaven84  (39/12.10.10)  

Окс
Огромное спасибо... осталось все это заточить под нас. 😊 ну и понять куда это все впихнуть 😊

[ #7 ]  15.09.11 13:50   Окс  EXPERT  

Примеры, это части Вашего диалплана - пихать в extensions.conf (хотя это зависит от версии/сборки Вашей Asterisk).
Есть еще один способ решения проблемы (скорее всего самый верный), воспользоваться интерфейсом AGI, но придется написать маленький скрипт/программу на php/perl/pascal/python. Если совсем будет тяжко, помогу с реализацией.

Komendant.pro
 ©1999-2025  Инженерная лаборатория "Комендантъ"