wiki:CoferenceOutcallExample

Version 1 (modified by alx, 7 years ago) ( diff )

--

Пример конфигурации FreeSwitch для разговора двух абонентов в конференции

Данная статья описывает пример настройки FreeSwitch (FS) для реализации сценария вызова одним абонентом другого через конференцию. Задача поставлена в ticket:125 и включает следующеие моменты:

  • при вызове создается конференция с именем типа <caller Name>(<caller Number>) -> <callee Name>(<callee Number>) (например Вася(123) -> Петя(456)), вызывающий и вызываемый абоненты добавляются в конференцию и ведут там разговор;
  • пока вызываемый абонент не вошел в конференцию, вызывающий слышит КПВ;
  • если вызов заканчивается неудачно (например вызываемый недоступен, вызываемый отказался принять вызов и т.п.), вызывающий должен слышать сигнал "Занято".

Конфигурация конференций

Создадим профиль конференций для нашей задачи. В файле /etc/freeswitch/autoload_configs/conference.conf.xml пишем такой фрагмент:

<configuration name="conference.conf" description="Audio Conference">
  ....
  <profiles>
    ....
    <profile name="2-way-calls">
      <param name="domain" value="$${domain}"/>
      <param name="member-flags" value="mintwo"/>
      <param name="rate" value="8000"/>
      <param name="interval" value="20"/>
      <param name="caller-controls" value="none"/>
      <param name="energy-level" value="200"/>
      <param name="moh-sound" value="tone_stream://%(1000,3000,440)"/>
      <param name="cdr-event-mode" value="content"/>
    </profile>
    ....
  </profiles>
  ....
</configuration>

В приведенном примере профиля есть следующие моменты, важные для решаемой задачи:

  • <param name="member-flags" value="mintwo"/> - этот флаг обеспечит отбой второго абонента когда один из собеседников отключится от конференции;
  • <param name="moh-sound" value="tone_stream://%(1000,3000,440)"/> - пока вызывающий абонент - единственный участник конференции, ему будет воспроизводиться сигнал КПВ.

Дайлплан

Теперь создадим дайлплан для нашей задачи. Вызывающий абонент будет вызывать номер 456:

<include>
  <extension name="call-in-conference">
    <!-- Проверим, что вызывается номер 456 -->
    <condition field="destination_number" expression="^456$">

      <!-- Формируем имя конференции -->
      <action application="set" data="conference_name=${caller_id_name}(${caller_id_number}) -> ${callee_id_name}(${destination_number})" />

      <!-- Установим параметры функции conference_auto_outcall -->
      <action application="set" data="conference_auto_outcall_timeout=60"/>
      <action application="set" data="conference_auto_outcall_flags=none"/>
      <action application="set" data="conference_auto_outcall_skip_member_beep=true"/>
      <!-- Имя и номер вызывающего абонента -->
      <action application="set" data="conference_auto_outcall_caller_id_name=${caller_id_name}"/>
      <action application="set" data="conference_auto_outcall_caller_id_number=${caller_id_number}"/>
      <action application="conference_set_auto_outcall" data="user/${destination_number}"/>

      <!-- Включаем вызывающего абонента в конференцию -->
      <action application="conference" data="${conference_name}@2-way-calls"/>

    </condition>
  </extension>
</include>

В приведенном примере при вызове номера 456 создается конференция с именем типа Вася(123) -> Петя(456) и с профилем 2-way-calls, сконфигурированным ранее, в нее включается вызывающий абонент, и выполняется вызов в конференцию вызываемого абонента 456.

В приведенном выше примере не выполняется последнее требование - в случае неудачного вызова вызывающий должен слышать сигнал "Занято". Сейчас же в случае если вызываемый абонент отклонит вызов, вызывающий будет продолжать слушать сигнал КПВ. Для выполнения последнего требования создадим в дайлплане специальное расширение busy, которое передает сигнал "Занято":

  <extension name="Play BUSY tone">
    <condition field="destination_number" expression="^busy$">
      <action application="answer"/>
      <action application="playback" data="tone_stream://%(330,330,440);loops=-1"/>
    </condition>
  </extension>

И дополним вызов в конференцию так, чтобы при неудаче вызова исходного абонента вызывалось расширение busy:

<action application="conference_set_auto_outcall" data="user/${destination_number}|loopback/busy"/>

Пример дайлплана, передающего в конференцию "Занято" в случае неудачного вызова:

<include>
  <extension name="Play BUSY tone">
    <condition field="destination_number" expression="^busy$">
      <action application="answer"/>
      <action application="playback" data="tone_stream://%(330,330,440);loops=-1"/>
    </condition>
  </extension>

  <extension name="call-in-conference">
    <!-- Проверим, что вызывается номер 456 -->
    <condition field="destination_number" expression="^456$">

      <!-- Формируем имя конференции -->
      <action application="set" data="conference_name=${caller_id_name}(${caller_id_number}) -> ${callee_id_name}(${destination_number})" />

      <!-- Установим параметры функции conference_auto_outcall -->
      <action application="set" data="conference_auto_outcall_timeout=60"/>
      <action application="set" data="conference_auto_outcall_flags=none"/>
      <action application="set" data="conference_auto_outcall_skip_member_beep=true"/>
      <!-- Имя и номер вызывающего абонента -->
      <action application="set" data="conference_auto_outcall_caller_id_name=${caller_id_name}"/>
      <action application="set" data="conference_auto_outcall_caller_id_number=${caller_id_number}"/>
      <action application="conference_set_auto_outcall" data="user/${destination_number}|loopback/busy"/>

      <!-- Включаем вызывающего абонента в конференцию -->
      <action application="conference" data="${conference_name}@2-way-calls"/>

    </condition>
  </extension>
</include>
Note: See TracWiki for help on using the wiki.