В разделе описаны методы привязки транковых каналов к виртуальным абонентам. Опишем ситуацию, в рамках которой данный функционал реализован.


Существует SIP - транк, за которым находятся несколько FXO портов для выхода в городскую ТфОП. Некоторые абоненты должны иметь возможность выхода в городскую сеть через любой свободный порт, остальные абоненты должна выходить строго через конкретно заданные (один или несколько) порты. В обратном порядке, когда вызов получен со стороны городской сети с конкретного FXO порта, SSW должен иметь возможность обрабатывать данный вызов с использованием различных стратегий. Более того, необходимо посредством BLF наблюдать состояние FXO, какие порты в транке сейчас заняты.
Поэтому, было решено к транкам, для которых явно заданы каналы, добавить возможность сопоставлять внутренние виртуальные номера домена и каждый из каналов в транке. Тогда вызовы будут обрабатываться следующим образом:

  1. Если вызов приходит из конкретного канала в транке, к которому привязан номер виртуального абонента, то номер вызывающего абонента для этого вызова меняется на заданный номер виртуального абонента (на виртуальном абоненте можно активировать различные ДВО, таким образом вызов из транка будет обрабатываться этими ДВО в том числе BLF);
  2. Звонок на номер виртуального абонента со стороны локального абонента приведет к звонку через определенный канал транка (тот канал, за которым закреплен номер данного виртуального абонента);

Пошаговая настройка привязки канала транка к номеру

  1. Создаем виртуально абонента с номером NUMBER, контекстом маршрутизации ROUTING_CONTEXT

    domain/<DOMAIN>/alias/virtual/declare <NUMBER> <ROUTING_CONTEXT> <GROUP>

    <DOMAIN> - имя виртуальной АТС (домен);
    <NUMBER> - номер абонента;
    <ROUTING_CONTEXT> - план маршрутизации, используемый абонентом;
    <GROUP> - группа, к которой будет причислен абонент.

  2. На данного виртуального абонента активируем один из сервисов распределения вызова (CGG, CHunt и т.п.). При этом нужно помнить, что когда групповые сервисы активны, также используется несколько абонентских линий и нужно активировать соответствующий сервис ml (мультилайн)

    domain/<DOMAIN>/ss/enable <NUMBER> cgg

    <DOMAIN> - название виртуальной АТС (домена), для которой выполняются настройки;
    <NUMBER> - номер виртуального абонента, для которого выполняются настройки.

    Активируем на виртуальном абонента услугу распределения вызова

    domain/<DOMAIN>/ss/activate <NUMBER> cgg numbers = <NUM1>, <NUM2>, ...

    <DOMAIN> - название виртуальной АТС (домена), для которой выполняются настройки;

    <NUMBER> - номер виртуального абонента, для которого выполняются настройки;
    <NUM1>, <NUM2> - номера на FXO порте, привязываемые к виртуальному номеру.

  3. Создаем SIP транк

    domain/<DOMAIN>/trunk/sip/declare <ROUTINGCONTEXT> <GROUP> <TRUNKNAME> <IPSET> static <DSTADDR> <DSTPORT> <MODE> <SRCPORT>

    <DOMAIN> - имя виртуальной АТС (домен);
    <ROUTING_CONTEXT> -план маршрутизации, используемый транком;
    <GROUP> - группа, к которой будет причислен транк;
    <TRUNK_NAME> - имя создаваемого транка;
    <IP_SET> - набор IP-адресов;
    <DST_ADDR> - адрес назначения для создаваемого транка;
    <DST_PORT> - порт назначения, для создаваемого транка;
    <MODE> - режим инкапсуляции ISUP:

    • sip-proxy - направление работает только по протоколу SIP (RFC 3261);
    • sip-t - направление работает по SIP с инкапсуляцией ISUP по протоколу SIP-T (RFC 3372);
    • sip-i - направление работает по SIP с инкапсуляцией ISUP по протоколу SIP-I (Q.1912-5).

    <SRC_PORT> - порт приема, для создаваемого транка.

  4. Указываем клиента, в чью сторону направлен транк:

    domain/<DOMAIN>/trunk/sip/set <TRUNK_GROUP> <TRUNK> remote-client <CLIENT>

    <DOMAIN> - имя виртуальной АТС (домен);
    <TRUNK_GROUP> - группа, к которой причислен транк;

    <TRUNK> - имя транка, для которого происходит настройка;
    <CLIENT> - название организации, с которой связан созданный транк.
  5. В созданный транк добавляем Coral контакты, закрепленные за ними номера виртуальных абонентов и номера каналов

    domain/<DOMAIN>/trunk/sip/set <TRUNK_GROUP> <TRUNK> channel-contact-map add <CHANNEL_RANGE> <NUMBER_RANGE> <CONTACT_RANGE>

    <DOMAIN> - имя виртуальной АТС (домен);
    <TRUNK_GROUP> - группа, в которую входит транк;
    <TRUNK> - имя транка, для которого происходит настройка;
    <CHANNEL_NUMBER> - номер выделенного в транке канала. формат: порядковый номер канала, или диапазон в {} через "-", или перечисление  или ",";
    <NUMBER> -номер виртуального абонента, закрепляемый за каналом в транке;
    <CONTACT_RANGE> - Специальный идентификатор порта для Coral шлюза.

  6. Активируем на транке ДВО fxo_trunk

    domain/<DOMAIN>/trunk/services/activate <TRUNK_GROUP> <TRUNK> fxo_trunk
    <DOMAIN> - имя виртуальной АТС (домен);
    <TRUNK_GROUP> - группа, в которую входит транк;
    <TRUNK> - имя транка, для которого происходит настройка;
  7. Правила маршрутизации, которые позволяют выйти на FXO порт
    Рассмотрим пример, в котором виртуальные абоненты будут иметь маску номера 99x. Городские номера иметь маску xxxxxxx Тогда выход на FXO порт закрепленный за данным номером будет выглядеть так:

    <rule name="to_fxo_port_with_empty_b_number">
          <conditions>
            <cdpn digits="99?"/>
          </conditions>
          <actions>
            <cdpn digits=""/>
          </actions>
          <result>
            <local vdn="{1,2,3}"/>
          </result>
        </rule>
        <rule name="to_fxo_port_with_complete_b_number">
          <conditions>
            <cdpn digits="99?%"/>
            <final value="true"/>
          </conditions>
          <actions>
            <cdpn digits="{%}"/>
          </actions>
          <result>
            <local vdn="{1,2,3}"/>
          </result>
        </rule>
        <rule name="to_fxo_trunk">
          <conditions>
            <cdpn digits="???????"/>
            <final value="true"/>
          </conditions>
          <result>
            <external>
              <trunk value="FXO_TRUNK"/>
            </external>
          </result>
        </rule>
    CODE

Таким образом, если абонент наберет номер виртуального абонента, то он совершит вызов на FXO порт без номера вызываемого абонента за портом FXO, и встречная станция будет коллектить номер. Если же абонента наберет номер виртуального абонента и вместе с ним номер, на которых он хочет позвонить - то вызов уйдет на определенный FXO порт с уже заполненным номером вызываемого абонента. Если же абонент не хочет выбирать определенный FXO порт, а хочет выйти через любой свободный порт - ему достаточно просто набрать 7-мизначный городской номер. В этом случае вызов по маршрутизации уйдет на FXO_TRUNK, там выберется свободный канал (FXO порт), и уже через него отправится вызов.

Пример команд:

domain/test.domain/alias/virtual/declare 99900{1-2} default_routing fxo.users
domain/test.domain/ss/enable 99900{1-2} cgg
domain/test.domain/ss/activate 99900{1-2} cgg numbers = [364000, 364001]
domain/test.domain/trunk/sip/declare default_routing cspg.trunks FXO_1 ipset1 static 192.168.23.173 5060 sip-proxy 5060
domain/test.domain/trunk/sip/set cspg.trunks FXO_1 remote-client coral
domain/test.domain/trunk/sip/set cspg.trunks FXO_1 channel-contact-map add {1-2} 99900{1-2} u00s15p{0-1}
domain/<DOMAIN>/trunk/services/activate cspg.trunks FXO_1 fxo_trunk 
CODE

BLF подписки

За счет того, что описанный выше механизм позволяет выполнять привязку внутренних номеров к каналам транка, появляется возможность выполнить BLF подписку на данный номер (внутренний номер), после чего при звонке через определенный канал транка будут идти BLF оповещения по связанному с ним номеру.