Как определить максимально дешевый маршрут звонка в Asterisk

Asterisk+Python: два метода определения самого дешевого маршрута для звонка

Недавно у моих коллег возникла задача – распределять исходящие звонки с Asterisk по транкам в соответствии с тем, чьему пулу принадлежит номер. В примитивной реализации достаточно просто добавить шаблоны телефонов по префиксам в маршруты FreePBX(927Х. – мегафон, 906Х. – билайн), однако, например, префикс 999 делят несколько операторов, а вообще в официальной таблице распределения DEF-номеров более 52 тысяч строк!

Основные критерии решения, которым хотелось бы следовать, были таковы:
1. Хочется получить совместимость не только с FreePBX, но и с чистым Asterisk, и любыми другими системами телефонии
2. Не хочется “ломать” логику диалплана FreePBX
3. Нужна простота настройки, так как заказ коммерческий, и нужно написать howto
4. Возможно, в будущем потребуется доработка, например, распределение исходящих звонков на городские номера в соответствии с регионом

Из вышесказанного следует, что:

1. Никакой работы с базой напрямую из диалплана
2. Изменения в диалплане должны быть минимальны, никаких extensions_override_freepbx
3. Кажется, пора расчехлять Python

Были разработаны две схемы: одна с использованием официального реестра распределения таблицы DEF-номеров от РосСвязьНадзора, вторая – с использованием API мегафона(единственный доступный публично), который легко может быть заменен на официальный API от оператора базы данных перенесенных номеров.

Первый вариант технически сложнее в реализации, и не учитывает номера, которые были переведены от оператора к оператору, но более надежный, быстрый и не зависит от проблем с каналом и сторонним API;

Второй, в свою очередь, более точный, учитывает перенесенные номера, но менее надежный и более медленный.

Суть реализации с точки зрения asterisk в разрезе FreePBX такова: в кастомном включении в from-internal вызываем скрипт, который по набранному номеру отдаст префикс, уникальный для каждого оператора, затем передаем звонок обратно на стандартное поведение FreePBX и настраиваем распределение по транкам на основе шаблонов маршрутов по префиксам. Для “чистого” asterisk достаточно просто добавить пару условных операторов для опредения алгоритма звонка по префиксу.

Для первого варианта бэкэнда, если так можно выразиться, связка получилась такая: один скрипт по расписанию стягивает(если получается) csv с сайта РосСвязьНадзора и парсит его в БД. Второй, вызываемый из астера, обращается к БД, находит название оператора по номеру и отдает префикс в соответствии с конфигурационным файлом.

Для второго все гораздо проще – просто обращаемся к API GET-запросом, получаем json, из которого берем код оператора по классификатору MNC, и уже его отдаем в asterisk.

Листинги обоих реализаций и более подробное описание смотрите по ссылкам.

Через CSV

Через API