Верификация мобильных номеров – часть 2
Описание: в этой статье мы продолжим разбор возможности проверки существования мобильного номера и его доступности. Все инструкции тестировались на следующем оборудовании: CentOS Linux release 7.5.1804 Asterisk 13.21.0 PHP 5.6.36 Apache/2.2.15 MySQL/10.1.33-MariaDB Используемые технологии: PHP MySQL Dialplan asterisk В первой части мы разобрали настройки, которые необходимо внести в asterisk для работы сервиса (Верификация мобильных номеров – […]
Описание: в этой статье мы продолжим разбор возможности проверки существования мобильного номера и его доступности.
Все инструкции тестировались на следующем оборудовании:
CentOS Linux release 7.5.1804
- Asterisk 13.21.0
- PHP 5.6.36
- Apache/2.2.15
- MySQL/10.1.33-MariaDB
Используемые технологии:
- PHP
- MySQL
- Dialplan asterisk
В первой части мы разобрали настройки, которые необходимо внести в asterisk для работы сервиса (Верификация мобильных номеров – часть 1), теперь рассмотрим API-скрипт. В нём есть функции коннекторы к mysql и AMI, их описывать здесь не будем, а перейдём сразу к исполнительной части. Она подразделяется на три большие блока:
- Инициация вызова
- Возврат статуса
- Ротация транков
- Инициация вызова
Выполняется при следующем запросе:
. https://ip_asterisk/verphone/?phone=8961******6&idblank=0001
Т.е. требует наличия двух параметров:
- phone – проверяемый мобильный номер
- idblank – номер договора
При получении такого запроса, скрипт инициирует вызов написанного нами ранее контекста с передачей аргументов.
$action = "Action: Originate\r\n";
$action .= "Channel: Local/$phone@phone-verification\r\n";
$action .= "Exten: h\r\n";
$action .= "Context: phone-verification\r\n";
$action .= "Priority: 1\r\n";
$action .= "Variable: idblank=$idblank\r\n";
$action .= "Async: yes\r\n\r\n";
ami_request($action);
Далее asterisk берёт из базы, в которой хранится список транков, id очередной городской линии и делает попытку дозвона. При неудаче берётся следующий транк и операция повторяется, в противном случае данный транк маркируется, как использованный, и указатель «сдвигается» на следующий. Это позволяет при недоступности одного из транков позвонить через следующий, а так же выполняет ещё одну задачу, но о ней в описании третьего блока.
- Возврат статуса
Второй значительный блок – позволяет по номеру телефона и договора получить статус последней попытки дозвона.
https://ip_asterisk/verphone/?phone=8961******6&idblank=0001&loop
- phone – проверяемый мобильный номер
- idblank – номер договора
- loop – возврат результата
Формально это обращение к, уже сформированной, внутренней базе данных, а запрос выглядит следующим образом:
MariaDB [asteriskcdrdb]> SELECT src,dst,disposition FROM cdr WHERE dst LIKE "%'.substr($phone, -10, 10).'" AND userfield="'.$idblank.'" ORDER BY calldate desc LIMIT 1;
Здесь через php мы подставляем полученный номер и осуществляем поиск. В зависимости от результатов, API возвращет три результата:
- «404 – result is empty» — в базе не найдено соответствия поисковому запросу
- «400 — call not accepted» — соответствие найдено, и вызов не был отвечен
- «200 — call accepted» — соответствие найдено и на вызов отвечен
Отвечающий за это код:
if(!empty($sqlArray)){
$answer['code'] = substr($sqlArray[0]['src'],7);
$answer['reason'] = $sqlArray[0]['disposition'];
switch ($sqlArray[0]['disposition']){
case 'ANSWERED':
$answer['status'] = 200;
$answer['reason'] = 'call accepted';
break;
default:
$answer['status'] = 400;
$answer['reason'] = 'call not accepted';
break;
}
}
else{
$answer['status'] = 404;
$answer['reason'] = 'result is empty';
}
Так же следует заметить, что вместе с кодом ответа и его расшифровкой в результате будут содержаться последние 4 цифры транка, через который прошёл вызов.
- Ротация транков
Последний и самый сложный в реализации блок API. Он вызывается не снаружи через http-запрос, а изнутри, из dialplan asterisk. Его задача получить и вернуть два параметра номер (CID) и идентификатор транка, с учётом двух условий. Первое: все транки должны последовательно перебираться. Второе: на один и тот же номер не должны осуществляться повторные вызовы с того же транка ранее чем через пять итераций.
Запрос принимает единственный параметр:
- revolver – который содержит номер вызываемого абонента
Что происходит далее разберём подробно.
$sqlArray = bd_bridge('asteriskcdrdb','SELECT line FROM lasttrunk');
$link = $sqlArray[0]['line'];
Получили из базы и сохранили в переменную порядковый номер текущего указателя.
$sqlStr = 'SELECT trunkid,channelid,outcid FROM trunk_list AS resource LEFT JOIN (SELECT src FROM cdr WHERE dst LIKE "%'.substr($revolver,-10,10).'" AND disposition<>"FAILED" ORDER BY calldate DESC LIMIT 5) AS filter ON outcid=src WHERE src IS NULL LIMIT '.$link.',2';
$sqlArray = bd_bridge('asteriskcdrdb',$sqlStr);
Получаем из базы id и cid транка по всем необходимым критериям: не использовался вместе с этим клиентом менее пяти раз и статус звонка не содержал ошибку.
echo ($sqlArray[0]['channelid'])? $sqlArray[0]['channelid'].'|'.$sqlArray[0]['outcid'] : '';
Посольку вернуть мы можем только один аргумент, а передаваемых значений – пара, конкатенируем их через разделитель, а после уже в диалплане разделим вновь.
$sqlStr = (count($sqlArray)==2) ? 'update lasttrunk set line = (line+1)' : 'UPDATE lasttrunk SET line="0"';
bd_bridge('asteriskcdrdb', $sqlStr);
Последним действием мы либо смещаем указатель на следующий транк, либо при исчерпании списка – сбрасываем его на первое значение.
Рассмотрим API в действии. Отправлять запросы будем через запросы из адресной строки браузера, а состояние мониторить в консоли сервера. Осуществляем первый запрос:
https://ip_asterisk/verphone/?phone=8961******6&idblank=0001
Ждём 10 секунд и смотрим, что получилось в консоли:
Здесь хорошо видно, что первый транк на момент звонка был недоступен и была повторная инициация вызова. Она прошла успешно, но в течении 10 секунд клиент не ответил на вызов. Проверим статус через запрос:
Делаем ещё одну проверку, но в этом случае отвечаем на вызов сразу:
Дозвон успешно осуществлён через первый найденный транк и вызов был отвечен. Смотрим статус через API:
В то же время на телефоне получена следующая информация:
Что соответствует данным со стороны лога asterisk и данным из API. Поставленная задача выполнена: мы поучили приложение, которое:
- Осуществляет дозвон клиенту посредством чередующихся транков
- При недоступности одного из транков берётся следующий, не чаще пяти раз на один клиентский номер
- Статус звонка записывается во внутреннюю базу данных и возвращается по запросу
Остались вопросы?
Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.