Виртуальная АТС. Маршрутизация телефонных вызовов
В данном разделе описываются понятия и определения, используемые при маршрутизации телефонных вызовов (далее маршрутизация вызовов) системой и принципы её настройки.
Понятия, определения
Маршрутизация телефонных вызовов — это процесс определения интерфейса назначения для определенного вызова на основании информации об интерфейсе источника вызова, информации о телефонном номере вызывающего и вызываемого абонента, категории вызывающего абонента, времени суток и дне недели.
Интерфейс — совокупность, описывающая в рамках системы ECSS-10 ресурс или группу ресурсов, через который проходит телефонный вызов в рамках определенного контекста маршрутизации (например, определенный порт на шлюзе доступа, порт на медиашлюзе, канал на транковом шлюзе, пучок каналов и т.п.).
Различают интерфейс инициатора вызова — "originating" интерфейс и интерфейс получателя вызова — "terminating" интерфейс.
Процесс маршрутизации: на основании доступной информации об "originating" интерфейсе, телефонном номере вызываемого абонента и других параметрах осуществляется поиск "terminating" интерфейса для установления соединения между интерфейсами инициатора и получателя вызова.
Контекст маршрутизации — логическая группировка (совокупность правил маршрутизации) уникальная в домене, в рамках которого идет определение интерфейса вызываемого абонента.
Различают контексты маршрутизации двух типов: локальные и транзитные.
Алиас (Абонент, Subscriber) — совокупность, описывающая в рамках системы ECSS-10 телефонный номер, связанный с интерфейсом в рамках определенной виртуальной АТС (домена) и различные дополнительные атрибуты (категория, абонентская группа, услуги). Фактически описывает абонента виртуальной АТС, подключенного к определенному порту и обладающего определенным набором специфичных для него параметров.
Профиль абонента — параметры алиаса в рамках виртуальной АТС.
Customer — заказчик с точки зрения телефонной сети. Фактически это абонент, за которым закреплен договор с его индивидуальным номером, которому предоставляются услуги связи по одному и более телефонным номерам/портам. В системе ECSS-10, как коммутационной платформе, такой сущности не существует, но она существует на уровне биллинговой системы и на уровне системы управления ECSS-10.
Виртуальная АТС (домен) — совокупность, группирующая в себе множество контекстов маршрутизации, интерфейсов и алиасов. Ближайший эквивалент — описание плана нумерации и маршрутизации в рамках классической телефонной станции для традиционных сетей.
План нумерации — набор адресов (телефонных номеров) в рамках виртуальной АТС.
Правило маршрутизации — описание процесса преобразования и разрешения (resolving) данных о вызове и получение информации об алиасе и интерфейсе вызываемого абонента. Всегда существует в рамках определенного контекста в домене маршрутизации.
Правило маршрутизации описывается:
- Условиями срабатывания (conditions) — набор параметров, которым должен удовлетворять вызов: номер вызывающего абонента (шаблон), категория, номер вызываемого абонента (шаблон), тип номера, время суток, день недели и другое;
- Действиями (actions) — при срабатывании правила можно выполнить действия по модификации параметров вызова: номер вызываемого абонента, номер вызывающего абонента, абонентская группа;
- Результатом (result) — правило может вернуть следующие результаты:
- Абонент Б локальный, искомый алиас и интерфейс вызываемого абонента;
- Абонент Б внешний, параметры номера абонента Б, интерфейс вызываемого абонента (направление);
- Сменить контекст маршрутизации. В этом случае выполняется смена контекста, после чего маршрутизация выполняется повторно;
- Маршрутизация невозможна.
Бридж — виртуальный шлюз, объединяющий связь между виртуальными АТС. Понятие «бридж» было введено для создания средств контроля соединениями между виртуальными АТС. Вызовы между виртуальными АТС одной системы ECSS-10 маршрутизируются в рамках данной системы через бридж. При этом не задействованы межстанционные соединительные линии. Бридж представлен в виде двух связанных друг с другом интерфейсов. Каждый интерфейс декларирован в своей виртуальной АТС. Для бриджа, как и для классического транка, могут быть заданы различные типы ограничений, например количество каналов, что дает ограничение на количество одновременно установленных соединений между виртуальными АТС и позволяет нормировать нагрузку.
Транковая группа — интерфейс, объединяющий несколько соединительных линий. В системе ECSS-10 интерфейс может являться отображением определенного канала или набора каналов — пучка. Свойства "транкового интерфейса" описывают порядок выбора каналов в пучке.
Направление — несколько интерфейсов, через которые возможно установление связи с определенным получателем.
Балансировка нагрузки в направлении и выбор альтернативного маршрута осуществляется именно между интерфейсами одного направления. Если в направлении один интерфейс оказывается недоступным, то происходит попытка установления соединения по следующему интерфейсу в списке. Балансировка нагрузки осуществляется на основании информации о загруженности интерфейса, которую периодически предоставляет управляющий интерфейсом адаптер.
Процесс маршрутизации телефонного вызова
Целью процесса маршрутизации является нахождение интерфейса вызываемого абонента для адресации ему вызова.
Входящий вызов из IP-транка или от абонента поступает на входящий интерфейс. Посредством протокола RADIUS (если используется) определяется возможность дальнейшей маршрутизации вызова. Далее в определенном контексте маршрутизации виртуальной АТС, который соответствует входному интерфейсу, выполняется обработка вызова. Проверяются условия отбора вызова (анализ номеров вызываемого, вызывающего абонентов, день недели, время суток) на соответствие одному из правил контекста маршрутизации.
При необходимости производится модификация входных данных вызова и осуществляется маршрутизация по заданным параметрам — на абонента, на внешнее направление, в другой контекст маршрутизации:
- если согласно правилу будет определено, что вызов нужно адресовать локальному абоненту или на внешнее направление, то выполняется соответствующая маршрутизация;
- если исходящее направление недоступно, то вызов будет переадресован на резервное направление (резервное направление должно быть настроено);
- если будет определено, что данных для маршрутизации недостаточно, то возвращается результат, сообщающий о неполноте номера: number_incomplete;
- если изменяется текущий контекст, то маршрутизация будет продолжена в указанном контексте, обработка в котором снова будет начинаться с проверки условий отбора вызова;
- если вызов был переадресован, то будет произведена повторная маршрутизация для нового вызова (абонент который переадресовывал вызов и абонент куда был переадресован вызов должны иметь между собой маршрут);
- если в контексте не нашлось удовлетворяющего требованиям правила, то возвращается ошибка маршрутизации
Общая схема прохождения телефонного вызова через маршрутизацию ECSS-10
Общая схема прохождения телефонного вызова представлена на рисунке 1.
Рисунок 1 — Общая схема прохождения телефонного вызова
Входящий вызов из IP-канала поступает на входящий интерфейс (SIP-транк). Из свойств SIP-транка определяется контекст маршрутизации по умолчанию, и маршрутизация вызова начинается в данном контексте. При входе в контекст маршрутизации проверяется его "план нумерации". Если он отличается от "плана нумерации" контекста, из которого мы пришли, то для абонента А выставляются свойства, заданные в плане нумерации нового контекста. Далее выполняется непосредственно маршрутизация вызова, включающая модификации номеров и свойств абонентов А, Б,
переходы между контекстами маршрутизации (в рамках одного контекста маршрутизации) с возможной сменой планов нумерации.
Маршрутизация продолжается до тех пор, пока не будет найден исходящий маршрут, или будет определено, что маршрута нет, либо количество переходов из одного правило в другое не превысит 1000 итераций.
При выходе на локального абонента ECSS-10 для абонента Б применяются свойства, заданные в плане нумерации контекста маршрутизации, в котором
был найден маршрут. После чего вызов направляется на SIP/Megaco-абонента.
При выходе на набор исходящих транков, если один из транков не доступен, вызов будет направлен на следующий в списке транк. Такой перебор будет выполняться до тех пор, пока есть хотя бы один транк, на который не было попытки направить вызов. При выходе на исходящее направление определяется список транков, входящих в данное направление, и вызов отправляется как на "набор исходящих транков" (описано выше).
Входящий вызов от SIP-абонента поступает на входящий SIP-интерфейс, посредством RADIUS (если данный протокол используется) определяется возможность дальнейшей маршрутизации вызова. Из свойств SIP-абонента определяется контекст маршрутизации по умолчанию, и маршрутизация вызова начинается в данном контексте. Далее маршрутизация отрабатывает точно так же, как в случае вызова с SIP-транка.
Входящий вызов от Megaco-абонента поступает на входящий Megaco-интерфейс. Из свойств Megaco-абонента определяется контекст маршрутизации по умолчанию, и маршрутизация вызова начинается в данном контексте. Далее маршрутизация отрабатывает точно так же, как в случае вызова с SIP-транка.
Рекомендуемая схема построения контекстов маршрутизации для "УПАТС с выходом на город"
В данном разделе рассмотрен пример построения контекстов маршрутизации для виртуальной АТС, которая позиционируется как УПАТС с выходом на город через SIP-транк или через bridge-интерфейс.
Общая схема построения контекстов маршрутизации представлена на рисунке 2.
Рисунок 2 — Общая схема построения контекстов маршрутизации
В данной виртуальной АТС выделено два плана нумерации: "внутренний план нумерации" и "городской план нумерации". Через внутренний план нумерации проходят все вызовы в рамках данной АТС. Именно в нем выполняется непосредственно маршрутизация вызова. Через городской план нумерации мы позволяем нашим абонентам выходить на город под городскими номерами. Все локальные абоненты, а также транки имеют дефолтный контекст маршрутизации во внутреннем плане нумерации.
Рассмотрим различные комбинации прохождения вызова по данной схеме.
1. Общая схема прохождения
Вызов поступает с локального SIP/Megaco-абонента, направляется в контекст маршрутизации, установленный по умолчанию, во внутреннем плане нумерации. В данном контексте происходит приведение номеров абонентов А, Б к внутреннему формату номеров, по которому выполняется маршрутизация вызовов, выставление свойств этих номеров. Данную фазу маршрутизации назовем "модификация по входу".
Далее, вызов направляется в корневой контекст внутреннего плана нумерации для непосредственного выполнения маршрутизации. Во время маршрутизации не предполагается изменение номеров А, Б, а также их свойств, но возможны переходы между контекстами. Когда маршрутизация обнаружила исходящее направление, она переходит в специальный контекст маршрутизации, который занимается преобразованием номеров и их свойств для выхода на данное направление, установление СОРМ-номеров для абонентов, если это необходимо. Данную фазу назовем "модификация по выходу".
По выходу из данного контекста мы имеем номера А, Б а также их свойства такими, которые понимает сторона Б.
2. Вызов с локального абонента на локального абонента
Вызов приходит с локального SIP/Megaco-абонента. Вызов направляется во внутренний план нумерации, выполняется "модификация по входу" для абонентов А, Б, после выполняется маршрутизация вызова. В ходе маршрутизации было определено, что абонент Б — локальный абонент, абонент данной виртуальной АТС. Поэтому маршрутизация переходит в контекст, предназначенный для модификации номеров при выходе на локальных абонентов, если это необходимо. В данном контексте выполняется модификация, после вызов отправляется на локального абонента.
3. Вызов с локального абонента на город
Вызов приходит с локального SIP/Megaco-абонента. Вызов поступает во внутренний план нумерации, выполняется "модификация по входу" для абонентов А, Б, после выполняется маршрутизация вызова. В ходе маршрутизации было определено, что абонент Б — городской абонент. Поэтому изменяем план нумерации на городской, путем перехода в один из контекстов маршрутизации в городском плане нумерации. При переходе в городской план нумерации для абонента А будут автоматически выставлены свойства "apri", "nai", "ni", "npi", "screening" для городского плана нумерации, а также номер абонента А, если у него прописан номер для городского плана нумерации. Далее, маршрутизация продолжается в городском плане нумерации. Когда маршрутизация определит направление (транк, bridge-интерфейс) вызова, будет выполнен переход в контекст маршрутизации для выхода на данное направление. В данном контексте маршрутизации будет выполнена "модификация по выходу", и вызов будет направлен на SIP-транк или bridge-интерфейс на город.
4. Вызов с города на локального абонента
Вызов поступает с города (SIP-транк или bridge-интерфейс) на локального абонента. Вызов направляется в городской план нумерации, для абонента А автоматически выставляются свойства "apri", "nai", "ni", "npi", "screening", выполняется "модификация по входу". Далее, выполняется маршрутизация вызова. Маршрутизация определяет, что вызов поступил на локального абонента. Поэтому происходит переход в контекст маршрутизации, предназначенный для модификации номеров при выходе на локальных абонентов, если необходимо. В данном контексте выполняется "модификация по выходу", после вызов отправляется на локального абонента. При выходе на локального абонента система по номеру абонента Б в городском плане нумерации выполняет поиск абонента данной АТС, у которой в городском плане нумерации выставлен номер Б, который получили в результате маршрутизации. Если таких абонентов больше чем один, то выбирается абонент, на который был данный номер установлен первым. И вызов направляется на данного абонента. Если абонент не найден, вызов отбивается.
Рекомендуемая схема построения контекстов маршрутизации для "Транзитной АТС"
Рисунок 3 — Схема построения контекстов маршрутизации для "Транзитного АТС"
В случае транзитной виртуальной АТС присутствует один "внутренний план нумерации", в рамках которого выполняется вся маршрутизация вызовов.
Рассмотрим ситуацию: вызов приходит из входящего SIP-транка #1 и должен быть направлен в транк #2. Сначала вызов поступает в контекст маршрутизации для SIP-транка, установленный по умолчанию #1, где выполняется приведение номеров А, Б, а также их свойств к внутреннему плану нумерации ("модификация по входу"). Далее, на основе модифицированных данных выполняется маршрутизация вызовов, по результатам которой будет найден маршрут до исходящего направления #2. Как только маршрут найден, вызов переходит в "контекст маршрутизации для модификации номеров и их свойств по выходу на направление #2" (модификация по выходу). В нем выполняется приведение номеров абонентов А, Б, а также их свойств к формату, который "понимает" транк #2. Далее, вызов уходит в данное направление.
Аналогичным образом проходит вызов из транка #1 в транк #2.
Схема подключения УПАТС к городу через транзитную АТС
В данном примере рассмотрим ситуацию, когда УПАТСы для выхода "на город" используют центральную АТС (выход на центральную АТС осуществляются через Bridge).
Рисунок 4 — Схема подключения УПАТС к городу через транзитную АТС
1. Абонент УПАТС #1 звонит в город
Вызов поступает с локального SIP/Megaco-абонента, направляется во внутренний план нумерации, выполняется "модификация по входу" для абонентов А, Б, после чего выполняется маршрутизация вызова. В процессе маршрутизации было определено, что абонент Б — городской абонент. Поэтому изменяем план нумерации на городской, путем перехода в один из контекстов маршрутизации в городском плане нумерации. При переходе в городской план нумерации для абонента А будут автоматически выставлены свойства "apri", "nai", "ni", "npi", "screening" для городского плана нумерации, а также номер абонента А, если у него прописан номер для городского плана нумерации. Далее, маршрутизация продолжается в городском плане нумерации. Когда маршрутизация определит направление вызова (находит bridge-интерфейс), будет выполнен переход в контекст маршрутизации для выхода на данный bridge-интерфейс. В данном контексте маршрутизации будет выполнена "модификация по выходу", в рамках которой номера абонентов А, Б, а также их свойства будут приведены к понятному в "Центральном домене" виду. Далее, вызов направляется в найденный bridge-интерфейс, пройдя через который попадает в "центральный домен" через "Входящий бридж-интерфейс УПАТС #1". В центральном домене вызов направляется в контекст маршрутизации по умолчанию для данного bridge-интерфейса, где могут быть выполнены приведения номеров А, Б, а также их свойств к внутреннему плану нумерации. Также в данном контексте может быть добавлена проверка на корректность номеров А, Б, пришедших с bridge-интерфейса. Далее, на основе модифицированных данных выполняется маршрутизация вызовов, по результатам которой будет найден маршрут до города. После этого вызов переходит в "контекст маршрутизации для модификации номеров и их свойств по выходу на город", где выполняется "модификация по выходу". Вызов поступает в направление до города.
2. С города поступает вызов на абонента УПАТС #1
В центральный домен приходит вызов из "входящего SIP-транка (вызов с города)", попадает в контекст маршрутизации по умолчанию во внутреннем плане нумерации, где происходит модификация номеров А, Б, а также их свойства к внутреннему плану нумерации. Далее, на основе модифицированной информации осуществляется маршрутизация вызова, в процессе которой определяется, что вызов идет на абонента УПАТС #1. Маршрутизация переходит в "контекст для модификации номеров и их свойств по выходу на УПАТС #1", после чего вызов отправляется в бридж до УПАТС #1.
В УПАТС #1 вызов направляется через "Входящий bridge-интерфейс с центрального домена", поступает в контекст маршрутизации в городском плане нумерации, установленный по умолчанию, где происходит модификации номеров А, Б, а также их свойств в "Городскому плану нумерации". Далее, выполняется непосредственная маршрутизация вызова, в результате которой определяется, что абонент Б — локальный абонент данной УПАТС. Поэтому выполняется переход в контекст маршрутизации, предназначенный для модификации номеров при выходе на локальных абонентов, если необходимо. В данном контексте выполняется "модификация по выходу", после чего вызов отправляется на локального абонента. При выходе на локального абонента система по номеру абонента Б в городском плане нумерации выполняет поиск абонента УПАТС #1, у которого в городском плане нумерации выставлен номер Б, который получили в результате маршрутизации. Если таких абонентов больше чем один, то выбирается абонент, на который был данный номер установлен первым. И вызов направляется на данного абонента. Если такой абонент не найден, вызов отбивается.
Реестр российского плана нумерации
РосСвязь на своем сайте предоставляет реестр российских номеров с привязкой к регионам, оператора, за которыми закреплены данные номера. Данная база периодически обновляется, при перераспределении номеров. В рамках релиза 3.14 была сделана возможность на уровне маршрутизации / модификации номеров вызова воспользоваться данной базой. Имеется возможность изменять отображаемое имя абонента А, Б на основе информации из данной базы. Маршрутизировать вызовы на основе оператора/региона / города абонента А, Б.
Для того, чтобы воспользоваться данным функционалом, необходимо настроить локальный кеш данной базы локально на каждом из хостов ECSS-10, на котором запущена нода DS.
Настройка кеша российского плана нумерации
Для обновления кеша российского плана нумерации был создан systemd-сервис ecss-rf-numbering-plan.service. При запуске сервис скачивает из internet российский план нумерации, разбирает его и записывает во внутреннюю базу номеров. Кодировка текста — UTF-8. После чего сервис останавливается, и сам не запускается. Для того, чтобы сервис автоматически обновлял кеш, есть таймер ecss-rf-numbering-plan.timer. По умолчанию он выключен, но его можно настроить обновлять кеш (например раз в неделю/месяц).
Конфигурация сервиса ecss-rf-numbering-plan.service
Конфигурация сервиса ecss-rf-numbering-plan.service располагается по пути /etc/ecss/ecss-rf-numbering-plan.conf
# Каталог, содержащий планы нумерации
# Path to directory, that contains files with numbering scheme
#PATH_SCHEMES=
# URL-адрес для автоматической загрузки планов нумерации
# URL for downloading numbering schemes
URL_NUMBERING_SCHEME="https://rossvyaz.ru/data"
# Список планов нумерации, требуется только при загрузке
# Names of numbering schemes, used for downloading
#NAMES_NUMBERING_SCHEME=
NAMES_NUMBERING_SCHEME=ABC-3xx.csv,ABC-4xx.csv,ABC-8xx.csv,DEF-9xx.csv
# Путь для записи базы данных
# Path to write database
SQL_DB=/var/lib/ecss/routing/rf-numbering-plan.db
# Путь для записи логов, если не задан логи пишутся только в stdout
# Path to write logs, if not set, then logs write only in stdout.
LOGS=/var/log/ecss/rf-numbering-plan.log
- Если при выполнении должны использоваться уже загруженные планы нумерации, то в PATH_SCHEMES требуется задать путь до каталога с ними. В этом каталоге должны находиться только файлы с планами нумерации!
- URL_NUMBERING_SCHEME URL адреса, для загрузки планов.
- NAMES_NUMBERING_SCHEME — список название планов нумерации. Названия должны быть перечислены через запятую без пробелов.
Загрузка осуществляется, используя комбинацию URL адреса и названий (пример: https://rossvyaz.ru/data/{ABC-3xx.csv,ABC-4xx.csv,ABC-8xx.csv,DEF-9xx.csv}) - LOGS — путь до файла для записи логов. Логи записываются только при работе через systemd-сервис, либо при запуске от root. При повторном запуске логи перетираются. Также все логи пишутся в stdout.
Запуск сервиса по таймеру
Для запуска через таймер также необходимо отредактировать ecss-rf-numbering-plan.timer (/lib/systemd/system/ecss-rf-numbering-plan.timer). В нём необходимо настроить время и период запуска сервиса. По умолчанию для таймера установлено следующее значение: первого числа каждого месяца в 00:00.
Единовременный запуск сервиса из консоли
ecss-rf-numbering-plan [<SQL_DB>] [--scheme <PATH_SCHEMES>]
Если SQL_DB не указан в конфигурационном файле, то его необходимо передать при запуске.
Особенности при парсинге номеров
При обработке используются следующие правила
- удаляются все лишние пробелы;
- вокруг символов ; — | удаляются все пробелы;
- все приводится в верхний регистр;
- буква "ё" заменяется на "е";
- город, г. о. (городской округ), г.п. (городское поселение) -> г.;
- область -> обл.;
- район/улус -> р-н;
- автономный округ, автономная область -> АО;
- республика и р-н стоят до названия;
- край, обл. и АО — после названия;
- полные версии форм организация: ОАО, ООО, ПАО, АО, ЗАО, ФГУП, ФКП, МБУ — приводятся к сокращенному виду.
Также есть список, по которому обрабатываются какие-либо нестандартные значения
- нас.пункт без региона;
- несколько регионов/нас.пунктов;
- федеральные округа, РФ;
- другое гос-во (Байконур/Казахстан );
- различные ошибки/опечатки (находил как в названиях нас.пунктов/районов, так и у операторов) и др.
Если после обработки будут обнаружены невалидные значения
- населенный пункт без указания региона;
- несколько населенных пунктов или регионов;
То появятся соответствующие сообщения.
Создание и настройка файлов контекстов маршрутизации
Создание и настройка контекстов маршрутизации выполняется из под операционной системы Linux либо через web-конфигуратор, который позволяет просмотреть текущие настройки контекстов маршрутизации, создавать, удалять и корректировать их элементы.
Если вы работаете в командной консоли управления CLI, то для создания контекстов маршрутизации нужно выйти из командной консоли управления CLI, используя команду exit.
При установке системы ECSS-10 автоматически прописывается путь по умолчанию, по которому будут располагаться контексты маршрутизации /var/lib/ecss/routing/ctx/src/<DOMAIN>/
.
Для каждого контекста маршрутизации в папке /var/lib/ecss/routing/ctx/src/<DOMAIN>/
необходимо создать отдельный файл. Описание файла контекста маршрутизации выполняется с использованием языка разметки XML.
Контекст маршрутизации описывается в файле тегом <context> и содержит одно или несколько правил <rule>. Правила включают в себя описание условий срабатывания <conditions>, набор операций для выполнения маршрутизации <actions> и результат выполнения маршрутизации вызова <result>.
Условия срабатывания <conditions> определяют, по каким правилам будет осуществляться маршрутизация — по номеру вызывающего абонента, по номеру вызываемого, по дню недели и другие правила.
Набор операций для выполнения маршрутизации <actions> включает в себя модификацию номеров вызываемого, вызывающего абонентов, установка флага "конец набора" и другие операции.
Результатом выполнения маршрутизации вызова <result> может быть маршрутизация внутри виртуальной АТС, маршрутизация на встречную АТС, неверная маршрутизация и другие варианты.
Все возможные варианты условий срабатывания, наборов операций и результатов выполнения приведены в разделе:
Детальное описание конфигурационного файла маршрутизации.
Порядок создания файла контекста маршрутизации
Для создания контекста маршрутизации необходимо:
1) Создать файл с расширением xml.
2) Указать в начале файла тег — версию xml:
<?xml version="1.0"?>
3) Создать контекст — открывающий и закрывающий теги:
<context>
</context>
В открывающем теге контекста указать параметры xmlns:xs и xs:noNamespaceSchemaLocation со следующими значениями:
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="ecss_routing.xsd"
Далее нужно указать:
- произвольное имя контекста, которое однозначно его определяет;
- домен, для которого создается контекст;
- тип контекста, установить значение local;
- правило создания плана нумерации, установить значение:
- auto — для контекстов, использующий протокол H.248/Megaco;
- none — для контекстов, не использующих протокол H.248/Megaco.
Пример открывающего тега контекста:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="ecss_routing.xsd"
name="some_name"
domain="some.domain"
type="local"
digitmap="auto">
4) Создать правило внутри контекста — открывающий и закрывающий теги:
<rule>
</rule>
В открывающем теге правила указать имя контекста маршрутизации:
<rule name="to_intercity">
5) Создать условие срабатывания правила — открывающий и закрывающий теги <conditions> внутри правила и условия срабатывания правила.
Самые распространенные условия основаны на анализе цифр номера вызываемого и вызывающего абонентов. Для этого используются теги <cdpn/> и <cgpn/> с параметром маски номера digits="Digits". Префиксная часть правила:
- "?" — один любой не пустой элемент номера (цифры 0-9 или буквы A, B, C, D, E, F);
- "0"-"9" — цифры от 0 до 9;
- "A"-"D" — буквы A, B, C, D;
- "E" — символ *;
- "F" — символ #;
- "( )" — диапазон или перечисление. Диапазон указывается через "-", перечисление через ",". Например, (1-6) — диапазон, (1,3,9) — перечисление;
- "%" — 0 или несколько элементов номера.
<conditions>
<cdpn/>
<cgpn/>
<calling/>
<time/>
<date/>
<weekday/>
<tag/>
<final/>
<cause/>
</conditions>
6) Если необходимо создать набор операций для выполнения маршрутизации, нужно указать открывающий и закрывающий теги <actions> внутри правила и набор операций для выполнения маршрутизации.
Самые распространенные операции основаны на модификации цифр номера вызываемого и вызывающего абонентов. Для этого используются теги <cdpn/> и <cgpn/>
<actions>
<set_options/>
<cgpn/>
<cdpn/>
<restore_cgpn/>
<restore_cdpn/>
<calling/>
<final/>
</actions>
7) Определить результат выполнения маршрутизации вызова — создать открывающий и закрывающий теги <result> внутри правила и описать результаты маршрутизации.
Самые распространенные варианты маршрутизации — вызовы на локального абонента <local> и вызовы на внешнее направление <external>. При вызове на внешнее направление создается тег <direction>, в котором указывается имя интерфейса для маршрутизации вызова.
<result>
<local/>
<external>
<direction/>
</external>
<no_route/>
<continue/>
<incomplete/>
</result>
Пример файла контекста маршрутизации:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="ecss_routing.xsd"
name="ctx_city_local"
domain="d.city"
type="local"
digitmap="auto">
<rule name="to_intercity">
<conditions>
<cdpn digits="8%"/>
<cgpn digits="%"/>
</conditions>
<actions>
<cdpn digits="{%}" nai="nationalNumber"/>
<cgpn digits="383{%}"/>
</actions>
<result>
<continue context="ctx_intercity"/>
</result>
</rule>
<rule name="local_subscribers1">
<conditions>
<cdpn digits="332???"/>
</conditions>
<result>
<local/>
</result>
</rule>
<rule name="local_subscribers2">
<conditions>
<cdpn digits="77???"/>
</conditions>
<result>
<local/>
</result>
</rule>
<rule name="external_subscribers">
<conditions>
<time value="9:00 - 18:00"/>
<date value="*.*.* - *.*.*"/>
<weekday value="1,2,3,4,5"/>
<cdpn digits="200??"/>
</conditions>
<result>
<external>
<direction value="port_sipt1"/>
<direction value="port_sipt2"/>
</external>
</result>
</rule>
</context>
Пример выбора оператора междугородней/международной связи в контексте маршрутизации:
Определение предустановленного оператора междугородней/международной связи для абонента может выполняться через префиксирование в соответствии со свойствами абонентов. В данном случае для каждого из абонентов может быть выбран свой предустановленный оператор связи.
Например, абонент набирает номер 84951234567. Необходимо выполнить подмену номера в соответствии с заданным кодом провайдера. Для этого используется параметр [calling.provider], назначенный в наборе операций для выполнения маршрутизации <actions>.
Если код провайдера определен в свойствах абонента (настройка свойств абонента рассматривается в разделе Команды управления конфигурацией алиасов в рамках домена, список параметров приведен в Приложение А. Набор параметров алиасов), например provider = 1501, то в результате на АМТС будет набран номер 815014951234567.
Пример правила маршрутизации с использованием свойств абонента А при модификации номеров:
<rule name="to_intercity">
<conditions>
<calling access_intercity="true"/>
<cdpn digits="8%"/>
</conditions>
<actions>
<cdpn digits="8[calling.provider]{%}"/> % Вместо [calling.provider] будет выбран номер оператора связи, прописанный в свойствах абонента
</actions>
<result>
<external>
<direction value="to_intercity"/>
</external>
</result>
</rule>
Настройка параметров маршрутизации через CLI
После создания контекстов маршрутизации выполняется настройка параметров маршрутизации.
Если конфигурирование системы будет выполняться через интерфейс командной строки CLI, подключитесь к командной консоли под пользователем admin.
Команда для подключения к консоли:
ssh admin@localhost -p 8023
Далее нужно импортировать в систему созданные контексты маршрутизации командой:
/domain/<DOMAIN>/routing/import <NODE> <FILE>
При успешном выполнении команды будет выведено сообщение:
context has been successfully imported
Посмотреть импортированные контексты можно командой:
/domain/<DOMAIN>/routing/show <FILE>
При необходимости контекст маршрутизации можно удалить из виртуальной АТС:
/domain/<DOMAIN>/routing/delete <FILE>
где
- <DOMAIN> — имя виртуальной АТС;
- <NODE> — имя ноды, на которой созданы контексты маршрутизации;
- <FILE> — имя файла с контекстом маршрутизации, который необходимо импортировать.
Трассировка вызова
Трассировка вызова используется для контроля корректности выполнения процесса маршрутизации для определенных вызовов и позволяет отобразить шаги маршрутизации с указанием переходов между контекстами маршрутизации.
/domain/<DOMAIN>/routing/trace
iface=<INTERFACE> cdpn.<PARAM>=value
[<OPT1>=<VALUE1> [ ... [<OPTN>=<VALUEN>]]]
где
- IFACE — интерфейс вызывающего абонента;
- CDPN. — параметры вызываемого абонента (cdpn.digits, cdpn.incomplete, cdpn.inni, cdpn.nai, cdpn.ni, cdpn.npi);
- OPT1..N — опциональные параметры — набор входных данных об устанавливаемом телефонном соединении.
В итоге выполнения команды для входных данных вызова (интерфейс абонента А, контекст абонента А, время суток, день недели, номер абонента А, номер абонента Б) на выходе будут получены следующие данные: интерфейс абонента А, домен абонента А, контекст абонента А, номер абонента А (возможно модифицированный), номер абонента Б (возможно модифицированный), интерфейс абонента Б.
Описание команд и параметров приведено в разделе Справочник команд CLI, Команды управления маршрутизацией.
Настройка параметров маршрутизации через web-конфигуратор
Для работы с маршрутизацией через web-конфигуратор используется приложение "Routing manager" ("Менеджер маршрутизации").
Описание приложения приведено в раздел Менеджер маршрутизации (Routing manager).
Порядок создания файла контекста маршрутизации через web-конфигуратор:
1. В определенной виртуальной АТС (домен) создать контекст маршрутизации;
2. Прописать произвольное уникальное имя контекста маршрутизации;
3. Выбрать тип контекста маршрутизации: пустой, для услуг, контекст по умолчанию;
4. Создать правило в заданном контексте маршрутизации:
- Прописать уникальное имя, однозначно его определяющее;
- Создать условие срабатывания правила (conditions);
- При необходимости создать набор операций для выполнения маршрутизации (actions);
- Определить результат выполнения маршрутизации. Самые распространённые варианты маршрутизации — вызовы на локального абонента и вызовы на внешнее направление;
5. Сохранить правило контекста маршрутизации;
6. Сохранить контекст маршрутизации. Изменения будут внесены в систему.
Чтобы на сервере ECSS-10 всегда хранились актуальные контексты маршрутизации, после создания/изменения файла контекста маршрутизации через web-конфигуратор нужно экспортировать файл на сервер системы ECSS-10.
Для этого:
- При экспорте файлов через web-конфигуратор файлы сохраняются на локальном ПК, с которого нужно скопировать файлы на сервер ECSS-10 в директорию/var/lib/ecss/routing/ctx/src/<DOMAIN>/.
- Для экспорта файла контекста маршрутизации через CLI нужно подключиться к командной консоли под пользователем admin.
Команда для подключения к консоли:
ssh admin@localhost -p 8023
Для выгрузки файла контекста маршрутизации на сервер системы ECSS-10 используется команда:
/domain/<DOMAIN>/routing/export <NODE> <CONTEXT_NAME>
где
- <DOMAIN> — имя виртуальной АТС;
- <NODE> — имя ноды, на которой созданы контексты маршрутизации;
- <CONTEXT_NAME> — название контекста маршрутизации.
В результате выполнения команды файл контекста маршрутизации, созданный/измененный через web-конфигуратор, будет сохранен на сервере системы ECSS-10 с новым именем. В имени файла будет указано время экспорта.
RADIUS-маршрутизация телефонных вызовов
На SSW существует возможность изменения параметров проходящего вызова при помощи команд от RADIUS-сервера, посылаемых в ответ на запросы RADIUS-Authorization. Команды передаются в текстовом виде с использованием Vendor-Specific атрибута с номером вендора, закреплённым за «ООО Предприятие «ЭЛТЕКС» и равным 35265, и именем атрибута "Eltex-AVPair", имеющим номер 1. В общем виде формат атрибута Eltex-AVPair выглядит следующим образом:
Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1):<$COMMAND-STRING>
Передавая различные команды в строке $COMMAND-STRING, возможно управлять следующими параметрами: модификация номеров CgPN, CdPN а так же параметром маршрутизации tag.
Для номеров CgPN, помимо значения самого номера, можно изменять такие параметры как:
- numtype – тип номера CgPN;
- plantype – тип плана нумерации CgPN;
- presentation – значение поля presentation CgPN.
Для номеров CdPN, помимо значения самого номера, можно менять такие параметры как:
- numtype – тип номера CdPN;
- plantype – тип плана нумерации CdPN.
Для того чтобы вызвать внешнюю маршрутизации на ECSS-10 в контексте маршрутизации необходимо написать правило вида:
<rule name="to_RADIUS_routing">
<conditions>
...
</conditions>
<actions>
<external_routing id="master;backup" service="radius_route_service" timeout="5000"/>
</actions>
<result>
<continue context="ctx_after_radius"/>
</result>
</rule>
В этом правиле говорится, что в случае совпадения условий, выполнить внешнюю RADIUS маршрутизацию на серверах с идентификаторами master (а если он недоступен, backup). Команды для настройки RADIUS серверов можно посмотреть тут. При этом на внешнюю маршрутизацию потратить не более 5000ms. По результатам выполнения RADIUS запроса, продолжится ECSS маршрутизация в контексте ctx_after_radius. Но с измененными CgPN, CdPN, tag (если эти поля были изменены в результате RADIUS запроса).
Поскольку запрос маршрутизации является запросом авторизации, логин и пароль, используемые при отправке запроса, определяются в разделе конфигурации "RADIUS-авторизация".
Синтаксис запроса на изменения параметра Tag
Команда состоит из следующих частей.
- «CallManagement:» — текстовый идентификатор, определяющий, что данный атрибут содержит команду для управления вызовом;
- «Tag=» — идентификатор команды, говорящий о том, что необходимо выставить параметр tag.
Значения для параметра Tag может выступать любая строка, которая затем может быть использована на маршрутизации в рамках софтсвича.
В общем виде формат команды выглядит следующим образом:
CallManagement:Tag=<$tag>
где:
- «CallManagement:Tag=<$tag>;» — выставление параметра tag в значение <$tag>.
Пример:
Выставить значение параметра tag в to_nsk. Для этого достаточно передать в ответе Access-Accept от RADIUS-сервера атрибут со следующим значением:
Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1):CallManagement:Tag=to_nsk
Синтаксис запроса на модификацию номеров CgPN и CdPN
Команда состоит из обязательной и необязательной части. Обязательная часть состоит из начального текстового идентификатора команды, идентификатора изменяемого номера и маски модификации.
- «CallManagement:» – текстовый идентификатор, определяющий, что данный атрибут содержит команду для управления вызовом;
- «CgPN=», «CdPN=» — идентификаторы номеров, указывают к какому номеру применить модификацию;
- Параметр «маска модификации» — правило для модификации цифр номера (может быть пустой).
Необязательная часть может состоять как из одного параметра, так и из нескольких параметров, разделяемых символом «точка с запятой». Обязательная и необязательная части также разделяются символом «точка с запятой» при наличии необязательной части команды.
Возможные параметры для необязательной части:
- numtype
- plantype
- presentation
В общем виде формат команды выглядит следующим образом (для CGPN):
CallManagement:CgPN=<$modifymask>;numtype=<$numtype>;plantype=<$plantype>;presentation=<$presentation>;displayName=<$displayName>
где:
- «CallManagement:CgPN=<$modify-mask>;» — обязательная часть,
- «numtype=<$numtype>;plantype=<$plantype>;presentation=<$presentation>»; displayName=<$displayName>- необязательная часть.
В общем виде формат команды выглядит следующим образом (для CDPN):
CallManagement:CdPN=<$modifymask>;numtype=<$numtype>;plantype=<$plantype>
где:
- «CallManagement:CdPN=<$modify-mask>;» — обязательная часть,
- «numtype=<$numtype>;plantype=<$plantype>»;displayName=<$displayName> — необязательная часть.
Параметры могут быть заданы в двух вариантах "общепринятое обозначение" или в соответствии с внутренними наименованиями SSW. Значения параметров, используемых в командах, представлены ниже:
- $modify-mask – правило модификации номера (синтаксис правила модификации описан в разделе Синтаксис правила модификации);
- $numtype – (параметр nai на SSW) одно из значений:
- internationNumber, nationalNumber, subscriberNumber, unknown;
- international, national, network-specific, subscriber, unknown;
- $plantype – (параметр npi на SSW) одно из значений:
- dataNumberingPlan, isdnTelephony, telexNumberingPlan;
- isdn, national, private, unknown;
- $presentation – (параметр apri на SSW) одно из значений:
- addressNotAvailable, presentationAllowed, presentationRestricted;
- allowed, restricted, not-available, spare;
- $displayName — имя, отображаемое на дисплее телефонного аппарата.
ECSS-10 позволяет передавать параметры команды модификации номера в нескольких атрибутах. Таким образом, набор команд:
«CallManagement:CgPN=<$modify-mask>»
«CallManagement:CgPN=;numtype=<$numtype>»
«CallManagement:CgPN=;presentation=<$presentation>»
«CallManagement:CgPN=;displayName=<$displayName>»
эквивалентен одной команде:
«CallManagement:CgPN=<$modify-mask>;numtype=<$numtype>;presentation=<$presentation>»
Пример:
К номеру CgPN добавить префикс +7383, поменять его тип номера на international и задать presentation restricted. Для этого достаточно передать в ответе Access-Accept от RADIUS-сервера атрибут со следующим значением:
Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1):CallManagement:CgPN=+7383;numtype=international;presentation=restricted;displayName=UserName
Что также это эквивалентно трем атрибутам со значениями:
Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1): CallManagement:CgPN=+7383 Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1): CallManagement:CgPN=;numtype=international Vendor-Specific(26): Eltex(35265): Eltex-AVPair(1): CallManagement:CgPN=;presentation=restricted
Синтаксис правила модификации
Правило модификации представляет собой набор спецсимволов, определяющих изменения номера:
- '.' и '-': спецсимволы, обозначающие, что цифра на данной позиции номера удаляется, и на ее место смещаются цифры, следующие далее;
- 'X', 'x': спецсимволы, обозначающие, что цифра на данной позиции остается неизменной (обязательное наличие цифры на этой позиции);
- '?': спецсимвол, обозначающий, что цифра на данной позиции остается неизменной (необязательное наличие цифры на этой позиции);
- '+': спецсимвол, означающий, что все знаки, находящиеся между этой позицией и следующим спецсимволом (или концом последовательности), вставляются в номер на заданное место;
- '!': спецсимвол, означающий окончание разбора, все дальнейшие цифры номера отрезаются;
- '$': спецсимвол, означающий окончание разбора, все дальнейшие цифры номера используются неизмененными;
- 0-9, D, # и * (не имеющие перед собою спецсимвола '+'): информационные символы, которые замещают цифру в номере на данной позиции.
Детальное описание конфигурационного файла маршрутизации
Конфигурационный файл для телефонной маршрутизации представляет собой файл в формате XML, который оформлен в соответствии со схемой данных, приведенной в файле attachment:ecss_routing.xsd.
Актуальный файл с описанием схемы данных находится на развернутой системе по пути /usr/lib/ecss/lib/rm_lib-x.x.x.x/priv/ecss_routing.xsd.
Каждый XML-файл представляет собой описание одного контекста маршрутизации (группы правил) в рамках виртуальной АТС.
Формат описания контекста маршрутизации:
<context>
<rule>
<conditions>
</conditions>
<actions>
</actions>
<result>
</result>
</rule>
<rule>
</rule>
...
<rule>
</rule>
</context>
<context>
Базовый элемент файла маршрутизации, описывающий параметры контекста маршрутизации.
Структура элемента <context> имеет следующий вид:
<context name="string" domain="string" digitmap="string" np="string" description="string">
</context>
где
- name — строка с именем контекста маршрутизации, должна быть уникальной в рамках виртуальной АТС;
- domain — строка с именем виртуальной АТС, к которой относится контекст маршрутизации;
- digitmap — маска номера, опциональный параметр, принимает значения:
- строка с диджитмапом для контекста маршрутизации;
- auto — диджитмап генерируется автоматически на базе описанных в контексте правил маршрутизации, установлено по умолчанию;
- none — параметр "digitmap" не указывается.
- np — имя плана нумерации для текущего контекста маршрутизации (если параметр не указан, то по умолчанию он равен значению default);
- description — текстовое описание контекста маршрутизации.
Далее в рамках тега <context> между закрывающим и открывающим тегом идет набор тегов, описывающих правила маршрутизации.
Анализ условий срабатывания правил производится в том порядке, в котором они указаны в файле — сверху вниз.
Планы нумерации
При входе в контекст маршрутизации, если план нумерации в текущем контексте отличается от плана нумерации в предыдущим контексте (либо при начале маршрутизации), для абонента применяются настройки домена нового плана нумерации (apri, nai, ni, npi, screening). Если абонент А — локальный абонент — то для него так же может поменяться номер (если он задан в свойстве алиаса [numbers] для данного плана нумерации). Таким образом, чтобы сменить план нумерации, необходимо сделать переход из контекста маршрутизации в исходном плане нумерации в контекст маршрутизации — в новом плане нумерации (данный переход выполняется в разделе result при помощи тега <continue />).
Если маршрутизация завершается в плане нумерации, отличном от дефолтного (с именем "default"), с результатом <local />, то маршрутизация смотрит, кому в плане нумерации назначен номер cdpn и идет по одному из следующих путей:
- номер назначен на алиас (список алиасов) — в этом случае маршрутизация заканчивается выбором master алиаса;
- номер назначен на бридж — в этом случае вызов направляем вызов на бридж;
- номер не на кого не назначен — в этом случае пытаемся найти локальный алиас с номером Б. Если он находится — делаем вызов на него; иначе — no_route.
Замечание: команды по управлению планами нумерации находятся по пути: /domain/<ИМЯ_ДОМЕНА>/np/... Чтобы выставить номер для локального абонента в определенном плане нумерации можно воспользоваться командой:
/domain/<ИМЯ_ДОМЕНА>/np/numbers/bind <ИМЯ_ПЛАНА_НУМЕРАЦИИ> <НОМЕР_В_ПЛАНЕ_НУМЕРАЦИИ> --alias <ИМЯ_ВЛАДЕЛЬЦА> <ИМЯ_ГРУППЫ> <ИМЯ_ИНТЕРФЕЙС> <ЛОКАЛЬНЫЙ_НОМЕР> [--master | --passive] --master — в случае, если вызов в плане нумерации поступает на номер <НОМЕР_В_ПЛАНЕ_НУМЕРАЦИИ>, то он будет перенаправлен на данного алиаса;
Чтобы выставить номер для бриджа в определенном плане нумерации можно воспользоваться командой:
/domain/<ИМЯ_ДОМЕНА>/np/numbers/bind <ИМЯ_ПЛАНА_НУМЕРАЦИИ> <НОМЕР_В_ПЛАНЕ_НУМЕРАЦИИ> --bridge <ИМЯ_БРИДЖА>
При этом бридж должен идти из домена <ИМЯ_ДОМЕНА> и использовать план нумерации
<ИМЯ_ПЛАНА_НУМЕРАЦИИ>.
<rule>
Элементом <rule> описывается правило маршрутизации.
Структура правила маршрутизации имеет следующий вид:
<rule name="RuleName">
<conditions>
</conditions>
<actions>
</actions>
<result>
</result>
</rule>
где
- RuleName — имя правила маршрутизации. Строка, которая должна быть уникальной в рамках контекста маршрутизации, выводится при трассировке маршрутизации;
- <conditions> — обязательный элемент, описывающий условия срабатывания правила маршрутизации;
- <actions> — опциональный элемент, описывающий набор операций, которые применяются к параметрам вызова при срабатывании правила маршрутизации;
- <result> — обязательный элемент, описывающий результат отработки правила маршрутизации.
<conditions>
В элементе <conditions> описывается набор условий, выполнение которых приводит к выполнению правила.
Формат описания элемента <conditions> имеет следующий вид:
<conditions>
<calling/>
<called>
<cdpn/>
<cgpn/>
<rgn/>
<time/>
<date/>
<weekday/>
<timetable/>
<tag/>
<final/>
<cause/>
<ocdpn>
</conditions>
где
- calling — поле сравнения параметров доступа вызывающего абонента;
- called — поле сравнения параметров доступа вызываемого абонента;
- cdpn — поле сравнения номера вызываемого абонента (номер Б и его параметры);
- cgpn — поле сравнения номера вызывающего абонента (номер А и его параметры);
- rgn — поле сравнения номера переадресации вызываемого абонента (номер Б, до переадресации на С);
- time — время суток;
- date — день в году;
- weekday — день недели;
- timetable — имя расписания, которое будет использоваться для проверки при маршрутизации;
- tag — вспомогательный параметр для организации многошаговой маршрутизации в рамках одного контекста, по умолчанию установлено значение "default";
- final — признак финальной маршрутизации: номер Б полный или возможен донабор по номеру Б;
- cause — причина окончания предыдущей попытки вызова.
Каждый из указанных выше элементов в рамках <conditions> является опциональным и может быть использован не более одного раза.
Пустой набор критериев говорит об отсутствии ограничений.
<calling>
Параметры доступа вызывающего абонента.
<calling access_private="booleanType"
access_local="booleanType"
access_zone="booleanType"
access_intercity="booleanType"
access_international="booleanType"
access_emergency="booleanType"
have_access_to="atomType"
city="stringType"
region="stringType"
operator="stringType"
category="atomType"
caller_id="stringType"
display_name="stringType"
sorm_digits="stringType"
sorm_ni="atomType"
interface_group="stringType"
iface="binaryType"/>
где
- access_private — проверка значения типа доступа вызываемого абонента при выходе на УПАТС access_type/access_private.out;
- access_local — проверка значения типа доступа вызываемого абонента при выходе на местную сеть access_type/access_local.out;
- access_zone — проверка значения типа доступа вызываемого абонента при выходе на зоновую сеть access_type/access_zone.out;
- access_intercity — проверка значения типа доступа вызываемого абонента при выходе на междугородную сеть access_type/access_intercity.out;
- access_international — проверка значения типа доступа вызываемого абонента при выходе на международную сеть access_type/access_international.out;
- access_emergency — проверка значения типа доступа вызываемого абонента при выходе на спецслужбы access_type/access_emergency.out;
- have_access_to — проверка матрицы доступа вызывающего абонента на возможность выхода в указанную группу доступа (access_matrix);
city — город абонента полученный из БД реестра плана нумерации РФ
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ;
- caller_id — текущее значение номера АОН;
- interface_group — группа вызывающего интерфейса;
- iface — имя вызывающего интерфейса;
- display_name — имя абонента для отображения на терминале (замечание: если задать условие display_name="" , то под это условие попадет как случай, когда display_name задан пустой строкой, так и случай, когда он вообще не задан);
- sorm_digits — номер абонента, который будет передан в ПУ СОРМ;
- sorm_ni — признак абонента, который будет передан в ПУ СОРМ, принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы.
- category — категория абонента А, может принимать строковое либо цифровое значение согласно таблице:
Таблица 1 — Категории абонента
Строковое значение | Цифровой код (ISUP) | Цифровой код (АОН) |
---|---|---|
unknownAtThisTime | 0 | |
operatorFrench | 1 | |
operatorEngish | 2 | |
operatorGerman | 3 | |
operatorRussian | 4 | |
operatorSpanish | 5 | |
reserved | 9 | |
ordinarySubscriber | 10 | 1 — ОАО "Ростелеком" |
subscriberWithPriority | 11 | 4 — ООО "Эквант" |
dataCall | 12 | 8 — ОАО "АРКТЕЛ" |
testCall | 13 | |
spare | 14 | |
payphone | 15 | 6 — ЗАО "Компания ТрансТелеКом" |
category0 | 224 | |
hotelsSubscriber | 225 | 2 — ОАО "КОМСТАР-ОТС" |
freeSubscriber | 226 | |
paidSubscriber | 227 | 7 — ЗАО "Синтерра" |
localSubscriber | 228 | 3 — ОАО "Вымпелком" (ранее ООО "СЦС Совинтел") |
localTaksofon | 229 | 9 — ОАО "Межрегиональный Транзит Телеком" |
autoCallI | 240 | |
semiautoCallI | 241 | |
autoCallII | 242 | |
semiautoCallII | 243 | |
autoCallIII | 244 | |
semiautoCallIII | 245 | |
autoCallIV | 246 | |
semiautoCallIV | 247 | |
FETCH_BY_ECSS_GLOBAL_NUMBER_LIST_NAME | В данном случае система сделает запрос на получения категории номера из единой базы номеров ECSS-10. Замечание: данное значение можно выставить только в блоке conditions. |
Атрибуты элемента <calling> являются опциональными, но должен быть указан хотя бы один атрибут.
Порядок указания атрибутов произвольный.
<called>
Параметры доступа вызываемого абонента.
<called sorm_digits="stringType"
sorm_ni="atomType"
city="stringType"
region="stringType"
operator="stringType"/>
где
- sorm_digits — номер абонента, который будет передан в ПУ СОРМ;
- sorm_ni — признак абонента, который будет передан в ПУ СОРМ, принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
city — город абонента полученный из БД реестра плана нумерации РФ
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ
Атрибуты элемента <called> являются опциональными, но должен быть указан хотя бы один атрибут.
Порядок указания атрибутов произвольный.
<cdpn>
Параметры номера вызываемого абонента.
<cdpn digits="Digits"
nai="Nai"
incomplete="boolean"
inni="Inni"
npi="Npi"
ni="Ni"
in_list="listName"/>
где
- digits — маска цифр номера вызываемого абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- inni — индикатор внутрисетевого номера (InternalNetworkNumberIndicator), принимает значения:
- routingToInternalNumberAllowed — маршрутизация на внутренний номер разрешена,
- routingToInternalNumberNotAllowed — маршрутизация на внутренний номер не разрешена;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- ni — признак номера (NumberIndicator), принимает значения:
- private — частная сеть,
- local — местная сеть,
- zone — зоновая сеть,
- intercity — междугородная сеть,
- international — международная сеть,
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
<cgpn>
Параметры номера вызывающего абонента.
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"
in_list="listName"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- screening — индикатор контроля номера вызывающего абонента, принимает значения:
- userProvidedNotVerified — предоставлена пользователем, не проверена;
- userProvidedVerifiedAndPassed — предоставлена пользователем, проверка пройдена;
- userProvidedVerifiedAndFailed — предоставлена пользователем, проверка не пройдена;
- networkProvided — предоставлена сетью.
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
<rgn>
Параметры номера, который выполнил переадресацию
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
in_list="listName"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы$
- empty — присутствует ли в сигнализации вызова параметр RedirectingNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — RedirectingNumber не присутствует в сигнализации;
- true — RedirectingNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
Для того, чтобы понять как будет обрабатываться правило с этим условием, требуется определиться откуда будет приходить вызов переадресацией. Если вызов приходит на SSW уже с признаком переадресации (это может быть поле Diversion в sip или redirecting number в isup), то проверка будет выполняться по указанному в признаке номеру. Если вызов был переадресован локально с использованием какой либо услуги cfu, то перед повторной маршрутизацией SSW поверяет, есть ли маршрут между абонентом который совершал переадресацию и номером куда переадресуется вызов. Только если этот маршрут найден, SSW начинает искать маршрут между звонящим абонентом и номером куда была совершена переадресация.
<time>
Время суток, задается в виде: ЧЧ:ММ-ЧЧ:ММ
где
- ЧЧ — часы;
- ММ — минуты.
<time value="TimeMask"/>
где
- value — маска времени суток. Подробное описание приведено в разделе Маска времени.
<date>
Дата, задается в виде: ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
<date value="DateMask"/>
где
- value — маска даты.
Маска даты задает диапазон дат.
Формат задания маски даты: "ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2"
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
Так же возможно применение на любой позиции служебного символа "*", который соответствует любому значению.
Примеры масок даты в правилах:
<conditions>
<date value="01.01.* - 31.01.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в январе (1 месяц).
<conditions>
<date value="10.*.* - 20.*.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период с 10 по 20-е число каждого месяца.
<conditions>
<date value="13.12.2011 - 13.12.2011"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые 13 декабря 2011 года.
<weekday>
Маска дня недели задает набор дней недели.
Формат описания маски дней недели: "ДН1,ДН2,...,ДНX"
где
- ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
Работает по григорианскому календарю.
<weekday value="WeekdayMask" day_types="DayTypes" />
где
- value — маска дня недели;
- day_types — типы дней недели, перечисленные через запятую. Возможные значения:
- day-off — выходной день;
- half-holiday — предпраздничный день;
- holiday — праздничный день;
- work — рабочий день
Если одновременно указаны параметры value и day_types то условие должно совпадать по обоим параметрам.
Примеры масок дней недели в правилах:
<conditions>
<weekday value="1,2,3,4,5" day_types="work" />
</conditions>
Условию удовлетворяют вызовы, обслуживаемые с понедельника по пятницу (рабочие дни).
<conditions>
<weekday value="6,7" day_types="day-off,holiday"/>
</conditions>
Условию удовлетворяют вызовы обслуживаемые в субботу и воскресенье (выходные дни).
<timetable>
Имя расписания, которое будет использоваться для проверки при маршрутизации.
<timetable value="Timetable" />
где
- value — имя расписания. Управление расписаниями приведено в разделах /domain/<DOMAIN>/calendar/timetable -команды для управление расписанием домена., Календарь (Calendar).
Если одновременно указаны теги <time>, <weekdays>, <timetable>, то условие должно совпадать по всем параметрам.
Пример:
<timetable value="working_time" />
<tag>
Специальный параметр, который можно установить для вызова при маршрутизации.
Параметр действует только на этапе маршрутизации, устанавливается в правиле маршрутизации и в последующем используется для изменения отработки логики маршрутизации.
<tag value="Tag"/>
где
- value — строка, значение поля "tag" для вызова, проверяется на полное совпадение. По умолчанию значение — "default".
<final>
Признак финальной маршрутизации. Набор номера Б завершен (срабатывает таймера окончания набора) либо номер полный (пришел в режиме "enblock").
<final value="boolean"/>
где
- value — признак финальной маршрутизации, принимает значение:
- true — номер Б полный;
- false — возможен донабор по номеру Б.
<cause>
Причина разъединения предыдущей попытки вызова.
Механизм позволяет использовать режим маршрутизации по "Cause". Когда вызов с абонента А на абонента Б был завершен с определенным кодом завершения без фазы разговора, то выполняется повторная маршрутизация, в качестве одного из параметров указывается причина разъединения.
Если в системе корректно настроены правила маршрутизации по "Cause", то возможно осуществить перевод таких вызовов на различного вида автоинформаторы (переадресация на автоинформаторы с сообщениями типа "абонент временно недоступен", "линия перегружена", "абонент не существует" и другие).
<cause value="Cause"/>
где
- cause — причина разъединения.
<ocdpn>
Параметры оригинального номера, на который был совершен вызов.
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
category="Category"
in_list="listName"/>
- digits — маска цифр номера вызываемого абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы.
- empty — присутствует ли в сигнализации вызова параметр OriginalCalledNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — OriginalCalledNumber не присутствует в сигнализации;
- true — OriginalCalledNumber присутствует;
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
<actions>
В элементе <actions> описывается набор действий, выполняемых при срабатывании правила.
Формат описания элемента <actions> имеет следующий вид:
<actions>
<set_options/>
<cgpn/>
<cdpn/>
<rgn/>
<restore_cgpn/>
<restore_rgn/>
<empty_rgn/>
<restore_cdpn/>
<calling/>
<called/>
<final/>
<alarm/>
<log/>
<cause/>
<external_routing/>
<ocdpn/>
<restore_ocdpn>
</actions>
где
- set_options — установка различных параметров вызова;
- cgpn — модификация параметров номера вызывающего абонента;
- cdpn — модификация параметров номера вызываемого абонента;
- rgn — модификация параметров номера, который выполнил переадресацию
- restore_cgpn — восстановление параметров номера вызывающего абонента до значений, которые были при входе в текущий контекст (отмена изменений в рамках контекста);
- restore_cdpn — восстановление параметров номера вызываемого абонента до значений, которые были при входе в текущий контекст (отмена изменений в рамках контекста);
- restore_rgn — восстановление исходных значений параметров номера, который выполнил переадресацию
- empty_rgn — восстановление исходных значений параметров номера вызываемого абонента;
- calling — модификация параметров доступа вызывающего абонента (структура аналогична параметру "calling" из элемента <conditions>);
- called — модификация параметров доступа вызываемого абонента для СОРМ (структура аналогична параметру "called" из элемента <conditions>);
- final — установка признака окончания набора;
- alarm — посылка аварии;
- log — запись сообщения в лог;
- cause — установка cause-ов, по которым необходимо выполнять маршрутизацию по козам;
- external_routing — вызов внешнего сервиса маршрутизации (в данный момент поддерживается только внешняя маршрутизация по Radius);
- ocdpn — операция модификации параметров оригинального номера, на который был совершен вызов;
restore_ocdpn — восстановление исходных значений параметров оригинального номера, на который был совершен вызов, которые были при входе в контекст маршрутизации;
empty_ocdpn — удалить из сигнализации параметр OriginalCalledNumber.
Действия указываются в порядке их выполнения. Все действия являются опциональными.
<set_options>
Низкоуровневая операция, может использоваться для модификации специальных свойств вызова.
Используется для передачи опциональных параметров из маршрутизации в ядро, в переменные IVR скрипта.
Для того чтобы определить переменную IVR скрипта, поле key должно начинаться с ivr_variable:
.
Например, чтобы выставить IVR переменную с именем CARD_PLATFORM_TO_NUMBER поле key должно быть равно ivr_variable:CARD_PLATFORM_TO_NUMBER
.
Пример задания переменной IVR скрипта CARD_PLATFORM_TO_NUMBER. Переменная выставляется в символы, введенные после номера выхода на IVR скрипт:
<actions>
<set_options>
<option key="ivr_variable:card_platform_to_number" value="{def}"/>
</set_options>
</actions>
<cgpn>
Операция модификации параметров номера вызывающего абонента.
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера,
Описание параметров "nai", "incomplete", "npi", "apri", "screening", "ni" аналогично описанию параметров элемента "cgpn" секции "conditions".
<cdpn>
Операция модификации параметров номера абонента Б.
<cdpn digits="Digits"
nai="Nai"
incomplete="boolean"
inni="Inni"
npi="Npi"
ni="Ni"/>
где
- digits — маска модификации цифр номера или новые цифры номера, подробное описание приведено в разделе Модификация цифр номера, остальные параметры аналогичны параметрам элемента "cdpn" секции "conditions".
<rgn>
Операция модификации параметров номера, который выполнил переадресацию
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"/>
где
- digits — маска модификации цифр номера или новые цифры номера, подробное описание приведено в разделе Модификация цифр номера,остальные параметры аналогичны параметрам элемента "rgn" секции "conditions".
<restore_cgpn>
Восстановление исходных значений параметров номера вызывающего абонента, которые были при входе в контекст маршрутизации.
Этот элемент атрибутов не имеет.
<restore_rgn>
Восстановление исходных значений параметров номера, который выполнил переадресацию, которые были при входе в контекст маршрутизации.
Этот элемент атрибутов не имеет.
<empty_rgn>
Удалить из сигнализации параметр RedirectingNumber.
Этот элемент атрибутов не имеет.
<restore_cdpn>
Восстановление исходных значений параметров номера вызываемого абонента, которые были при входе в контекст маршрутизации.
Этот элемент атрибутов не имеет.
<calling>
Модификация параметров доступа вызывающего абонента.
<calling category="atomType"
caller_id="stringType"
display_name="stringType"
sorm_digits="stringType"
sorm_ni="atomType"/>
Синтаксис атрибута "caller_id" аналогичен полю "digits" в "cgpn".
Описание параметров аналогично описанию параметров "calling" раздела "conditions".
Установка номера АОН. Синтаксис атрибута "digits" аналогичен полю "digits" в "cgpn".
Пример установки "caller_id", добавление "8" к номеру из "cgpn":
<conditions>
<cgpn digits="%"/>
</conditions>
<actions>
<calling caller_id="8{%}"/>
</actions>
Параметр display_name позволяет при маршрутизации вызова подменить отображаемое имя абонента А. Данное поле имеет тестовый тип, поддерживает следующие макро-переменные:
%CITY% — город абонента А, на основе Реестра российского плана нумерации;
- %REGION% — регион абонента А, на основе Реестра российского плана нумерации;
- %OPERATOR% — оператор абонента А, на основе Реестра российского плана нумерации
<called>
Модификация параметров доступа вызываемого абонента.
<called sorm_digits="stringType"
sorm_ni="atomType"/>
Описание параметров аналогично элементу "called" раздела "conditions".
<final value="true">
Установка признака финальной маршрутизации. Набор номера Б завершен (срабатывает таймера окончания набора) либо номер полный (пришел в режиме "enblock").
<alarm>
Добавление аварийного события на ECSS-10.
<alarm severity="alarmSeverity"
value="string"/>
- severity — уровень важности аварийного события, возможные значения: warning, minor, major, critical, indeterminate, cleared;
- value — строковое описание данного аварийного события. Строка описания поддерживает следующий набор макросов:
- %TAG% — значения поля tag;
- %CDPN.NAI% — значение nai для вызываемого абонента;
- %CDPN.NI% — значение ni для вызываемого абонента;
- %CDPN.INCOMPLETE% — значение incpomlete для вызываемого абонента;
- %CDPN.INNI% — значение inni для вызываемого абонента;
- %CDPN.NPI% — значение npi для вызываемого абонента;
- %CDPN.DIGITS% — номер для вызываемого абонента;
- %CGPN.NAI% — значение nai для вызывающего абонента;
- %CGPN.NI% — значение ni для вызывающего абонента;
- %CGPN.INCOMPLETE% — значение incpomlete для вызывающего абонента;
- %CGPN.NPI% — значение npi для вызывающего абонента;
- %CGPN.APRI% — значение apri для вызывающего абонента;
- %CGPN.SCREENING% — значение screening для вызывающего абонента;
- %CGPN.DIGITS% — номер вызывающего абонента;
- %DOMAIN% — домен, в рамках которого маршрутизировался данный вызов;
- %ISFINAL% — значение параметра isFinal;
- %CONTEXTNAME% — имя контекста маршрутизации;
- %IFACEA% — интерфейс абонента А;
- %DATETIME% — время, в которое была выполнена маршрутизация.
<log>
Создать запись в системный журнал.
<log severity="logSeverity"
value="string"/>
- severity — показатель критичности записи в системный журнал, возможные значения: error, warning, info;
- value — текст записи в системный журнал. Строка описания поддерживает следующий набор макросов:
- %TAG% — значения поля tag;
- %CDPN.NAI% — значение nai для вызываемого абонента;
- %CDPN.NI% — значение ni для вызываемого абонента;
- %CDPN.INCOMPLETE% — значение incpomlete для вызываемого абонента;
- %CDPN.INNI% — значение inni для вызываемого абонента;
- %CDPN.NPI% — значение npi для вызываемого абонента;
- %CDPN.DIGITS% — номер для вызываемого абонента;
- %CGPN.NAI% — значение nai для вызывающего абонента;
- %CGPN.NI% — значение ni для вызывающего абонента;
- %CGPN.INCOMPLETE% — значение incpomlete для вызывающего абонента;
- %CGPN.NPI% — значение npi для вызывающего абонента;
- %CGPN.APRI% — значение apri для вызывающего абонента;
- %CGPN.SCREENING% — значение screening для вызывающего абонента;
- %CGPN.DIGITS% — номер вызывающего абонента;
- %DOMAIN% — домен, в рамках которого маршрутизировался данный вызов;
- %ISFINAL% — значение параметра isFinal;
- %CONTEXTNAME% — имя контекста маршрутизации;
- %IFACEA% — интерфейс абонента А;
- %DATETIME% — время, в которое была выполнена маршрутизация.
<cause>
Для того чтобы можно было выставить cause-ы, по которым необходимо выполнять маршрутизацию по козам, в блоке "Действие" необходимо добавить раздел "Причины для повторной маршрутизации". В данном разделе добавить три поля для ввода:
- причины ACP (ACP causes) — список ACP козов;
- причины ISUP (ISUP causes) — список ISUP козов;
- причины SIP (SIP causes) — список SIP козов.
На уровне контекста маршрутизации, блока actions добавляется блок cause:
<rule name="rule1">
<actions>
<cause acp="normal, bPtyBusy" isup="16,17,18" sip="401, 400"/>
</actions>
</rule>
<external_routing>
Вызов внешнего сервиса маршрутизации (в настоящий момент поддерживается только внешняя маршрутизации по RADIUS).
<external_routing id="stringType"
service="stringType"
timeout="positiveIntegerType"/>
- id — список имен RADIUS-серверов, на которые будут направляться запросы внешней маршрутизации. Список задается через точку с запятой. В случае указания нескольких серверов, на последующий сервер запрос пойдет только в том случае, если ранее стоящий сервер недоступен. Список серверов можно посмотреть командой @/domain/<DOMAIN>/radius/info@;
- service — radius_route_service — внешняя маршрутизация по RADIUS;
- timeout — время ожидания результата от сервиса внешней маршрутизации, в миллисекундах. По умолчанию установлено 500 мс. Если за данное время внешняя маршрутизация не завершится, система воспримет, что маршрутизация не внесла никаких изменений.
Пример вызова внешней маршрутизации с использованием RADIUS-серверов с именами master и backup, тайм-аутом на запрос в 1 секунду:
<actions>
<external_routing id="master;backup" service="radius_route_service" timeout="1000"/>
</actions>
<ocdpn>
Операция модификации параметров оригинального номера, на который был совершен вызов.
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
category="Category"/>
- digits — маска модификации цифр номера или новые цифры номера, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы$
- empty — присутствует ли в сигнализации вызова параметр OriginalCalledNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — OriginalCalledNumber не присутствует в сигнализации;
- true — OriginalCalledNumber присутствует;
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
<restore_ocdpn>
Восстановление исходных значений параметров оригинального номера, на который был совершен вызов, которые были при входе в контекст маршрутизации.
Этот элемент атрибутов не имеет.
<empty_ocdpn>
Удалить из сигнализации параметр OriginalCalledNumber.
Этот элемент атрибутов не имеет.
<result>
В этом обязательном элементе <result> описывается результат отработки правила маршрутизации.
<result>
Result
</result>
где
- Result — результат выполнения правила, принимает значения: local; external; incomplete; no_route; continue.
<local>
Найден локальный абонент домена.
Номер полный, абонент найден, маршрутизатор производит поиск интерфейса абонента по его номеру и останавливает маршрутизацию, возвращая найденные данные по абонентам А и Б, интерфейсы А и Б.
Синтаксис в упрощенном варианте:
<result>
<local/>
</result>
Синтаксис для случая продолжения маршрутизации если абонент не был найден в БД локальных абонентов:
<result>
<local>
<continue tag="not_local"/>
<local/>
</result>
Синтаксис для поиска локального абонента по введенному атрибуту vdn:
<rule name="local_calls">
<conditions>
<cdpn digits="1???%"/>
</conditions>
<result>
<local vdn="{1,2,3,4}"/>
</result>
</rule>
Для задания атрибута vdn используется следующий синтаксис:
<local vdn="[CGPN|CDPN|RGN{DIGITS}]"/>
По умолчанию значение берется из cdpn.
где
- tag — строковый тэг, используемый в дальнейшей обработке вызова на маршрутизации. Тэг устанавливаем обязательно, т.к. если его не задать и в маршрутизации не обработать — это приведет к зацикливанию маршрутизации.
<ivr>
Найдено направление выхода из домена на сервис ivr (относящийся к данному домену); маршрутизатор останавливает маршрутизацию, возвращая найденные данные по абоненту А, интерфейсы А и Б.
Внимание: в случае выхода на ivr проверка групп доступа, режимов ограничения на абоненте А не проводится.
Синтаксис:
<result>
<ivr script="IvrScript"/>
</result>
где
- script — имя ivr скрипта, который будет выполнен при выходе по данному правилу.
<external>
Найден интерфейс выхода из домена (транк в другой домен, транк на другую станцию и т.п.), маршрутизатор останавливает маршрутизацию, возвращая найденные данные по абонентам А и Б, интерфейсы А и Б.
при установленном флаге найден интерфейс выхода из домена (транк в другой домен, транк на другую станцию и т.п.), маршрутизатор останавливает маршрутизацию, возвращая найденные данные по абонентам А и Б, интерфейсы А и Б.
Синтаксис:
<result>
<external>
<trunk value="Interface1" weight="50" max_load="80%"/>
<trunk value="Interface2" weight="50" max_load="80%"/>
<trunk value="Interface3" weight="10"/>
</external>
</result>
где
- trunk — описание интерфейса, соответствующего выходу из виртуальной АТС (домена). Соответствует транку на бридже, либо каком-то шлюзе. Может быть указано несколько интерфейсов, что определяет набор пучков СЛ в одном направлении.
- value — строка с именем интерфейса
- weight — вес интерфейса, число, опциональный параметр, который указывает приоритет занятия каналов в конкретном пучке СЛ в направлении. В правиле веса либо задаются для всех интерфейсов, либо не задаются ни для одного интерфейса. В зависимости от того заданы веса или нет определяется режим выбора интерфейса из списка (когда их больше чем 1). Если веса заданы, то в результате маршрутизации возвращается сортированный список интерфейсов с учетом этих весов (на каждую маршрутизацию при срабатывании правила производится "перевзвешивание" интерфейсов и их пересортировка). В случае если веса не указаны, то маршрутизатор возвращает список интерфейсов в том порядке как они указаны в конфигурации. Дальнейшая логика работы с этим списком реализована в ядре и заключается в том, что берется первый интерфейс из списка, производится попытка установления соединения через этот интерфейс, если она завершается по причине перегрузки интерфейса или его занятости, то производится попытка установления соединения через следующий интерфейс по списку и т.д.
- max_load — максимальная загрузка интерфейсов (в процентах, либо в количествах вызовов), трактуется следующим образом: если указано Число% — это означает загрузку транка в процентах от максимальной загрузке (максимальная загрузка задается на уровне интерфейса). Если указано просто число — оно означает количество активных вызовов в рамках данного транка. В итоге, если на момент маршрутизации загрузка меньше, чем указана в max_load — мы идем по указанному направлению. Иначе — пытаемся взять следующее направление.
Замечание: В случае, если параметры max_load и weight используются одновременно — то сперва выбираются направления, по которым нагрузка не превышает максимального значения — после чего вызов распределяется на основе weight. Например, имеем правило:
<external>
<trunk value="ems1" weight="50" max_load="60%"/>
<trunk value="ems2" weight="50"/>
</external>
и максимальная нагрузка на транке ems1 выставлена в 20. Тогда, пока нагрузка на транке ems1 меньше 60% (т.е. < 12 вызовам), в данный транк может пойти вызов через данное правило. Но т.к. для транков ems1, ems2 ещё и выставлен weight — это означает, что в среднем (статистически) все вызовы будут делиться между этими двумя транками. В случае, как только нагрузка на транке стала >= 12 вызовам — все вызовы будут идти только на транк ems2.
<direction>
Найдено направление выхода из домена на направление (direction); маршрутизатор останавливает маршрутизацию, возвращая найденные данные по абоненту А, интерфейсу А и направлению.
Синтаксис:
<result>
<direction value="DirectionName"/>
</result>
где
- value — имя направления.
ВНИМАНИЕ: Направления декларируются через /domain/<DOMAIN>/direction/
<incomplete>
Номер неполный. Маршрутизация завершается с признаком того, что был набран неполный номер, ядро продолжает накопление цифр номера.
Синтаксис:
<result>
<incomplete timeout="TimeoutInMilliseconds"/>
</result>
где
- timeout — опциональный параметр, число, количество миллисекунд ожидания цифр номера.
<no_route>
Ошибка маршрутизации. Маршрутизация завершается с признаком того, что набран неверный номер.
Синтаксис:
<result>
<no_route isup_cause="ISUPCause"/>
</result>
где
- isup_cause — опциональный параметр, число, isup причины, которые будут использованы в сообщении rel.
<continue>
Продолжить маршрутизацию в текущем, либо в другом контексте данной виртуальной АТС (домена).
Синтаксис:
<result>
<continue context="ContextName" tag="Tag"/>
</result>
где
- context — имя контекста, в котором будет продолжена маршрутизация. Если не указан, то продолжаем в том же контексте;
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил маршрутизации при последующем анализе, дает возможность делать некое подобие условной параметрической маршрутизации.
<next>
Продолжить маршрутизацию в текущем контексте со следующего правила. Если условия выполняются, будет применен набор действий из элемента <actions>.
Синтаксис:
<result>
<next tag="Tag"/>
</result>
где
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил маршрутизации при последующем анализе, дает возможность делать некое подобие условной параметрической маршрутизации.
Маска времени
Маска времени задает диапазон значений времени суток.
Формат задания времени "ЧЧ:ММ-ЧЧ:ММ"
где
- ЧЧ — значение часа;
- ММ — значение минут.
Вместо указания конкретных значений часа или минут можно указать служебный символ "*", который соответствует любому значению.
Примеры масок времени в правилах:
<conditions>
<time value="09:00 - 18:00"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 09:00 по 18:00 (рабочее время).
<conditions>
<time value="*:20 - *:30"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 20 по 30 минут каждого часа в сутках.
Маска даты
Маска даты задает диапазон дат.
Формат задания маски даты: "ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2"
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
Так же возможно применение на любой позиции служебного символа "*", который соответствует любому значению.
Примеры масок даты в правилах:
<conditions>
<date value="01.01.* - 31.01.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в январе (1 месяц).
<conditions>
<date value="10.*.* - 20.*.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период с 10 по 20-е число каждого месяца.
<conditions>
<date value="13.12.2011 - 13.12.2011"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые 13 декабря 2011 года.
Маска дня недели
Маска дня недели задает набор дней недели.
Формат описания маски дней недели: "ДН1,ДН2,...,ДНX"
где
- ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
Работает по григорианскому календарю.
<weekday value="WeekdayMask" day_types="DayTypes" />
где
- value — маска дня недели;
- day_types — типы дней недели, перечисленные через запятую. Возможные значения:
- day-off — выходной день;
- half-holiday — предпраздничный день;
- holiday — праздничный день;
- work — рабочий день
Если одновременно указаны параметры value и day_types то условие должно совпадать по обоим параметрам.
Примеры масок дней недели в правилах:
<conditions>
<weekday value="1,2,3,4,5" day_types="work" />
</conditions>
Условию удовлетворяют вызовы, обслуживаемые с понедельника по пятницу (рабочие дни).
<conditions>
<weekday value="6,7" day_types="day-off,holiday"/>
</conditions>
Условию удовлетворяют вызовы обслуживаемые в субботу и воскресенье (выходные дни).
Маска цифр номера
Маска цифр номера в поле условий срабатывания правил. Предоставляет удобный и гибкий синтаксис описания различных номеров.
Регулярные выражения не используются умышленно, т.к. это значительно повышает порог квалификации инженера, который необходим для использования механизма.
Маска номера задается в виде строки, в которую вводится номер для осуществления сравнения. Можно указать диапазон через «-», либо перечислить через «,». Диапазон, или перечисление заключается в круглые скобки "(" ")" Так же возможны следующие служебные символы:
- "?" — один любой не пустой элемент номера (цифры 0-9, либо буквы A, B, C, D);
- "%" — 0 или несколько элементов номера (внимание: после символа "%" не может идти других символов).
Для сравнения общего префикса параметров cgpn, cdpn, ocdpn, rgn между собой, используется следующий синтаксис [cgpn|cdpn|rgn|ocdpn{DIGITS}].
Для правила количество масок номера ограничивается 256. Если в условиях задаются диапазоны номеров, то при компиляции контекста могут быть сформированы несколько масок для каждого диапазона номеров. Например, для диапазона 100-400 сформируются маски: 1??, 2??, 3??, 4??.
Примеры масок номера в правилах:
Условию удовлетворяют номера длиной больше либо равный 1 и начинающиеся с цифры 8.
<conditions>
<cgpn digit="345???????"/>
</conditions>
Условию удовлетворяют номера длиной 10 знаков, начинающиеся с 345.
<conditions>
<cgpn digit="%"/>
</conditions>
Условию удовлетворяют любые номера.
<conditions>
<cdpn digit="???"/>
</conditions>
Условию удовлетворяют любые номера длинной 3 знака.
Далее примеры использования диапазонов и перечислений в масках номеров:
<conditions>
<cdpn digit="(1-3)7%"/>
</conditions>
Равносильно трем правилам с масками 17% 27% 37%.
Условию будут удовлетворять любые 7ми-значные номера указанного диапазона.
Равносильно трем правилам с масками 17% 57% 77%.
Пример сравнения общего префикса параметров cgpn и cdpn:
<conditions>
<cdpn digits="????"/>
<cgpn digits="[cdpn{1,2}]??"/>
</conditions>
Известные ошибки при сравнении параметров:
Сравнивание параметров друг с другом
<conditions> <cdpn digits="[cgpn{1,2}]??"/> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEИспользование параметра, которого не существует
<conditions> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEВыход за границы сравниваемого параметра
<conditions> <cdpn digits="????"/> <cgpn digits="[cdpn{5,6}]??"/> </conditions>
CODE
Модификация цифр номера
В действиях по модификации параметров вызова одним из основных элементов для корректировки является изменение цифр номера абонента А или Б.
Существуют разные подходы к способу описания синтаксиса такой модификации: модификация на шаблонах, регулярные выражения и т.п.
Регулярные выражения являются самым гибким способом, позволяющим делать все возможные преобразования, но у него есть существенные недостатки:
- сложность синтаксиса — регулярные выражения — это универсальный механизм, используемый в разных сферах IT. Обладает своим сложным языком описания, что повышает входной порог знаний человека, который их использует;
- вычислительная сложность — вычисление результата модификации на базе регулярных выражений (в том числе в перекомпилированном варианте) требует больших вычислительных ресурсов по сравнению с модификацией на шаблонах.
Чтобы избавится от недостатков регулярных выражений, в системе ECSS-10 используется модификация номера на шаблонах.
При модификации номера используется следующая нотация:
- каждая цифра исходного номера (до модификации) обозначается либо числом описывающим ее позицию, либо буквой английского алфавита на соответствующей позиции (исходный семизначный номер без изменения можно записать в виде: "1,2,3,4,5,6,7" или "abcdefg");
- как и в условиях срабатывания правил, поддерживается спец символ "%", который означает ту часть номера, которая соответствует символу % в секции <conditions> (можно считать, что на этапе условия правила для соответствующего номера формируется переменная с именем "%", которая заполняется цифрами номера, а на этапе модификации она используется);
- для того чтобы была возможность модифицировать номер (абонента А или абонента Б), он обязательно должен присутствовать в элементе <conditions> правила (это гарантирует соблюдение формата номера);
- для того чтобы были возможны модификации с определенными цифрами в номере, в элементе <conditions> в условии для соответствующего номера цифры на требуемых позициях должны присутствовать либо сами цифры номера (шаблон по цифрам), либо цифры должны быть закрыты спецсимволами "?";
- для правил, обрабатывающих номер произвольной длины (в элементе <conditions> для цифр номера стоит условие со спец символом "%"), возможно только префиксирование (дописывание дополнительного префикса), либо постфиксирование (дописывание постфикса в конце номера);
- если необходимо вставить дополнительные цифры, которые не входили в исходный номер, то они просто записываются в поле "digits" в нужной позиции, поддерживается указание собственно цифр номера от 0 до 9 и букв A, B, C, D (либо a,b,c,d);
- если требуется записать элементы исходного номера в виде кодов (номеров позиции, либо буквенных кодов), либо в виде спец символа "%", то они записываются в фигурных скобках (например {abc}, либо {3,5,4}, либо {5,%};
- если требуется скопировать часть цифр из cgpn в cdpn, rgn, ocdpn (аналогично для остальных типов номеров), которые совпали в рамках секции conditions, в секции actions используется [cgpn|cdpn|rgn|ocdpn{DIGITS,%}].
Примеры:
Удаление префикса 345 от десятизначного номера:
<conditions>
<cgpn digits="345???????"/>
</conditions>
<actions>
<cgpn digits="{4,5,6,7,8,9,10}"/>
</actions>
Удаление префикса 345 от номера произвольной длины с префиксом 345:
<conditions>
<cgpn digits="345%"/>
</conditions>
<actions>
<cgpn digits="{%}"/>
</actions>
Перестановка цифр 2 и 3 в трехзначном номере (сами цифры любые):
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="{1,3,2}"/>
</actions>
Префиксирование произвольного трехзначного номера с префиксом 008:
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="008{1,2,3}"/>
</actions>
Замена местами cdpn и cgpn:
<conditions>
<cgpn digits="%"/>
<cdpn digits="%"/>
</conditions>
<actions>
<cgpn digits="[cdpn{%}]"/>
<cdpn digits="[cgpn{%}]"/>
</actions>
Правило, которое может использоваться для выхода на междугородную станцию. В частности видно, что правило сработает для вызовов, в которых у абонента А семизначный местный номер, номер абонента Б начинается на 8. Задача модификации преобразовать местный номер к междугородному, который понимает междугородка, для этого дописывается префикс и меняется «ni» и «nai». Номер Б не изменяется, его разбором занимается междугородка.
<conditions>
<cgpn digits="???????" ni="local"/>
<cdpn digits="8%"/>
</conditions>
<actions>
<cgpn digits="8383{1,2,3,4,5,6,7}" ni="intercity" nai="nationalNumber"/>
</actions>
Множественная маршрутизация
При множественной маршрутизации результатом может быть маршрутизация либо локальный абонент, либо на транк. Для этого следует добавить секцию continue внутри секции local.
Если в правиле нет секции actions, и не задан ни один из параметров ContextName, Tag — то маршрутизация зациклится.
Пример 1
Есть абоненты с трехзначными номерами в формате 7xx. Часть этих абонентов находятся на сторонней станции, до которой есть транк с именем PANASONIC_TRUNK.
Пример контекста для выполнения маршрутизации либо на локального абонента, либо на транк:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="ctx_city_local">
<rule name="panasonic_users">
<conditions>
<cdpn digits="7??"/>
<tag value="not_local_user"/>
</conditions>
<result>
<external>
<trunk value="PANASONIC_TRUNK"/>
</external>
</result>
</rule>
<rule name="local">
<conditions>
<cdpn digits="7??"/>
</conditions>
<result>
<local>
<continue tag="not_local_user">
</local>
</result>
</rule>
Пример 2
Есть абоненты с трехзначными номерами в формате 7xx. Если звонок идет на номер, которого не существует, то проигрывается фраза "Абонента с данным номером не существует в нашей компании. Вызов переводится на секретаря.", и вызов переводится на секретаря. Для этого создается IVR-скрипт с именем to_secretary (ID скрипта: e5a8909590717068), и пишется следующий контекст маршрутизации:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="ctx_city_local">
<rule name="panasonic_users">
<conditions>
<cdpn digits="7??"/>
<tag value="not_local_user"/>
</conditions>
<result>
<ivr script="e5a8909590717068"/>
</result>
</rule>
<rule name="local">
<conditions>
<cdpn digits="7??"/>
</conditions>
<result>
<local>
<continue tag="not_local_user">
</local>
</result>
</rule>
О чем стоит помнить
При создании контекстов маршрутизации, необходимо обращать внимание на то, что бы вызов успешно маршрутизировался как в режиме enblock, так и в режиме overlap.
Обычно, шлюзы (особенно это касается SIP шлюзов) работают в режиме enblock, но при попытке использовать какую либо услугу, например call transfer или conference маршрутизация вводимого номера происходит в режиме overlap.
Поэтому надо помнить, что в зависимости от нюансов при описании контекста, один и тот же набор в двух разных режимах может выдавать разный результат.
Модификаторы и адаптация номеров по входу/выходу с интерфейса
Общее описание
В некоторых случаях возникает необходимость в модификации номеров (Calling, Called, Original called, Redirecting, Connected, а так же их свойств (ni, nai, apri и т.п.)) при входе с транков или при выходе на транк. Зачастую это вызвано тем, что один и тот же вызов может быть отправлен одним правилом маршрутизации в два или несколько транков (балансировка, резервирование), форматы номеров в которых различаются:
<rule name="to_trunk">
<result>
<external>
<trunk value="Trunk1" />
<trunk value="Trunk2" />
</external>
</result>
</rule>
Также возможны случаи, когда необходима модификация при записях в CDR или для СОРМ.
Для реализации данных требований были разработаны соответствующие инструменты:
- Модификаторы номеров — набор правил модификации номеров, которые применяются при звонке с определенного интерфейса или на определенный интерфейс. Модификатор назначается на интерфейс ECSS-10 (транк, абонент), группу интерфейсов.
- Адаптация номеров — набор правил модификации номеров для СОРМ, TTS. Технически, это те же модификаторы номеров, но только применимые для адаптации номеров из внутреннего формата к формату СОРМ, TTS.
Модификаторы выставляются на интерфейсах, адаптация — на свойства домена (для СОРМ, TTS) и позволяют изменять номера при входе/выходе с/на интерфейс, а также при передаче номеров в СОРМ, TTS.
Модификаторы состоят из двух секций — in и out, каждая из которых содержит правила модификации.
Адаптация состоит из одной секции adaptation, которая содержит в себе правила модификации.
Каждое правило состоит из условия/маски, действия (action) и результата. При совпадении условия над переданными номерами применяются описанные в правиле действия, после чего в зависимости от результата происходит следующее:
- finish — модификация/адаптация номеров закончена, новые номера возвращаются из модификатора / адаптации;
- continue — необходимо повторить модификатор / адаптацию, но с уже измененными в текущем правиле номерами;
- error — изменение номеров закончено, т.к. переданные номера имеют невалидный формат (в этом случае абоненту, приславшему данные номера пойдет релиз).
Модификаторы привязаны к интерфейсам на ECSS (как абонентским, так и транковым). Можно выставить модификаторы по умолчанию и для всех интерфейсов определенной группы и для всех интерфейсах в домене с помощью свойства:
- modificator — модификатор номеров по входу/выходу с интерфейса.
Для адаптации номеров для СОРМа используется параметр:
domain/p.city/sorm/info adaptation ┌─────────────────────────────┬──────┬───────────────────────────────┐ │ Property │Domain│ Value │ ├─────────────────────────────┼──────┼───────────────────────────────┤ │adaptation │p.city│to_sorm │ └─────────────────────────────┴──────┴───────────────────────────────┘
для адаптации номеров для CDR используется параметр:
domain/p.city/tts/properties/info adaptation ┌─────────────────────────────┬──────┬───────────────────────────────┐ │ Property │Domain│ Value │ ├─────────────────────────────┼──────┼───────────────────────────────┤ │adaptation │p.city│to_tts │ └─────────────────────────────┴──────┴───────────────────────────────┘
При использовании модификаторов вызов будет обрабатываться в системе следующим образом:
Описание:
Вызов приходит с абонента / транка на ECSS. На входе в систему (на ecss-core) выполняется модификация номеров по входу (на основе контекста модификации, назначенного на входящий интерфейс). Если контекст модификации не назначен, то номера проходят без модификации. После чего модифицированные номера заходят в сервисы абонента А. После того, как все сервисы абонента А отрабатывают, выполняется маршрутизация вызова.
На указанной схеме предполагается, что маршрутизация закончилась правилом с выходом на N транков, поэтому будет осуществляться перебор маршрутов.
Сперва выбирается Маршрут 1, выполняются сервисы абонента Б, после чего идет модификация номера по выходу на Транк 1,
который закреплен за Маршрут 1. Таким образом в Транк 1 номера пойдут в том формате, который нужен именно Транку 1. Параллельно информация о вызове посылается на TTS, СОРМ, предварительно выполнив адаптацию номеров для TTS, СОРМ соответственно.
Если окажется, что Транк 1 недоступен или переполнен, то будет взят следующий Маршрут 2. И все повторится аналогично, как и с Маршрутом 1. Таким образом, для Транка 2 из Маршрута 2 номера будут такие, какие нужны именно Транку 2 (при этом они могут отличаться от номеров для Транка 1).
Замечания:
- если маршрутизация вызова не прошла, то информация о вызове уйдет на TTS, СОРМ сразу с уровня сервисов абонента А с адаптацией номеров TTS, СОРМ соответственно;
если параметры вызова не соответствуют ни одному условию в контексте модификации или адаптации, то вызов отбивается:
│ 806009978│09.10.2018 11:16:0│released│ 240101│ 240505│ 240101│ 240505│n│ 0s│tException │12│S│Number's modification stopp│N│ │ │ │ 0 │ │ │ │ │ │ │ │ │7 │ │ed by no rule │ │ │
Детальное описание формата правил модификации номеров для модификаторов приведено в разделе "Детальное описание контекста модификации номеров".
Детальное описание формата правил модификации номеров для адаптации приведено в разделе "Детальное описание контекста адаптации номеров".
Примеры настройки
Если требуется скопировать часть цифр из cgpn в cdpn, rgn, rnn, cn, ocdpn (аналогично для остальных типов номеров), которые совпали в рамках секции conditions, в секции actions используется следующий синтаксис:
<?xml version="1.0"?>
<!-------- Общий синтаксис -------->
<conditions>
<[cgpn|cdpn|rgn|rnn] digits="[DIGITS],%"/>
</conditions>
<actions>
<cgpn digits="...[cgpn|cdpn|rgn|rnn|cn|ocdpn{DIGITS,%}]..."/>
</actions>
Использование символа "%" в секции _conditions_ обязательно. При этом, если в секции _actions_, требуется использовать цифры или символы из _conditions_, стоящие перед символом "%", то позиции этих символов нужно указать в DIGITS. Пример:
<?xml version="1.0"?>
<modificators
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_modificators.xsd" name="test_modificators">
<in>
<rule name="local_calls">
<conditions>
<cgpn digits="42%"/>
</conditions>
<actions>
<cdpn digits="[cgpn{1,2,%}]"/>
</actions>
<result>
<finish/>
</result>
</rule>
</in>
<out>
<rule name="local_calls">
<conditions>
<cgpn digits="4%"/>
</conditions>
<actions>
<cdpn digits="[cgpn{1,%}]"/>
</actions>
<result>
<finish/>
</result>
</rule>
</out>
</modificators>
Поля в узлах cdpn, cgpn, rgn, ocdpn, cn, time, date, weekday, tag такие же, как и в контексте маршрутизации. Но для поля digits в полях cdpn, cgpn, rgn, ocdpn, cn будет одно расширение.
Если первый символ S, то считается что условия/модификация, описанная в данном digits, будет задаваться в формате условий/модификаторов SMG.
Например:
<?xml version="1.0"?>
<modificators
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="city">
<rule name="ecss10_rule">
<conditions>
<rgn digits="111???"/>
</conditions>
<actions>
<rgn digits="810{4,5,6}999"/>
</actions>
<result>
<finish/>
</result>
</rule>
<rule name="smg_rule">
<conditions>
<cgpn digits="S111xxx"/>
</conditions>
<actions>
<cgpn digits="S---+810XXX999"/>
</actions>
<result>
<finish/>
</result>
</rule>
</modificators>
В данном примере оба правила одинаково обновляют номер rgn (в случае ECSS10) и rgn (в случае SMG) соответственно.
Пример настройки модификаторов на транке или группе интерфейсов через CLI
Выставление свойства на определенном транке:
## Выставление модификатора на определенном транке antoniy@[mycelium1@ryabkov]:/$ domain/p.city/iface/user-set pa_sip eltex_office EltexOffice modificator modification_context_1 Property 'modificator' successfully changed to 'modification_context_1' for interfaces: EltexOffice ## Выставление модификатора для всех интерфейсов в определенной группе antoniy@[mycelium1@ryabkov]:/$ domain/p.city/iface/group-set -g eltex_office -p modificator modification_context_1 Defined iface resources group property modificator for eltex_office ## Выставление контекста модификатора для интерфейсов в домене antoniy@[mycelium1@ryabkov]:/$ domain/p.city/iface/group-set -p modificator modification_context_1 Defined iface resources group property modificator for *
Команды по управлению контекстами модификации описаны в разделе /domain/<DOMAIN>/modificators/.
Команды по управлению адаптациями описаны в разделе domain/<DOMAIN>/adaptation/.
Детальное описание контекста адаптации номеров
Конфигурационный файл представляет собой файл в формате XML, который оформлен в соответствии со схемой данных, приведенной в файле ecss_modificators.xsd.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- categoryType -->
<xs:simpleType name="categoryType">
<xs:restriction base="xs:string">
<xs:enumeration value="unknownAtThisTime"/>
<xs:enumeration value="operatorFrench"/>
<xs:enumeration value="operatorEngish">
<xs:annotation>
<xs:documentation xml:lang="en">Obsolete value. Correct value is operatorEnglish</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="operatorEnglish"/>
<xs:enumeration value="operatorGerman"/>
<xs:enumeration value="operatorRussian"/>
<xs:enumeration value="operatorSpanish"/>
<xs:enumeration value="reserved"/>
<xs:enumeration value="ordinarySubscriber"/>
<xs:enumeration value="subscriberWithPriority"/>
<xs:enumeration value="dataCall"/>
<xs:enumeration value="testCall"/>
<xs:enumeration value="spare"/>
<xs:enumeration value="payphone"/>
<xs:enumeration value="category0"/>
<xs:enumeration value="hotelsSubscriber"/>
<xs:enumeration value="freeSubscriber"/>
<xs:enumeration value="paidSubscriber"/>
<xs:enumeration value="localSubscriber"/>
<xs:enumeration value="localTaksofon"/>
<xs:enumeration value="autoCallI"/>
<xs:enumeration value="semiautoCallI"/>
<xs:enumeration value="autoCallII"/>
<xs:enumeration value="semiautoCallII"/>
<xs:enumeration value="autoCallIII"/>
<xs:enumeration value="semiautoCallIII"/>
<xs:enumeration value="autoCallIV"/>
<xs:enumeration value="semiautoCallIV"/>
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="4"/>
<xs:enumeration value="5"/>
<xs:enumeration value="6"/>
<xs:enumeration value="7"/>
<xs:enumeration value="8"/>
<xs:enumeration value="9"/>
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
<xs:enumeration value="13"/>
<xs:enumeration value="14"/>
<xs:enumeration value="15"/>
<xs:enumeration value="16"/>
<xs:enumeration value="17"/>
<xs:enumeration value="18"/>
<xs:enumeration value="19"/>
<xs:enumeration value="20"/>
<xs:enumeration value="21"/>
<xs:enumeration value="22"/>
<xs:enumeration value="23"/>
<xs:enumeration value="24"/>
<xs:enumeration value="25"/>
<xs:enumeration value="26"/>
<xs:enumeration value="27"/>
<xs:enumeration value="28"/>
<xs:enumeration value="29"/>
<xs:enumeration value="30"/>
<xs:enumeration value="31"/>
<xs:enumeration value="32"/>
<xs:enumeration value="33"/>
<xs:enumeration value="34"/>
<xs:enumeration value="35"/>
<xs:enumeration value="36"/>
<xs:enumeration value="37"/>
<xs:enumeration value="38"/>
<xs:enumeration value="39"/>
<xs:enumeration value="40"/>
<xs:enumeration value="41"/>
<xs:enumeration value="42"/>
<xs:enumeration value="43"/>
<xs:enumeration value="44"/>
<xs:enumeration value="45"/>
<xs:enumeration value="46"/>
<xs:enumeration value="47"/>
<xs:enumeration value="48"/>
<xs:enumeration value="49"/>
<xs:enumeration value="50"/>
<xs:enumeration value="51"/>
<xs:enumeration value="52"/>
<xs:enumeration value="53"/>
<xs:enumeration value="54"/>
<xs:enumeration value="55"/>
<xs:enumeration value="56"/>
<xs:enumeration value="57"/>
<xs:enumeration value="58"/>
<xs:enumeration value="59"/>
<xs:enumeration value="60"/>
<xs:enumeration value="61"/>
<xs:enumeration value="62"/>
<xs:enumeration value="63"/>
<xs:enumeration value="64"/>
<xs:enumeration value="65"/>
<xs:enumeration value="66"/>
<xs:enumeration value="67"/>
<xs:enumeration value="68"/>
<xs:enumeration value="69"/>
<xs:enumeration value="70"/>
<xs:enumeration value="71"/>
<xs:enumeration value="72"/>
<xs:enumeration value="73"/>
<xs:enumeration value="74"/>
<xs:enumeration value="75"/>
<xs:enumeration value="76"/>
<xs:enumeration value="77"/>
<xs:enumeration value="78"/>
<xs:enumeration value="79"/>
<xs:enumeration value="80"/>
<xs:enumeration value="81"/>
<xs:enumeration value="82"/>
<xs:enumeration value="83"/>
<xs:enumeration value="84"/>
<xs:enumeration value="85"/>
<xs:enumeration value="86"/>
<xs:enumeration value="87"/>
<xs:enumeration value="88"/>
<xs:enumeration value="89"/>
<xs:enumeration value="90"/>
<xs:enumeration value="91"/>
<xs:enumeration value="92"/>
<xs:enumeration value="93"/>
<xs:enumeration value="94"/>
<xs:enumeration value="95"/>
<xs:enumeration value="96"/>
<xs:enumeration value="97"/>
<xs:enumeration value="98"/>
<xs:enumeration value="99"/>
<xs:enumeration value="100"/>
<xs:enumeration value="101"/>
<xs:enumeration value="102"/>
<xs:enumeration value="103"/>
<xs:enumeration value="104"/>
<xs:enumeration value="105"/>
<xs:enumeration value="106"/>
<xs:enumeration value="107"/>
<xs:enumeration value="108"/>
<xs:enumeration value="109"/>
<xs:enumeration value="110"/>
<xs:enumeration value="111"/>
<xs:enumeration value="112"/>
<xs:enumeration value="113"/>
<xs:enumeration value="114"/>
<xs:enumeration value="115"/>
<xs:enumeration value="116"/>
<xs:enumeration value="117"/>
<xs:enumeration value="118"/>
<xs:enumeration value="119"/>
<xs:enumeration value="120"/>
<xs:enumeration value="121"/>
<xs:enumeration value="122"/>
<xs:enumeration value="123"/>
<xs:enumeration value="124"/>
<xs:enumeration value="125"/>
<xs:enumeration value="126"/>
<xs:enumeration value="127"/>
<xs:enumeration value="128"/>
<xs:enumeration value="129"/>
<xs:enumeration value="130"/>
<xs:enumeration value="131"/>
<xs:enumeration value="132"/>
<xs:enumeration value="133"/>
<xs:enumeration value="134"/>
<xs:enumeration value="135"/>
<xs:enumeration value="136"/>
<xs:enumeration value="137"/>
<xs:enumeration value="138"/>
<xs:enumeration value="139"/>
<xs:enumeration value="140"/>
<xs:enumeration value="141"/>
<xs:enumeration value="142"/>
<xs:enumeration value="143"/>
<xs:enumeration value="144"/>
<xs:enumeration value="145"/>
<xs:enumeration value="146"/>
<xs:enumeration value="147"/>
<xs:enumeration value="148"/>
<xs:enumeration value="149"/>
<xs:enumeration value="150"/>
<xs:enumeration value="151"/>
<xs:enumeration value="152"/>
<xs:enumeration value="153"/>
<xs:enumeration value="154"/>
<xs:enumeration value="155"/>
<xs:enumeration value="156"/>
<xs:enumeration value="157"/>
<xs:enumeration value="158"/>
<xs:enumeration value="159"/>
<xs:enumeration value="160"/>
<xs:enumeration value="161"/>
<xs:enumeration value="162"/>
<xs:enumeration value="163"/>
<xs:enumeration value="164"/>
<xs:enumeration value="165"/>
<xs:enumeration value="166"/>
<xs:enumeration value="167"/>
<xs:enumeration value="168"/>
<xs:enumeration value="169"/>
<xs:enumeration value="170"/>
<xs:enumeration value="171"/>
<xs:enumeration value="172"/>
<xs:enumeration value="173"/>
<xs:enumeration value="174"/>
<xs:enumeration value="175"/>
<xs:enumeration value="176"/>
<xs:enumeration value="177"/>
<xs:enumeration value="178"/>
<xs:enumeration value="179"/>
<xs:enumeration value="180"/>
<xs:enumeration value="181"/>
<xs:enumeration value="182"/>
<xs:enumeration value="183"/>
<xs:enumeration value="184"/>
<xs:enumeration value="185"/>
<xs:enumeration value="186"/>
<xs:enumeration value="187"/>
<xs:enumeration value="188"/>
<xs:enumeration value="189"/>
<xs:enumeration value="190"/>
<xs:enumeration value="191"/>
<xs:enumeration value="192"/>
<xs:enumeration value="193"/>
<xs:enumeration value="194"/>
<xs:enumeration value="195"/>
<xs:enumeration value="196"/>
<xs:enumeration value="197"/>
<xs:enumeration value="198"/>
<xs:enumeration value="199"/>
<xs:enumeration value="200"/>
<xs:enumeration value="201"/>
<xs:enumeration value="202"/>
<xs:enumeration value="203"/>
<xs:enumeration value="204"/>
<xs:enumeration value="205"/>
<xs:enumeration value="206"/>
<xs:enumeration value="207"/>
<xs:enumeration value="208"/>
<xs:enumeration value="209"/>
<xs:enumeration value="210"/>
<xs:enumeration value="211"/>
<xs:enumeration value="212"/>
<xs:enumeration value="213"/>
<xs:enumeration value="214"/>
<xs:enumeration value="215"/>
<xs:enumeration value="216"/>
<xs:enumeration value="217"/>
<xs:enumeration value="218"/>
<xs:enumeration value="219"/>
<xs:enumeration value="220"/>
<xs:enumeration value="221"/>
<xs:enumeration value="222"/>
<xs:enumeration value="223"/>
<xs:enumeration value="224"/>
<xs:enumeration value="225"/>
<xs:enumeration value="226"/>
<xs:enumeration value="227"/>
<xs:enumeration value="228"/>
<xs:enumeration value="229"/>
<xs:enumeration value="230"/>
<xs:enumeration value="231"/>
<xs:enumeration value="232"/>
<xs:enumeration value="233"/>
<xs:enumeration value="234"/>
<xs:enumeration value="235"/>
<xs:enumeration value="236"/>
<xs:enumeration value="237"/>
<xs:enumeration value="238"/>
<xs:enumeration value="239"/>
<xs:enumeration value="240"/>
<xs:enumeration value="241"/>
<xs:enumeration value="242"/>
<xs:enumeration value="243"/>
<xs:enumeration value="244"/>
<xs:enumeration value="245"/>
<xs:enumeration value="246"/>
<xs:enumeration value="247"/>
<xs:enumeration value="248"/>
<xs:enumeration value="249"/>
<xs:enumeration value="250"/>
<xs:enumeration value="251"/>
<xs:enumeration value="252"/>
<xs:enumeration value="253"/>
<xs:enumeration value="254"/>
<xs:enumeration value="255"/>
</xs:restriction>
</xs:simpleType>
<!-- naiType -->
<xs:simpleType name="naiType">
<xs:restriction base="xs:string">
<xs:enumeration value="spare"/>
<xs:enumeration value="subscriberNumber"/>
<xs:enumeration value="unknown"/>
<xs:enumeration value="nationalNumber"/>
<xs:enumeration value="internationNumber"/>
</xs:restriction>
</xs:simpleType>
<!-- inniType -->
<xs:simpleType name="inniType">
<xs:restriction base="xs:string">
<xs:enumeration value="routingToInternalNumberAllowed"/>
<xs:enumeration value="routingToInternalNumberNotAllowed"/>
</xs:restriction>
</xs:simpleType>
<!-- npiType -->
<xs:simpleType name="npiType">
<xs:restriction base="xs:string">
<xs:enumeration value="spare"/>
<xs:enumeration value="isdnTelephony"/>
<xs:enumeration value="dataNumberingPlan"/>
<xs:enumeration value="telexNumberingPlan"/>
<xs:enumeration value="reserved1"/>
<xs:enumeration value="reserved2"/>
<xs:enumeration value="reserved3"/>
</xs:restriction>
</xs:simpleType>
<!-- niType -->
<xs:simpleType name="niType">
<xs:restriction base="xs:string">
<xs:enumeration value="private"/>
<xs:enumeration value="local"/>
<xs:enumeration value="zone"/>
<xs:enumeration value="intercity"/>
<xs:enumeration value="international"/>
<xs:enumeration value="emergency"/>
</xs:restriction>
</xs:simpleType>
<!-- apriType -->
<xs:simpleType name="apriType">
<xs:restriction base="xs:string">
<xs:enumeration value="presentationAllowed"/>
<xs:enumeration value="presentationRestricted"/>
<xs:enumeration value="addressNotAvailable"/>
<xs:enumeration value="spare"/>
</xs:restriction>
</xs:simpleType>
<!-- screeningType -->
<xs:simpleType name="screeningType">
<xs:restriction base="xs:string">
<xs:enumeration value="userProvidedNotVerified"/>
<xs:enumeration value="userProvidedVerifiedAndPassed"/>
<xs:enumeration value="userProvidedVerifiedAndFailed"/>
<xs:enumeration value="networkProvided"/>
</xs:restriction>
</xs:simpleType>
<!-- booleanType -->
<xs:simpleType name="booleanType">
<xs:restriction base="xs:boolean"/>
</xs:simpleType>
<!-- ruleType -->
<xs:complexType name="ruleType">
<xs:sequence>
<xs:element name="conditions" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="cgpn" type="cgpnType" minOccurs="0"/>
<xs:element name="cdpn" type="cdpnType" minOccurs="0"/>
<xs:element name="rgn" type="rgnConditionType" minOccurs="0"/>
<xs:element name="rnn" type="rnnConditionType" minOccurs="0"/>
<xs:element name="ocdpn" type="ocdpnConditionType" minOccurs="0"/>
<xs:element name="cn" type="cnConditionType" minOccurs="0"/>
<xs:element name="time" type="valueType" minOccurs="0"/>
<xs:element name="date" type="valueType" minOccurs="0"/>
<xs:element name="weekday" type="valueType" minOccurs="0"/>
<xs:element name="tag" type="valueType" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="actions" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="cgpn" type="cgpnType" minOccurs="0"/>
<xs:element name="cdpn" type="cdpnType" minOccurs="0"/>
<xs:element name="rgn" type="rgnActionType" minOccurs="0"/>
<xs:element name="rnn" type="rnnActionType" minOccurs="0"/>
<xs:element name="ocdpn" type="ocdpnActionType" minOccurs="0"/>
<xs:element name="cn" type="cnActionType" minOccurs="0"/>
<xs:element name="empty_rgn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove routing number.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="empty_ocdpn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove original called number.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="empty_cn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove connected number.</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="result">
<xs:complexType>
<xs:choice>
<xs:element name="finish" type="finishResultType"/>
<xs:element name="error" type="errorResultType"/>
<xs:element name="next" type="nextResultType"/>
<xs:element name="continue" type="continueResultType"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
</xs:complexType>
<!-- modificatorsType -->
<xs:complexType name="modificatorsType">
<xs:all>
<xs:element name="in" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="out" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="name" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>The name of the current modificators.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="description" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>Text description of the current modificators.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- adaptationType -->
<xs:complexType name="adaptationType">
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>The name of the current adaptation.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="description" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>Text description of the current adaptation.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- modificators -->
<xs:element name="modificators" type="modificatorsType"/>
<!-- adaptation -->
<xs:element name="adaptation" type="adaptationType"/>
<!-- cdpnType -->
<xs:complexType name="cdpnType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="city" type="xs:string"/>
<xs:attribute name="region" type="xs:string"/>
<xs:attribute name="operator" type="xs:string"/>
</xs:complexType>
<!-- cgpnType -->
<xs:complexType name="cgpnType">
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="screening" type="screeningType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="transit_display_name" type="booleanType"/>
<xs:attribute name="caller_id" type="xs:string"/>
<xs:attribute name="city" type="xs:string"/>
<xs:attribute name="region" type="xs:string"/>
<xs:attribute name="operator" type="xs:string"/>
</xs:complexType>
<!-- rgnConditionType -->
<xs:complexType name="rgnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- rnnConditionType -->
<xs:complexType name="rnnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- ocdpnConditionType -->
<xs:complexType name="ocdpnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- cnConditionType -->
<xs:complexType name="cnConditionType">
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- rgnActionType -->
<xs:complexType name="rgnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
</xs:complexType>
<!-- rnnActionType -->
<xs:complexType name="rnnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
</xs:complexType>
<!-- ocdpnActionType -->
<xs:complexType name="ocdpnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
</xs:complexType>
<!-- cnActionType -->
<xs:complexType name="cnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="caller_id" type="xs:string"/>
<xs:attribute name="transit_display_name" type="booleanType"/>
</xs:complexType>
<!-- valueType -->
<xs:complexType name="valueType">
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
<!-- nullType -->
<xs:complexType name="nullType"/>
<!-- Result types -->
<!-- finishResultType -->
<xs:complexType name="finishResultType"/>
<!-- errorResultType -->
<xs:complexType name="errorResultType">
<xs:attribute name="acp_cause" type="xs:string" use="optional"/>
<xs:attribute name="isup_cause" type="xs:string" use="optional"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
</xs:complexType>
<!-- continueResultTypeType -->
<xs:simpleType name="continueResultTypeType">
<xs:restriction base="xs:string">
<xs:enumeration value="start"/>
<xs:enumeration value="next"/>
</xs:restriction>
</xs:simpleType>
<!-- nextResultType -->
<xs:complexType name="nextResultType">
<xs:attribute name="tag" type="xs:string" use="optional"/>
</xs:complexType>
<!-- continueResultType -->
<xs:complexType name="continueResultType">
<xs:attribute name="tag" type="xs:string" use="optional"/>
<xs:attribute name="type" type="continueResultTypeType" default="start" use="optional"/>
</xs:complexType>
</xs:schema>
Актуальный файл с описанием схемы данных находится на развернутой системе по пути /usr/lib/ecss/ecss-ds/lib/rm_lib-x.x.x.x/priv/ecss_modificators.xsd.
Каждый XML-файл представляет собой описание одного контекста адаптации (группы правил) в рамках виртуальной АТС.
Формат описания контекста адаптации:
<adaptation>
<rule>
<conditions>
</conditions>
<actions>
</actions>
<result>
</result>
</rule>
<rule>
</rule>
</adaptation
1. <adaptation>
Базовый элемент файла адаптации, описывающий параметры контекста адаптации.
Структура элемента <adaptation> имеет следующий вид:
<adaptation name="string" description="string">
</adaptation>
где
- name — строка с именем контекста адаптации, должна быть уникальной в рамках виртуальной АТС;
- description — текстовое описание контекста адаптации.
Далее в рамках тега <adaptation> между закрывающим и открывающим тегом идет набор тегов, описывающих правила адаптации.
Анализ условий срабатывания правил производится в том порядке, в котором они указаны в файле — сверху вниз.
Примечание: в одном контексте адаптации не может быть больше 1000 правил. Ограничение введено искусственно, так как количество правил влияет на скорость обработки адаптации.
2. <rule>
Элементом <rule> описывается правило адаптации.
Структура правила адаптации имеет следующий вид:
<rule name="RuleName">
<conditions>
</conditions>
<actions>
</actions>
<result>
</result>
</rule>
где
- RuleName — имя правила адаптации. Строка, которая должна быть уникальной в рамках контекста адаптации, выводится при трассировке адаптации;
- <conditions> — обязательный элемент, описывающий условия срабатывания правила адаптации;
- <actions> — опциональный элемент, описывающий набор операций, которые применяются к параметрам вызова при срабатывании правила адаптации;
- <result> — обязательный элемент, описывающий результат отработки правила адаптации.
2.1 <conditions>
В элементе <conditions> описывается набор условий, выполнение которых приводит к выполнению правила.
Формат описания элемента <conditions> имеет следующий вид:
<conditions>
<cgpn/>
<cdpn/>
<rgn/>
<rnn/>
<ocdpn/>
<cn/>
<time/>
<date/>
<weekday/>
<tag/>
</conditions>
где
- cdpn — поле сравнения номера вызываемого абонента (номер Б и его параметры);
- cgpn — поле сравнения номера вызывающего абонента (номер А и его параметры);
- rgn — поле сравнения номера который выполнил переадресацию;
- rnn — поле сравнения номера на который выполнили переадресацию;
- ocdpn — поле сравнения оригинального номера на который выполнили вызов;
- cn — поле сравнения подключенного номера;
- time — дата и время суток;
- tag — вспомогательный параметр для организации многошаговой адаптации в рамках одного контекста, по умолчанию установлено значение "undefined";
Каждый из указанных выше элементов в рамках <conditions> является опциональным и может быть использован не более одного раза.
Пустой набор критериев говорит об отсутствии ограничений.
2.1.1 <cgpn>
Параметры номера вызывающего абонента:
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"
in_list="List"
city="City"
region="Region"
operator="Operator"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: spare, subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: spare, isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- spare — зарезервирован;
- screening — индикатор контроля номера вызывающего абонента, принимает значения:
- userProvidedNotVerified — предоставлена пользователем, не проверена;
- userProvidedVerifiedAndPassed — предоставлена пользователем, проверка пройдена;
- userProvidedVerifiedAndFailed — предоставлена пользователем, проверка не пройдена;
- networkProvided — предоставлена сетью.
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
- city — город абонента полученный из БД реестра плана нумерации РФ
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ.
2.1.2 <cdpn>
Параметры номера вызываемого абонента:
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
ni="Ni"
inni="Inni"
in_list="List"
city="City"
region="Region"
operator="Operator"/>
где
- digits — маска цифр номера вызываемого абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- inni — индикатор внутрисетевого номера (InternalNetworkNumberIndicator), принимает значения:
- routingToInternalNumberAllowed — маршрутизация на внутренний номер разрешена,
- routingToInternalNumberNotAllowed — маршрутизация на внутренний номер не разрешена;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- ni — признак номера (NumberIndicator), принимает значения:
- private — частная сеть,
- local — местная сеть,
- zone — зоновая сеть,
- intercity — междугородная сеть,
- international — международная сеть,
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
city — город абонента полученный из БД реестра плана нумерации РФ;
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ.
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1:
2.1.3 <rgn>
Параметры номера, который выполнил переадресацию:
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера:
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр RedirectingNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — RedirectingNumber не присутствует в сигнализации;
- true — RedirectingNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
2.1.4 <rnn>
Параметры номера на который выполнили переадресацию:
<rnn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
category="Category"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр RedirectionNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — RedirectionNumber не присутствует в сигнализации;
- true — RedirectionNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
2.1.5 <ocdpn>
Параметры оригинального номера на который выполнили вызов:
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
category="Category"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр OriginalCalledNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — OriginalCalledNumber не присутствует в сигнализации;
- true — OriginalCalledNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
2.1.6 <cn>
Параметры номера подключенного номера
<cn digits="Digits"
nai="Nai"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр ConnectedNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — ConnectedNumber не присутствует в сигнализации;
- true — ConnectedNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
2.1.7 <ti me>
Время суток, задается в виде: ЧЧ:ММ-ЧЧ:ММ, где ЧЧ — часы, ММ — минуты:
<time value="TimeMask"/>
где
- value — маска времени суток. Подробное описание приведено в разделе Маска времени
2.1.8 <date>
Дата, задается в виде: ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2, где ДД — день, ММ — месяц, ГГГГ — год:
<date value="DateMask"/>
где
- value — маска даты. Подробное описание приведено в разделе Маска даты.
2.1.9 <weekd ay>
День недели, задается в виде ДН1,ДН2,...,ДНX, где ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
<weekday value="WeekdayMask"/>
где
- value — маска дня недели. Подробное описание приведено в разделе Маска дня недели;
2.1.10 <tag>
Специальный параметр, который можно установить для вызова при адаптации.
Параметр действует только на этапе адаптации, устанавливается в правиле адаптации и в последующем используется для изменения отработки логики адаптации.
<tag value="Tag"/>
где
- value — строка, значение поля "tag" для вызова, проверяется на полное совпадение. По умолчанию значение — "undefined".
2.2 <actions>
Формат описания элемента <actions> имеет следующий вид:
<actions>
<cgpn/>
<cdpn/>
<rgn/>
<rnn/>
<ocdpn/>
<cn/>
<empty_rgn/>
<empty_ocdpn/>
<empty_cn/>
</actions>
где
- cgpn — адаптация параметров номера вызывающего абонента;
- cdpn — адаптация параметров номера вызываемого абонента;
- rgn — адаптация параметров номера который выполнил переадресацию;
- rnn — адаптация параметров номера на который выполнили переадресацию;
- ocdpn — адаптация параметров оригинального номера на который выполнили вызов;
- cn — адаптация параметров подключенного номера;
- empty_cn — удалить из сигнализации параметр ConnectedNumber;
- empty_rgn — удалить из сигнализации параметр RedirectingNumber;
- empty_ocdpn — удалить из сигнализации параметр OriginalCalledNumber;
Действия указываются в порядке их выполнения. Все действия являются опциональными.
2.2.1 <cgpn>
Операция адаптации параметров номера вызывающего абонента.
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"
display_name="DisplayName"
caller_id="CallerId"/>
где
- digits — маска адаптации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — адаптация имени абонента описана в разделе Модификация имени абонента.
- caller_id — маска адаптации caller id, синтаксис аналогичен полю digits.
Описание параметров "nai", "incomplete", "npi", "apri", "screening", "ni" аналогично описанию параметров элемента "cgpn" секции "conditions".
2.2.2 <cdpn>
Операция адаптации параметров номера вызываемого абонента.
<cdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
ni="Ni"
inni="Inni"
display_name="DisplayName"/>
где
- digits — маска адаптации цифр номера или новые цифры номера. Подробное описание приведено в разделе Модификация цифр номера
- display_name — адаптация имени абонента описана в разделе Модификация имени абонента;
Описание параметров "nai", "incomplete", "npi", "category", "inni", "ni" аналогично описанию параметров элемента "cdpn" секции "conditions".
2.2.3 <rgn>
Операция адаптации параметров номера, который выполнил переадресацию.
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска адаптации цифр номера или новые цифры номера. Подробное описание приведено в разделе Модификация цифр номера;
- display_name — адаптация имени абонента описана в разделе Модификация имени абонента;
Описание параметров "nai", "incomplete", "npi", "apri", "ni" аналогично описанию параметров элемента "rgn" секции "conditions".
2.2.3 <rnn>
Операция адаптации параметров номера на который выполнили переадресацию.
<rnn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
inni="Inni"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска адаптации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера; - display_name — адаптация имени абонента описана в разделе Модификация имени абонента;
Описание параметров "nai", "incomplete", "npi", "inni", category", "ni" аналогично описанию параметров элемента "rnn" секции "conditions".
2.2.4 <ocdpn>
Операция адаптации параметров оригинального номера на который выполнили вызов.
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
apri="Apri"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска адаптации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера; - display_name — адаптация имени абонента описана в разделе Модификация имени абонента;
Описание параметров "nai", "incomplete", "npi", "category", "apri", "ni" аналогично описанию параметров элемента "rnn" секции "conditions".
2.2.5 <cn>
Операция адаптации параметров подключенного номера.
<cn digits="Digits"
nai="Nai"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
display_name="DisplayName"
caller_id="CallerId"
transit_display_name="boolean"/>
где
- digits — маска адаптации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера; - display_name — адаптация имени абонента описана в разделе Модификация имени абонента;
- caller_id — маска адаптации caller id, синтаксис аналогичен полю digits.
- empty — удалить из сигнализации параметр ConnectedNumber (если выставлен в true, то остальные атрибуты не должны быть выставлены).
Описание параметров "nai", "npi", "apri", "ni" аналогично описанию параметров элемента "cn" секции "conditions".
2.2.6 <empty_cn>
Удалить из сигнализации параметр ConnectedNumber.
Этот элемент атрибутов не имеет.
2.2.7 <empty_rgn>
Удалить из сигнализации параметр RedirectingNumber.
Этот элемент атрибутов не имеет.
2.2.8 <empty_ocdpn>
Удалить из сигнализации параметр OriginalNumber.
Этот элемент атрибутов не имеет.
2.3 <result>
В этом обязательном элементе <result> описывается результат отработки правила адаптации.
<result>
Result
</result>
где
- Result — результат выполнения правила, принимает значения: finish; error; next; continue.
2.3.1 <finish>
Завершение адаптации.
Модификация прошла успешно, будет возвращен результат адаптации номеров в соответствии с правилами.
Синтаксис в упрощенном варианте:
<result>
<finish/>
</result>
2.3.2 <error>
Ошибка адаптации.
Синтаксис:
<result>
<error isup_cause="ISUPCause"
acp_cause="ACPCause"
description="Description"/>
</result>
где
- isup_cause — опциональный параметр, число, isup причины, которое будет использовано в сообщении rel.
- acp_cause — опциональный параметр, строка, acp причины, которая будет использована в сообщении rel.
- description — опциональный параметр, описание причины, которое будут использованы в сообщении rel.
2.3.3 <continue>
Продолжить адаптацию в текущем контексте данной виртуальной АТС (домена).
Синтаксис:
<result>
<continue type="Type" tag="Tag"/>
</result>
- type — опциональное поле, может принимать значения:
- start — продолжить в текущем контексте с первого правила;
- next — продолжить в текущем контексте со следующего правила (будет сконвертирован в <next>).
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил адаптации при последующем анализе, дает возможность делать некое подобие условной параметрической адаптации.
2.3.4 <next>
Продолжить адаптацию в текущем контексте со следующего правила. Если условия выполняются, будет применен набор действий из элемента <actions>.
Синтаксис:
<result>
<next tag="Tag"/>
</result>
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил адаптации при последующем анализе, дает возможность делать некое подобие условной параметрической адаптации.
Маска цифр номера
Маска цифр номера в поле условий срабатывания правил. Предоставляет удобный и гибкий синтаксис описания различных номеров.
Регулярные выражения не используются умышленно, т.к. это значительно повышает порог квалификации инженера, который необходим для использования механизма.
Маска номера задается в виде строки, в которую вводится номер для осуществления сравнения. Можно указать диапазон через «-», либо перечислить через «,». Диапазон, или перечисление заключается в круглые скобки "(" ")" Так же возможны следующие служебные символы:
- "?" — один любой не пустой элемент номера (цифры 0-9, либо буквы A, B, C, D);
- "%" — 0 или несколько элементов номера (внимание: после символа "%" не может идти других символов).
Для сравнения общего префикса параметров cgpn, cdpn, ocdpn, rgn, cn, rnn между собой, используется следующий синтаксис [cgpn|cdpn|rgn|ocdpn|cn|rnn{DIGITS}].
Примеры масок номера в правилах:
<conditions>
<cgpn digit="8%"/>
</conditions>
Условию удовлетворяют номера длинной больше либо равный 1 и начинающиеся с цифры 8.
<conditions>
<cgpn digit="345???????"/>
</conditions>
Условию удовлетворяют номера длинной 10 знаков, начинающиеся с 345.
<conditions>
<cgpn digit="%"/>
</conditions>
Условию удовлетворяют любые номера.
<conditions>
<cdpn digit="???"/>
</conditions>
Условию удовлетворяют любые номера длинной 3 знака.
Далее примеры использования диапазонов и перечислений в масках номеров:
<conditions>
<cdpn digit="(1-3)7%"/>
</conditions>
Равносильно трем правилам с масками 17% 27% 37%.
<conditions>
<cdpn digit="(2010000-2029999)"/>
</conditions>
Условию будут удовлетворять любые 7ми значные номера указанного диапазона.
<conditions>
<cdpn digit="(1,5,7)7%"/>
</conditions>
Равносильно трем правилам с масками 17% 57% 77%.
Пример сравнения общего префикса параметров cgpn и cdpn:
<conditions>
<cdpn digits="????"/>
<cgpn digits="[cdpn{1,2}]??"/>
</conditions>
Известные ошибки при сравнении параметров:
Сравнивание параметров друг с другом
<conditions> <cdpn digits="[cgpn{1,2}]??"/> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEИспользование параметра которого не существует
<conditions> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEВыход за границы сравниваемого параметра
<conditions> <cdpn digits="????"/> <cgpn digits="[cdpn{5,6}]??"/> </conditions>
CODE
Маска времени
Маска времени задает диапазон значений времени суток.
Формат задания времени "ЧЧ:ММ-ЧЧ:ММ"
где
- ЧЧ — значение часа;
- ММ — значение минут.
Вместо указания конкретных значений часа или минут можно указать служебный символ "*", который соответствует любому значению.
Примеры масок времени в правилах:
<conditions>
<time value="09:00 - 18:00"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 09:00 по 18:00 (рабочее время).
<conditions>
<time value="*:20 - *:30"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 20 по 30 минут каждого часа в сутках.
Маска даты
Маска даты задает диапазон дат.
Формат задания маски даты: "ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2"
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
Так же возможно применение на любой позиции служебного символа "*", который соответствует любому значению.
Примеры масок даты в правилах:
<conditions>
<date value="01.01.* - 31.01.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в январе (1 месяц).
<conditions>
<date value="10.*.* - 20.*.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период с 10 по 20-е число каждого месяца.
<conditions>
<date value="13.10.2019 - 13.10.2019"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые 13 октября 2019 года.
Маска дня недели
Маска дня недели задает набор дней недели.
Формат описания маски дней недели: "ДН1,ДН2,...,ДНX"
где
- ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
Работает по григорианским календарю.
Примеры масок дней недели в правилах:
<conditions>
<weekday value="1,2,3,4,5"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые с понедельника по пятницу (рабочие дни).
<conditions>
<weekday value="6,7"/>
</conditions>
Условию удовлетворяют вызовы обслуживаемые в субботу и воскресенье (выходные дни).
Модификация цифр номера
В действиях по модификации параметров вызова одним из основных элементов для корректировки является изменение цифр номера абонента А или Б.
Существуют разные подходы к способу описания синтаксиса такой модификации: модификация на шаблонах, регулярные выражения и т.п.
Регулярные выражения являются самым гибким способом, позволяющим делать все возможные преобразования, но у него есть существенные недостатки:
- сложность синтаксиса — регулярные выражения — это универсальный механизм, используемый в разных сферах IT. Обладает своим сложным языком описания, что повышает входной порог знаний человека, который их использует;
- вычислительная сложность — вычисление результата модификации на базе регулярных выражений (в том числе в перекомпилированном варианте) требует больших вычислительных ресурсов по сравнению с модификацией на шаблонах.
Чтобы избавится от недостатков регулярных выражений, в системе ECSS-10 используется модификация номера на шаблонах.
При модификации номера используется следующая нотация:
- каждая цифра исходного номера (до модификации) обозначается либо числом описывающим ее позицию, либо буквой английского алфавита на соответствующей позиции (исходный семизначный номер без изменения можно записать в виде: "1,2,3,4,5,6,7" или "abcdefg");
- как и в условиях срабатывания правил, поддерживается спец символ "%", который означает ту часть номера, которая соответствует символу % в секции <conditions> (можно считать, что на этапе условия правила для соответствующего номера формируется переменная с именем "%", которая заполняется цифрами номера, а на этапе модификации она используется);
- для того, чтобы была возможность модифицировать номер (абонента А или абонента Б) он обязательно должен присутствовать в элементе <conditions> правила (это гарантирует соблюдение формата номера);
- для того, чтобы были возможны модификации с определенными цифрами в номере, в элементе <conditions> в условии для соответствующего номера цифры на требуемых позициях должны присутствовать либо сами цифры номера (шаблон по цифрам), либо цифры должны быть закрыты спецсимволами "?";
- для правил, обрабатывающих номер произвольной длины (в элементе <conditions> для цифр номера стоит условие со спец символом "%"), возможно только префиксирование (дописывание дополнительного префикса), либо постфиксирование (дописывание постфикса в конце номера);
- если необходимо вставить дополнительные цифры, которые не входили в исходный номер, то они просто записываются в поле "digits" в нужной позиции, поддерживается указание собственно цифр номера от 0 до 9 и букв A, B, C, D (либо a,b,c,d);
- если требуется записать элементы исходного номера в виде кодов (номеров позиции, либо буквенных кодов), либо в виде спец символа "%", то они записываются в фигурных скобках (например {abc}, либо {3,5,4}, либо {5,%}.
- если требуется скопировать часть цифр из cgpn в cdpn, rgn, rnn, cn, ocdpn (аналогично для остальных типов номеров), которые совпали в рамках секции conditions, в секции actions используется [cgpn|cdpn|rgn|rnn|cn|ocdpn{DIGITS,%}].
Примеры:
Удаление префикса 345 от десятизначного номера:
<conditions>
<cgpn digits="345???????"/>
</conditions>
<actions>
<cgpn digits="{4,5,6,7,8,9,10}"/>
</actions>
Удаление префикса 345 от номера произвольной длины с префиксом 345:
<conditions>
<cgpn digits="345%"/>
</conditions>
<actions>
<cgpn digits="{%}"/>
</actions>
Перестановка цифр 2 и 3 в трехзначном номере (сами цифры любые):
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="{1,3,2}"/>
</actions>
Например, для того, чтобы в CGPN скопировать первые два символа из CDPN, можно написать следующее условие:
<rule name="test">
<conditions>
<cgpn digits="???"/>
<cdpn digits="?????"/>
</conditions>
<actions>
<cgpn digits="[CGPN{1,2}]{abc}"/>
</actions>
</rule>
Префиксирование произвольного трехзначного номера с префиксом 008:
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="008{1,2,3}"/>
</actions>
Правило, которое может использоваться для выхода на междугородную станцию. В частности видно, что правило сработает для вызовов, в которых у абонента А семизначный местный номер, номер абонента Б начинается на 8. Задача модификации преобразовать местный номер к междугородному, который понимает междугородка, для этого дописывается префикс и меняется «ni» и «nai». Номер Б не изменяется, его разбором занимается междугородка.
<conditions>
<cgpn digits="???????" ni="local"/>
<cdpn digits="8%"/>
</conditions>
<actions>
<cgpn digits="8383{1,2,3,4,5,6,7}" ni="intercity" nai="nationalNumber"/>
</actions>
Модификация имени абонента
Конвертирование имени абонента во внутреннюю кодировку на модификаторах по входу:
- $latin1_to_utf8
- $cp1251_to_utf8
Конвертирование имени абонента на модификаторах по выходу:
- $utf8_to_latin1
- $utf8_to_cp1251
При помощи макропеременных
%CITY%|%REGION%|%OPERATOR%
в качестве имени, можно задать город/регион/оператора абонента.
Во всех остальных случаях в качестве имени абонента будет подставлена переданная строка.
Детальное описание контекста модификации номеров
Конфигурационный файл для собой файл в формате XML, который оформлен в соответствии со схемой данных, приведенной в файле ecss_modificators.xsd.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- categoryType -->
<xs:simpleType name="categoryType">
<xs:restriction base="xs:string">
<xs:enumeration value="unknownAtThisTime"/>
<xs:enumeration value="operatorFrench"/>
<xs:enumeration value="operatorEngish">
<xs:annotation>
<xs:documentation xml:lang="en">Obsolete value. Correct value is operatorEnglish</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="operatorEnglish"/>
<xs:enumeration value="operatorGerman"/>
<xs:enumeration value="operatorRussian"/>
<xs:enumeration value="operatorSpanish"/>
<xs:enumeration value="reserved"/>
<xs:enumeration value="ordinarySubscriber"/>
<xs:enumeration value="subscriberWithPriority"/>
<xs:enumeration value="dataCall"/>
<xs:enumeration value="testCall"/>
<xs:enumeration value="spare"/>
<xs:enumeration value="payphone"/>
<xs:enumeration value="category0"/>
<xs:enumeration value="hotelsSubscriber"/>
<xs:enumeration value="freeSubscriber"/>
<xs:enumeration value="paidSubscriber"/>
<xs:enumeration value="localSubscriber"/>
<xs:enumeration value="localTaksofon"/>
<xs:enumeration value="autoCallI"/>
<xs:enumeration value="semiautoCallI"/>
<xs:enumeration value="autoCallII"/>
<xs:enumeration value="semiautoCallII"/>
<xs:enumeration value="autoCallIII"/>
<xs:enumeration value="semiautoCallIII"/>
<xs:enumeration value="autoCallIV"/>
<xs:enumeration value="semiautoCallIV"/>
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="4"/>
<xs:enumeration value="5"/>
<xs:enumeration value="6"/>
<xs:enumeration value="7"/>
<xs:enumeration value="8"/>
<xs:enumeration value="9"/>
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
<xs:enumeration value="13"/>
<xs:enumeration value="14"/>
<xs:enumeration value="15"/>
<xs:enumeration value="16"/>
<xs:enumeration value="17"/>
<xs:enumeration value="18"/>
<xs:enumeration value="19"/>
<xs:enumeration value="20"/>
<xs:enumeration value="21"/>
<xs:enumeration value="22"/>
<xs:enumeration value="23"/>
<xs:enumeration value="24"/>
<xs:enumeration value="25"/>
<xs:enumeration value="26"/>
<xs:enumeration value="27"/>
<xs:enumeration value="28"/>
<xs:enumeration value="29"/>
<xs:enumeration value="30"/>
<xs:enumeration value="31"/>
<xs:enumeration value="32"/>
<xs:enumeration value="33"/>
<xs:enumeration value="34"/>
<xs:enumeration value="35"/>
<xs:enumeration value="36"/>
<xs:enumeration value="37"/>
<xs:enumeration value="38"/>
<xs:enumeration value="39"/>
<xs:enumeration value="40"/>
<xs:enumeration value="41"/>
<xs:enumeration value="42"/>
<xs:enumeration value="43"/>
<xs:enumeration value="44"/>
<xs:enumeration value="45"/>
<xs:enumeration value="46"/>
<xs:enumeration value="47"/>
<xs:enumeration value="48"/>
<xs:enumeration value="49"/>
<xs:enumeration value="50"/>
<xs:enumeration value="51"/>
<xs:enumeration value="52"/>
<xs:enumeration value="53"/>
<xs:enumeration value="54"/>
<xs:enumeration value="55"/>
<xs:enumeration value="56"/>
<xs:enumeration value="57"/>
<xs:enumeration value="58"/>
<xs:enumeration value="59"/>
<xs:enumeration value="60"/>
<xs:enumeration value="61"/>
<xs:enumeration value="62"/>
<xs:enumeration value="63"/>
<xs:enumeration value="64"/>
<xs:enumeration value="65"/>
<xs:enumeration value="66"/>
<xs:enumeration value="67"/>
<xs:enumeration value="68"/>
<xs:enumeration value="69"/>
<xs:enumeration value="70"/>
<xs:enumeration value="71"/>
<xs:enumeration value="72"/>
<xs:enumeration value="73"/>
<xs:enumeration value="74"/>
<xs:enumeration value="75"/>
<xs:enumeration value="76"/>
<xs:enumeration value="77"/>
<xs:enumeration value="78"/>
<xs:enumeration value="79"/>
<xs:enumeration value="80"/>
<xs:enumeration value="81"/>
<xs:enumeration value="82"/>
<xs:enumeration value="83"/>
<xs:enumeration value="84"/>
<xs:enumeration value="85"/>
<xs:enumeration value="86"/>
<xs:enumeration value="87"/>
<xs:enumeration value="88"/>
<xs:enumeration value="89"/>
<xs:enumeration value="90"/>
<xs:enumeration value="91"/>
<xs:enumeration value="92"/>
<xs:enumeration value="93"/>
<xs:enumeration value="94"/>
<xs:enumeration value="95"/>
<xs:enumeration value="96"/>
<xs:enumeration value="97"/>
<xs:enumeration value="98"/>
<xs:enumeration value="99"/>
<xs:enumeration value="100"/>
<xs:enumeration value="101"/>
<xs:enumeration value="102"/>
<xs:enumeration value="103"/>
<xs:enumeration value="104"/>
<xs:enumeration value="105"/>
<xs:enumeration value="106"/>
<xs:enumeration value="107"/>
<xs:enumeration value="108"/>
<xs:enumeration value="109"/>
<xs:enumeration value="110"/>
<xs:enumeration value="111"/>
<xs:enumeration value="112"/>
<xs:enumeration value="113"/>
<xs:enumeration value="114"/>
<xs:enumeration value="115"/>
<xs:enumeration value="116"/>
<xs:enumeration value="117"/>
<xs:enumeration value="118"/>
<xs:enumeration value="119"/>
<xs:enumeration value="120"/>
<xs:enumeration value="121"/>
<xs:enumeration value="122"/>
<xs:enumeration value="123"/>
<xs:enumeration value="124"/>
<xs:enumeration value="125"/>
<xs:enumeration value="126"/>
<xs:enumeration value="127"/>
<xs:enumeration value="128"/>
<xs:enumeration value="129"/>
<xs:enumeration value="130"/>
<xs:enumeration value="131"/>
<xs:enumeration value="132"/>
<xs:enumeration value="133"/>
<xs:enumeration value="134"/>
<xs:enumeration value="135"/>
<xs:enumeration value="136"/>
<xs:enumeration value="137"/>
<xs:enumeration value="138"/>
<xs:enumeration value="139"/>
<xs:enumeration value="140"/>
<xs:enumeration value="141"/>
<xs:enumeration value="142"/>
<xs:enumeration value="143"/>
<xs:enumeration value="144"/>
<xs:enumeration value="145"/>
<xs:enumeration value="146"/>
<xs:enumeration value="147"/>
<xs:enumeration value="148"/>
<xs:enumeration value="149"/>
<xs:enumeration value="150"/>
<xs:enumeration value="151"/>
<xs:enumeration value="152"/>
<xs:enumeration value="153"/>
<xs:enumeration value="154"/>
<xs:enumeration value="155"/>
<xs:enumeration value="156"/>
<xs:enumeration value="157"/>
<xs:enumeration value="158"/>
<xs:enumeration value="159"/>
<xs:enumeration value="160"/>
<xs:enumeration value="161"/>
<xs:enumeration value="162"/>
<xs:enumeration value="163"/>
<xs:enumeration value="164"/>
<xs:enumeration value="165"/>
<xs:enumeration value="166"/>
<xs:enumeration value="167"/>
<xs:enumeration value="168"/>
<xs:enumeration value="169"/>
<xs:enumeration value="170"/>
<xs:enumeration value="171"/>
<xs:enumeration value="172"/>
<xs:enumeration value="173"/>
<xs:enumeration value="174"/>
<xs:enumeration value="175"/>
<xs:enumeration value="176"/>
<xs:enumeration value="177"/>
<xs:enumeration value="178"/>
<xs:enumeration value="179"/>
<xs:enumeration value="180"/>
<xs:enumeration value="181"/>
<xs:enumeration value="182"/>
<xs:enumeration value="183"/>
<xs:enumeration value="184"/>
<xs:enumeration value="185"/>
<xs:enumeration value="186"/>
<xs:enumeration value="187"/>
<xs:enumeration value="188"/>
<xs:enumeration value="189"/>
<xs:enumeration value="190"/>
<xs:enumeration value="191"/>
<xs:enumeration value="192"/>
<xs:enumeration value="193"/>
<xs:enumeration value="194"/>
<xs:enumeration value="195"/>
<xs:enumeration value="196"/>
<xs:enumeration value="197"/>
<xs:enumeration value="198"/>
<xs:enumeration value="199"/>
<xs:enumeration value="200"/>
<xs:enumeration value="201"/>
<xs:enumeration value="202"/>
<xs:enumeration value="203"/>
<xs:enumeration value="204"/>
<xs:enumeration value="205"/>
<xs:enumeration value="206"/>
<xs:enumeration value="207"/>
<xs:enumeration value="208"/>
<xs:enumeration value="209"/>
<xs:enumeration value="210"/>
<xs:enumeration value="211"/>
<xs:enumeration value="212"/>
<xs:enumeration value="213"/>
<xs:enumeration value="214"/>
<xs:enumeration value="215"/>
<xs:enumeration value="216"/>
<xs:enumeration value="217"/>
<xs:enumeration value="218"/>
<xs:enumeration value="219"/>
<xs:enumeration value="220"/>
<xs:enumeration value="221"/>
<xs:enumeration value="222"/>
<xs:enumeration value="223"/>
<xs:enumeration value="224"/>
<xs:enumeration value="225"/>
<xs:enumeration value="226"/>
<xs:enumeration value="227"/>
<xs:enumeration value="228"/>
<xs:enumeration value="229"/>
<xs:enumeration value="230"/>
<xs:enumeration value="231"/>
<xs:enumeration value="232"/>
<xs:enumeration value="233"/>
<xs:enumeration value="234"/>
<xs:enumeration value="235"/>
<xs:enumeration value="236"/>
<xs:enumeration value="237"/>
<xs:enumeration value="238"/>
<xs:enumeration value="239"/>
<xs:enumeration value="240"/>
<xs:enumeration value="241"/>
<xs:enumeration value="242"/>
<xs:enumeration value="243"/>
<xs:enumeration value="244"/>
<xs:enumeration value="245"/>
<xs:enumeration value="246"/>
<xs:enumeration value="247"/>
<xs:enumeration value="248"/>
<xs:enumeration value="249"/>
<xs:enumeration value="250"/>
<xs:enumeration value="251"/>
<xs:enumeration value="252"/>
<xs:enumeration value="253"/>
<xs:enumeration value="254"/>
<xs:enumeration value="255"/>
</xs:restriction>
</xs:simpleType>
<!-- naiType -->
<xs:simpleType name="naiType">
<xs:restriction base="xs:string">
<xs:enumeration value="spare"/>
<xs:enumeration value="subscriberNumber"/>
<xs:enumeration value="unknown"/>
<xs:enumeration value="nationalNumber"/>
<xs:enumeration value="internationNumber"/>
</xs:restriction>
</xs:simpleType>
<!-- inniType -->
<xs:simpleType name="inniType">
<xs:restriction base="xs:string">
<xs:enumeration value="routingToInternalNumberAllowed"/>
<xs:enumeration value="routingToInternalNumberNotAllowed"/>
</xs:restriction>
</xs:simpleType>
<!-- npiType -->
<xs:simpleType name="npiType">
<xs:restriction base="xs:string">
<xs:enumeration value="spare"/>
<xs:enumeration value="isdnTelephony"/>
<xs:enumeration value="dataNumberingPlan"/>
<xs:enumeration value="telexNumberingPlan"/>
<xs:enumeration value="reserved1"/>
<xs:enumeration value="reserved2"/>
<xs:enumeration value="reserved3"/>
</xs:restriction>
</xs:simpleType>
<!-- niType -->
<xs:simpleType name="niType">
<xs:restriction base="xs:string">
<xs:enumeration value="private"/>
<xs:enumeration value="local"/>
<xs:enumeration value="zone"/>
<xs:enumeration value="intercity"/>
<xs:enumeration value="international"/>
<xs:enumeration value="emergency"/>
</xs:restriction>
</xs:simpleType>
<!-- apriType -->
<xs:simpleType name="apriType">
<xs:restriction base="xs:string">
<xs:enumeration value="presentationAllowed"/>
<xs:enumeration value="presentationRestricted"/>
<xs:enumeration value="addressNotAvailable"/>
<xs:enumeration value="spare"/>
</xs:restriction>
</xs:simpleType>
<!-- screeningType -->
<xs:simpleType name="screeningType">
<xs:restriction base="xs:string">
<xs:enumeration value="userProvidedNotVerified"/>
<xs:enumeration value="userProvidedVerifiedAndPassed"/>
<xs:enumeration value="userProvidedVerifiedAndFailed"/>
<xs:enumeration value="networkProvided"/>
</xs:restriction>
</xs:simpleType>
<!-- booleanType -->
<xs:simpleType name="booleanType">
<xs:restriction base="xs:boolean"/>
</xs:simpleType>
<!-- ruleType -->
<xs:complexType name="ruleType">
<xs:sequence>
<xs:element name="conditions" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="cgpn" type="cgpnType" minOccurs="0"/>
<xs:element name="cdpn" type="cdpnType" minOccurs="0"/>
<xs:element name="rgn" type="rgnConditionType" minOccurs="0"/>
<xs:element name="rnn" type="rnnConditionType" minOccurs="0"/>
<xs:element name="ocdpn" type="ocdpnConditionType" minOccurs="0"/>
<xs:element name="cn" type="cnConditionType" minOccurs="0"/>
<xs:element name="time" type="valueType" minOccurs="0"/>
<xs:element name="date" type="valueType" minOccurs="0"/>
<xs:element name="weekday" type="valueType" minOccurs="0"/>
<xs:element name="tag" type="valueType" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="actions" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="cgpn" type="cgpnType" minOccurs="0"/>
<xs:element name="cdpn" type="cdpnType" minOccurs="0"/>
<xs:element name="rgn" type="rgnActionType" minOccurs="0"/>
<xs:element name="rnn" type="rnnActionType" minOccurs="0"/>
<xs:element name="ocdpn" type="ocdpnActionType" minOccurs="0"/>
<xs:element name="cn" type="cnActionType" minOccurs="0"/>
<xs:element name="empty_rgn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove routing number.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="empty_ocdpn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove original called number.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="empty_cn" type="nullType" minOccurs="0">
<xs:annotation><xs:documentation xml:lang="en">Remove connected number.</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="result">
<xs:complexType>
<xs:choice>
<xs:element name="finish" type="finishResultType"/>
<xs:element name="error" type="errorResultType"/>
<xs:element name="next" type="nextResultType"/>
<xs:element name="continue" type="continueResultType"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
</xs:complexType>
<!-- modificatorsType -->
<xs:complexType name="modificatorsType">
<xs:all>
<xs:element name="in" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="out" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="name" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>The name of the current modificators.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="description" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>Text description of the current modificators.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- adaptationType -->
<xs:complexType name="adaptationType">
<xs:sequence>
<xs:element name="rule" type="ruleType" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>The name of the current adaptation.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="description" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>Text description of the current adaptation.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- modificators -->
<xs:element name="modificators" type="modificatorsType"/>
<!-- adaptation -->
<xs:element name="adaptation" type="adaptationType"/>
<!-- cdpnType -->
<xs:complexType name="cdpnType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="city" type="xs:string"/>
<xs:attribute name="region" type="xs:string"/>
<xs:attribute name="operator" type="xs:string"/>
</xs:complexType>
<!-- cgpnType -->
<xs:complexType name="cgpnType">
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="screening" type="screeningType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="transit_display_name" type="booleanType"/>
<xs:attribute name="caller_id" type="xs:string"/>
<xs:attribute name="city" type="xs:string"/>
<xs:attribute name="region" type="xs:string"/>
<xs:attribute name="operator" type="xs:string"/>
</xs:complexType>
<!-- rgnConditionType -->
<xs:complexType name="rgnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- rnnConditionType -->
<xs:complexType name="rnnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- ocdpnConditionType -->
<xs:complexType name="ocdpnConditionType">
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- cnConditionType -->
<xs:complexType name="cnConditionType">
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="in_list" type="xs:string"/>
<xs:attribute name="empty" type="booleanType">
<xs:annotation>
<xs:documentation>In case of empty attribute set - other attributes MUST NOT be set.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- rgnActionType -->
<xs:complexType name="rgnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
</xs:complexType>
<!-- rnnActionType -->
<xs:complexType name="rnnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
<xs:attribute name="inni" type="inniType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="ni" type="niType"/>
</xs:complexType>
<!-- ocdpnActionType -->
<xs:complexType name="ocdpnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="category" type="categoryType"/>
<xs:attribute name="incomplete" type="xs:boolean"/>
</xs:complexType>
<!-- cnActionType -->
<xs:complexType name="cnActionType">
<xs:attribute name="display_name" type="xs:string"/>
<xs:attribute name="nai" type="naiType"/>
<xs:attribute name="npi" type="npiType"/>
<xs:attribute name="apri" type="apriType"/>
<xs:attribute name="digits" type="xs:string"/>
<xs:attribute name="ni" type="niType"/>
<xs:attribute name="caller_id" type="xs:string"/>
<xs:attribute name="transit_display_name" type="booleanType"/>
</xs:complexType>
<!-- valueType -->
<xs:complexType name="valueType">
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
<!-- nullType -->
<xs:complexType name="nullType"/>
<!-- Result types -->
<!-- finishResultType -->
<xs:complexType name="finishResultType"/>
<!-- errorResultType -->
<xs:complexType name="errorResultType">
<xs:attribute name="acp_cause" type="xs:string" use="optional"/>
<xs:attribute name="isup_cause" type="xs:string" use="optional"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
</xs:complexType>
<!-- continueResultTypeType -->
<xs:simpleType name="continueResultTypeType">
<xs:restriction base="xs:string">
<xs:enumeration value="start"/>
<xs:enumeration value="next"/>
</xs:restriction>
</xs:simpleType>
<!-- nextResultType -->
<xs:complexType name="nextResultType">
<xs:attribute name="tag" type="xs:string" use="optional"/>
</xs:complexType>
<!-- continueResultType -->
<xs:complexType name="continueResultType">
<xs:attribute name="tag" type="xs:string" use="optional"/>
<xs:attribute name="type" type="continueResultTypeType" default="start" use="optional"/>
</xs:complexType>
</xs:schema>
Актуальный файл с описанием схемы данных находится на развернутой системе по пути /usr/lib/ecss/ecss-ds/lib/rm_lib-x.x.x.x/priv/ecss_modificators.xsd.
Каждый XML-файл представляет собой описание одного контекста модификации (группы правил) в рамках виртуальной АТС.
Формат описания контекста модификации:
<modificators>
<in>
<rule>
<conditions></conditions>
<actions></actions>
<result></result>
</rule>
<rule></rule>
</in>
<out>
<rule></rule>
...
<rule></rule>
</out>
</modificators>
1. <modificators>
Базовый элемент файла модификации, описывающий параметры контекста модификации.
Структура элемента <modificators> имеет следующий вид:
<modificators name="string" description="string">
</modificators>
где
- name — строка с именем контекста модификации, должна быть уникальной в рамках виртуальной АТС;
- description — текстовое описание контекста модификации.
Далее в рамках тега <modificators> между закрывающим и открывающим тегом идет набор тегов, описывающих правила модификаторов.
Анализ условий срабатывания правил производится в том порядке, в котором они указаны в файле — сверху вниз.
Примечание: в одном контексте модификаторов не может быть больше 1000 правил. Ограничение введено искусственно, так как количество правил влияет на скорость обработки модификации.
2. <rule>
Элементом <rule> описывается правило модификации.
Структура правила модификации имеет следующий вид:
<rule name="RuleName">
<conditions>
</conditions>
<actions>
</actions>
<result>
</result>
</rule>
где
- RuleName — имя правила модификации. Строка, которая должна быть уникальной в рамках контекста модификации, выводится при трассировке модификации;
- <conditions> — обязательный элемент, описывающий условия срабатывания правила модификации;
- <actions> — опциональный элемент, описывающий набор операций, которые применяются к параметрам вызова при срабатывании правила модификации;
- <result> — обязательный элемент, описывающий результат отработки правила модификации.
2.1 <conditions>
В элементе <conditions> описывается набор условий, выполнение которых приводит к выполнению правила.
Формат описания элемента <conditions> имеет следующий вид:
<conditions>
<cgpn/>
<cdpn/>
<rgn/>
<rnn/>
<ocdpn/>
<cn/>
<time/>
<date/>
<weekday/>
<tag/>
</conditions>
где
- cdpn — поле сравнения номера вызываемого абонента (номер Б и его параметры);
- cgpn — поле сравнения номера вызывающего абонента (номер А и его параметры);
- rgn — поле сравнения номера который выполнил переадресацию;
- rnn — поле сравнения номера на который выполнили переадресацию;
- ocdpn — поле сравнения оригинального номера на который выполнили вызов;
- cn — поле сравнения подключенного номера;
- time — дата и время суток;
- tag — вспомогательный параметр для организации многошаговой модификации в рамках одного контекста, по умолчанию установлено значение "undefined";
Каждый из указанных выше элементов в рамках <conditions> является опциональным и может быть использован не более одного раза.
Пустой набор критериев говорит об отсутствии ограничений.
2.1.1 <cgpn>
Параметры номера вызывающего абонента.
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"
in_list="List"
city="City"
region="Region"
operator="Operator"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: spare, subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: spare, isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- spare — зарезервирован;
- screening — индикатор контроля номера вызывающего абонента, принимает значения:
- userProvidedNotVerified — предоставлена пользователем, не проверена;
- userProvidedVerifiedAndPassed — предоставлена пользователем, проверка пройдена;
- userProvidedVerifiedAndFailed — предоставлена пользователем, проверка не пройдена;
- networkProvided — предоставлена сетью.
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
city — город абонента полученный из БД реестра плана нумерации РФ
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ.
2.1.2 <cdpn>
Параметры номера вызываемого абонента.
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
ni="Ni"
inni="Inni"
in_list="List"
city="City"
region="Region"
operator="Operator"/>
где
- digits — маска цифр номера вызываемого абонента, подробное описание приведено в разделе Маска цифр номера;
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- inni — индикатор внутрисетевого номера (InternalNetworkNumberIndicator), принимает значения:
- routingToInternalNumberAllowed — маршрутизация на внутренний номер разрешена,
- routingToInternalNumberNotAllowed — маршрутизация на внутренний номер не разрешена;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- ni — признак номера (NumberIndicator), принимает значения:
- private — частная сеть,
- local — местная сеть,
- zone — зоновая сеть,
- intercity — междугородная сеть,
- international — международная сеть,
- emergency — спецслужбы.
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
city — город абонента полученный из БД реестра плана нумерации РФ
При задании через xml нужно учитывать знаки: точки, тире, пробелы.
Для обозначения города используется сокращения:
- Г. — город;
- ПГТ. — поселок городского типа;
- Р-Н — район
- operator — оператор абонента полученный из БД реестра плана нумерации РФ;
- region — регион абонента полученный из БД реестра плана нумерации РФ;
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице:
Таблица 1 — Категории абонента
Строковое значение | Цифровой код (ISUP) | Цифровой код (АОН) |
---|---|---|
unknownAtThisTime | 0 | |
operatorFrench | 1 | |
operatorEngish | 2 | |
operatorGerman | 3 | |
operatorRussian | 4 | |
operatorSpanish | 5 | |
reserved | 9 | |
ordinarySubscriber | 10 | 1 — ОАО "Ростелеком" |
subscriberWithPriority | 11 | 4 — ООО "Эквант" |
dataCall | 12 | 8 — ОАО "АРКТЕЛ" |
testCall | 13 | |
spare | 14 | |
payphone | 15 | 6 — ЗАО "Компания ТрансТелеКом" |
category0 | 224 | |
hotelsSubscriber | 225 | 2 — ОАО "КОМСТАР-ОТС" |
freeSubscriber | 226 | |
paidSubscriber | 227 | 7 — ЗАО "Синтерра" |
localSubscriber | 228 | 3 — ОАО "Вымпелком" (ранее ООО "СЦС Совинтел") |
localTaksofon | 229 | 9 — ОАО "Межрегиональный Транзит Телеком" |
autoCallI | 240 | |
semiautoCallI | 241 | |
autoCallII | 242 | |
semiautoCallII | 243 | |
autoCallIII | 244 | |
semiautoCallIII | 245 | |
autoCallIV | 246 | |
semiautoCallIV | 247 | |
FETCH_BY_ECSS_GLOBAL_NUMBER_LIST_NAME | В данном случае система сделает запрос на получения категории номера из единой базы номеров ECSS-10. Замечание: данное значение можно выставить только в блоке conditions. |
2.1.3 <rgn>
Параметры номера, который выполнил переадресацию:
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр RedirectingNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — RedirectingNumber не присутствует в сигнализации;
- true — RedirectingNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
2.1.4 <rnn>
Параметры номера на который выполнили переадресацию:
<rnn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
category="Category"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр RedirectionNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — RedirectionNumber не присутствует в сигнализации;
- true — RedirectionNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
2.1.5 <ocdpn>
Параметры оригинального номера на который выполнили вызов:
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
category="Category"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр OriginalCalledNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — OriginalCalledNumber не присутствует в сигнализации;
- true — OriginalCalledNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
- category — категория абонента, может принимать строковое либо цифровое значение согласно таблице 1.
2.1.6 <cn>
Параметры номера подключенного номера:
<cn digits="Digits"
nai="Nai"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
in_list="List"/>
где
- digits — маска цифр номера вызывающего абонента, подробное описание приведено в разделе Маска цифр номера
- nai — тип номера (NatureOfAddressInformation), принимает значения: subscriberNumber, unknown, nationalNumber, internationNumber;
- incomplete — признак полного номера, принимает значения:
- false — номер полный,
- true — номер не полный;
- npi — код плана нумерации (NumberingPlanIndicator), принимает значения: isdnTelephony, dataNumberingPlan, telexNumberingPlan, reserved1 (код 5), reserved2 (код 6), reserved3 (код 7);
- apri — индикатор ограничения предоставления номера вызывающего абонента (AddressPresentationRestrictionIndicator):
- presentationRestricted — запрет,
- presentationAllowed — разрешение,
- addressNotAvailable — недоступность номера;
- ni — индикатор номера (NumberIndicator), принимает значения:
- private — частная сеть;
- local — местная сеть;
- zone — зоновая сеть;
- intercity — междугородная сеть;
- international — международная сеть;
- emergency — спецслужбы;
- empty — присутствует ли в сигнализации вызова параметр ConnectedNumber (В случае, если данный параметр выставлен — все остальные параметры (digits, nai, incompele, npi, apri, ni) не должны выставляться
- false — ConnectedNumber не присутствует в сигнализации;
- true — ConnectedNumber присутствует;
- in_list — имя списка для проверки номеров на вхождение. Список можно сформировать в приложении web-конфигуратора "Группы мониторинга" или командами CLI. Тип списка должен быть default. Замечание: начиная с версии 3.14.5 добавлена поддержка глобальной базы категорий номеров. Для проверки вхождения номера в эту базу в качестве имени списка нужно указать ECSS_GLOBAL_NUMBER_LIST_NAME.
2.1.7 <time>
Время суток, задается в виде: ЧЧ:ММ-ЧЧ:ММ
где
- ЧЧ — часы;
- ММ — минуты.
<time value="TimeMask"/>
где
- value — маска времени суток. Подробное описание приведено в разделе Маска времени
2.1.8 <date>
Дата, задается в виде: ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
<date value="DateMask"/>
где
- value — маска даты. Подробное описание приведено в разделе Маска даты
2.1.9 <weekday>
День недели, задается в виде ДН1,ДН2,...,ДНX
где
- ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
<weekday value="WeekdayMask"/>
где
- value — маска дня недели. Подробное описание приведено в разделе Маска дня недели;
2.1.10 <tag>
Специальный параметр, который можно установить для вызова при модификации.
Параметр действует только на этапе модификации, устанавливается в правиле модификации и в последующем используется для изменения отработки логики модификации:
<tag value="Tag"/>
где
- value — строка, значение поля "tag" для вызова, проверяется на полное совпадение. По умолчанию значение — "undefined".
2.2 <actions>
Формат описания элемента <actions> имеет следующий вид:
<actions>
<cgpn/>
<cdpn/>
<rgn/>
<rnn/>
<ocdpn/>
<cn/>
<empty_rgn/>
<empty_ocdpn/>
<empty_cn/>
</actions>
где
- cgpn — модификация параметров номера вызывающего абонента;
- cdpn — модификация параметров номера вызываемого абонента;
- rgn — модификация параметров номера который выполнил переадресацию;
- rnn — модификация параметров номера на который выполнили переадресацию;
- ocdpn — модификация параметров оригинального номера на который выполнили вызов;
- cn — модификация параметров подключенного номера;
- empty_cn — удалить из сигнализации параметр ConnectedNumber;
- empty_rgn — удалить из сигнализации параметр RedirectingNumber;
- empty_ocdpn — удалить из сигнализации параметр OriginalCalledNumber;
Действия указываются в порядке их выполнения. Все действия являются опциональными.
2.2.1 <cgpn>
Операция модификации параметров номера вызывающего абонента:
<cgpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
screening="Screening"
ni="Ni"
display_name="DisplayName"
caller_id="CallerId"
transit_display_name="boolean"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
- caller_id — маска модификации caller id, синтаксис аналогичен полю digits.
- transit_display_name — модификация имени абонента не будет выполняться, если значение выставлено в true.
Описание параметров "nai", "incomplete", "npi", "apri", "screening", "ni" аналогично описанию параметров элемента "cgpn" секции "conditions".
2.2.2 <cdpn>
Операция модификации параметров номера вызываемого абонента:
<cdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
ni="Ni"
inni="Inni"
display_name="DisplayName"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
Описание параметров "nai", "incomplete", "npi", "category", "inni", "ni" аналогично описанию параметров элемента "cdpn" секции "conditions".
2.2.3 <rgn>
Операция модификации параметров номера, который выполнил переадресацию:
<rgn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
apri="Apri"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
Описание параметров "nai", "incomplete", "npi", "apri", "ni" аналогично описанию параметров элемента "rgn" секции "conditions".
2.2.4 <rnn>
Операция модификации параметров номера на который выполнили переадресацию:
<rnn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
inni="Inni"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
Описание параметров "nai", "incomplete", "npi", "inni", category", "ni" аналогично описанию параметров элемента "rnn" секции "conditions".
2.2.5 <ocdpn>
Операция модификации параметров оригинального номера на который выполнили вызов:
<ocdpn digits="Digits"
nai="Nai"
incomplete="boolean"
npi="Npi"
category="Category"
apri="Apri"
ni="Ni"
display_name="DisplayName"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
Описание параметров "nai", "incomplete", "npi", "category", "apri", "ni" аналогично описанию параметров элемента "rnn" секции "conditions".
2.2.6 <cn>
Операция модификации параметров подключенного номера:
<cn digits="Digits"
nai="Nai"
npi="Npi"
apri="Apri"
ni="Ni"
empty="Empty"
display_name="DisplayName"
caller_id="CallerId"
transit_display_name="boolean"/>
где
- digits — маска модификации цифр номера или новые цифры номера.
Подробное описание приведено в разделе Модификация цифр номера. - display_name — модификация имени абонента описана в разделе Модификация имени абонента.
- caller_id — маска модификации caller id, синтаксис аналогичен полю digits.
- empty — удалить из сигнализации параметр ConnectedNumber (если выставлен в true, то остальные атрибуты не должны быть выставлены).
Описание параметров "nai", "npi", "apri", "ni" аналогично описанию параметров элемента "cn" секции "conditions".
2.2.7 <empty_cn>
Удалить из сигнализации параметр ConnectedNumber.
Этот элемент атрибутов не имеет.
2.2.8 <empty_rgn>
Удалить из сигнализации параметр RedirectingNumber.
Этот элемент атрибутов не имеет.
2.2.9 <empty_ocdpn>
Удалить из сигнализации параметр OriginalNumber.
Этот элемент атрибутов не имеет.
2.3 <result>
В этом обязательном элементе <result> описывается результат отработки правила модификации:
<result>
Result
</result>
где
- Result — результат выполнения правила, принимает значения: finish; error; next; continue.
2.3.1 <finish>
Завершение модификации.
Модификация прошла успешно, будет возвращен результат модификации номеров в соответствии с правилами.
Синтаксис в упрощенном варианте:
<result>
<finish/>
</result>
2.3.2 <error>
Ошибка модификации.
Синтаксис:
<result>
<error isup_cause="ISUPCause"
acp_cause="ACPCause"
description="Description"/>
</result>
где
- isup_cause — опциональный параметр, число, isup причины, которое будет использовано в сообщении rel.
- acp_cause — опциональный параметр, строка, acp причины, которая будет использована в сообщении rel.
- description — опциональный параметр, описание причины, которое будут использованы в сообщении rel.
2.3.3 <continue>
Продолжить модификацию в текущем контексте данной виртуальной АТС (домена).
Синтаксис:
<result>
<continue type="Type" tag="Tag"/>
</result>
где
- type — опциональное поле, может принимать значения:
- start — продолжить в текущем контексте с первого правила;
- next — продолжить в текущем контексте со следующего правила (будет сконвертирован в <next>).
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил модификации при последующем анализе, дает возможность делать некое подобие условной параметрической модификации.
2.3.4 <next>
Продолжить модификацию в текущем контексте со следующего правила. Если условия выполняются, будет применен набор действий из элемента <actions>.
Синтаксис:
<result>
<next tag="Tag"/>
</result>
- tag — опциональное поле, возможность выставить значение параметра "tag", который далее можно использовать в условиях срабатывания правил модификации при последующем анализе, дает возможность делать некое подобие условной параметрической модификации.
Маска цифр номера
Маска цифр номера в поле условий срабатывания правил. Предоставляет удобный и гибкий синтаксис описания различных номеров.
Регулярные выражения не используются умышленно, т.к. это значительно повышает порог квалификации инженера, который необходим для использования механизма.
Маска номера задается в виде строки, в которую вводится номер для осуществления сравнения. Можно указать диапазон через «-», либо перечислить через «,». Диапазон, или перечисление заключается в круглые скобки "(" ")" Так же возможны следующие служебные символы:
- "?" — один любой не пустой элемент номера (цифры 0-9, либо буквы A, B, C, D);
- "%" — 0 или несколько элементов номера (внимание: после символа "%" не может идти других символов).
Для сравнения общего префикса параметров cgpn, cdpn, ocdpn, rgn, cn, rnn между собой, используется следующий синтаксис [cgpn|cdpn|rgn|ocdpn|cn|rnn{DIGITS}].
Примеры масок номера в правилах:
<conditions>
<cgpn digit="8%"/>
</conditions>
Условию удовлетворяют номера длинной больше либо равный 1 и начинающиеся с цифры 8.
<conditions>
<cgpn digit="345???????"/>
</conditions>
Условию удовлетворяют номера длинной 10 знаков, начинающиеся с 345.
<conditions>
<cgpn digit="%"/>
</conditions>
Условию удовлетворяют любые номера.
<conditions>
<cdpn digit="???"/>
</conditions>
Условию удовлетворяют любые номера длинной 3 знака.
Далее примеры использования диапазонов и перечислений в масках номеров:
<conditions>
<cdpn digit="(1-3)7%"/>
</conditions>
Равносильно трем правилам с масками 17% 27% 37%.
<conditions>
<cdpn digit="(2010000-2029999)"/>
</conditions>
Условию будут удовлетворять любые 7ми значные номера указанного диапазона.
<conditions>
<cdpn digit="(1,5,7)7%"/>
</conditions>
Равносильно трем правилам с масками 17% 57% 77%.
Пример сравнения общего префикса параметров cgpn и cdpn:
<conditions>
<cdpn digits="????"/>
<cgpn digits="[cdpn{1,2}]??"/>
</conditions>
Известные ошибки при сравнении параметров:
Сравнивание параметров друг с другом
<conditions> <cdpn digits="[cgpn{1,2}]??"/> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEИспользование параметра которого не существует
<conditions> <cgpn digits="[cdpn{1,2}]??"/> </conditions>
CODEВыход за границы сравниваемого параметра
<conditions> <cdpn digits="????"/> <cgpn digits="[cdpn{5,6}]??"/> </conditions>
CODE
Маска времени
Маска времени задает диапазон значений времени суток.
Формат задания времени "ЧЧ:ММ-ЧЧ:ММ"
где
- ЧЧ — значение часа;
- ММ — значение минут.
Вместо указания конкретных значений часа или минут можно указать служебный символ "*", который соответствует любому значению.
Примеры масок времени в правилах:
<conditions>
<time value="09:00 - 18:00"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 09:00 по 18:00 (рабочее время).
<conditions>
<time value="*:20 - *:30"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период времени с 20 по 30 минут каждого часа в сутках.
Маска даты
Маска даты задает диапазон дат.
Формат задания маски даты: "ДД1.ММ1.ГГГГ1-ДД2.ММ2.ГГГГ2"
где
- ДД — день;
- ММ — месяц;
- ГГГГ — год.
Так же возможно применение на любой позиции служебного символа "*", который соответствует любому значению.
Примеры масок даты в правилах:
<conditions>
<date value="01.01.* - 31.01.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в январе (1 месяц).
<conditions>
<date value="10.*.* - 20.*.*"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые в период с 10 по 20-е число каждого месяца.
<conditions>
<date value="13.10.2019 - 13.10.2019"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые 13 октября 2019 года.
Маска дня недели
Маска дня недели задает набор дней недели.
Формат описания маски дней недели: "ДН1,ДН2,...,ДНX"
где
- ДН — номер дня недели (числа от 1 до 7). Может быть указано от 1 до 7 дней недели.
Работает по григорианским календарю.
Примеры масок дней недели в правилах:
<conditions>
<weekday value="1,2,3,4,5"/>
</conditions>
Условию удовлетворяют вызовы, обслуживаемые с понедельника по пятницу (рабочие дни).
<conditions>
<weekday value="6,7"/>
</conditions>
Условию удовлетворяют вызовы обслуживаемые в субботу и воскресенье (выходные дни).
Модификация цифр номера
В действиях по модификации параметров вызова одним из основных элементов для корректировки является изменение цифр номера абонента А или Б.
Существуют разные подходы к способу описания синтаксиса такой модификации: модификация на шаблонах, регулярные выражения и т.п.
Регулярные выражения являются самым гибким способом, позволяющим делать все возможные преобразования, но у него есть существенные недостатки:
- сложность синтаксиса — регулярные выражения — это универсальный механизм, используемый в разных сферах IT. Обладает своим сложным языком описания, что повышает входной порог знаний человека, который их использует;
- вычислительная сложность — вычисление результата модификации на базе регулярных выражений (в том числе в перекомпилированном варианте) требует больших вычислительных ресурсов по сравнению с модификацией на шаблонах.
Чтобы избавится от недостатков регулярных выражений, в системе ECSS-10 используется модификация номера на шаблонах.
При модификации номера используется следующая нотация:
- каждая цифра исходного номера (до модификации) обозначается либо числом описывающим ее позицию, либо буквой английского алфавита на соответствующей позиции (исходный семизначный номер без изменения можно записать в виде: "1,2,3,4,5,6,7" или "abcdefg");
- как и в условиях срабатывания правил, поддерживается спец символ "%", который означает ту часть номера, которая соответствует символу % в секции <conditions> (можно считать, что на этапе условия правила для соответствующего номера формируется переменная с именем "%", которая заполняется цифрами номера, а на этапе модификации она используется);
- для того, чтобы была возможность модифицировать номер (абонента А или абонента Б) он обязательно должен присутствовать в элементе <conditions> правила (это гарантирует соблюдение формата номера);
- для того, чтобы были возможны модификации с определенными цифрами в номере, в элементе <conditions> в условии для соответствующего номера цифры на требуемых позициях должны присутствовать либо сами цифры номера (шаблон по цифрам), либо цифры должны быть закрыты спецсимволами "?";
- для правил, обрабатывающих номер произвольной длины (в элементе <conditions> для цифр номера стоит условие со спец символом "%"), возможно только префиксирование (дописывание дополнительного префикса), либо постфиксирование (дописывание постфикса в конце номера);
- если необходимо вставить дополнительные цифры, которые не входили в исходный номер, то они просто записываются в поле "digits" в нужной позиции, поддерживается указание собственно цифр номера от 0 до 9 и букв A, B, C, D (либо a,b,c,d);
- если требуется записать элементы исходного номера в виде кодов (номеров позиции, либо буквенных кодов), либо в виде спец символа "%", то они записываются в фигурных скобках (например {abc}, либо {3,5,4}, либо {5,%}.
- если требуется скопировать часть цифр из cgpn в cdpn, rgn, rnn, cn, ocdpn (аналогично для остальных типов номеров), которые совпали в рамках секции conditions, в секции actions используется [cgpn|cdpn|rgn|rnn|cn|ocdpn{DIGITS,%}].
Примеры:
Удаление префикса 345 от десятизначного номера:
<conditions>
<cgpn digits="345???????"/>
</conditions>
<actions>
<cgpn digits="{4,5,6,7,8,9,10}"/>
</actions>
Удаление префикса 345 от номера произвольной длины с префиксом 345:
<conditions>
<cgpn digits="345%"/>
</conditions>
<actions>
<cgpn digits="{%}"/>
</actions>
Перестановка цифр 2 и 3 в трехзначном номере (сами цифры любые):
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="{1,3,2}"/>
</actions>
Например, для того, чтобы в CGPN скопировать первые два символа из CDPN, можно написать следующее условие:
<rule name="test">
<conditions>
<cgpn digits="???"/>
<cdpn digits="?????"/>
</conditions>
<actions>
<cgpn digits="[CGPN{1,2}]{abc}"/>
</actions>
</rule>
Префиксирование произвольного трехзначного номера с префиксом 008:
<conditions>
<cgpn digits="???"/>
</conditions>
<actions>
<cgpn digits="008{1,2,3}"/>
</actions>
Правило, которое может использоваться для выхода на междугородную станцию. В частности видно, что правило сработает для вызовов, в которых у абонента А семизначный местный номер, номер абонента Б начинается на 8. Задача модификации преобразовать местный номер к междугородному, который понимает междугородка, для этого дописывается префикс и меняется «ni» и «nai». Номер Б не изменяется, его разбором занимается междугородка.
<conditions>
<cgpn digits="???????" ni="local"/>
<cdpn digits="8%"/>
</conditions>
<actions>
<cgpn digits="8383{1,2,3,4,5,6,7}" ni="intercity" nai="nationalNumber"/>
</actions>
Модификация имени абонента
Конвертирование имени абонента во внутреннюю кодировку на модификаторах по входу:
- $latin1_to_utf8
- $cp1251_to_utf8
Конвертирование имени абонента на модификаторах по выходу:
- $utf8_to_latin1
- $utf8_to_cp1251
При помощи макропеременных
%CITY%|%REGION%|%OPERATOR%
в качестве имени, можно задать город/регион/оператора абонента.
Во всех остальных случаях в качестве имени абонента будет подставлена переданная строка.
Руководство по настройке планов нумерации
В данном разделе представлен пример настройки плана нумерации для двух доменов, между которыми настроен бридж.
Исходные данные:
Домен_1 : central, нумерация 240ххх
Домен_2 : local_1, нумерация 50x.
Создание плана нумерации
В домене "central" создаем план нумерации "np_240", в домене "local_1" создаем план нумерации "np_500".
Для создания плана нумерации, в cocon прописываем команду:
domain/<DOMAIN>/np/declare <NAME> <MASK>
где:
- <DOMAIN> — имя домена, в котором создается план;
- <NAME> — имя плана нумерации (задается произвольно);
- <MASK> — маска плана нумерации.
Настройка контекста маршрутизации
После того, как были созданы планы нумерации, необходимо настроить маршрутизацию.
В данном примере, у домена "central" существует центральный контекст (default_routing), маршрутизация в котором происходит на транки/бриджи/другие контексты.
Задавать план нумерации на этот контекст не рекомендуется.
Создадим на домене "central" контекст маршрутизации, название — "to_local_1", план нумерации — "np_240".
Рисунок 5. Контекст to_local_1
В контексте "defaul_routing" создадим правило, по которому все вызовы на номера 240ххх уходят в контекст to_local_1.
Рисунок 6. Контекст "default_routing"
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="default_routing" np="np_240" digitmap="(*[0-9*][0-9*].#|#[0-9*][0-9*].#|*#[0-9*][0-9*].#|1xx.|10xx.)"> <rule name="240xxx"> <conditions> <cdpn digits="240???"/> </conditions> <result> <continue context="to_local_1"/> </result> </rule>
После того, как на домене "central" контексты настроены, переходим в домен "local_1" и редактируем существующий в нем контекст (в данном случае "default_routing"), указываем план нумерации "np_500".
Рисунок 7. Контекст "default_routing"
Создание бриджа
После создания планов нумерации необходимо создать бридж, который будет связывать 2 домена.
При декларации бриджа в поле "план нумерации", необходимо указать соответствующие планы нумерации.
Рисунок 8
Настройка плана нумерации
После того, как были настроены все пункты, указанные выше, в плане нумерации домена "central" необходимо добавить номера, например 240555, и связать его с интерфейсом, в данном случае с бриджем "bridge2", который смотрит в сторону домена "local_1". Как только номер будет связан с бриджем, этот номер автоматически добавляется во второй план нумерации, который указан в настройках бриджа.
Рисунок 9. Настройка плана нумерации np_240
В домене "local_1"в плане нумерации np_500 номер 240555 уже будет создан,теперь его необходимо связать с короткими номером (алиас 500).
Рисунок 10. Настройка плана нумерации np_500
Руководство по управлению менеджером планов нумерации см. в разделе Менеджер планов нумерации (Numbering plan manager).
Построение системы с использованием планов нумерации на примере 375 740 740 7001(1001).
Центральный домен, домен из которого будет назначаться нумерация для остальных — main.domain.
В этом домене нужно прописать реальную нумерацию. В нашем случае несколько номеров — 375 740 740 7???
Создаем план нумерации командой:
support@[ds1@ecss1]:/$ domain/main.domain/np/declare np_7001 3757407407001 Test Numbering plan "test_np" declared successfully.
Здесь:
- np_7001 — название создаваемого плана
- 3757407407001 — digitmap
- Test — текстовое описание
Добавляем номера в созданный план:
support@[ds1@ecss1]:/$ domain/main.domain/np/numbers/add np_7001 3757407407001 ┌─────────────┬──────┐ │NP Number │Result│ ├─────────────┼──────┤ │3757407407001│ok │ └─────────────┴──────┘
Далее создаем план нумерации в домене назначения, в ats1.local. Создаем его пустым:
support@[ds1@ecss1]:/$ domain/ats1.local/np/declare np_ats1
Связываем эти планы нумерации с помощью настроек бриджа. Доменом А должен быть "центральный" домен (main.domain).
Далее назначаем/передаем номер в абонентский домен (ats1.local) из плана нумерации центрального домена (main.domainn):
support@[ds1@ecss1]:/$ domain/main.domain/np/numbers/bind np_7001 3757407407001 --bridge main_ats1 ok [exec at: 17.03.2016 15:43:54, exec time: 13ms, nodes: ds1@ecss1]
Здесь:
- np_7001 — план из которого берем номер
- 3757407407001 — номер, который передаем
- --bridge — указываем, что номер передаем в бридж (можно передать в алиас, об этом ниже)
- main_ats1 — имя бриджа, в который передаем номер (бридж создается заранее)
Создаем локального абонента 1001 в домене
Назначаем внешний номер этому локальному абоненту:
support@[ds1@ecss1]:/$ domain/ats1.local/np/numbers/bind np_ats1 3757407407001 --alias 1001 * 1001@ats1.local --master ok
Здесь:
- np_ats1 — план из которого берем номер
- 3757407407001 — сам номер
- --alias — указываем, что номер передаем алиасу
- 1001 — имя алиаса
- * — группа алиаса (в данном случае любая)
- 1001@ats1.local — имя интерфейса алиаса
- --master — режим мастер. В этом режиме вызов на 3757407407001 будет направлен только на тот алиас, у которого этот режим выставлен. Все остальные алиасы (локальные номера), которым может быть назначен внешний номер 3757407407001 должны иметь роль --passive и принимать вызовы с 3757407407001 по умолчанию не должны.
Далее вносим правки в контексты маршрутизации для активации обработки планов нумерации (нужно делать на этапе создания доменов, до связывания бриджами)
В центральном домене (main.domain) создаем еще один контекст для выхода на пользовательский (ats1.local). В нем одно правило — все вызовы отправлять на local. Можно прописать конкретные номера, но в результате необходимо указать именно local.
Далее делаем экспорт контекста(на последних версиях можно редактировать контекст из веба). Открываем его редактором и дописываем используемый план нумерации np="np_7001" в секции context:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="to_ats1" np="np_7001" digitmap="auto">
<rule name="rule1">
<conditions>
<cdpn digits="%"/>
</conditions>
<result>
<local/>
</result>
</rule>
</context>
Импортируем обратно этот контекст.
Далее вносим правки в пользовательский домен (ats1.local).Создаем контекст для выхода в центральный домен и прописываем в нем план нумерации:
<?xml version="1.0"?>
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="to_main" np="np_ats1" digitmap="auto">
<rule name="rule1">
<conditions>
<cdpn digits="%"/>
</conditions>
<result>
<external>
<trunk value="bridge:to_main"/>
</external>
</result>
</rule>
</context>
И последнее — меняем настройки бриджа. Для доменов прописываем новые контексты.
HTTP-маршрутизация телефонных вызовов
ECSS-10 существует возможность изменения параметров проходящего вызова при помощи команд от HTTP-сервера, посылаемых в ответ на http-запросы. Команды передаются в текстовом виде json с использованием Key-Value атрибутов. В общем виде формат атрибутов выглядит следующим образом:
При попадании вызова в action "Внешняя маршрутизация по http", на указанный сервер отправляется POST-запрос с текущими параметрами вызова в теле сообщения:
{ "cgpn:"102", "caller_id":"102", "cgpn_display_name":"Sidorov", "cdpn":"789", "domain":"test.domain", "iface_a":"054a20799850a72b", "tag":"default, "context":"local", "api_key":"sdtgywq398yhetg9831qy" }
В случаи успешной маршрутизации в ответ с сервера ожидается 200 код. Если серверу необходимо изменить какой либо из параметров, в тело ответа помещается json с свойствами и значениями параметров вызова, которые необходимо изменить:
{ "cgpn": "string", (опционально) "caller_id": "string", (опционально) "cgpn_display_name": "string", (опционально) "cdpn": "string", (опционально) "cdpn_display_name": "string", (опционально) "tag": "string", (опционально) "cgpn_numtype": "internationNumber" | "nationalNumber" | "subscriberNumber" | "unknown", (опционально) "cdpn_numtype": "internationNumber" | "nationalNumber" | "subscriberNumber" | "unknown", (опционально) "cgpn_plantype": "isdnTelephony" | "reserved1" | "reserved2" | "spare", (опционально) "cdpn_plantype": "isdnTelephony" | "reserved1" | "reserved2" | "spare", (опционально) "presentation": "presentationAllowed" | "presentationRestricted" | "addressNotAvailable" | "spare" (опционально) }
Для того чтобы вызвать внешнюю маршрутизации на ECSS-10, в контексте маршрутизации необходимо задекларировать http-сервер:
/domain/DEV_DOM/routing/http/declare routeHttp http://10.40.12.140:9990/route/actions_external_routing --api-key sdtgywq398yhetg9831qy",
Далее добавить в контекст маршрутизации правило вида:
<rule name="to_HTTP_routing">
<conditions>
...
</conditions>
<actions>
<external_routing id="routeHttp" service="http_route_service" timeout="5000"/>
</actions>
<result>
<continue context="ctx_after_http"/>
</result>
</rule>
В этом правиле говорится, что в случае совпадения условий, выполнить внешнюю HTTP маршрутизацию на серверах с идентификаторами routeHttp. Команды для настройки HTTP серверов можно посмотреть тут. При этом на внешнюю маршрутизацию потратить не более 5000ms. По результатам выполнения HTTP запроса, продолжится ECSS маршрутизация в контексте ctx_after_http. Но с измененными cgpn, cdpn, tag (если эти поля были изменены в результате HTTP запроса).
Если сервер вернет код не равный 200 или не ответит, маршрутизация продолжится так, будто HTTP сервер не поменял параметров вызова.
Если в секции Результат ("<result>") выполняется действие выставление тега, то фактически этот тег будет выставлен в секции Действия ("<actions>") и в запросе к HTTP серверу будет указан уже новый тег.
Если в секции Действия ("<actions>") выполняется действие аналогичные действия выполняемым на сервере действует следующая логика:
- выполняются действия в секции <actions>;
- выполняется установка тега из <result>;
- выполняется запрос к HTTP серверу, где в параметрах вызова указываются уже измененные параметры;
- параметры вызова изменяются согласно указанным параметрам с сервера.
Пример получения DisplayName из внешней БД организаций от 2gis, Yandex и др.
Создаем HTTP-сервера для сервисов 2gis и Yandex:
admin@[mycelium1@ecss1#ECSS 010145]:/$ domain/DEV_DOM/routing/http/declare resolve-2gis http://system.restfs.ecss:9990/api/display-name-resolver/2gis --api-key 23214
HTTP routing server <<"resolve-2gis">> successfully declared.
[exec at: 13.05.2020 13:32:08, exec time: 133ms, nodes: ds1@ecss1]
admin@[mycelium1@ecss1#ECSS 010145]:/$ domain/refactor/routing/http/declare resolve-yandex http://system.restfs.ecss:9990/api/display-name-resolver/yandex --api-key 23312214
HTTP routing server "resolve-yandex" successfully declared.
[exec at: 13.05.2020 13:33:33, exec time: 83ms, nodes: ds1@ecss1]
Далее создаем контекст маршрутизации, который будет обращаться к данным серверам по HTTP:
<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="http_server" digitmap="(*[0-9*][0-9*].#|#[0-9*][0-9*].#|*#[0-9*][0-9*].#|1xx.|10xx.)">
<rule name="2gis">
<actions>
<external_routing service="http_route_service" id="resolve-2gis" args="{"proceed_on_failure":"true"}" timeout="1501"/>
</actions>
<result>
<continue tag="lookup-yandex"/>
</result>
</rule>
<rule name="yandex">
<conditions>
<tag value="lookup-yandex"/>
</conditions>
<actions>
<external_routing service="http_route_service" id="resolve-yandex" args="{"proceed_on_failure":"true"}" timeout="1503"/>
</actions>
<result>
<local/>
</result>
</rule>
</context>
Таким образом при совершении звонка, ECSS-10 произведет обращение к серверам 2gis, Yandex. При получении ответа от сервера, в котором содержится DisplayName, ECSS-10 производит подстановку данной информации в cgpn DisplayName.
Повторная маршрутизация с помощью cause ISUP, ACP, SIP
Описание механизма повторной маршрутизации
Иногда требуется чтобы вызов, который не смог установиться с определенной причиной, был отправлен на другое направление или автоинформатор. Для этого служит механизм маршрутизации по "Cause". Например: происходит вызов с номера А на номер Б. В контексте маршрутизации находится направление на абонента Б, при этом в блоке "действия" определен параметр "Причины для повторной маршрутизации",он означает, что если вызов на абонента Б завершится с одной из перечисленных причин, будет выполнена повторная маршрутизация с А на номер Б с указанием текущей причины завершения вызова. Для того, чтобы воспользоваться указанными причинами, в контексте маршрутизации, в секции "условия" так же можно указать параметр "причины" в разделе "дополнительно". Он проверяет, совпала ли хотя бы одна из указанных причин с переданной в маршрутизацию причиной разъединения вызова. Если да, то такое правило сработает и позволит перенаправить вызов на другое направление.
Повторная маршрутизация
Механизм позволяет использовать режим маршрутизации по "Cause". Когда вызов с абонента А на абонента Б был завершен с определенным кодом (ACP, SIP, ISUP) завершения без фазы разговора/ожидания ответа, то выполняется повторная маршрутизация, в качестве одного из параметров указывается причина разъединения.
В случае одновременного указания нескольких причин разъединения, то правило сработает если хотя бы одна из причин совпадет.
<cause acp="ACPCauses" isup="ISUPCauses" sip="SIPCauses"/>
где
- ACPCauses — список ACP причина разъединения вызова, разделенных запятой;
- ISUPCauses — список ISUP причина разъединения вызова, разделенных запятой;
- SIPCauses — список SIP причина разъединения вызова, разделенных запятой.
Причина разъединения предыдущей попытки вызова в блоке условий
Механизм позволяет использовать режим маршрутизации по "Cause". Когда вызов с абонента А на абонента Б был завершен с определенным кодом (ACP, SIP, ISUP) завершения без фазы разговора/ожидания ответа, то выполняется повторная маршрутизация, в качестве одного из параметров указывается причина разъединения.
Если в системе корректно настроены правила маршрутизации по "Cause", то возможно осуществить перевод таких вызовов на различного вида автоинформаторы (переадресация на автоинформаторы с сообщениями типа "абонент временно недоступен", "линия перегружена", "абонент не существует" и другие).
В случае одновременного указания нескольких причин разъединения, то правило сработает если хотя бы одна из причин совпадет. Как применяются в контексте маршрутизации данные правила смотреть здесь: <conditions>
На текущий момент имеется возможность анализировать не только "Cause" по которому был отбит вызов, но и его инициатора. Доступно 3 causeInitiator: system, network, user.
- System — Причина, связанная с внутренней логикой обработки вызова на ECSS-10;
- Network — Отбой произошел со стороны сети (транковое направление);
- User — Отбой произошел со стороны пользователя.
Пример настройки на ECSS-10:
/domain/refactor/properties/set alternate_route_sip_causes add 404/user
Причины для повторной маршрутизации в блоке действий
Причина(ы) разъединения данного вызова, по которым необходимо выполнять перебор маршрутов.
Механизм позволяет использовать режим маршрутизации по "Cause". Когда вызов с абонента А на абонента Б был завершен с одним из указанных в <cause> причин, будет выполнена повторная маршрутизация вызова, но при этом в маршрутизации будут заданы причины с которыми текущий вызов завершился (маршрутизация по "Cause" работает только для вызовов, завершившихся до наступления фазы разговора/алертинга). Как применяются в контексте маршрутизации данные правила смотреть здесь: <actions>
Важно! Для работы маршрутизации по SIP — cause, необходимо выставить параметры домена: alternate_route_sip_causes. Необходимо учесть, что маршрутизация для SIP не будет работать, если не будет получен cause от транка.
Влияние маршрутизации по "Cause" на другие подсистемы:
- СОРМ — на СОРМе перебор маршрутов выглядит как несколько независимых вызовов;
- СDR — на CDR перебор маршрутов выглядит как несколько независимых вызовов с одинаковым conn_id;
- AAA — на AAA перебор маршрутов выглядит как несколько независимых вызовов, при этом неуспешные вызов посылаются на ААА только в случае включенного свойства unsuccessful_call_info = true (domain/<DOMAIN>/aaa/accounting/set).
Замечание: в настоящий момент максимальное количество попыток перемаршрутизации вызова — 10 (с учетом первой маршрутизации).
RADIUS-маршрутизация телефонных вызовов
Vendor-Specific(26): Cisco(9): Cisco-AVPair(1): xpgk-route-retries=<$ROUTE_RETRIES>
Vendor-Specific(26): Cisco(9): Cisco-AVPair(1): ecss-routing-cause-isup=<$ROUTE_CAUSE_ISUP>
Vendor-Specific(26): Cisco(9): Cisco-AVPair(1): ecss-routing-cause-sip=<$ROUTE_CAUSE_SIP>
Vendor-Specific(26): Cisco(9): Cisco-AVPair(1): ecss-routing-cause-acp=<$ROUTE_CAUSE_ACP>
- <$ROUTE_RETRIES> — номер попытки маршрутизации вызова;
- <$ROUTE_CAUSE_ISUP> — ISUP причина отбития предыдущего вызова;
- <$ROUTE_CAUSE_SIP> — SIP причина отбития предыдущего вызова;
- <$ROUTE_CAUSE_ACP> — ACP причина отбития предыдущего вызова.