| 1 | = Пример конфигурации !FreeSwitch для разговора двух абонентов в конференции = |
| 2 | |
| 3 | Данная статья описывает пример настройки !FreeSwitch (FS) для реализации сценария вызова одним абонентом другого через конференцию. Задача поставлена в ticket:125 и включает следующеие моменты: |
| 4 | |
| 5 | - при вызове создается конференция с именем типа `<caller Name>(<caller Number>) -> <callee Name>(<callee Number>)` (например `Вася(123) -> Петя(456)`), вызывающий и вызываемый абоненты добавляются в конференцию и ведут там разговор; |
| 6 | - пока вызываемый абонент не вошел в конференцию, вызывающий слышит КПВ; |
| 7 | - если вызов заканчивается неудачно (например вызываемый недоступен, вызываемый отказался принять вызов и т.п.), вызывающий должен слышать сигнал "Занято". |
| 8 | |
| 9 | == Конфигурация конференций == |
| 10 | |
| 11 | Создадим профиль конференций для нашей задачи. В файле `/etc/freeswitch/autoload_configs/conference.conf.xml` пишем такой фрагмент: |
| 12 | |
| 13 | {{{#!xml |
| 14 | <configuration name="conference.conf" description="Audio Conference"> |
| 15 | .... |
| 16 | <profiles> |
| 17 | .... |
| 18 | <profile name="2-way-calls"> |
| 19 | <param name="domain" value="$${domain}"/> |
| 20 | <param name="member-flags" value="mintwo"/> |
| 21 | <param name="rate" value="8000"/> |
| 22 | <param name="interval" value="20"/> |
| 23 | <param name="caller-controls" value="none"/> |
| 24 | <param name="energy-level" value="200"/> |
| 25 | <param name="moh-sound" value="tone_stream://%(1000,3000,440)"/> |
| 26 | <param name="cdr-event-mode" value="content"/> |
| 27 | </profile> |
| 28 | .... |
| 29 | </profiles> |
| 30 | .... |
| 31 | </configuration> |
| 32 | }}} |
| 33 | |
| 34 | В приведенном примере профиля есть следующие моменты, важные для решаемой задачи: |
| 35 | |
| 36 | - `<param name="member-flags" value="mintwo"/>` - этот флаг обеспечит отбой второго абонента когда один из собеседников отключится от конференции; |
| 37 | - `<param name="moh-sound" value="tone_stream://%(1000,3000,440)"/>` - пока вызывающий абонент - единственный участник конференции, ему будет воспроизводиться сигнал КПВ. |
| 38 | |
| 39 | == Дайлплан == |
| 40 | |
| 41 | Теперь создадим дайлплан для нашей задачи. Вызывающий абонент будет вызывать номер 456: |
| 42 | |
| 43 | {{{#!xml |
| 44 | <include> |
| 45 | <extension name="call-in-conference"> |
| 46 | <!-- Проверим, что вызывается номер 456 --> |
| 47 | <condition field="destination_number" expression="^456$"> |
| 48 | |
| 49 | <!-- Формируем имя конференции --> |
| 50 | <action application="set" data="conference_name=${caller_id_name}(${caller_id_number}) -> ${callee_id_name}(${destination_number})" /> |
| 51 | |
| 52 | <!-- Установим параметры функции conference_auto_outcall --> |
| 53 | <action application="set" data="conference_auto_outcall_timeout=60"/> |
| 54 | <action application="set" data="conference_auto_outcall_flags=none"/> |
| 55 | <action application="set" data="conference_auto_outcall_skip_member_beep=true"/> |
| 56 | <!-- Имя и номер вызывающего абонента --> |
| 57 | <action application="set" data="conference_auto_outcall_caller_id_name=${caller_id_name}"/> |
| 58 | <action application="set" data="conference_auto_outcall_caller_id_number=${caller_id_number}"/> |
| 59 | <action application="conference_set_auto_outcall" data="user/${destination_number}"/> |
| 60 | |
| 61 | <!-- Включаем вызывающего абонента в конференцию --> |
| 62 | <action application="conference" data="${conference_name}@2-way-calls"/> |
| 63 | |
| 64 | </condition> |
| 65 | </extension> |
| 66 | </include> |
| 67 | }}} |
| 68 | |
| 69 | В приведенном примере при вызове номера 456 создается конференция с именем типа `Вася(123) -> Петя(456)` и с профилем `2-way-calls`, сконфигурированным ранее, в нее включается вызывающий абонент, и выполняется вызов в конференцию вызываемого абонента 456. |
| 70 | |
| 71 | В приведенном выше примере не выполняется последнее требование - в случае неудачного вызова вызывающий должен слышать сигнал "Занято". Сейчас же в случае если вызываемый абонент отклонит вызов, вызывающий будет продолжать слушать сигнал КПВ. Для выполнения последнего требования создадим в дайлплане специальное расширение `busy`, которое передает сигнал "Занято": |
| 72 | |
| 73 | {{{#!xml |
| 74 | <extension name="Play BUSY tone"> |
| 75 | <condition field="destination_number" expression="^busy$"> |
| 76 | <action application="answer"/> |
| 77 | <action application="playback" data="tone_stream://%(330,330,440);loops=-1"/> |
| 78 | </condition> |
| 79 | </extension> |
| 80 | }}} |
| 81 | |
| 82 | И дополним вызов в конференцию так, чтобы при неудаче вызова исходного абонента вызывалось расширение busy: |
| 83 | |
| 84 | `<action application="conference_set_auto_outcall" data="user/${destination_number}|loopback/busy"/>` |
| 85 | |
| 86 | Пример дайлплана, передающего в конференцию "Занято" в случае неудачного вызова: |
| 87 | |
| 88 | {{{#!xml |
| 89 | <include> |
| 90 | <extension name="Play BUSY tone"> |
| 91 | <condition field="destination_number" expression="^busy$"> |
| 92 | <action application="answer"/> |
| 93 | <action application="playback" data="tone_stream://%(330,330,440);loops=-1"/> |
| 94 | </condition> |
| 95 | </extension> |
| 96 | |
| 97 | <extension name="call-in-conference"> |
| 98 | <!-- Проверим, что вызывается номер 456 --> |
| 99 | <condition field="destination_number" expression="^456$"> |
| 100 | |
| 101 | <!-- Формируем имя конференции --> |
| 102 | <action application="set" data="conference_name=${caller_id_name}(${caller_id_number}) -> ${callee_id_name}(${destination_number})" /> |
| 103 | |
| 104 | <!-- Установим параметры функции conference_auto_outcall --> |
| 105 | <action application="set" data="conference_auto_outcall_timeout=60"/> |
| 106 | <action application="set" data="conference_auto_outcall_flags=none"/> |
| 107 | <action application="set" data="conference_auto_outcall_skip_member_beep=true"/> |
| 108 | <!-- Имя и номер вызывающего абонента --> |
| 109 | <action application="set" data="conference_auto_outcall_caller_id_name=${caller_id_name}"/> |
| 110 | <action application="set" data="conference_auto_outcall_caller_id_number=${caller_id_number}"/> |
| 111 | <action application="conference_set_auto_outcall" data="user/${destination_number}|loopback/busy"/> |
| 112 | |
| 113 | <!-- Включаем вызывающего абонента в конференцию --> |
| 114 | <action application="conference" data="${conference_name}@2-way-calls"/> |
| 115 | |
| 116 | </condition> |
| 117 | </extension> |
| 118 | </include> |
| 119 | }}} |