Пример конфигурации 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>