По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Работаете с IP – АТС Asterisk? Тогда этот материал для вас. Говорить будем про отправку уведомлений в VK (Вконтакте) при входящем звонке. От слов к делу.
Получаем access_token
Первым делом, перейдите Developers раздел VK. В хедере (верхнем меню навигации) нажмите Мои приложения после чего нажмите Создать приложение:
Название - дайте имя для вашего аппликейшна. Например, Asterisk;
Платформа - выбираем Standalone-приложение;
Переходим в раздел настроек созданного приложения. Копируем ID приложения, как показано на рисунке ниже:
Отлично. Теперь скопируйте ссылку ниже:
https://oauth.vk.com/authorize?client_id=1234567&scope= offline,messages&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.37&response_type=token
Предварительно замените client_id на ваше значение, полученное ранее (ID приложения). VK API спросит разрешения на доступ к некоторым данным:
Если все ОК, то VK вернет нам токен:
Если вы столкнулись с ошибкой вида «{"error":"invalid_request","error_description":"Security Error"}», то перелогиньтесь в вашей учетной записи в VK и повторите попытку
Сохраняем значение и переходим к настройке скрипта на стороне Asterisk.
Адаптация на Asterisk
Реализацию скрипта сделаем на .php. Создайте файл asteriskvk.php и наполните его следующим содержимым:
#!/usr/bin/php -q
<?php
require('phpagi.php');
$agi = new AGI();
$message = "Сейчас поступит звонок с номера: ";
$message .= $agi->request['agi_callerid'];
$id = "ID получателя сообщения";
$token = "Токен";
function send($id , $message, $token)
{
$url = 'https://api.vk.com/method/messages.send';
$params = array(
'user_id' => $id,
'message' => $message,
'access_token' => $token,
'v' => '5.37',
);
$result = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => http_build_query($params)
)
)));
}
send($id, $message, $token);
Скачать скрипт
В скрипте вам необходимо поменять следующие переменные:
$id - идентификатор пользователя, которому будет отправлено сообщение. Помимо user_id, это может быть ID группового чата;
$token - API - токен, который вы получили ранее;
Сохраняйте файл и загрузите в директорию /var/lib/asterisk/agi-bin/ после чего дайте следующие команды в консоли сервера:
chmod 755 /var/lib/asterisk/agi-bin/asteriskvk.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/asteriskvk.php
dos2unix /var/lib/asterisk/agi-bin/asteriskvk.php
Лезем в диалплан и на входящем маршруте адаптируем простенькую конструкцию:
exten => _.,n,AGI(asteriskvk.php)
Звоним и проверяем:
GLBP (Gateway load Balancing Protocol) - это протокол, разработанный компанией Cisco, который обеспечивает распределение нагрузки на несколько роутеров, используя всего 1 виртуальный адрес.
Этот протокол входит в группу FHRP, а теперь давайте напомню какие протоколы в неё входят.
HSRP (Hot Standby Router Protocol) - проприетарный протокол, разработанный Cisco;
VRRP (Virtual Router Redundancy Protocol) - свободный протокол, сделан на основе HSRP;
GLBP (Gateway Load Balancing Protocol).
GLBP обеспечивает балансировку трафика одновременно на несколько роутеров, когда HSRP и VRRP работал только один из 2х роутеров.
Терминология протокола
AVG (Active Virtual Gateway) - активный роутер, который занимается раздачей MAC адресов устройствам. Некий начальник над роутерами в сети GLBP .
Это роль диспетчера, который указывает устройствам, как распределять трафик по средству раздачи им MAC адресов, когда приходит ARP запрос. То есть IP адрес у всех будет единый, а вот MAC адреса будут разные.
AVF (Active Virtual Forwarder) - активный роутер, который пропускает через себя трафик.
Роутер с ролью AVG только один может быть, а вот с ролью AVF любой, при этом AVG может быть и AVF одновременно.
Настройка этого протокола такая же, как и любого протокола группы FHRP на интерфейсе (в данном случает interface e0/0)
Теперь пройдемся по командам
Router(config-if)# glbp 1 ip 192.168.0.254 //включение GLBP
Router(config-if)# glbp 1 priority 110 //установка приоритета 110 (если приоритет будет выше остальных ,то он станет AVG по умолчанию 100)
Router(config-if)# glbp 1 preempt //установит режим приемптинга для AVG ( работает также как и в HSRP, VRRP)
Router(config-if)# glbp 1 weighting 115 //установить вес для AVF в 115 Router(config-if)# glbp 1 load-balancing host-depended | round-robin | weighted
Для чего требуется вес?
Для того, чтобы выбрать кто будет AVF. Чтобы при падении линка до провайдера мы могли передать эту роль кому-нибудь ещё. Далее рассмотрим механизм передачи:
Router(config-if)# glbp 1 weighting 130 lower 20 upper 129
Команда установит вес для Forwarder в 130, а нижняя граница будет 20, верхняя 129. Если вес упадет до 19, то он перестанет быть AVF, а если вес возрастет выше 129 после падения, то он снова превратиться в AVF. По умолчанию lower равен 1, upper равен 100.
Данная команда используется совместно с Track:
Router(config)# track 1 interface e0/1 line-protocol
Router(config)# int e0/0
Router(config-if)# glbp 1 weighting track 1 decrement 111
Как проверить стал ли роутер AVG?
R2(config)#do show glbp
Ethernet0/0 - Group 1
State is Active
...
Смотрим, состояние Active, а это значит он и стал AVG. Взглянем на второй:
R3(config-if)#do sh glbp
Ethernet0/0 - Group 1
State is Standby
...
Говорит о том, что он не стал AVG.
При просмотре команды нужно обращать внимание на State is Active / Listen / Standby. Где AVG это Active, запасной Standby, а тот, кто в выборах не участвует Listen. То есть если роутер State is Active накроется, то его место займет маршрутизатор с состоянием State is Standby. При этом каждый роутер является AVF.
3 режима AVG
Round Robin (по кругу) - это значит, что балансирует равномерно, раздавая каждому устройству новый MAC по списку, а как заканчивается список, начинает заново. Когда в сети просыпается устройство или ARP table устаревает, то у него нет mac шлюза по умолчанию. Он формирует ARP запрос, где запрашивает эти данные. Отвечает ему только AVG, который выдает виртуальные mac адреса за роутеры в группе glbp. Одному ПК он выдаст свой ,потому что он еще и AVF , следующему ПК - R3 mac-address выдаст ,следующему устройству R4 mac-address .
Weighted (утяжеленный) - когда AVF имеет больший вес, то принимает большую нагрузку, чем остальные роутеры.
Host dependent (Зависимое устройство) - присваивает постоянный MAC определенным устройствам. Допустим к нему обратился VPC10 за MAC адресом и AVG выдает его, а также запоминает, что ему выдает только этот адрес.
Как это работает? Представим, что в нашей топологии:
Роутер R3 (State is Listen) умрет, то тогда его клиентов возьмет любой из группы, либо R2, либо R4.
Роутер R2 (State is Active) умрет, то тогда роль AVG займет роутер R4 (State is Standby), а также возьмет его клиентов (или распределит между R3/R4). R3 станет запасным AVG.
Роутер R4 (State is Standby) умрет, то его клиентов возьмет один из R2/R3 и R3 (State is Listen) станет State is Standby.
show glbp на разных роутерах
R2(config-if)#do sh glbp
Ethernet0/0 - Group 1
State is Active
1 state change, last state change 00:06:48
Virtual IP address is 192.168.0.254
Hello time 3 sec, hold time 10 sec
Next hello sent in 2.176 secs
Redirect time 600 sec, forwarder timeout 14400 sec
Preemption disabled
Active is local
Standby is 192.168.0.3, priority 100 (expires in 8.576 sec)
Priority 100 (default)
Weighting 100 (default 100), thresholds: lower 1, upper 100
Load balancing: round-robin
Group members:
aabb.cc00.2000 (192.168.0.1) local
aabb.cc00.3000 (192.168.0.2)
aabb.cc00.4000 (192.168.0.3)
There are 3 forwarders (1 active)
Forwarder 1
State is Active
1 state change, last state change 00:06:37
MAC address is 0007.b400.0101 (default)
Owner ID is aabb.cc00.2000
Redirection enabled
Preemption enabled, min delay 30 sec
Active is local, weighting 100
Forwarder 2
State is Listen
MAC address is 0007.b400.0102 (learnt)
Owner ID is aabb.cc00.3000
Redirection enabled, 599.104 sec remaining (maximum 600 sec)
Time to live: 14399.104 sec (maximum 14400 sec)
Preemption enabled, min delay 30 sec
Active is 192.168.0.2 (primary), weighting 100 (expires in 9.216 sec)
Forwarder 3
State is Listen
MAC address is 0007.b400.0103 (learnt)
Owner ID is aabb.cc00.4000
Redirection enabled, 598.592 sec remaining (maximum 600 sec)
Time to live: 14398.592 sec (maximum 14400 sec)
Preemption enabled, min delay 30 sec
Active is 192.168.0.3 (primary), weighting 100 (expires in 10.016 sec)
В данный момент я подключил 3 роутера в группу glbp 1 и если посмотреть на вывод, то он показывает отношение 1 роутера к другому. То есть R2 по отношению к R3 и R4 является active, а остальные listen . Если глянуть на R3 и R4 ,то картина будет с точностью наоборот. Это сделано для того, чтобы наблюдать, какой роутер взял на себя роль AVF в случае падения, тогда при падении один из Forwarder будет в состоянии Active.
Режим preempt
Этот режим, как и в других протоколах типа FHRP помогает роутеру настроить нужную роль. В GLBP это будет касаться AVG и AVF. Для AVG по умолчанию он отключен, а для AVF по умолчанию включен, с задержкой 30 секунд.
preempt для AVG:
R2(config)# int e0/0
R2(config-if)# glbp 1 preempt
preempt для AVF:
R2(config)# int e0/0
R2(config-if)# glbp 1 forwarder preempt delay minimum 60
Настройка таймеров
Настройка интервалов в группе GLBP:
R2(config-if)# glbp 1 timers 3 10
Настройка пароля
//Аутентификация через md5 по хешу
R2(config-if)#glbp 1 authentication md5 key-string CISCO
//Аутентификация в открытом виде
R2(config-if)#glbp 1 authentication text CISCO
Диагностика
R2# show glbp //показать общую информацию по протоколу группы FHRP
R2# show glbp brief //показывает краткую таблицу по всем роутерам группы GLBP
----------------------------------------------------------------------------------------------------------------------------
R2#show glbp brief
Interface Grp Fwd Pri State Address Active router Standby router
Et0/0 1 - 110 Standby 192.168.0.254 192.168.0.4 local
Et0/0 1 1 - Active 0007.b400.0101 local -
Et0/0 1 2 - Listen 0007.b400.0102 192.168.0.2 -
Et0/0 1 3 - Listen 0007.b400.0103 192.168.0.3 -
Et0/0 1 4 - Listen 0007.b400.0104 192.168.0.4 -
Важное
В топологии GLBP может пропускать максимум 4 роутера, если подключить 5, то он попадет в таблицу GLBP, но пропускать через себя трафик не станет. А будет просто ждать, пока умрет какой-либо AVF.
Как и любая современная АТС, Asterisk имеет свою встроенную систему хранения истории звонков - CDR (Call Detail Record). Она используется для снятия статистики, ведения отчетности, прослушивания вызовов или подсчета биллинговых показателей.
В Asterisk для этого создана база данных asteriskcdrdb, в которой существует таблица cdr. Давайте рассмотрим как пользоваться данной таблицей и ее структуру.
[root@asterisk]# mysql // подключаемся к MySQL
После успешного подключения, необходимо выбрать для работы базу данных asteriskcdrdb:
mysql> use asteriskcdrdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
Давайте убедимся, что у нас есть таблица cdr. Выполним это, как указано ниже:
mysql> show tables;
+-------------------------+
| Tables_in_asteriskcdrdb |
+-------------------------+
| cdr |
| cel |
+-------------------------+
2 rows in set (0.00 sec)
На данном этапе мы убедились, что у нас есть база данных asteriskcdrdb, в которой находится таблица cdr. Давайте попробуем посмотреть входящие звонки из города за сегодня (дата написания статьи 18 марта 2016 года), в период с 12:00 до 12:10, т.е за 10 минут:
SELECT `dst` , `src` , `duration` , `calldate` , `recordingfile`
FROM `cdr` WHERE `calldate` >= '2016-03-18 12:00:00' AND `calldate` <= '2016-03-18 12:10:00' AND LENGTH( `src` ) >3;
+-----+-------------+----------+---------------------+----------------------------------------------------------------+
| dst | src | duration | calldate | recordingfile |
+-----+-------------+----------+---------------------+----------------------------------------------------------------+
| 113 | 84991111111 | 140 | 2016-03-18 12:00:36 | external-113-84991111111-20160318-115933-1458291573.157155.wav |
| 104 | 89162222222 | 81 | 2016-03-18 12:01:33 | external-104-89162222222-20160318-120133-1458291693.157169.wav |
+-----+-------------+----------+---------------------+----------------------------------------------------------------+
2 rows in set (0.00 sec)
В вышеуказанном примере, в SQL запросе указано LENGTH( `src` ) >3. Столбец ‘src’ – показывает номер звонящего (source - источник). Это сделано для того, чтобы исключить внутренние звонки, так как у нас используется трехзначная нумерация. Тем самым, мы получаем в результате данные, с которыми затем можем работать. Например, отправить на почту в виде отчета. Ниже рассмотрена структура таблицы cdr в базе данных asteriskcdrdb:
Столбец
Пример значения
Описание
calldate
2016-03-18 12:00:36
Дата и время звонка
clid
"Oleg Ivanov" <84991111111>
В данное поле попадает полное CallerID (CLID, CID), которое состоит из имени и номера звонящего. Это доступно только для считывания.
src
84991111111
Номер звонящего в конструкции CallerID (CNUM). Это доступно только для считывания.
dst
113
Номер назначения для звонка. Это доступно только для считывания.
dcontext
CustomContext1
Контекст для обработки. Это доступно только для считывания.
channel
SIP/0002B2356854-a34bh3ef
Канал, через который поступил звонок
dstchannel
SIP/0004F6675969-97836bb0
Канал, через который ушел исходящий звонок
lastapp
Dial, Busy, Congestion
Приложение, которое последним отработало этот вызов перед попаданием в таблицу cdr
lastdata
SIP/0004F6675969,30,tT
Аргумент, который был передан приложению, которое отработало вызов последним (lastapp)
duration
75
Количество секунд от начала (отметка start) до окончания вызова (отметка end)
billsec
67
Количество секунд от ответа (отметка answer) до окончания вызова (отметка end). Данное значение всегда меньше значения duration, и отражает длительность самого разговора, что важно для подсчета стоимости.
disposition
ANSWERED, BUSY, NO ANSWER, FAILED
Результат звонка
amaflags
OMIT, BILLING, DOCUMENTATION, Unknown
Метка Automatic Message Accounting (AMA) – автоматический учет стоимости вызова.
accountcode
23232
Идентификатор аккаунта. Данное значение пустое по умолчанию, и определяется параметрами конкретного пользователя.
uniqueid
1458291693.157169
Уникальный идентификатор звонка
userfield
-
Пользовательское поле. Здесь можно передавать что угодно, добавляя данные в этот столбец при работе с вызовом внутри контекста обработки.
did
4996491913
DID (Direct Inward Dialing). На основании DID вызова на Asterisk осуществляется его маршрутизация (это значение приходит от провайдера).
recordingfile
external-113-84991111111-20160318-115933-1458291573.157155.wav
Имя файла, содержащего запись разговора. В данном имени можно проследить путь к файлу в файловой структуре сервера.
cnum
84991111111
Номер звонящего в структуре CallerID.
cnam
Oleg Ivanov
Имя звонящего в структуре CallerID.
Теперь, когда вы понимаете принцип формирования запросов к базе данных и ее структуру, вы можете без труда формировать собственные отчеты. Например, ежедневный отчет о количестве входящих звонков за текущий день на почту. Это реализуется средствами php скрипта и добавления расписания через cron. Поговорим об этом в следующей статье