- PVSM.RU - https://www.pvsm.ru -
Привет!
Я много работаю с VoIP-сетями. С коммерческим оборудованием, конечно тоже, но и очень много с OpenSource (статья пишется в контексте использования Asterisk PBX).
В телефонии часто возникает простая задача, разделить маршруты на определённые направления. Ну например, направить вызовы на городские номера в сторону оператора 1, МГ — в сторону оператора 2, МН — в сторону оператора 3.
Задача, в общем-то тривиальная, и реализуется на Asterisk легко:
;Местная городская связь: 7 знаков (в разных регионах РФ от 3-х до 7-ми знаков), и номера экстренных служб.
exten => _0X,1,dial(SIP/itsp1/${EXTEN})
exten => _0XX,1,dial(SIP/itsp1/${EXTEN})
exten => _XXXXXXX,1,dial(SIP/itsp1/${EXTEN})
;Междугородняя и мобильная связь: код выхода на МГ связь (в РФ - "8") + 10 знаков.
exten => _8[348]XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
exten => _89XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
;Международная связь: код выхода на МН связь (в РФ - "810") + номер телефона в международном формате.
exten => _810X.,1,dial(SIP/itsp3/${EXTEN})
Однако иногда возникает необходимость предоставить абоненту доступ только к мобильным телефонам его области, и здесь простым "_89XXXXXXXXX" не отделаешься.
Дело в том, что телефонные коды мобильных операторов являются негеографическими (т.н. DEF-коды), а это значит, что привязки кода к конкретному региону нет. Из-за этого в коде «900», например, есть диапазоны, принадлежащие операторам из Вологодской области, Псковской, Чеченской республики, и так далее.
Оператор мобильной связи теоретически может позволить себе выделить любой свободный диапазон в любом регионе, а это приводит к тому, что в разных регионах есть телефонные номера из разных диапазонов с разным количеством номеров. Например, в Вологодской области выделено 46 различных диапазонов, в Московской — 398.
Если бы все диапазоны были «красивыми», по 1000 или 10000 номеров, как например такой: 5100000 — 5109999 (10000 номеров в коде 914), то всё было бы более-менее хорошо.
Но зачастую большие диапазоны по 10000 номеров «разрезаются» на поддиапазоны из чисел, не кратных своему порядку (порядок количества чисел в диапазоне). Навскидку:
Код | От | До | Ёмкость | Регион |
958 | 2997500 | 2998749 | 1250 | Республика Адыгея |
958 | 2998750 | 2999999 | 1250 | Удмуртская Республика |
Или вообще по одному номеру (приводить не буду).
Подобный диапазон (2997500 — 2998749) одним регулярным выражением Asterisk не опишешь, в итоге получится 3 маршрута:
exten => _89582997[5-9]XX,1,dial(SIP/itsp1/${EXTEN})
exten => _89582998[0-6]XX,1,dial(SIP/itsp1/${EXTEN})
exten => _895829987[0-4]X,1,dial(SIP/itsp1/${EXTEN})
И это один конкретный диапазон. Если взять целый регион, то количество регулярных выражений резко увеличивается. В добавок ко всему с течением времени коды изменения коды DEF имеют свойства меняться. Исчезают одни, появляются другие. Если вы этого не учитываете, это может привести к тому, что ваши абоненты в лучшем случае не смогут звонить на определённые диапазоны вашего региона.
Итак, задача сформулирована: Необходимо из любого количества любых диапазонов создавать регулярные выражения, которые распознает ваша телефонная станция.
Во всех источниках (МТТ, Министерство Связи РФ) фигурируют именно диапазоны, а не регулярные выражения. Так как работа по созданию маршрутов является скучной и рутинной, а мне приходится работать с разными регионами РФ, я решил её автоматизировать. Как ни странно, готовых инструментов я для этого не нашел.
Поэтому инструмент я сделал сам, а заодно и делюсь им со всеми. Эдакий сервис создания регулярных выражений :).
Возьмём произвольный диапазон (2633722 — 2673388). Человек легко создаст на его основе регулярные выражения. В итоге они получатся такими:
Поддиапазон | Регулярное выражение |
2633722-2633729 | _263372[2-9] |
2633730-2633799 | _26337[3-9]X |
2633800-2633999 | _2633[8-9]XX |
2634000-2639999 | _263[4-9]XXX |
2640000-2669999 | _26[4-6]XXXX |
2670000-2672999 | _267[0-2]XXX |
2673000-2673299 | _2673[0-2]XX |
2673300-2673379 | _26733[0-7]X |
2673380-2673388 | _267338[0-8] |
Рассмотрим, как это делать автоматически.
Я писал на php. В итоге скрипт умеет:
Скриншот:
Тонкостей при написании возникло много, и вряд ли их стоит здесь перечислять.
Исходный код доступен здесь [2]. В нём много чего можно улучшить (пока в планах суммирование диапазонов перед 3-м пунктом алгоритма и добавление регулярных выражений других форматов, а так же полноценная работа из CLI с целью автоматизации регулярного обновления маршрутов на действующих серверах Asterisk), поэтому прошу писать мне все пожелания. Так же буду рад услышать рекомендации в плане веб-интерфейса и безопасности. Я не программист, поэтому качество кода может страдать.
Автор: sasharu
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/telefoniya/8280
Ссылки в тексте:
[1] ФАС: http://www.rossvyaz.ru/activity/num_resurs/registerNum/
[2] здесь: http://rootblog.ru/pub/src/cc2regex.tar.gz
[3] http://rootblog.ru/regex/: http://rootblog.ru/regex/
[4] http://www.mtt.ru/mtt/def: http://www.mtt.ru/mtt/def
[5] Википедии: http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8
Нажмите здесь для печати.