(!) Пример использования xml для настройки правил дозвона абонентов в IP PBX X8004

XML (англ. eXtensible Markup Language, расширяемый язык разметки) –  язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком. Язык называется расширяемым, поскольку он не фиксирует разметку, используемую в документах: пользователь может создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка.
Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также базирование на кодировках Юникод для представления содержания документов позволяет широко использовать данный язык в самых разнообразных приложениях.

В данном примере с помощью xml опишем правила коммутации в IP PBX X8004. Данные правила описывают возможность внутренних абонентов звонить на разные телефонные номера (внутренние, городские, сотовые и пр.), а также определяют, через какие из доступных внешних линий (направлений) будет совершен звонок.
Здесь стоит задача создать универсальный алгоритм, который позволит определять, разрешено ли абоненту звонить на те или иные номера, и если да – через какие внешние линии. В принципе, эту задачу можно решить и путем изменения сценария дозвона под каждого абонента. Но в этом случае сценарии вырастут до огромных размеров, и управлять таким сценарием будет затруднительно.
С помощью xml-файла данную задачу можно решить достаточно просто. Пример xml-файла, используемого для данной задачи:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Caller_Ab ID=101>
        <Napr ID=10>=</Napr>
        <Napr ID=20>Город 1</Napr>
        <Napr ID=30>=</Napr>
        <Napr ID=40>=</Napr>
    </Caller_Ab>
    <Caller_Ab ID=102>
        <Napr ID=10>+</Napr>
        <Napr ID=20>Город 1</Napr>
        <Napr ID=30>Город 1</Napr>
        <Napr ID=40>Город 2</Napr>
        <Called_Ab ID=121></Called_Ab>
        <Called_Ab ID=122></Called_Ab>
    </Caller_Ab>
    <Caller_Ab ID=120>
        <Napr ID=10>-</Napr>
        <Napr ID=20>Город 1</Napr>
        <Napr ID=30>Город 2</Napr>
        <Napr ID=40>SipNet</Napr>
        <Called_Ab ID=102></Called_Ab>
    </Caller_Ab>
</Root>

Корневой тег Caller_Ab определяет номер звонящего абонента, для которого будут применяться правила коммутации.
Для каждого абонента есть несколько дочерних тегов:
Тег Napr определяет направление совершения звонка и исходящий канал, через который этот звонок будет совершен.
В данном случае используется несколько типов телефонных номеров и их кодов:
10 – внутренние абоненты (3 знака в номере);
20 – город (7 знаков);
30 – сотовые (11 знаков, начинаются с 89);
40 – межгород (11 знаков, кроме начинающихся на 89).
Для анализа набранного номера удобно использовать стандартные строковые функции: Len (возвращает длину строки), SubStr (возвращает подстроку из строки) и IndexOf (возвращает позицию подстроки в строке).
Подробнее о встроенных функциях и правилах их использования можно прочитать на стр. 266 в руководстве пользователя: http://download.from.zyxel.ru/f7e85f4b-8559-4de9-ab26-901ada3a58ee/X8004_UserGuide_3.0.2.1.pdf.
Значение тега Napr – это код направления, через который будет совершен звонок. Коды направлений определяются в настройках X8004 в разделе Администрирование > Линии на вкладке Направления в колонке Код. Направления и линии, входящие в них, создаются произвольно.


Так, например, строка <Napr ID=20>Город 1</Napr> в xml-файле означает, что для звонков на городские телефоны (код номера 20) будет использовано направление с кодом Город 1.
Тег Called_Ab определяет, на какие внутренние номера может (или не может) звонить абонент Caller_Ab. Этот тег будет проверяться только в том случае, если значение тега Napr для внутреннего звонка (ID=10) будет равно «+» (белый список) или «–» (черный список). Если стоит «=», то тег Called_Ab проверяться не будет и внутреннее направление для абонента Caller_Ab будет закрыто.
При использовании белого списка, можно будет дозвониться только до тех внутренних номеров, которые перечислены в тегах Called_Ab.
При использовании черного списка доступ ко всем номерам, перечисленным в теге Called_Ab, будет закрыт.
В данном примере с номера 101 можно позвонить только на городской номер (код 20) через направление Город 1.
С номера 102 можно звонить на внутренние 121 и 122, а также на городские и сотовые номера через направление Город 1 и на междугородные номера через направление Город 2.
С номера 120 можно звонить на все внутренние кроме 102, а также на городские номера через направление Город 1, на сотовые номера через направление Город 2 и на междугородные номера через направление SipNet.

Файл xml сохраняется на X8004 на диске D в папке UserData. Поскольку файл хранится в текстовом формате, его удобно изменять, дополнять. При этом после внесения изменений и сохранения файла не требуется выполнять какие-либо дополнительные действия в сценарии X8004.
Совершение исходящего вызова реализовано в отдельном IVR-сценарии, в котором используются переменные:
Caller_Ab – номер звонящего абонента;
Called_Ab – набранный номер;
Napravl – код направления, через которое будет совершен звонок.
Сценарий, реализующий описанную логику работы, выглядит так:

Для начала необходимо считать внешний xml-файл, сохраненный в папке D:\UserData. Для этого используется компонент сценария Файловая операция.


Из полученного в переменной External_XML содержимого файла нужно извлечь полезную информацию. Для этого используется компонент сценария Парсер (XML, HTML, текст):


В качестве поискового запроса к xml-файлу используется строка вида {номер звонящего абонента}>{Набранный номер}#{Код звонка}. Например, при совершении звонка с номера 101 на номер 123-45-67 запрос будет выглядеть так: 101>1234567#20.
Результатом работы парсера будет значение Город 1 в переменной Napravl.
В дальнейшем эту переменную можно проверить с помощью компонента Меню сравнения (объект Меню 1). Кроме собственно направления, для совершения звонка в переменной Napravl может оказаться значение +, –. = или она может быть пустой.
В случае ошибки работы объектов Считать внешнюю базу или Выборка данных объект Меню 2 проверяет длину набранного номера, и если он относится к категории внутренних номеров (3 знака), то управление передается на сценарий дозвона по внутренним номерам. В противном случае управление передается на объект Переключение на внешнюю линию. Предварительно в переменную Napravl заносится код направления по умолчанию.
Чтобы указать направление совершения исходящего звонка в объекте Переключение на внешнюю линию необходимо в свойстве Направления перейти на вкладку Аргумент и выбрать переменную Napravl.


Таким образом, в случае обнаружения в xml-файле нужной информации о совершении вызова, дозвон будет совершаться в соответствии с установленным правилом. Если в ходе получения информации произошла ошибка или в файле нет информации об ограничениях для звонящего, дозвон будет выполнен с параметрами по умолчанию.
Дозвон по внутренним номерам может быть ограничен с помощью белого или черного списков. Определить принадлежность номера к одному из списков можно с помощью соответствующего парсера. Например, если после Выборки данных в переменной Napravl оказалось значение +, это означает, что звонящий абонент может позвонить только на номера, которые перечислены в xml-файле (это белый список). Для поиска этих абонентов используется объект Белый список:


Например, если абонент 102 пытается позвонить на номер 121, то после работы объекта Выборка данных в переменной Napravl будет значение + (это значит, абоненту 102 можно звонить только на номера, перечисленные в списке). А после работы объекта Белый список переменная Napravl будет содержать пустое значение, но поиск в xml-файле увенчается успехом. Поэтому сценарий перейдет к объекту Внутренний звонок, и абонент 102 соединится с абонентом 121.
Черный список работает аналогичным образом, но переход к объекту Внутренний звонок происходит в случае неудачного поиска номера дозвона в xml-файле.

KB-3532

Была ли эта статья полезной?
Пользователи, считающие этот материал полезным: 0 из 0