Дмитрий Кайдаш
04.02.2020
2638

Верификация мобильных номеров – часть 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 ниже 5.4 будет произвести некоторые изменения, но работоспособность не пострадает.

Используемые технологии:

  • PHP
  • MySQL
  • Dialplan asterisk

В первой части мы разобрали настройки, которые необходимо внести в asterisk для работы сервиса (Верификация мобильных номеров – часть 1), теперь рассмотрим API-скрипт. В нём есть функции коннекторы к mysql и AMI, их описывать здесь не будем, а перейдём сразу к исполнительной части. Она подразделяется на три большие блока:

  1. Инициация вызова
  2. Возврат статуса
  3. Ротация транков
  1. Инициация вызова

Выполняется при следующем запросе:

. 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 возвращет три результата:

  1. «404 – result is empty» — в базе не найдено соответствия поисковому запросу
  2. «400 — call not accepted» — соответствие найдено, и вызов не был отвечен
  3. «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 секунд и смотрим, что получилось в консоли:

Лог неотвеченного вызова.png
Лог неотвеченного вызова

Здесь хорошо видно, что первый транк на момент звонка был недоступен и была повторная инициация вызова. Она прошла успешно, но в течении 10 секунд клиент не ответил на вызов. Проверим статус через запрос:

Статус неотвеченного вызова.png
Статус неотвеченного вызова

Делаем ещё одну проверку, но в этом случае отвечаем на вызов сразу:

Лог отвеченного вызова.png
Лог отвеченного вызова

Дозвон успешно осуществлён через первый найденный транк и вызов был отвечен. Смотрим статус через API:

Статус отвеченного вызова.png
Статус отвеченного вызова

В то же время на телефоне получена следующая информация:

Звонки на клиенте.jpg
Звонки на клиенте

Что соответствует данным со стороны лога asterisk и данным из API. Поставленная задача выполнена: мы поучили приложение, которое:

  1. Осуществляет дозвон клиенту посредством чередующихся транков
  2. При недоступности одного из транков берётся следующий, не чаще пяти раз на один клиентский номер
  3. Статус звонка записывается во внутреннюю базу данных и возвращается по запросу
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.