[Из песочницы] Уведомление при перехвате вызова в 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] Перехват вызова. Персональный звонок. 302 [15:12:08] Перехват вызова. Персональный звонок. 226 [15:25:47] Перехват вызова. Персональный звонок. 106 [15:32:40] Персональный звонок. 116 Надеюсь, для кого-то данная информация будет полезной.

© Habrahabr.ru