Глава 8

Парковка, пейджинг и конференц-связь

Я не верю в ангелов, нет. Но у меня есть

парковочный ангел. Он на моей приборной панели, и ты

его заводишь. Крылья машут, что должно дать вам

парковочное место. Это работает до сих пор.

-Billy Connolly В

В этой главе будут рассмотрены два важных аспекта системы УАТС: парковочные вызовы, которые могут быть приняты из местоположения, отличного от того, куда они изначально поступили, и пейджинг, который позволяет объявить для кого вызов и как его можно получить.

В Asterisk эти две функциональности являются эксклюзивными друг для друга и могут использоваться независимо друг от друга. Некоторые предприятия, которые имеют большие склады или сотрудников, которые много перемещаются по офису и необязательно сидят за столом весь день, используют функции пейджинга и парковки своих систем для прямого вызова по всему офису. В этой главе мы покажем вам, как использовать парковку и пейджинг в традиционной настройке, а также несколько более современных решений этих часто используемых функций.

features.conf

Asterisk также предоставляет несколько функций, общих для большинства современных АТС, многие из которых имеют необязательные параметры. В файле features.conf вы можете настроить или определить различные параметры функций в Asterisk.

Базовые особенности DTMF

Многие из параметров features.conf применяются только при запуске вызовов, которые были запущены в диалплане приложениями Dial() или Queue() с одним или несколькими из вариантов K, k, H, h, T, t, W, w, X или x. Доступные таким образом функции основаны на DTMF (это означает, что они не могут быть доступны через обмен SIP-сообщениями, а только через тональные сигналы в звуковом канале, вызванные пользователями, набирающими требуемые цифры на их панели набора).1

Передачу по SIP-каналам (например, с SIP-телефона) можно обрабатывать с использованием возможностей самого телефона что никоим образом не будет затронуто в файле features.conf.

Раздел [general]

В разделе [general] файла features.conf вы можете определить параметры, которые точно настраивают поведение парковки и переносят функции в Asterisk. Эти параметры перечислены в Таблице 11-1.

Таблица 11-1. features.conf раздел [general]

Опция Значение/ Пример Примечание
parkext 700 Устанавливает внутренний номер по умолчанию, используемый для парковки вызовов.
parkpos 701-720 Устанавливает диапазон внутренних номеров, используемых в качестве парковки. Припаркованные вызовы могут быть получены путем набора номеров в этом диапазоне.
context parkedcalls Устанавливает контекст по умолчанию, в котором создаются номера для парковки и номера парковочных мест.
parkinghints no Включает/отключает автоматическое создание хинтов диалплана для номеров парковки чтобы телефоны могли подписаться на состояние номеров парковки и парковочных мест. По умолчанию – no.
parkingtime 45 Указывает количество секунд, в течение которых вызов будет ждать на парковке до истечения времени ожидания.
comebacktoorigin yes Настраивает обработку таймаутов припаркованных вызовов. Для получения дополнительной информации о поведении этого параметра см. врезку под названием «Обработка таймаутов припаркованных вызовов с опцией comebacktoorigin».
courtesytone beep Указывает звуковой файл, который будет воспроизводиться у припаркованного абонента, когда вызов будет забран с парковки.
parkedplay caller Указывает, на какой стороне вызова будет воспроизводиться courtesytone, когда припаркованный вызов будет забран. Допустимые параметры включают callee, caller, both или no. По умолчанию – no.
parkedcalltransfers caller Контролирует, какая сторона вызова имеет возможность выполнить передачу DTMF в вызове, который возникает при наборе припаркованного вызова. Допустимые параметры включают callee, caller, both или no. По умолчанию – no.
parkedcallreparking caller Контролирует, какая сторона вызова имеет возможность выполнить парковку, основанную на DTMF в вызове, который возникает при наборе припаркованного вызова.a Допустимые параметры включают callee, caller, both или no. По умолчанию – no.
parkedcallhangup caller Контролирует, какая сторона вызова имеет возможность выполнить завершение разговора на основе DTMF в вызове, который возникает при наборе припаркованного вызова. Допустимые параметры включают callee, caller, both или no. По умолчанию – no.
parkedcallrecording caller Контролирует, какая сторона вызова имеет возможность инициировать запись в одно касание на основе DTMF в вызове, который возникает в результате захвата припаркованного вызова. Допустимые параметры включают callee, caller, both или no. По умолчанию – no.
parkeddynamic yes Включает динамическое создание парковочных мест в диалплане. Должны быть заданы переменные канала PARKINGDYNAMIC, PARKINGDYNCONTEXT и PARKINGDYNPOS.
adsipark yes Передает информацию ADSI о припаркованном вызове обратно в исходный набор.
findslot next Настраивает поведение выбора места для парковки. Дополнительную информацию см. в разделе «Парковочные места».
perkedmusicclass default Указывает класс MOH, который будет использоваться для воспроизведения припаркованным абонентам. Класс музыки, установленный в диалплане с использованием функции канала диалплана CHANNEL(musicclass), переопределит этот параметр.
transferdigittimeout 3 Устанавливает количество секунд для ожидания каждой цифры от вызывающего абонента, выполняющего передачу.
xfersound beep Указывает звук, который будет воспроизводиться, чтобы указать, что перевод завершен.
xferfailsound beeperr Указывает звук, который будет воспроизводиться, чтобы указать, что перевод не завершился.
pickupexten *8 Настраивает расширение, используемое для парковки вызова.
pickupsound beep Указывает звук, который будет воспроизводиться при успешной попытке захвата вызова. По умолчанию звук не воспроизводится.
pickupfailsound beeperr Указывает звук, который будет воспроизводиться при неудачной попытке захвата вызова. По умолчанию звук не воспроизводится.
featuredigittimeout 1000 Устанавливает количество миллисекунд ожидания между цифрами, нажатыми во время вызова, при сопоставлении с DTMF-активируемыми функциями вызова.
atxfernoanswertimeout 15 Настраивает количество секунд ожидания ответа цели передачи, прежде чем считать, что время ожидания истекло.
atxferdropcall no Настраивает поведение обработки подтверждаемого трансфера, когда передатчик кладет трубку до завершения трансфера и он не выполняется. По умолчанию этот параметр имеет значение no, и будет инициирован вызов, чтобы попытаться осуществить трансфер к абоненту, который инициировал его. Если установлено значение yes, вызов будет сброшен после недачного трансфера.
atxferloopdelay 10 Устанавливает количество секунд ожидания между повторами обратного вызова, если atxferdropcall установлен на no.
atxfercallbackretries 2 Устанавливает количество попыток обратного вызова, если atxferdropcall установлен на no. По умолчанию установлены 2 попытки обратного вызова.

a Прочтите это снова. Это имеет смысл.

Обработка таймаутов припаркованных вызовов с опцией comebacktoorigin

Этот параметр настраивает поведение парковки вызова, когда время ожидания припаркованных вызовов (см. параметры parkingtime). У comebacktoorigin может быть одно из двух значений:

yes (по умолчанию)

Когда превышен тайм-аут припаркованного вызова Asterisk попытается отправить вызов обратно пиру, который припарковал этот вызов. Если канал больше не доступен для Asterisk, вызывающий абонент будет отключен.

no

Этот параметр будет использоваться, если вы хотите выполнить пользовательскую функциональность набора номера на припаркованных вызовах, которые превысили тайм-ауты. Абонент будет отправлен в определенную область диалплана, где логика может корректно обрабатывать оставшуюся часть вызова (это может включать просто возврат вызова к другому внутр.номеру, или выполнение какого-либо поиска).

Вам также может потребоваться учитывать вызовы, в которых исходный канал не может обрабатывать возвращенный припаркованный вызов. Если, например, вызов был припаркован каналом, который является транком для другой системы, не было достаточной информации для отправки обратного вызова нужному человеку в той системе. Действия, следующие за тайм-аутом, были бы более сложными, чем comebacktoorigin=yes, который мог бы обрабатывать изящно.

Припаркованные вызовы, чей тайм-аут с comebacktoorigin=no всегда будут отправлены в контекст parkedcallstimeout.

Диалплан (и контексты) подробно обсуждались в Главе 6.

Расширение, на которое они будут отправлены, будет создано из имени канала, который припарковал вызов. Например, если узел с SIP-именем 0004F2040808 припарковал этот вызов, расширение будет SIP_0004F2040808.

Если это расширение не существует, вызов будет отправлен на расширение s в контексте parkedcallstimeout. Наконец, если расширение s в parkedcallstimeout не существует, вызов будет отправлен на расширение s контекста default.

Кроме того, для любых вызовов, где comebacktoorigin=no, будет существовать расширение SIP_0004F2040808, созданное в контексте park-dial. Это расширение будет настроено для выполнения Dial() на SIP/0004F2040808.1

Раздел [featuremap]

В этом разделе вы можете определить последовательности DTMF запускающие различные функции на каналах, которые были соединены через опции в приложениях Dial() или Queue(). Параметры приведены в Таблице 11-2.

Таблица 11-2. feature.conf раздел [featuremap]

Опция Значение/Пример Примечание Флаги Dial()/Queues()
blindxfer #1 Вызывает слепой (неконтролируемый) трансфер T, t
disconnect *0 Завершает вызов H, h
automon *1 Запускает запись текущего вызова с использованием приложения Monitor() (нажатие этой последовательности клавиш второй раз останавливает запись) W, w
atxfer *2 Выполняет автоматический трансфер T, t
parkcall #72 Парковка вызовов K, k
automixmon *3 Запускает запись текущего вызова с использованием приложения MixMonitor() (нажатие этой последовательности клавиш снова останавливает запись) X, x

По умолчанию blindxfer и disconnect коды: # и * соответственно. Обычно их изменяют по умолчанию, поскольку они будут мешать другим вещам, которые вы, возможно, захотите сделать (например, если вы используете параметр Tt в вашей команде Dial() каждый раз когда вы нажимаете клавишу # вы инициируете передачу).

Раздел [applicationmap]

Этот раздел features.conf позволяет сопоставлять коды DTMF с приложениями диалплана. Вызывающий абонент будет переведен на удержание, пока приложение не завершит выполнение.

Синтаксис для определения карты приложения выглядит следующим образом (она должна располагаться в одной строке, разрывы строк не допускаются):3

<FeatureName> => <DTMF_sequence>,<ActivateOn>[/<ActivatedBy>]

,<Application>([<AppArguments>])[,MOH_Class]

Вы делаете следующее:

  1. Дайте карте имя чтобы его можно было включить в диалплане за счет использования переменной канала DYNAMIC_FEATURES.
  2. Определите последовательность DTMF, которая активирует эту функцию (мы рекомендуем использовать для этого как минимум две цифры).
  3. Определите на каком канале будет активирована функция, и (необязательно) участника, которому разрешено активировать функцию (по умолчанию это позволяет обоим каналам использовать/активировать эту функцию).
  4. Дайте имя приложению, которое эта карта вызывает, и его аргументы.
  5. Предоставьте дополнительный класс музыки на удержании (MOH) для назначения этой функции (которую будет слышать противоположный канал при выполнении приложения). Если вы не определите какой-либо класс MOH, вызывающий абонент будет слышать только тишину.

Вот пример карты приложения, которое будет запускать скрипт AGI:

agi_test => *6,self/callee,AGI(agi-test.agi),default

Поскольку приложения, созданные из карты приложения, запускаются за пределами ядра УАТС, вы не можете использовать приложения, запускающие диалплан (такие как Goto(), Macro(), Background() и т.д.). Если вы хотите использовать карту приложения на запуск внешних процессов (в том числе выполнение кода диалплана) Вам нужно будет запускать внешнее приложение с помощью AGI() вызова или приложения System(). Дело в том, что если вы хотите, выполнить что-то сложное с помощью карты приложения, то нужно будет очень тщательно протестировать, так как не все будет работать так, как вы могли бы ожидать.

Чтобы использовать карту приложения, вы должны объявить её в диалплане, установив переменную DYNAMIC_FEATURES где-то перед командой Dial(), которая соединяет каналы. Используйте модификатор в виде двойного подчеркивания для имени переменной, чтобы гарантировать, что карта приложения доступна для обоих каналов в течение всего вызова. Например:

exten => 101,1,NoOp()

same => n,Set(__DYNAMIC_FEATURES=agi_test)

same => n,Dial(SIP/0000FFFF0002)

Если вы хотите разрешить доступ к нескольким картам приложений при вызове, вам нужно будет использовать символ # в качестве разделителя между несколькими именами карт:

Set(__DYNAMIC_FEATURES=agi_test#my_other_map)

Причина, по которой символ # был выбран вместо простой запятой заключается в том, что старые версии приложения Set() интерпретировали запятую иначе, чем более поздние, а синтаксис карт приложений никогда не обновлялся.

Не забудьте перезагрузить модуль функций после внесения изменений в файл features.conf:

*CLI> features reload

Вы можете проверить, что ваши изменения произошли с помощью команды features show. Убедитесь, что вы проверили свою карту приложений, прежде чем передавать ее своим пользователям!

Наследование переменных канала

Переменные канала всегда связаны с исходным каналом, который их установил, и более недоступны после трансфера канала.

Чтобы позволить канальным переменным следить за каналом, когда он передается по системе, необходимо использовать наследование переменной канала. Существует два модификатора, которые могут позволить переменной канала следовать за каналом: одинарное подчеркивание и двойное подчеркивание.

Одинарное подчеркивание (_) заставляет канальную переменную наследоваться каналом для одного трансфера, после чего она больше недоступна для дополнительных трансферов. Если вы используете двойное подчеркивание (__) переменная канала будет наследоваться на протяжении всего срока жизни этого канала.

Настройка переменных канала для наследования требует, чтобы вы использовали один или два символа подчеркивания в качестве префикса имени канала. Затем на переменные канала ссылаются точно так же, как и в обычном режиме (например, не пытайтесь считывать значения переменных канала с символами подчеркивания в имени переменной).

Вот пример установки переменной канала для единичного наследования:

exten => example,1,Set(_MyVariable=thisValue)

Вот пример установки переменной канала для бесконечного наследования:

exten => example,1,Set(__MyVariable=thisValue)

Чтобы прочитать значение переменной канала, не используйте подчеркивания:

exten => example,1,Verbose(1,Value of MyVariable is: ${MyVariable})

И если вы считаете, что эта врезка была захватывающей, посмотрите ещё одну!

Динамическое создание Feature-Map из диалплана.

Начиная с Asterisk 11, вы можете создавать карты функций из диалплана напрямую, что делает определение функции и ее отображение DTMF динамическим по каждому каналу. Это делается с помощью функций диалплана FEATURE() и FEATUREMAP(). Допустимые значения для FEATUREMAP() включают следующие значения, которые устанавливают или извлекают используемую последовательность DTMF для запуска функциональности:

atxfer

Трансфер вызова с уведомлением

blindxfer

Слепой трансфер

automon

Авто Monitor() (Запись вызова)

disconnect

Разъединение вызова

parkcall

Парковка вызова

automixmon

Авто MixMonitor() (запись вызова)

С помощью FEATUREMAP() функция может быть использована для получения текущей последовательности DTMF для этой функциональности:

exten => 199,1,Verbose(2,Current DTMF для atxfer: ${FEATUREMAP (atxfer)})

Или вы можете использовать последовательность DTMF для особой функции на текущем канале:

exten => 199,1,NoOp()

same => n,Set(FEATUREMAP(atxfer)=*9)

Если вы хотите установить тайм-аут парковки для канала, то можете сделать это с помощью функции FEATURE(). Она содержит один аргумент – время парковки, которое является значением в секундах до того, как припаркованный вызов возвращается к абоненту (или назначению, в зависимости от того как вы настроили парковку):

exten => 199,1,NoOp()

same => n,Set(FEATURE(parkingtime)=60)

Группировка карт приложений

Если у вас есть много функций, которые необходимо активировать для определенного контекста или внутреннего номера, вы можете группировать несколько элементов вместе в группе карт приложений, так что одно назначение переменной DYNAMIC_FEATURES присваивает все назначенные функции этой карте.

Группировка карт приложений добавляется в конец файла features.conf. Каждой группе присваивается имя, а затем перечисляются соответствующие функции:

[shifteight]

unpauseMonitor => *1 ; присвоение пользовательского ключа

pauseMonitor => *2 ; присвоение пользовательского ключа

agi_test => ; не присвоено пользовательского ключа

Если вы хотите указать пользовательское сопоставление ключей для объекта в группировке карт приложений, просто выполните => с соответствующим сопоставлением ключей. Если вы не укажете сопоставление ключей, будет использована карта ключей по умолчанию для этой функции (как указано в разделе [featuremap]). Независимо от того, хотите ли вы назначить сопоставление настраиваемых ключей или нет требуется оператор =>.

В диалплане вы должны назначить эту группу приложений с помощью приложения Set():

Set(__DYNAMIC_FEATURES=shifteight) ; используйте двойное подчеркивание,

; если вы хотите, чтобы оба плеча вызова

; имели назначенную переменную.

Парковочные места

Парковочные места (лоты) позволяют проводить вызов в системе без привязки к определенному номеру. Затем вызов может быть получен любым, кто знает код парковки для этого вызова. Эта функция часто используется в сочетании с системой служебного оповещения (система PA или Tannoy для наших читателей в Великобритании). По этой причине её часто называют парк-энд-пейдж4; однако следует отметить, что парковка и пейджинг фактически раздельны.

Для парковки вызова в Asterisk вам необходимо передать вызывающего абонента в код функции, назначенный для парковки, который назначается в файле features.conf директивой parkext. По умолчанию это 700:

parkext => 700 ; Какой номер набрать для парковки (все парковочные места)

Вам нужно подождать, чтобы завершился трансфер пока не получите номер места для поиска парковки из системы, иначе у вас не будет способа получить звонок. По умолчанию поисковые слоты, назначенные с помощью директивы parkpos в features.conf, пронумерованы как 701-720:

parkpos => 701-720 ; Какие номера использовать для парковки вызовов

; (парковочные места по умолчанию)

После того, как вызов припаркован, любой из пользователей системы может получить его, набрав номер поискового слота (parkpos), назначенный этому вызову. Затем вызов будет подключен к каналу, набирающему код поиска.

Существует два способа назначения слотов для поиска. Это делается с помощью директивы findslot в файле features.conf. Метод по умолчанию (findslot => first) всегда использует слот с наименьшим номером, если он доступен, и, при необходимости присваивает коды с более высоким номером. Второй метод (findslot => next) будет перемещаться по кодам извлечения при каждой последующей парковке, возвращаясь к первому коду извлечения после использования последнего. Какой метод вы выберете, будет зависеть от того, насколько заняты ваши парковочные места. Если вы используете парковку редко, по умолчанию findslot в first будет лучше (люди будут использовать их припаркованные вызовы всегда находящиеся в одном и том же слоте). Если вы используете парковку часто (например, в автосалоне), гораздо лучше для каждой последующей парковки назначать следующий слот, так как вы часто будете иметь более одного одновременно припаркованного вызова. Ваши пользователи привыкнут внимательно слушать фактический номер парковки (вместо того, чтобы просто всегда набирать 701) и это минимизирует вероятность того, что люди случайно получат неправильный вызов в занятой системе.

Если вы используете парковку, вам, вероятно, также понадобится способ объявлять о припаркованных вызовах, чтобы заинтересованные стороны знали, как их получить. Хотя можно просто бегать по коридору и кричать “Вася, там тебе звонят на 701!” более профессиональный метод заключается в использовании системы пейджинга (более формально известной как система публичных адресов), которую мы обсудим в следующем разделе.

Пейджинг потолочный и «под носом» (aka система оповещения).

Во многих системах УАТС желательно иметь возможность пользователю отправлять свой голос с телефона в систему оповещения. Обычно это включает в себя набор кода функции или номера, который делает соединение с каким-либо ресурсом системы оповещения, а затем делает объявление через трубку телефона, которое транслируется на все устройства, связанные с этим пейджинговым ресурсом. Часто это будет внешняя пейджинговая система, состоящая из усилителя, подключенного к потолочным громкоговорителям; однако пейджинг через громкоговорители офисных телефонов также популярен (в основном по соображениям стоимости). Если у вас есть бюджет (или существующая потолочная пейджинговая система), потолочный пейджинг обычно лучше, но настольный пейджинг (aka пейджинг «под носом») может хорошо работать во многих местах. Что пожалуй является наиболее распространенным, состоит в том, чтобы иметь сочетание настольного и потолочного пейджинга где, например, настольный пейджинг может использоваться для офисов, а потолочный будет использоваться для склада, прихожей и общественных мест (столовая, приемная , и т.д.).

В Asterisk для пейджинга используется приложение Page(). Это приложение просто берет список каналов в качестве аргумента, одновременно вызывает все перечисленные каналы, и, как они отвечают, помещает каждый из них в конференц-зал. Имея это в виду, становится очевидным, что одно требование для работы поискового вызова заключается в том, что каждый канал назначения должен иметь возможность автоматически отвечать на входящее соединение и выводить звук на какой-то динамик (другими словами, Page() не будет работать, если все телефоны просто звонят).

Таким образом, в то время как приложение Page() само по себе является безболезненным и простым в использовании, получение всех каналов назначения для правильной обработки входящего пейджинга немного сложнее. Мы вернемся к этому в ближайшее время.

Приложение Page() принимает три аргумента, определяя группу каналов, которые должны быть подключены к пейджингу, параметры и таймаут:

exten => *724,1,Page(${ChannelsToPage},i,120)

Параметры (обозначенные в Таблице 11-3) дают вам некоторую гибкость в отношении того, как работает Page(), но большая часть конфигурации будет связана с тем, как целевые устройства обрабатывают входящее соединение. Мы рассмотрим различные способы настройки устройств для приема пейджинга в следующем разделе.

Таблица 11-3. Параметры Page()

Опция Описание Разъяснение
d Включает полнодуплексный звук Иногда называется «пейджинг для разговора», использование этого параметра означает, что оборудование, которое получает пейджинг, имеет возможность передавать звук обратно на тот же канал, откуда оно получает звук. Как правило, вы не захотите использовать его, если у вас нет конкретной потребности в нем.
i Игнорирует попытки переадресации вызова Обычно вы хотите, чтобы эта опция была включена.
q Не воспроизводит звуковой сигнал для вызывающего абонента (тихий режим) Обычно вы не будете использовать это, но если у вас есть внешний усилитель, который обеспечивает свой собственный тон, вы можете установить эту опцию.
r Записывает пейджинг в файл Если вы собираетесь использовать один и тот же пейджинг несколько раз в будущем, вы можете записать его, а затем использовать позже, вызывая с помощью Originate() или используя параметр A(x) для Page().
s Набирает канал только в том случае, если состояние устройства NOT_INUSE Этот вариант, вероятно, полезен (и надежен) для SIP-каналов, но даже в этом случае может не работать, если одной линии разрешено одновременно выполнять несколько вызовов. Поэтому во всех случаях не полагайтесь на эту опцию.
A(x) Воспроизводит объявление x для всех участников Вы можете использовать ранее записанный файл для воспроизведения по пейджинговой системе. Если вы объедините это с Originate() и Record(), то можете реализовать систему отложенного пейджинга.
n Не воспроизводит объявление вызывающему абоненту (подразумевает A(x)) По умолчанию система будет воспроизводить исходящий звук как для вызывающего абонента, так и для вызываемого абонента. Если этот параметр включен, то звук вызова не будет воспроизводиться вызывающему абоненту (персональный пейджинг).

Из-за того, как работает команда Page(), она очень ресурсоемка. Мы не можем этого достаточно подчеркнуть. Внимательно читайте дальше, и мы расскажем, как обеспечить, чтобы пейджинг не вызывал проблем с производительностью в рабочей среде (что почти наверняка произойдет, если пейджинг не будет правильно спроектирован).

Места для отправки пейджинга

Как мы уже говорили ранее, Page() сама по себе очень проста. Хитрость заключается в том, как собрать всех вместе. Пейджинги могут быть отправлены на различные типы каналов, и все они требуют различной конфигурации.

Внешний пейджинг

Если в здании установлена система оповещения, обычно подключается телефонная система к внешнему усилителю и вызов отправляется на нее по каналу. Один из способов сделать это – подключить звуковую карту вашего сервера к усилителю и отправлять вызовы на канал с именем Console/DSP, но это предполагает, что звуковые драйверы на вашем сервере работают правильно, а уровни звука нормализованы правильно на этом канале. Другой способ (потенциально простой, и возможно более надежный) для обработки внешнего поискового вызова заключается в использовании FXS устройства некоторого типа (например, ATA), который подключается к интерфейсу поискового вызова, такому как Bogen UTI1,5 который затем подключается к пейджинговому усилителю.6

В вашем диалплане пейджинг на внешний усилитель будет выглядеть как простой Dial() для устройства, подключенного к пейджинговому оборудованию. Например, если у вас был ATA, настроенный в sip.conf как [PagingATA] и вы подключили ATA к Bogen UTI1, вы выполните пейджинг, набрав:

exten => *724,1,Verbose (2, Пейджинг на внешний усилитель) ; обратите внимание

; ‘*’ в наборе является частью того

; что вы на самом деле набираете

same => n, Set(PageDevice=SIP/PagingATA)

same => n, Page(${PageDevice},i,120)

Обратите внимание, что для этого вам придется регистрировать ATA как SIP устройство в sip.conf, и в этом случае мы назвали устройство [PagingATA]. Вы можете назвать это устройство как угодно (например, мы часто используем MAC-адрес как имя SIP-устройства), но для чего-либо, что не является телефоном пользователя, может быть полезно использовать имя, которое делает его выделяющимся из других устройств.

Если в вашей системе была FXS-карта, и вы подключили UTI1 к ней, вы бы делали Dial() на канал для этого порта FXS:

same => n,Dial(DAHDI/25)

UTI1 отвечает на вызов и открывает канал к пейджинговой системе; вы затем делаете свое объявление и вешаете трубку.

Настольный пейджинг

Настольный пейджинг стал популярным в кнопочных телефонных системах, где спикеры офисных телефонов используются в качестве системы оповещения бедняков. Большинство SIP-телефонов имеют возможность автоответа на вызов по громкой связи, который выполняет то, что в основном требуется от каждого телефона. В дополнение к этому, однако, необходимо передать аудио более чем на один аппарат одновременно. Asterisk использует встроенный механизм конференц-связи для обработки деталей под капотом. Вы используете приложение Page(), чтобы это произошло.

Подобно Dial(), приложение Page() может обрабатывать несколько каналов. Так как вы, как правило будете хотеть, чтобы Page() сигнализировал нескольким аппаратам сразу (возможно даже всем телефонам в вашей системе) вы можете получить длинные строки с устройствами, которые выглядят примерно так:

Page(SIP/SET1&SIP/SET2&SIP/SET3&SIP/SET4&SIP/SET5&SIP/SET6&SIP/SET7&…

При превышении определенного размера система Asterisk не сможет создать несколько наборов пейджинга. Например, в офисе с 200 телефонами использование SIP для пейджинга каждого телефона было бы невозможно; трафик и нагрузка на процессор сервера Asterisk были бы слишком велики. В подобных случаях вы должны смотреть или на многоадресный пейджинг или на внешний.

Возможно, самая сложная часть пейджинга на основе SIP – заключается в том, что вам обычно приходится указывать каждому аппарату, что он должен отвечать автоматически, но у разных производителей SIP-телефонов для этой цели используются разные SIP-сообщения. Таким образом, в зависимости от используемой модели телефона команды, необходимые для выполнения пейджингового вызова на основе SIP, будут отличаться. Вот несколько примеров:

  • Для Aastra:

exten => *724,1,Verbose(2,Paging to Aastra sets)

same => n,SIPAddHeader(Alert-Info: info=alert-autoanswer)

same => n,Set(PageDevice=SIP/00085D000000)

same => n,Page(${PageDevice},i)

  • Для Polycom:

exten => *724,1,Verbose(2,Paging to Polycom sets)

same => n,SIPAddHeader(Alert-Info: Ring Answer)

same => n,Set(PageDevice=SIP/0004F2000000)

same => n,Page(${PageDevice},i)

  • Для Snom:

exten => *724,1,Verbose(2,Paging to Snom sets)

same => n,Set(VXML_URL=intercom=true)

; заменить ‘domain.com’ на домен вашей системы

same => n,SIPAddHeader(Call-Info: sip:domain.com\;answer-after=0)

same => n,Set(PageDevice=SIP/000413000000)

same => n,Page(${PageDevice},i)

  • Для Cisco SPA (бывшие телефоны Linksys, но не серии 79XX):

exten => *724,1,Verbose(2,Paging для Cisco SPA, но не Cisco 79XX)

same => n,SIPAddHeader(Call-Info:\;answer-after=0) ; Cisco SPA phones

same => n,Set(PageDevice=SIP/0004F2000000)

same => n,Page(${PageDevice},i)

Предполагаем, что вы поняли, что произойдет, если у вас смесь телефонов в вашей рабочей среде? Как вы будете контролировать, какие заголовки отправлять на телефоны?7

Как бы то ни было, это не красиво.

К счастью, многие из этих аппаратов поддерживают многоадресную (multicast) IP-рассылку, которая является гораздо лучшим способом отправки пейджинга на несколько телефонов (подробности читайте далее). Тем не менее, если у вас есть лишь горстка телефонов в вашей системе и все они принадлежат одному и тому же производителю, то пейджинговая система на основе SIP может быть самым простым методом, поэтому мы не хотим запугивать вас.

Многоадресный пейджинг через канал MulticastRTP

Если вы серьезно относитесь к пейджинговому вызову через телефоны в вашей системе и у вас больше, чем горстка телефонов, вам нужно будет посмотреть, как использовать многоадресную IP-рассылку. Понятие multicast IP существует уже давно,8 но широко не используется. Тем не менее, оно идеально подходит для пейджинга в одном месте.

Asterisk имеет канал (chan_multicast_rtp), предназначенный для создания многоадресной рассылки RTP. Затем этот поток подписывается различными телефонами, и результат заключается в том, что всякий раз когда появляется медиапоток в многоадресной рассылке, телефоны передают этот медиапоток на свои динамики.

Поскольку MulticastRTP является драйвером канала, у него нет приложения, но вместо этого он будет работать в любом месте диалплана, где вы могли бы иначе использовать канал. В нашем случае мы будем использовать приложение Page() для инициирования многоадресной рассылки.

Чтобы использовать многоадресный канал, вы просто отправляете ему вызов так же, как и любому другому каналу. Синтаксис для канала выглядит следующим образом:

MulticastRTP/<тип>/<ip address:port>[/<linksys address:port>]

Тип может быть basic или linksys. Основной синтаксис канала MulticastRTP выглядит следующим образом:

exten => *723,1,Page(MulticastRTP/basic/239.0.0.1:1234)

Не все устройства поддерживают IP multicast, но мы протестировали его на Snom,9 Linksys/Cisco, Polycom (прошивка 4.x или позже), и Aastra, и он работает замечательно.

Многоадресный пейджинг на Cisco SPA-телефонах

Функция многоадресной рассылки на телефонах Cisco SPA немного странна, но после ее настройки она работает нормально. Хитрость заключается в том, что адрес, который вы помещаете в телефон, не является адресом многоадресной передачи, на который ссылается пейджинг, а скорее своего рода сигнальным каналом.

Мы обнаружили, что вы можете сделать этот адрес таким же, как адрес многоадресной рассылки, но просто используйте другой номер порта.

Диалплан выглядит так:

exten => *724,1,Page(MulticastRTP/linksys/239.0.0.1:1234/239.0.0.1:6061)

В SPA-телефоне вам необходимо войти в интерфейс администрирования и перейти к вкладке SIP. В самой нижней части страницы вы найдете раздел Linksys Key System Parameters (Параметры системы клавиш Linksys). Вам необходимо установить следующие параметры:

  • Linksys Key System: Yes
  • Multicast Address: 239.0.0.1:6061

Обратите внимание, что адрес многоадресной рассылки, который вы назначаете для телефона, является вторым в определении канала (в нашем примере тот, который использует порт 6061).

Обратите внимание, что вы можете написать команду Page() в этом формате в среде, где есть сочетание телефонов SPA (fka Linksys, теперь Cisco) и других типов телефонов. Другие телефоны будут использовать первый адрес и будут работать так же, как если бы вы использовали basic вместо linksys.

VoIP-пейджинговые адаптеры

В последнее время на рынке появились различные пейджинговые колонки на основе VoIP. Эти устройства адресуются в диалплане точно так же, как SIP ATA, подключенный к UTI1, но они могут быть установлены так же, как и потолочные громкоговорители. Поскольку они автоматически отвечают, нет необходимости передавать им какую-либо дополнительную информацию, как вам необходимо в случае SIP-телефона.

Для небольших установок (где требуется не более полудюжины динамиков), эти устройства могут быть экономически эффективными. Однако для чего-либо большего (или установки в сложной среде, такой как склад или автостоянка), вы получите более высокую производительность с гораздо меньшей стоимостью с помощью традиционной аналоговой пейджинговой системы, подключенной к телефонной системе аналоговым (FXS) интерфейсом.

Мы не знаем, поддерживают ли эти устройства многоадресную рассылку. Имейте это в виду, если вы планируете использовать их в большом количестве.

Комбинации пейджинга

Во многих организациях может возникнуть необходимость как в настольном, так и во внешнем пейджинге. Например, производственное предприятие может захотеть использовать оповещение на основе телефонов для офисной зоны, а внешний пейджинг для завода и склада. С точки зрения Asterisk это довольно просто. Когда вы вызываете приложение Page(), вы просто указываете различные ресурсы, на которые хотите направить пейджинг, разделенные символом & и все они будут включены в конференцию приложением Page().

Соединим все вместе

На этом этапе у вас должен быть список различных типов каналов, на которых вы хотите разместить пейджинг. Поскольку Page() почти всегда будет сигнализировать более одного канала, мы рекомендуем установить глобальную переменную, которая определяет список каналов, а затем вызвать приложение Page() этой строкой:

[global]

MULTICAST=MulticastRTP/linksys/239.0.0.1:1234

;MULTICAST=MulticastRTP/linksys/239.0.0.1:1234/239.0.0.1:6061 ; если у вас

;SPA телефоны

; (Linksys / Cisco)

BOGEN=SIP/ATAforPaging ; Это предполагает ATA в файле sip.conf с именем;

; [ATAforPaging]

;BOGEN=DAHDI/25 ; Мы могли бы это сделать, полагая, что у нас есть

; аналоговый FXS на 25 канале DAHDI

PAGELIST=${MULTICAST}&${BOGEN} ; Все эти имена переменных произвольны.

; Asterisk все равно, как вы называете эти

; строки

[page_context] ; Вам не нужен контекст пейджинга, если вы используете номер

; телефона, пейджинг можно набирать вашими телефонами

exten => *724,1,Page(${PAGELIST},i,120)

В этом примере предлагается несколько возможных конфигураций, в зависимости от аппаратного обеспечения. Хотя необязательно иметь переменную PAGELIST, мы обнаружили что это будет способствовать упрощению управления несколькими ресурсами пейджингового вызова, особенно во время процесса настройки и тестирования.

Мы создали контекст для пейджингового вызова в этом примере. Чтобы это сработало, вам нужно либо сделать include этого контекста в контексты диалплана, в которые входят ваши телефоны или код Goto() в этих контекстах, чтобы добавить пользователя в этот контекст и номер (то есть Goto(page_context,*724,1)). В качестве альтернативы вы можете жестко задавать внутренний номер для приложения Page() каждом контексте, как номер набора сервисов.

Зонирование пейджинга

Зонирование пейджинга популярно в таких местах, как автосалоны, где отдел запчастей, отдел продаж и, возможно, отдел подержанных автомобилей требуют пейджинга, но им не нужно слышать пейджинги друг друга.

В зонировании пейджинга человек, отправляющий пейджинг, должен выбрать, в какую зону он хочет его отправить. Контроллер зонирования, такой как Bogen PCM2000, обычно используется для сигнализации различных зон: приложение Page() сигнализирует контроллеру зоны, отвечает контроллеру зоны, а затем отправляется дополнительная цифра, чтобы выбрать, в какую зону должен быть отправлен пейджинг. Большинство контроллеров зонирования позволяют использовать пейджинг для всех зон, в дополнение к объединению зон (например, пейджинг для отделов продаж новых и подержанных автомобилей).

Вы также можете иметь отдельные внутренние номера в диалплане, чтобы разделить ATA (или группы телефонов), но это может оказаться более сложным и дорогостоящим, чем просто покупка пейджингового контроллера, который предназначен для обработки этого. Зонирование пейджинга не требует какой-либо существенно другой технологии, но для этого требуется немного больше размышлений и планирования относительно диалплана и аппаратного обеспечения.

Расширенные возможности конференц-связи

Приложение ConfBridge() представляет собой расширенное приложение для конференц-связи в Asterisk, которое позволяет осуществлять мелкомасштабный контроль участников конференции, помимо аудио- и видеоконференций высокой четкости. Текущая реализация ConfBrifge() была выпущена вместе с Asterisk 10.10 Начиная с Asterisk 10 приложение ConfBridge() является фактической заменой MeetMe(), которая все еще работает хорошо, но не содержит расширенных функций ConfBridge(). Ранее мы представили базовую рабочую настройку для ConfBridge() (см. «Конференц-связь с ConfBridge()» в Главе 10) и предложили Вам начать работу, если вы еще не настроили свой первый конференц-мост.

В файле confbridge.conf мы настраиваем как users (пользователей) так и типы bridge (мостов). Тип users позволяет нам создавать профили, которые мы можем назначить пользователям, прежде чем они войдут в конференцию, чтобы контролировать свои права доступа и назначать разные функции. Например может быть профиль участника и профиль администратора, где администратор может отключать участников конференции. Другой пример – на конференцию может не передаваться аудиопоток, пока не войдет лидер конференции. Помимо профиля users мы также имеем профили bridge, которые используются для определения атрибутов самого моста конференции. Некоторые параметры включают определение максимального количества участников или запись конференции (и место сохранения записанных файлов).

В разделе «Конференц-связь с ConfBridge()» в Главе 10 мы настроили наши типы пользователей и мостов по умолчанию с минимальным набором данных. Давайте рассмотрим доступные варианты для каждого из типов.

Раздел [general]

Раздел [general] зарезервирован для будущего использования и в настоящее время не содержит каких-либо глобальных параметров.

Параметры профилей пользователей

Параметры в Таблице 11-4 для профилей пользователей, которые определяют опции, доступные участникам конференции.

Таблица 11-4. Параметры профиля пользователя в confbridge.conf

Опция Описание
admin Определяет, помечен ли пользователь как администратор конференции. Пользователям, отмеченным как администраторы, могут быть предоставлены различные параметры, доступные только администраторам в пользовательском меню. Меню определяется в confbridge.conf и выбирается при вызове приложения ConfBridge(). Доступными параметрами являются yes или no. По умолчанию – no.
marked Задает, должен ли пользователь в этом профиле быть отмечен (промаркирован) или нет. Используется для запуска конференции при ожидании маркированного пользователя. См. wait_marked и end_marked. Доступные параметры: yes или no. По умолчанию – no.
startmuted Устанавливает для пользователей в этом профиле значение “звук отключен” при первоначальном присоединении к конференции. Доступные параметры: yes или no. По умолчанию – no.
music_on_hold_when_empty Определяет, следует ли воспроизводить MOH, когда существует только один участник конференции или когда конференция ожидает маркированного пользователя. Доступные параметры: yes или no. По умолчанию – no.
music_on_hold_class Устанавливает, какой класс MOH должен использоваться. Значение по умолчанию default.
quiet Если этот параметр включен, он ограничивает звуки, воспроизводимые в конференции, например звуки присоединения и объявления пользователей. Доступные параметры: yes или no. По умолчанию – no.
announce_user_count Если включено, количество пользователей в конференции объявляется присоединяющемуся участнику до входа в конференцию. Доступные параметры: yes или no. По умолчанию – no.
announce_user_count_all Используется для объявления количества участников всем участникам конференции. Если задано число, то объявление воспроизводится только тогда, когда число участников превышает заданное число. Доступные параметры: yes, no или целое число. По умолчанию – no.
announce_only_user Если включено, подсказка будет воспроизводиться когда первый участник конференции присоединяется, сообщая, что он является единственным участником конференции. Доступные параметры: yes или no. По умолчанию – yes.
wait_marked Если этот параметр включен, участник конференции должен дождаться присоединения маркированного пользователя. Доступные параметры: yes или no. По умолчанию – no.
end_marked Определяет, удаляются ли оставшиеся пользователи после того, как последний маркированный пользователь покинет конференцию. Доступные параметры: yes или no. По умолчанию – no.
dsp_drop_silence Когда включено, Asterisk отбросит то, что он определяет как тишину в конференции, вызывая резкое нарастание фонового шума в конференции. Рекомендуется для больших конференций, где фоновый шум может стать проблемой. Доступные параметры: yes или no. По умолчанию – no.
dsp_talking_threshold Значение в миллисекундах—продолжительность звука остающаяся выше исходного значения, установленного DSP. Значение не должно быть изменено, пока вы не знакомы с внутренним устройством того, как это может повлиять на вашу конференцию. Смотри файл confbridge.conf.sample в каталоге contribs исходников Asterisk для получения дополнительной информации.
dsp_silence_threshold Похож на dsp_talking_threshold, но ищет тишину. Значение в миллисекундах. Не рекомендуется настраивать.
talk_detection_events Если включено, уведомление о том, когда оратор начинает и заканчивает говорить, передается как событие по AMI. Доступные параметры: yes или no. По умолчанию – no.
denoise Опция denoise полезна, если вы используете кодек speex, а диктор имеет повышенный уровень фонового шума. При включении этой опции будет предпринята попытка удалить фоновый шум до того, как звук будет микширован в конференцию, сохраняя желаемый звук речи. Этот параметр не следует путать с параметром dsp_drop_silence. Кроме того, эта опция имеет небольшое влияние на производительность. Доступные параметры: yes или no. По умолчанию – no.
jitterbuffer Если включено, то jitterbuffer будет включен на аудиоканале пользователя до микширования. Это желательно в том случае, если может помочь сгладить звук, воспроизводимый в конференции за счет небольшой задержки. Эта опция использует адаптивный режим функции JITTERBUFFER(). Если требуется точная настройка jitterbuffer, отключите эту опцию и используйте функцию JITTERBUFFER() перед вызовом приложения ConfBridge(). Доступные параметры: yes или no. По умолчанию – no.
pin Если установлен, то человеку, при входе в конференцию будет предложено ввести PIN-код. Допустимое значение – любое целое число.
announce_join_leave Если эта функция включена, пользователю, входящему в конференцию, будет предложено записать свое имя до присоединения к конференции. Затем будет воспроизведено имя, объявляющее человека, присоединяющегося и покидающего конференцию. Доступные параметры: yes или no. По умолчанию – no.
dtmf_passthrough Если этот параметр включен, DTMF будет передаваться через конференцию. Это полезно, когда мост конференции может быть связан с оконечной точкой, от которой вы хотите получить DTMF; иначе, он поглощается Asterisk. Доступные параметры: yes или no. По умолчанию – no.
announcement Если этот параметр задан, при присоединении пользователей к конференции будет воспроизводиться объявление с именем. Значение должно быть путем к файлу объявления.

Параметры для профилей мостов

Параметры, перечисленные в Таблице 11-5 для профилей мостов и определения параметров для самого моста конференции.

Таблица 11-5. Опции профиля моста в confbridge.conf

Опция Описание
max_members Определяет максимальное число участников конференции для одного моста. При достижении этого лимита конференция будет заблокирована до тех пор, пока лишний участник не покинет конференцию. Единственным исключением является то, что администраторы всегда могут присоединиться к конференции, независимо от количества участников. Значение должно быть целым числом. По умолчанию количество участников не ограничено.
record_conference Если эта опция включена, запись конференции начнется, когда первый участник присоединится к конференции, и прекратится, когда последний участник покинет конференцию. Имя файла для записи имеет формат confbridge-<имя моста конференции>-<время начала>.wav. Файл по умолчанию будет записываться линейно с частотой 8 кГц. Запись будет сохранена в каталоге монитора, настроенном в asterisk.conf. Доступные параметры: yes или no.
record_file Если параметр record_conference включена, можно указать имя файла для записанной конференции. Однако, несколько конференций могут использовать один и тот же профиль моста, не рекомендуется задавать этот параметр в самом файле confbridge.conf. Вместо этого используйте функцию CONFBRIDGE() для динамической установки имени файла в диалплане перед входом в конференцию.
internal_sample_rate Эта опция установит внутреннюю частоту дискретизации конференции, при которой будет происходить микширование. По умолчанию частота дискретизации выбирается автоматически, однако можно указать значение от 8 000 до 192 000. Если задать частоту дискретизации, которую не поддерживает Asterisk, будет использоваться ближайшая, поддерживаемая Asterisk. Доступные значения: auto или значение от 8000 до 192000. Значение по умолчанию – auto.
mixing_interval Этот параметр задает внутренний интервал микширования моста конференции в миллисекундах. Установка более высокого интервала микширования может уменьшить количество нагрузки, используемой большими конференциями за счет более слабосвязанной конференции (например, задержки). Допустимые значения: 10, 20, 40, и 80. Значение по умолчанию – 20.
video_mode Параметр video_mode используется для управления распределением видео среди участников конференции, которые могут создавать и/или просматривать видеопотоки.a Участники, которые хотят просматривать и быть источником видео, должны совместно использовать один и тот же видеокодек, например H.264 (в sip.conf используйте allow=h264 в дополнение к аудиокодекам). Кроме того, рекомендуется отключить jitterbuffer, так как jitterbuffer работает только на аудиочасти конференции, и, таким образом, может привести к сбою синхронизации аудио и видео. Доступные режимы можно увидеть в Таблице 11-6.

a Микширование различных видеокодеков невозможно. Кроме того, видео, отображаемое в конференции, транслирует только одного участника за раз (т. е. Вы не можете сделать видео “Brady Bunch”).

Таблица 11-6. Доступные видеорежимы

Опция Описание
none По умолчанию источники видео не выбраны. Можно все еще включить источник видеосигнала для конференции через DTMF или AMI.
follow_talker Источником видео будет тот, кто говорит на конференции (самый громкий) и у которого есть источник видео. Источник видео будет видеть последний выбранный Источник видео, а не свой собственный.
last_marked Источником видео будет последний маркированный пользователь, присоединившийся к конференции. Если к конференции присоединилось несколько маркированных участников конференции и ушел последний маркированный пользователь, то источником станет участник, присоединившийся непосредственно перед последним (и так далее).
first_marked Как и в last_marked, первый маркированный участник конференции с источником видеосигнала будет источником видеосигнала для конференции. Если этот участник уйдет, то следующий маркированный участник с видеосигналом станет источником видеосигнала для конференции.

Пользовательские звуки конференц-моста

Также в разделе профиля моста вы можете определить пользовательские звуки, которые будут использоваться для этого профиля моста. Параметры, перечисленные в Таблице 11-7 показывают доступные настройки звука.

Таблица 11-7. Доступные параметры звука для профилей моста

Опция Описание
sound_join Звук, воспроизводимый, когда участник присоединяется к конференции
sound_leave Звук воспроизводится, когда участник покидает конференцию
sound_has_joined Звук, воспроизводимый при объявлении имени присоединяющегося участника
sound_has_left Звук, воспроизводимый при объявлении имени покидающего участника
sound_kicked Звук воспроизводимый участнику, когда он был удален из конференции
sound_muted Звук, воспроизводимый участнику, когда у него был отключен звук
sound_unmuted Звук, воспроизводимый участнику, когда у него был возвращен звук
sound_only_person Звук, воспроизводимый участнику, когда он является единственным участником конференции
sound_only_one Звук, воспроизводимый присоединяющемуся участнику, если в конференции есть только один другой участник
sound_there_are Звук, воспроизводимый при объявлении количества участников конференции
sound_other_in_party Смежный звук используется с sound_there_are; звуковые файлы объединяются следующим образом: sound_there_are number_of_participants sound_other_in_party
sound_place_into_conference Звук, воспроизводимый участнику при помещении в конференцию после ожидания присоединения маркированного пользователя
sound_wait_for_leader Звук, воспроизводимый участникам, уведомляющий их об ожидании присоединения к конференции маркированного пользователя
sound_leader_has_left Звук воспроизводится, когда последний макрированный пользователь покинул конференцию
sound_get_pin Звук, воспроизводимый участнику при запросе пин-кода для конференции
sound_invalid_pin Звук, воспроизводимый участнику при вводе неверного PIN-кода
sound_locked Звук, воспроизводимый участнику при попытке присоединиться к заблокированной конференции
sound_locked_now Звук, воспроизводимый администратору после блокировки конференции
sound_unlocked_now Звук, воспроизводимый администратору после разблокировки конференции
sound_error_menu Звук воспроизводится при вводе недопустимого параметра меню

Параметры меню ConfBridge

Приложение диалплана ConfBridge() также имеет возможность настройки меню для участников конференции. Параметры доступны через DTMF и могут быть указаны в качестве аргумента для приложения ConfBridge(), такого как профили пользователей и профили мостов. В Таблице 11-8 мы рассмотрим доступные параметры для пользовательских меню, как определено в confbridge.conf.

Можно объединить несколько параметров вместе с использованием одной последовательности DTMF. Выполнение нескольких действий выполняется путем разграничения каждого действия запятой (,).

Таблица 11-8. Параметры меню ConfBridge()

Опция Описание
playback(<audio_filename>[[&<audio_filename>]]) Опция playback может использоваться для воспроизведения аудио участнику, вводящему строку DTMF. Аудио не может быть прервано этой опцией. Похожее по стилю на приложение Playback().
playback_and_continue(<audio_filename>[[&<audio_filename>]]) Подобно playback, за исключением того, что оно будет прослушивать DTMF во время воспроизведения звука. Это полезно в ситуациях, когда вы создаете аудио-меню и хотите разрешить DTMF во время воспроизведения. Аналогично стилю приложения Background().
toggle_mute Включает отображение состояния включения и выключения звука для участника. В то время как mute включен, звук участника не будет воспроизводиться в конференц-мосте, но он все равно сможет слушать.
no_op Опция no_op означает No Operation (Не операция). Её цель – просто зарезервировать последовательности DTMF в меню.
decrease_listening_volume Уменьшить громкость прослушивания участника.
increase_listening_volume Увеличить громкость прослушивания участника.
reset_listening_volume Сбросить громкость прослушивания на значение по умолчанию.
decrease_talking_volume Уменьшить громкость разговора участника.
increase_talking_volume Увеличить громкость разговора участника.
reset_talking_volume Сбросить громкость разговора участника на значение по умолчанию.
dialplan_exec(context,extension,priority_label) Использование опции dialplan_exec позволяет участнику покинуть конференцию, выполнить диалплан и в конце диалплана вернуться в конференцию.
leave_conference Позволяет участнику покинуть конференцию с помощью последовательности DTMF. Выполнение диалплана будет продолжено после приложения ConfBridge().
admin_kick_last Позволяет администратору выгнать последнего присоединившегося участника из конференции. Этот параметр доступен только администраторам, поэтому его можно безопасно включить в общее меню для пользователей и администраторов.
admin_toggle_conference_lock Позволяет администратору переключаться между включением и выключением конференции. Может использоваться только администраторами, даже если включено в меню пользователя.
set_as_single_video_src Позволяет участнику установить себя в качестве единственного источника видеосигнала для конференции. Это позволяет прикрепить видео к одному участнику, независимо от того, в каком режиме установлен video_mode.
release_as_single_video_src Освобождает участника от роли единственного источника видеосигнала для моста. После освобождения участника мост конференции возвратится к video_mode, который был установлен для конференции.
admin_toggle_mute_participants Позволяет администратору переключаться между отключением и включением звука всех участников конференции, не являющихся администраторами. Администраторы по-прежнему смогут выступать на конференции. Если этот параметр включен, все участники, включая администраторов, будут уведомлены о том, что звук конференции отключен.
participant_count При использовании, скажет участнику сколько всего участников в конференции.

Включение PIN-кода

В «Конференц-связь с ConfBridge()» в Главе 10 мы создали базовую конфигурацию, которая позволила нам присоединиться к конференц-мосту на основе ConfBridge(). Теперь мы собираемся расширить её и добавить PIN-код в профиль пользователя. Если вы еще не настроили базовую конференцию, то вернитесь и сделайте это сейчас, прежде чем продолжить.

Сначала мы начнем с нашей базовой конфигурации confbridge.conf и просто добавим опцию pin для профиля default_user:

[general]

[default_user]

type = user

pin = 1234

[default_bridge]

type = bridge

После этого мы просто запускаем module reload app_confbridge.so из консоли и попытаемся позвонить нашему мосту конференции на номер 602. При этом мы увидим вывод консоли, похожий на следующий:

*CLI> module reload app_confbridge.so

— Reloading module ‘app_confbridge.so’ (Conference Bridge Application)

== Using SIP RTP CoS mark 5

— Executing [602@LocalSets:1] NoOp(“SIP/0000FFFF0001-00000003”, “”) in new stack

— Executing [602@LocalSets:2] ConfBridge(“SIP/0000FFFF0001-00000003”, “602”) in new stack

— <SIP/0000FFFF0001-00000003> Playing ‘conf-getpin.gsm’ (language ‘en’)

— <SIP/0000FFFF0001-00000003> Playing ‘conf-onlyperson.gsm’ (language ‘en’)

— <SIP/0000FFFF0001-00000003> Playing ‘confbridge-join.gsm’ (language ‘en’)

— <Bridge/0x7fdddc004378-input> Playing ‘confbridge-join.gsm’ (language ‘en’)

Довольно просто, правда? А что, если мы хотим сделать ПИН-код динамичным? Возможно, мы хотим найти ПИН-код в базе данных, которая может быть изменена внешним приложением. Мы можем сделать это просто с помощью динамических профилей в нашем диалплане. Сначала мы начнем со статически определенного PIN-кода, но установим его из диалплана.

Мы начнем с этого простого диалплана:

[ConferenceRooms]

exten => 602,1,NoOp()

same => n,ConfBridge(${EXTEN})

Затем мы используем функцию CONFBRIDGE() для динамического задания параметров профиля до присоединерия к конференции. Мы будем использовать CONFBRIDGE(), чтобы установить другой PIN-код, который мы определили в профиле default_user:

[ConferenceRooms]

exten => 602,1,NoOp()

same => n,Set(CONFBRIDGE(user,pin)=4321)

same => n,ConfBridge(${EXTEN})

После внесения изменений просто выполните dialplan reload и наберите добавочный номер 602. Вам все равно будет предложено ввести ПИН-код, но на этот раз это будет 4321 вместо 1234.

Рискуя раздражать вас разговорами о PIN-кодах конференций, давайте рассмотрим еще один пример. На этот раз мы переопределим ПИН-код по умолчанию, указанный в AstDB. Мы также могли бы вставить ПИН-код из внешней базы данных, такой как MySQL, но AstDB является приятной и простой. (См. Главу 16 для получения информации о func_odbc, которую вы могли бы использовать для вставки ПИН-кода из реляционной базы данных.)

Сначала давайте поместим ПИН-код в нашу AstDB из консоли Asterisk:

*CLI> database put confbridge 602/pin 1200

Updated database successfully

*CLI> database show confbridge

/confbridge/602/pin : 1200

С нашим PIN-кодом 1200, установленным для конференц-моста 602, мы можем изменить наш диалплан, чтобы найти ПИН-код, который мы должны использовать для ConfBridge():

[ConferenceRooms]

exten => 602,1,NoOp()

; поиск пин-кода для конференции

same => n,Set(CONF_PIN=${DB(confbridge/${EXTEN}/pin)})

; проверка на пустое возвращаемое значение

same => n,GotoIf($[${ISNULL(${CONF_PIN})}]?join)

; установка пин-кода

same => n,Set(CONFBRIDGE(user,pin)=${CONF_PIN})

; вход в конференцию

same => n(join),ConfBridge(${EXTEN})

После выполнения dialplan reload наш консольный вывод будет выглядеть так при наборе внутреннего номера 602:

— Executing [602@LocalSets:1] NoOp(“SIP/0000FFFF0001-00000006”, “”)

in new stack

— Executing [602@LocalSets:2] Set(“SIP/0000FFFF0001-00000006”,

“CONF_PIN=1200”) in new stack

— Executing [602@LocalSets:3] GotoIf(“SIP/0000FFFF0001-00000006”,

“0?join”) in new stack

— Executing [602@LocalSets:4] Set(“SIP/0000FFFF0001-00000006”,

“CONFBRIDGE(user,pin)=1200”) in new stack

— Executing [602@LocalSets:5] ConfBridge(“SIP/0000FFFF0001-00000006”, “602”) in new stack

Вы заметите, что мы добавили ярлык приоритета, называемый join, помимо вызова ConfBridge(). Мы сделали это, чтобы у нас было место для перехода на нулевое значение11, возвращаемое из поиска AstDB. Он просто дает нам один дополнительный уровень контроля, так что, если PIN-код не был возвращен, мы перейдем к ПИН-по умолчанию, установленному в confbridge.conf.

Ожидание присоединения маркированного пользователя

В некоторых случаях полезно создать конференцию, в которой все участники могут присоединиться к конференции до начала и ждать в зале ожидания до того, как присоединится лидер конференции. Мы можем включить эту функцию с использованием пары опций и маркированного пользователя. Маркированный пользователь будет лидером конференции и, когда он присоединится, то заставит всех участников переместиться в конференц-зал, где они смогут разговаривать друг с другом в обычном режиме.

Мы будем использовать функцию CONFBRIDGE() для настройки нашего обычного и маркированного участника, но Вам можно просто изменить файл confbridge.conf, если вы предпочитаете этот метод.

Во-первых, давайте настроим наш диалплан, чтобы люди, присоединившиеся к конференции, должны были ждать маркированного пользователя и удаляться из конференции когда последний маркированный пользователь покидает конференцию. (Несколько маркированных пользователей могут присоединиться к конференции, поэтому, если, скажем, три менеджера присоединились к конференции, и одному нужно уйти раньше, конференция продолжится до тех пор, пока не уйдет последний менеджер.) Например:

[ConferenceRooms]

; обычный участник

exten => 602,1,NoOp()

same => n,Set(CONFBRIDGE(user,wait_marked)=yes)

same => n,Set(CONFBRIDGE(user,end_marked)=yes)

same => n,Goto(conference,1)

; маркированный участник (с пин)

exten => 603,1,NoOp()

same => n,Set(CONFBRIDGE(user,marked)=yes)

same => n,Set(CONFBRIDGE(user,pin)=1200)

same => n,Goto(conference,1)

; тот же мост для всех

exten => conference,1,NoOp()

same => n,ConfBridge(primary)

Давайте немного пройдемя по нашему диалплану. Во-первых, у нас есть два внутренних номера: 602 и 603. Номера 602 не имеет PIN-кода и настроит людей, присоединяющихся к конференции, дожидаться, когда присоединится первый маркированный пользователь и удалит их из конференции, когда последний маркированный пользователь уйдет из конференция. После установки параметров wait_marked и end_marked на yes – Goto() переводит выполнение диалплана туда, где запущено приложение ConfBridge(). Номер 603 используется для установки маркированного пользователя перед присоединением к конференции. Мы также требуем, чтобы они вводили ПИН-код, поскольку мы не хотим, чтобы любой входил в качестве маркированного пользователя.

Этого достаточно. После того, как вы изменили свой диалплан, просто выполните dialplan reload, и все это будет соусом.

Использование меню ConfBridge()

Меню ConfBridge() – это метод выполнения различных функций на конференциях, вводя последовательности DTMF с вашего телефона и вызывая действие, оставаясь в конференции. Использование меню на основе DTMF в ConfBridge() осуществляется путем определения его в файле confbridge.conf. После того, как вы включили свое меню, вы можете передать имя своего меню в приложение ConfBridge(), которое сделает его активным для этого участника. Различные параметры меню перечислены и описаны в «Параметры меню ConfBridge». Сначала давайте посмотрим, как определить новое меню.

Наше первое меню: управление громкостью

Давайте создадим простое меню в файле confbridge.conf. Просто поместите его в нижней части файла ниже раздела [default_bridge]:

Не забывайте, что type=menu является первой строкой под заголовком, иначе ваше меню не будет загружаться в Asterisk.

[volume_ctrl_menu]

type=menu

*5=toggle_mute

1=increase_listening_volume

4=decrease_listening_volume

7=reset_listening_volume

3=increase_talking_volume

6=decrease_talking_volume

9=reset_talking_volume

Меню, которое мы создали, позволяет участнику переключать свой статус отключения звука, увеличивать и уменьшать громкость разговоров и прослушивания, а также сбрасывать их. Чтобы включить это меню, мы просто передаем volume_ctrl_menu в качестве аргумента приложению ConfBridge(). Включение меню выполняется путем перезагрузки модуля app_confbridge.so:

*CLI> module reload app_confbridge.so

— Reloading module ‘app_confbridge.so’ (Conference Bridge Application)

== Parsing ‘/etc/asterisk/confbridge.conf’: Found

Теперь давайте изменим наш диалплан, чтобы любой, кто присоединится к нашей конференции, мог управлять громкостью на конференции. Мы будем использовать наш пример из раздела “Ожидание присоединения маркированного пользователя” в качестве основы для этой конфигурации:

; same bridge for everyone

exten => conference,1,NoOp()

same => n,ConfBridge(primary,,,volume_ctrl_menu)

Единственное изменение, которое мы должны были сделать, это добавить ,,,volume_ctrl_menu после слова primary в строке, которая загружает приложение ConfBridge(). Нам нужны три ведущие запятые, так как меню является четвертым аргументом. (второй аргумент – профиль моста; третий – профиль пользователя, который мы оставили пустым, так как мы используем профили по умолчанию.)

После сохранения изменений перезагрузите диалплан:

*CLI> dialplan reload

Войдите в мост конференций. После входа в систему, попробуйте набрать *5. Вы должны услышать сообщение, в котором говорится: “Ваш микрофон выключен.” Если вы снова наберете *5, вы услышите “Ваш микрофон включён.”

Расширенное меню: использование dialplan_exec

Допустим, мы подумали о некоторой функциональности, которую хотим выполнить с моста конференции, но просматривая доступные опции меню ConfBridge() ни один из них не удовлетворяет нашему требованию. К счастью, у нас есть опция dialplan_exec, которая позволяет нам выполнять любую функциональность, которую мы хотим, используя программирование диалплана.

Пример, который мы собираемся использовать – это временный выход из конференции, предоставление меню для ввода номера телефона, который вы хотите присоединить к конференции и запрос на возвращение на конференцию вместе с новым вызванным участником. Давайте посмотрим, как мы можем сделать это с помощью опции dialplan_exec:

[ConferenceRooms]

; обычный участник

exten => 602,1,NoOp()

same => n,Goto(conference,1)

exten => conference,1,NoOp()

same => n,Set(thisBridge=primary)

same => n,ConfBridge(${thisBridge},,,volume_ctrl_menu)

exten => conference_joiner,1,NoOp()

same => n,Read(numberToDial,vm-enter-num-to-call)

same => n,Originate(SIP/my_itsp/${numberToDial},exten,ConferenceRooms,602,1)

В первой части нашего диалплана мы определяем номер 602, который просто делает Goto() в расширение конференции. Мы удалили конфигурацию функции CONFBRIDGE() так как она здесь не требуется. Расширение конференции затем присоединяется к мосту конференции и переходит в наше volume_ctrl_menu, который будет содержать последовательность DTMF для выполнения следующей части диалплана. Расширение conference_joiner где происходит волшебство. Первая строка выполняет Read(), которое просит участника ввести номер, которому он хочет позвонить.

В этом случае мы установили минимальный функционал, необходимый для того, чтобы заставить систему делать то, что мы хотим. В производственной системе вы, вероятно, захотите ввести некоторые дополнительные элементы управления и проверки, чтобы убедиться, что набраны действительные номера и т.д.

В следующей строке используется приложение Originate() для вызова участника. Первый аргумент – конечная точка, которую мы вызываем; мы используем пира SIP/my_itsp вместе с номером, запрошенным в приложении Read() для создания строки запроса. Второй аргумент – это слово exten, означающее, что мы хотим подключить вызываемого пользователя к расширению в диалплане. Следующие три аргумента являются местоположением в диалплане: контекст ConferenceRooms, расширение 602 и приоритет 1.

После внесения изменений в наш диалплан, нам нужен способ выполнить расширение conference_joiner один раз внутри конференц-моста. Мы делаем это с модификацией файла confbridge.conf. Мы изменим существующий параметр volume_ctrl_menu меню ConfBridge(), чтобы добавить параметр DTMF dialplan_exec:

[volume_ctrl_menu]

type=menu

*5=toggle_mute

1=increase_listening_volume

4=decrease_listening_volume

7=reset_listening_volume

3=increase_talking_volume

6=decrease_talking_volume

9=reset_talking_volume

0=dialplan_exec(ConferenceRooms,conference_joiner,1)

После внесения изменений необходимо перезагрузить наш диалплан и приложение конференц-моста:

*CLI> dialplan reload

*CLI> module reload app_confbridge.so

И теперь мы можем проверить нашу функциональность, позвонив в конференц-мост, а затем нажав цифру 0. Нам будет предложено ввести номер, по которому мы хотим позвонить. После ввода номера, Asterisk вызовет его и попытается присоединиться к ним к мосту конференции после ответа.

Включение видеоконференций

Одной из основных особенностей нового приложения ConfBridge() является использование видеоконференций. Вероятно, лучшая часть этого заключается в том, что это действительно довольно просто реализовать. Есть несколько вещей, которые вы должны знать о возможных проблемах в реализации видеоконференций:

  • Все участники видео должны использовать один и тот же видеокодек; перекодирование видео в Asterisk недоступно.
  • В Asterisk нет мультиплексирования видео; одновременно участнику может быть показан только один источник видео.

Помимо этих двух предостережений, видеоконференция в Asterisk работает довольно хорошо. Давайте начнем с включения нескольких опций в sip.conf, так как мы сосредоточимся на использовании SIP-клиентов для нашей конфигурации.

В sip.conf есть два варианта, которые мы должны включить, оба из них мы можем включить в разделе [general] (если мы просто хотим включить его вообще для всех наших пиров) или в конфигурации пира. Мы будем контролировать, какие пиры получают параметры, изменив существующий шаблон office-phone:

[office-phone](!)

type=friend

context=LocalSets

host=dynamic

nat=force_rport,comedia

secret=welcome

dtmfmode=auto

videosupport=yes

disallow=all

allow=g722

allow=ulaw

allow=alaw

allow=h264

Мы добавили videosupport=yes и allow=h264 в наш шаблон office-phone в sip.conf. С нашими изменениями там, давайте перезагрузим модуль chan_sip пока мы думаем об этом:

*CLI> module reload chan_sip.so

Мы можем проверить наши изменения, запустив sip show peer <peer_identifier> в консоли Asterisk:

*CLI> sip show peer 0000FFFF0001

User=Phone : No

Video Support : Yes

Text Support : No

Def. Username : 0000FFFF0001

SIP Options : (none)

Codecs : (ulaw|alaw|g722|h264)

Codec Order : (g722:20,ulaw:20,alaw:20,h264:0)

Следующий шаг – включить поддержку видео в файле confbridge.conf. Включение video_mode в профиле моста позволит нам установить тип видеорежима, включенного в конференц-мосте. Существует четыре типа, которые мы описываем в разделе “Параметры для профилей мостов”:

  • none
  • follow_talker
  • last_marked
  • first_marked

Наиболее популярным вариантом является follow_talker, который заставляет источник видео переключаться между участниками моста конференции на основе того, кто говорит. Мы включим его в нашем профиле моста в confbridge.conf:

[default_bridge]

type=bridge

video_mode=follow_talker

При любых изменениях в confbridge.conf, нам необходимо перезагрузить app_confbridge.so:

*CLI> module reload app_confbridge.so

Вот и все. Мы можем теперь войти в конференц-мост с клиентом SIP, который поддерживает видео H.264. Клиент, который был хорошо протестирован с Asterisk – это Jitsi, он является кросс-платформенным для Windows, OSX и Linux.

Вывод

В этой главе мы рассмотрели файл features.conf, который содержит функциональные возможности для включения передачи на основе DTMF, включение записи вызовов во время вызова и настройки парковки для одной или нескольких компаний. Мы также рассмотрели различные способы объявления звонков и информации людям в офисе, используя несколько методов пейджинга, включая традиционные системы пейджинга и многоадресный пейджинг телефонных аппаратов на столах сотрудников. После этого мы углубились в приложение ConfBridge(), которое отличается исключительной гибкостью в настройке и богатством доступных функций. Это исследование различных методов реализации традиционных функций парковки, пейджинга и конференц-связи современным способом, как мы надеемся, показало вам гибкость, которую может предложить Asterisk.

1Да, мы понимаем, что сообщение SIP INFO на самом деле является SIP-сообщением, а не технической частью аудиоканала, но дело в том, что вы не можете использовать кнопку «transfer» или «park» на вашем SIP-телефоне для доступа к этим функциям во время вызова. Вам придется отправить DTMF.

2 Мы надеемся вы поймете, что фактическое расширение будет связано с именем канала, которое припарковало вызов, и не будет SIP_0004F2040808 (если только Leif не продаст Вам телефон Polycom из своей лаборатории).

3В синтаксисе имеется определенная гибкость (вы можете посмотреть пример файла для подробностей), но наш пример использует стиль, который мы рекомендуем, так как он наиболее соответствует типичному синтаксису диалплана.

4park-and-page – парковка и пэйджинг (прим. переводчика)

5Bogen UTI1 полезен, поскольку он может обрабатывать всевозможные входящие и исходящие соединения, что почти гарантирует, что вы сможете безболезненно подключить свою телефонную систему к любому внешнему пейджинговому оборудованию, независимо от того, насколько оно старое или малоизвестное.

6В этой книге мы предполагаем, что внешнее пейджинговое оборудование уже установлено и работает со старой телефонной системой.

7Подсказка: канал Local будет вашим другом в этом случае.

8У него даже есть свое собственное зарезервированное IP-адресное пространство класса D от 224.0.0.0 до 239.255.255.255 (но считайте IP multicast, прежде чем вы просто захватите один из них и назначите его). Части этого адресного пространства являются частными, части-общедоступными, а части предназначены для целей, отличных от тех, для которых их можно использовать. Дополнительные сведения о многоадресной рассылки см. на этой странице Википедии.

9Очень громко, и нет возможности настроить усиление.

10ConfBridge() существует с Asterisk 1.8, но это была простая реализация, которая не содержала аудио- или видеоконференции высокой четкости.

11Даже если бы мы сделали что-то вроде Set(CONFBRIDGE(user,pin)=), статически определенный ПИН в confbridge.conf будет иметь приоритет, что означает, что невозможно переопределить ПИН-код ни на что. Мы считаем это функцией безопасности.

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices