| | 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 | }}} |