Интеграции

Как подключить FreeSWITCH к AutoCall.kz

← Все статьи

FreeSWITCH подключается к платформе обзвона одним SIP-профилем. После этого обзвоны идут через вашу станцию: с ваших номеров, через вашего оператора и по вашему тарифу на связь, а платформа отвечает за сценарии, распознавание речи, ИИ-агента и отчёты.

Как устроен звонок

Вызов начинаем мы. Платформа отправляет вашему FreeSWITCH INVITE, где вызываемый номер — это номер абонента. Ваш диалплан должен отправить этот вызов наружу через gateway вашего оператора. Если сценарий переводит абонента на оператора, тем же транком приходит вызов на внутренний номер.

Регистрация не нужна: станцию мы опознаём по её статическому публичному IP, а вы нас — по ACL.

Параметры подключения

Адрес сигнализации 185.35.223.2
Порт на нашей стороне 5060 — UDP, 5061 — TLS
Голос (RTP) подсеть 109.233.108.208/28, порты 10000–20000
Кодек PCMA (alaw)
Формат номера +7XXXXXXXXXX

Шаг 1. Фаервол

Сигнализация приходит с одного адреса, голос — из подсети. Ниже порт профиля 5070, который мы заведём на следующем шаге; если оставите профиль на стандартном порту, поправьте правило.

# сигнализация на профиль autocall
udp dport 5070 ip saddr 185.35.223.2 accept
# голос
udp dport 10000-20000 ip saddr 109.233.108.208/28 accept

Шаг 2. ACL

conf/autoload_configs/acl.conf.xml — список, по которому профиль пустит наши вызовы без авторизации:

<list name="autocall" default="deny">
  <node type="allow" cidr="185.35.223.2/32"/>
</list>

Применить: fs_cli -x "reloadacl". Проверить, что список виден: fs_cli -x "acl autocall list".

Шаг 3. Отдельный SIP-профиль

conf/sip_profiles/autocall.xml. Отдельный профиль, а не правка external, — чтобы не менять поведение пиров, которые у вас уже работают.

<profile name="autocall">
  <settings>
    <param name="sip-ip"      value="$${local_ip_v4}"/>
    <param name="rtp-ip"      value="$${local_ip_v4}"/>
    <!-- если станция за NAT, укажите свой белый адрес -->
    <param name="ext-sip-ip"  value="ВАШ_БЕЛЫЙ_IP"/>
    <param name="ext-rtp-ip"  value="ВАШ_БЕЛЫЙ_IP"/>
    <param name="sip-port"    value="5070"/>
    <param name="context"     value="from-autocall"/>
    <param name="dialplan"    value="XML"/>
    <!-- вызовы приходят с доверенного адреса, пароль не спрашиваем -->
    <param name="auth-calls"  value="false"/>
    <param name="apply-inbound-acl" value="autocall"/>
    <param name="inbound-codec-prefs"  value="PCMA"/>
    <param name="outbound-codec-prefs" value="PCMA"/>
    <param name="inbound-codec-negotiation" value="generous"/>
    <param name="rtp-timeout-sec" value="300"/>
  </settings>
</profile>

Поднять профиль: fs_cli -x "sofia profile autocall start", проверить — fs_cli -x "sofia status". Порт 5070 нужно будет указать в кабинете при подключении АТС.

Можно обойтись и профилем external: тогда добавьте к нему apply-inbound-acl, а в диалплане контекста public отберите наши вызовы условием по ${network_addr}. Отдельный профиль просто меньше пересекается с тем, что у вас уже работает.

Шаг 4. Диалплан

conf/dialplan/from-autocall.xml — две записи: внутренние номера и всё остальное наружу.

<include>
  <context name="from-autocall">

    <!-- перевод на внутренний номер из сценария -->
    <extension name="autocall_internal">
      <condition field="destination_number" expression="^(\d{3,4})$">
        <action application="bridge" data="user/$1@$${domain}"/>
      </condition>
    </extension>

    <!-- обзвон: номер абонента уходит через вашего оператора -->
    <extension name="autocall_outbound">
      <condition field="destination_number" expression="^\+?(7\d{10})$">
        <!-- ваш номер вместо служебной метки платформы -->
        <action application="set" data="effective_caller_id_number=7XXXXXXXXXX"/>
        <action application="set" data="effective_caller_id_name=7XXXXXXXXXX"/>
        <action application="bridge" data="sofia/gateway/ваш-оператор/$1"/>
      </condition>
    </extension>

  </context>
</include>

Применить: fs_cli -x "reloadxml". Шаблон ^(\d{3,4})$ подгоните под длину своих внутренних номеров, а формат набора у оператора уточните в договоре: кому-то нужен номер с +, кому-то без, кому-то с восьмёркой.

Подмена CallerID обязательна. В нашем INVITE в поле «от кого» стоит служебная метка вида AutoCall_kz_номер звонка — по ней удобно сверять CDR с нашей выгрузкой, но телефонным номером она не является. Без effective_caller_id_number оператор отклонит вызов.

Шифрование: TLS и SRTP

В профиль добавляются параметры TLS, а шифрование голоса включается в диалплане переменной:

<!-- в settings профиля -->
<param name="tls"          value="true"/>
<param name="tls-only"     value="true"/>
<param name="tls-sip-port" value="5061"/>
<param name="tls-version"  value="tlsv1.2"/>

<!-- в extension, до bridge -->
<action application="set" data="rtp_secure_media=true"/>

В кабинете при этом выберите транспорт TLS и, если нужен SRTP, соответствующий режим шифрования голоса.

SRTP работает только вместе с TLS. Ключ шифрования передаётся прямо в SIP-сообщении: по незашифрованной сигнализации он уедет открытым текстом рядом с «зашифрованным» потоком. При этом TLS без SRTP — нормальный вариант, много оборудования именно так и работает.

Шаг 5. Добавить АТС в кабинете

Раздел «Мои АТС» → «Подключить АТС»: IP станции, порт профиля (в нашем примере 5070), транспорт, при необходимости логин с паролем, а также предел одновременных каналов и скорость набора. Ставьте их не выше того, что разрешает ваш оператор, — мы не превысим.

После сохранения в списке появится состояние станции: «Отвечает» означает, что FreeSWITCH отвечает на наши проверки связи. Дальше при создании обзвона выбираете свою АТС — и смета сразу считается по льготной цене секунды.

Если звонки не идут

  • Тишина в ответ на наши проверки. Профиль не поднялся или слушает не тот адрес: sofia status покажет состояние и порт.
  • 403 Forbidden на INVITE. Не сработал ACL. Проверьте acl autocall list и что в профиле стоит apply-inbound-acl.
  • Вызов приходит и сразу завершается. Не нашлось подходящей записи в диалплане: sofia global siptrace on и console loglevel debug покажут, в каком контексте искали.
  • Оператор отбивает вызовы. Не подменён CallerID.
  • Соединяется, но тишина. Не открыта голосовая подсеть или не выставлены ext-rtp-ip и ext-sip-ip при работе за NAT.

Сколько это стоит

При звонках через свою АТС минуты связи вы платите своему оператору, а с нашей стороны остаётся только работа платформы — поэтому секунда стоит в несколько раз дешевле обычной. Повторные попытки дозвона через свою станцию бесплатны: связь ваша, платить за настойчивость нашей связи не за что.

Зачем отдельный профиль, а не external?

Чтобы не менять поведение пиров, которые у вас уже работают. Отдельный профиль слушает свой порт, имеет свой контекст и свой ACL. Вариант с external тоже рабочий — тогда отбирайте наши вызовы в диалплане по ${network_addr}.

Нужна ли регистрация или авторизация?

Нет, вызовы принимаются по ACL с auth-calls=false. Если хотите, чтобы платформа авторизовывалась, включите авторизацию у себя и укажите логин с паролем в кабинете.

Почему вызов приходит, но сразу завершается?

Вызов попал в контекст, где нет подходящей записи. Проверьте параметр context в профиле и правила для номеров вида +7XXXXXXXXXX.

Какой кодек использовать?

PCMA (alaw). Других мы не предлагаем, поэтому достаточно указать его во входящих и исходящих предпочтениях профиля — не будет лишнего перекодирования.

Поддерживается ли TLS и SRTP?

Да: TLS в профиле, SRTP — переменной rtp_secure_media. SRTP только поверх TLS, иначе ключ шифрования уезжает открытым текстом.

Если что-то не сходится — напишите в поддержку и приложите вывод sofia global siptrace on за время тестового звонка. По нему видно, дошёл ли INVITE, что ответил ваш FreeSWITCH и на каком шаге всё закончилось.

Звоните со своих номеров через свою АТС

Подробности и цены — на странице «Подключение своей АТС».

Попробовать бесплатно →