Уведомление при перехвате вызова в Asterisk

от автора

Не большая предыстория

На работе периодически приходится перехватывать вызовы, что в принципе не беда. Но бывает, что необходимо потом перезвонить тому, кто звонил.
Номер соответственно у меня не высветился и обычно приходится лезть в cdr’ки в mysql или подойти к телефону напарника и искать номер телефона.
Можно в принципе попросить напарника включать переадресацию на телефонном аппарате, но уходит он на пару минут, да и мы не ищем легких путей.

Итак, что мы имеем: офисная АТС на Asterisk (версия = 1.8.15.1), реализована функция перехвата вызова и уведомлений о звонке через jabber.

Информации по поводу настройки перехвата вызова, отправки уведомлений c помощью jabber достаточно в просторах интернета, так что сразу опишу о реализации получения уведомления при перехвате вызова.

Начнем с Mysql (версия = Server version: 5.5.31-0+wheezy1 (Debian)):

В базе asteriskcdrdb создадим 2 таблицы pickup_message и pickup_group.
В таблице pickup_message, у нас будет всего 2 столбца pg_id и message:
pg_id — id pickup группы в Asterisk;
message — поле куда будут записываться уведомления;

mysql> CREATE TABLE pickup_message     -> (pg_id smallint unsigned, 

Параметры SMALLINT и UNSIGNED для столбца pg_id, выбрал т.к. планируются только короткие, целые числа. Хотя можно использовать и имена для групп перехвата.

  -> message varchar(128),   -> CONSTRAINT pk_pg_id PRIMARY KEY (pg_id) 

В столбце pg_id у нас будут только уникальные записи, и столбец будет служить для связки 2-х таблиц.

 -> ); Query OK, 0 rows affected (0.09 sec) 

Таблица pickup_group содержит информацию о принадлежности внутреннего номера (peer) к определенной группе перехвата (pg_id).
Так же для связки 2 таблиц добавим FOREIGN KEY () и REFERENCES.

mysql> CREATE TABLE pickup_group     -> (pg_id SMALLINT UNSIGNED,     -> peer SMALLINT UNSIGNED,     -> CONSTRAINT fk_pg_id FOREIGN KEY (pg_id)     -> REFERENCES pickup_message (pg_id)     -> ); Query OK, 0 rows affected (0.08 sec) 

Заполним для теста обе таблицы следующей информацией группа перехвата 1, внутренние номера 309 и 373:

mysql> insert into pickup_message values (1, NULL); Query OK, 1 row affected (0.05 sec)  mysql> insert into pickup_group values (1, 309); Query OK, 1 row affected (0.06 sec)  mysql> insert into pickup_group values (1, 373); Query OK, 1 row affected (0.04 sec)  mysql> select * from pickup_message; +-------+---------+ | pg_id | message | +-------+---------+ |     1 | NULL    | |    33 | NULL    | +-------+---------+ 2 rows in set (0.00 sec)  mysql> select * from pickup_group; +-------+------+ | pg_id | peer | +-------+------+ |     1 |  309 | |     1 |  373 | +-------+------+ 2 rows in set (0.00 sec) 

Переходим к настройкам Asterisk, отредактируем extensions.conf:

В контексте где обрабатывается набор внутренних номеров:

exten => _ZXX,1,Macro(jabb-personal-pickup,${EXTEN}) same => n,Dial(SIP/${EXTEN},120,t) same => n,Hangup 

Макрос для отправки уведомлений (в макрос передается одна переменная ${ARG1}, номер который набрали):

[macro-jabb-personal-pickup] exten => s,1,Set(text=Входящий вызов от ${CALLERID(number)})   same => n,MYSQL(Connect connid 127.0.0.1 root PASSWORD asteriskcdrdb)         same => n,MYSQL(Query resultid ${connid} select pickup_message.pg_id from pickup_message inner join pickup_group where peer = '${ARG1}';) ; #в данном запросе ищем к какой группе относится номер который набрали same => n,MYSQL(Fetch fetchid ${resultid} pg_id) same => n,GotoIf($["${fetchid}"="1"]?yes:no)  same => n(yes),MYSQL(Query resultid ${connid} update pickup_message set message ='${text}' where pg_id = '${pg_id}') ; #если номер есть в группе, то запишем в ячейку группы message переменную text same => n(no),MYSQL(Clear ${resultid}) same => n,MYSQL(Query resultid ${connid} select jabb_id from jabber where number=${ARG1}) same => n,MYSQL(Fetch fetchid ${resultid} jabb_id) same => n,GotoIf($["${fetchid}"="1"]?ok:bad) same => n(ok),JabberSend(asterisk,${jabb_id},${text}) same => n(bad),MYSQL(Clear ${resultid}) same => n,MYSQL(Disconnect ${connid}) 

И собственно контекст при перехвате звонка (*8). Здесь мы проверяем к какой группе мы относимся и есть ли сообщения в нашей группе.
Т.е. при входящем звонке на внутренний номер, в ячейку группы записывается информация о звонящем, а перехватом мы эту информацию забираем.
В принципе все просто:

exten => *8,1,NoOp(pickup) same => n,MYSQL(Connect connid 127.0.0.1 root PASSWORD asteriskcdrdb) same => n,MYSQL(Query resultid ${connid} select pickup_message.message from pickup_message inner join pickup_group where peer = ${CALLERID(number)}) ; #запрос на проверку к какой группе перехвата мы относимся same => n,MYSQL(Fetch fetchid ${resultid} message)  same => n,GotoIf($["${fetchid}"="1"]?message:no)  ; #проверяем что в запросе есть результат          same => n(message),Set(text=Перехват вызова. ${message}) ;# в переменную text запишем данные из ячейки нашей группы same => n,MYSQL(Clear ${resultid}) same => n,MYSQL(Query resultid ${connid} select jabb_id from jabber where number=${CALLERID(number)})  ;# ищем id jabber для peer'a, т.к. не все его используют  same => n,MYSQL(Fetch fetchid ${resultid} jabb_id)  same => n,GotoIf($["${fetchid}"="1"]?yes:no)   ; # проверяем что в запросе есть результат same => n(yes),JabberSend(asterisk,${jabb_id},${text}) same => n(no),MYSQL(Clear ${resultid}) same => n,MYSQL(Query resultid ${connid} update pickup_message set message ='NULL' where message = '${message}') same => n,MYSQL(Disconnect ${connid}) same => n,PickUP() 

В итоге, при перехвате вызова, в jabber приходят сообщения такого рода:

[15:09:07] <Office Manager> Перехват вызова. Персональный звонок. 302 [15:12:08] <Office Manager> Перехват вызова. Персональный звонок. 226 [15:25:47] <Office Manager> Перехват вызова. Персональный звонок. 106 [15:32:40] <Office Manager> Персональный звонок. 116 

Надеюсь, для кого-то данная информация будет полезной.

ссылка на оригинал статьи http://habrahabr.ru/post/225837/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *