Адресная книга в Asterisk на коленке

6 Сен
2011

Есть у нас на фирме небольшой сервер Asterisk, который раскидывает входящие звонки по отделам. Захотелось сделать чтобы привходящем звонке от оператора, кроме номера телефона, еще и определялась дополнительная информация (ФИ, фирма, отдел, и т.д), это удобно, сразу понятно кто звонит и как разговаривать с абонентом.
Задачу разделим на две части
— создаем адресную базу в MySQL
— правим диалплан Asterisk.

Создаем базу «address_book»
create database address_book

В ней создаем таблицу, в которой будет два поля — номер телефона и имя абонента. Все номера телефонов должны быть в одном формате, это нужно будет для поиска совпадении при входящем звонке.
Структура таблицы «t_book»
CREATE TABLE `t_book` (
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`phone` varchar(80) NOT NULL DEFAULT '',
`name` varchar(80) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `phone` (`phone`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

Даем полные права на что бы не заморачиваться
grant all on address_book.t_book to 'localhost'@'asterisk_user' identified by 'Asterisk_books'

Не забываем
flush privileges

Заполнить содержимое таблицы можно как в ручную, так и скриптом.
Теперь переходим ко второй части задачи.
Меняем контекст, обрабатывающий входящие звонки в extensions.conf.
[check_number]
exten => s,1,NoOp(================ Incoming call from ${CALLERID(number)} to: ${SIP_HEADER(TO):5:6})
exten => s,n,GotoIf($[ ${LEN(${CALLERID(number)})} > 6 ]?mob:gorod)
exten => s,n(mob),Set(_MY_NUM=373${IF($[ ${CALLERID(number):0:1} = 0]?${CALLERID(number):1}:${CALLERID(number)})})
exten => s,n,Goto(check_number,s,mysql)
exten => s,n(gorod),Set(__MY_NUM=37322${CALLERID(number)})}
exten => s,n(mysql),MYSQL(Connect connid localhost asterisk_user Asterisk_books address_book)
exten => s,n,MYSQL(Query resultid ${connid} SELECT phone,name FROM asterisk.t_book WHERE phone=${MY_NUM} LIMIT 1)
exten => s,n,MYSQL(Fetch fetchid ${resultid} MY_PHONE MY_NAME)
exten => s,n,GotoIf($["${fetchid}" = "1"]?s,found)
exten => s,n,MYSQL(Clear ${resultid})
exten => s,n,MYSQL(Disconnect ${connid})
exten => s,n,Goto(inbound_firma,${SIP_HEADER(TO):5:6},1)
exten => s,n(found),NoOP(===${MY_PHONE} ===${MY_NAME})
exten => s,n,MYSQL(Clear ${resultid})
exten => s,n,MYSQL(Disconnect ${connid})
exten => s,n,Set(CALLERID(all)=${MY_NAME} <${CALLERID(number)}>)
exten => s,n,Goto(inbound_firma,${SIP_HEADER(TO):5:6},1)
exten => s,n,Hangup()

В данном контексте, при поступлении входящего звонка номер приводиться вмеждународный формат, затем проверяетя наличие данного номера в базе, и если он найден — отображении не дисплее телефона.
Все теперь мы знаем, кто нам звонит!
По материалам Хабрахабр.



загрузка...

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

Наверх