355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Джим Меггелен » Asterisk™: будущее телефонии Второе издание » Текст книги (страница 16)
Asterisk™: будущее телефонии Второе издание
  • Текст добавлен: 7 октября 2016, 17:17

Текст книги "Asterisk™: будущее телефонии Второе издание"


Автор книги: Джим Меггелен


Соавторы: Джаред Смит,Лейф Мадсен

Жанр:

   

ОС и Сети


сообщить о нарушении

Текущая страница: 16 (всего у книги 41 страниц)

exten => 101,1,Dial(${JOHN},10)

exten => 101,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => 101,n(unavail),Voicemail(101@default,u) exten => 101,n,Hangup()

exten => 101,n(busy),VoiceMail(101@default,b) exten => 101,n,Hangup()

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

Организация доступа к голосовой почте

Пользователи могут извлекать свои сообщения голосовой почты, менять опции и записывать приветствия голосовой почты с помощью приложения VoiceMailMain(). В своей типовой форме приложение VoiceMailMain() вызывается без аргументов. Добавим в контекст [internal] диалплана добавочный номер 700, чтобы внутренние пользователи могли выполнять звонки для доступа к своим сообщениям голосовой почты: exten => 700,1,VoiceMailMain()

Создание телефонного справочника для набора номера по имени

Осталась последняя заслуживающая внимания функция системы голосовой почты Asterisk – телефонный справочник для набора номера по имени. Создается он с помощью приложения Directory(). Это приложение, используя имена, заданные в описаниях почтовых ящиков в файле voicemail.conf, предоставляет абоненту телефонный справочник абонентов АТС для набора номеров по имени.

Directory() принимает три аргумента: контекст голосовой почты, из которого считываются имена, контекст диалплана, в котором вызывается пользователь (необязательный), и строку опций (также необязательный). По умолчанию Directory() ведет поиск пользователя по фамилии. Если передается опция f, поиск осуществляется по имени. Добавим два справочника для набора номера по имени в контекст [incoming] нашего образца диалплана, чтобы абоненты могли выполнять поиск или по имени, или по фамилии:

exten => 8,1,Directory(default,incoming,f) exten => 9,1,Directory(default,incoming)

Если абоненты нажмут кнопку 8, они получат справочник, составленный по именам. Если они наберут 9, то получат справочник, составленный по фамилиям.

Макрос

Макросы[76]76
  Макрос похож на подпрограмму диалплана общего назначения, но ему свойственна проблема переполнения стека, поэтому не следует создавать в макросах вызовы с более чем пятикратной глубиной вложенности. На момент написания данной книги мы не располагаем информацией о том, будет ли приложение Macro доработано для версии 1.4 или переписано для будущих версий. Если планируется выполнять множество вложенных макросов (и вызывать в их рамках сложные функции), есть вероятность возникновения нестабильности. Проблему выявит всего лишь один тестовый звонок, поэтому, если диалплан проходит тестирование, он готов к работе. Также рекомендуется обратить внимание на приложения Gosub и Return, поскольку зачастую функциональность, реализуемая с помощью Macro(), на самом деле может быть получена без его использования. Также, будьте добры, отметьте, что мы не предлагаем не использовать Macro(). Это фантастический инструмент, обладающий замечательными рабочими характеристиками; ему просто свойственны некоторые проблемы с вложенностью.


[Закрыть]
– очень полезная структура, разработанная во избежание повторов в диалплане. Также они облегчают задачу по внесению изменений в диалплан. Чтобы проиллюстрировать это, снова вернемся к нашему примеру диалплана. Если вы помните, при внесении изменений для голосовой почты мы остановились на следующем варианте добавочного номера для Джона: exten => 101,1,Dial(${J0HN},10)

exten => 101,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => 101,n(unavail),Voicemail(101@default,u) exten => 101,n,Hangup()

exten => 101,n(busy),VoiceMail(101@default,b) exten => 101,n,Hangup()

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

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

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

Лучший способ оценить макрос – увидеть его в деле, так что прямо сейчас и приступим.

Описание макроса

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

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

Имена макросов должны начинаться со служебного слова macro-. Это отличает их от обычных контекстов. Команды внутри макроса формируются практически аналогично всем остальным элементам диалпла– на; единственное ограничение – макросы используют только добавочный номер s. Введем логику голосовой почты в макрос, заменяя по ходу добавочные номера на s:

[macro-voicemail]

exten => s,1,Dial(${JOHN},10)

exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)

exten => s,n(unavail),Voicemail(101@default,u)

exten => s,n,Hangup()

exten => s,n(busy),VoiceMail(101@default,b)

exten => s,n,Hangup()

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

Вызов макроса из диалплана

Использовать макрос в диалплане нам поможет приложение Macro(). Оно вызывает заданный макрос и передает в него необходимые аргументы. Например, чтобы вызвать наш макрос голосовой почты из диал– плана, можно сделать следующее:

exten => 101,1,Macro(voicemail) Приложение Macro() определяет также несколько специальных переменных. К ним относятся: ${MACRO_CONTEXT}

Исходный контекст, в котором был вызван макрос. ${MACRO_EXTEN}

Исходный добавочный номер, в котором был вызван макрос.

${MACRO_PRIORITY}

Исходный приоритет, в котором был вызван макрос.

${ARG n}

n-ный аргумент, передаваемый в макрос. Например, первым был бы аргумент ${ARG1}, вторым – ${ARG2} и т. д.

Как говорилось ранее, описанный выше макрос был жестко определен для Джона, тогда как должен быть универсальным. Давайте изменим его и вместо номера почтового ящика 101 будем использовать переменную ${MACRO_EXTEN}. Таким образом, при вызове макроса из добавочного номера 101 сообщения голосовой почты будут приходить в почтовый ящик 101; если макрос будет вызван из добавочного номера 102, сообщения пойдут в почтовый ящик 102, и т. д.: [macro-voicemail] exten => s,1,Dial(${JOHN},10)

exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u) exten => s,n,Hangup()

exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b) exten => s,n,Hangup()

Использование аргументов в макросе

Итак, мы уже близки к получению того макроса, какой нам нужен, осталось внести последнее изменение. Необходимо передать в макрос канал, по которому будут выполняться вызовы, потому что до сих пор в нем жестко прописан канал ${JOHN} (помните, мы определяли переменную JOHN как канал для звонков Джону?). Передадим канал как аргумент – и наш первый макрос будет готов: [macro-voicemail] exten => s,1,Dial(${ARG1},10)

exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => s,n(unavail),Voicemail(${MCARO_EXTEN}@default,u)

exten => s,n,Hangup()

exten => s,n(busy),VoiceMail(${MCARO_EXTEN}@default,b) exten => s,n,Hangup()

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

exten => 101,1,Macro(voicemail,${JOHN}) exten => 102,1,Macro(voicemail,${JANE}) exten => 103,1,Macro(voicemail,${JACK})

И для 50 или более пользователей этот диалплан сохранит свою четкость и организованность; для каждого пользователя просто будет создана строка со ссылкой на макрос, который может быть настолько сложным, насколько это необходимо. Может существовать даже несколько разных макросов для различных типов пользователей, таких как executives (руководство), courtesy_phones (телефоны справочной службы), call_center_agents (агенты центра обработки вызовов), analog_ sets (аналоговые телефоны), sales_department (отдел продаж) и т. д. Более сложная версия макроса может выглядеть примерно так: [macro-voicemail] exten => s,1,Dial(${ARG1},20) exten => s,n,Goto(s-${DIALSTATUS},1) exten => s-NOANSWER,1,Voicemail(${MACRO_EXTEN},u) exten => s-NOANSWER,n,Goto(incoming,s,1) exten => s-BUSY,1,Voicemail(${MACRO_EXTEN},b) exten => s-BUSY,n,Goto(incoming,s,1) exten => _s-.,1,Goto(s-NOANSWER,1)

Этот макрос использует замечательный побочный эффект приложения Dial(): Dial() задает переменную DIALSTATUS как индикатор успешности или неуспешности вызова. В данном случае обрабатываются варианты NOANSWER (не отвечает) и BUSY (занято), а все остальные результаты трактуются как NOANSWER.

Использование базы данных Asterisk (AstDB)

Ну что, пока довольны? Дальше будет еще интереснее! В Asterisk есть мощный механизм для хранения значений, который называется базой данных Asterisk (AstDB). AstDB обеспечивает простой способ хранения данных для использования в диалплане.

Для тех, кто имеет опыт использования реляционных баз данных, таких как PostgreSQL или MySQL, заметим, что база данных Asterisk не является традиционной реляционной базой данных. Это база данных Berkeley DB версии 1. Существует несколько способов хранения данных из Asterisk в реляционной базе данных. Подробнее о реляционных базах данных рассказывается в главе 12.

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

Хранение данных в AstDB

Для сохранения нового значения в базе данных Asterisk используется приложение SetQ[77]77
  В предыдущих версиях Asterisk были приложения DBput() и DBget(), которые использовались для задания и извлечения значения из AstDB. Если вы используете старую версию Asterisk, применяйте эти приложения.


[Закрыть]
, но с его помощью задается переменная не канала, а AstDB. Например, чтобы присвоить ключу count семейства test значение 1, необходимо записать следующее:

exten => 456,1,Set(DB(test/count)=1)

Если в семействе test уже есть ключ count, его значение будет заменено на новое. Также можно сохранять значения из командной строки Asterisk, выполнив команду database put семейство ключ значение. Для нашего примера надо ввести следующее: data base put test count 1.

Извлечение данных из AstDB

Чтобы извлечь значение из базы данных Asterisk и присвоить его переменной, используется все то же приложение Set(). Давайте извлечем значение count (опять же из семейства test), присвоим его переменной COUNT и затем воспроизведем это значение абоненту:

exten => 456,1,Set(DB(test/count)=1) exten => 456,n,Set(COUNT=${DB(test/count)}) exten => 456,n,SayNumber(${COUNT})

Также можно проверять значение заданного ключа из командной строки Asterisk, выполнив команду database get семейство ключ. Для просмотра всего содержимого AstDB используется команда database show.

Удаление данных из AstDB

Существует два способа удаления данных из базы данных Asterisk.

Чтобы удалить ключ, можно использовать приложение DB DELETE().

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

; удаляет ключ и возвращает его значение за один шаг

exten => 457,1,Verbose(0, The value was ${DB_DELETE(test/count)})

Также можно удалить все семейство ключей, используя приложение DBdeltree(). Оно принимает всего один аргумент – имя семейства ключей, подлежащего удалению. Чтобы удалить все семейство test, делаем следующее:

exten => 457,1,DBdeltree(test)

Для удаления ключей и семейств ключей AstDB из командной строки используются команды database del ключ и database deltree семейство соответственно.

Использование AstDB в диалплане

Существует бесконечное число вариантов использования базы данных Asterisk в диалплане. Чтобы представить AstDB, рассмотрим два простых примера. Первый – простой пример вычисления, демонстрирующий постоянство базы данных Asterisk (имеется в виду, что она устойчива к перезагрузкам системы). Во втором примере с помощью функции BLACKLIST() будет определена принадлежность номера к черному списку и необходимость его блокировки.

Для начала в примере с воспроизведением счета извлечем число (значение ключа count) из базы данных и присвоим его переменной COUNT. Если такой ключ не существует, DB() возвратит NULL (нет значения). Чтобы проверить наличие значения в базе данных, введем функцию ISNULL(), которая будет контролировать, возвращено ли значение. В случае если этого не произошло, мы присвоим AstDB исходное значение 1 с помощью приложения Set(). Следующий приоритет возвратит нас к приоритету 1. Это произойдет при первом вызове данного добавочного номера:

exten => 678,1,Set(COUNT=${DB(test/count)})

exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)

exten => 678,n,Set(DB(test/count)=1)

exten => 678,n,Goto(1)

exten => 678,n(continue),NoOp()

Далее будет воспроизведено текущее значение COUNT. После этого оно будет увеличено на 1:

exten => 678,1,Set(COUNT=${DB(test/count)})

exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)

exten => 678,n,Set(DB(test/count)=1)

exten => 678,n,Goto(1)

exten => 678,n(continue),NoOp()

exten => 678,n,SayNumber(${COUNT})

exten => 678,n,Set(COUNT=$[${COUNT} + 1])

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

exten => 678,1,Set(COUNT=${DB(test/count)})

exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)

exten => 678,n,Set(DB(test/count)=1)

exten => 678,n,Goto(1)

exten => 678,n(continue),NoOp()

exten => 678,n,SayNumber(${COUNT})

exten => 678,n,Set(COUNT=$[${COUNT} + 1])

exten => 678,n,Set(DB(test/count)=${COUNT})

Наконец вернемся к первому приоритету. Теперь приложение будет продолжать счет:

exten => 678,1,Set(COUNT=${DB(test/count)})

exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)

exten => 678,n,Set(DB(test/count)=1)

exten => 678,n,Goto(1)

exten => 678,n(continue),NoOp()

exten => 678,n,SayNumber(${COUNT})

exten => 678,n,Set(COUNT=$[${COUNT} + 1]

exten => 678,n,Set(DB(test/count)=${COUNT})

exten => 678,n,Goto(1)

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

В следующем примере логика диалплана будет организована вокруг функции BLACKLIST(), которая проверяет наличие Caller ID (ID звонящего) текущего абонента в черном списке. (Черный список – это просто семейство AstDB, называемое blacklist.) Если функция BLACKLIST() находит номер в черном списке, она возвращает значение 1, в противном случае возвращается 0. Эти значения в сочетании с приложением GotoIf() могут использоваться для управления выполнением приложения Dial() при вызове:

exten => 124,1,GotoIf($[${BLACKLIST()]?blocked,1) exten => 124,n,Dial(${JOHN})

exten => blocked,1,Playback(privacy-you-are-blacklisted) exten => blocked,n,Playback(vm-goodbye) exten => blocked,n,Hangup()

Чтобы добавить номер в черный список, выполните команду database put blacklist номер 1 из интерфейса командной строки Asterisk.

Полезные функции Asterisk

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

Zapateller()

Zapateller() – это простое приложение Asterisk, которое воспроизводит специальный информационный тон в начале звонка. Устройства автоматического набора (обычно используемые в системах продаж по телефону) принимают этот тон за сигнал разъединения линии. Причем они не только прекратят вызов, но также пометят данный номер как не обслуживаемый, что поможет избежать всех видов телемаркетинговых звонков. Чтобы использовать эту функциональность в своем диалпла– не, вам надо просто вызвать приложение Zapateller().

Также применим необязательную опцию nocallerid, чтобы тон воспроизводился только в случае, если входящий вызов не предоставляет информации о Caller ID (ID звонящего). Вот пример использования приложения Zapateller() в добавочном номере контекста [incoming]:

[incomimg]

exten => s,1,Zapateller(nocallerid) exten => s,n,Playback(enter-ext-of-person)

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

Еще одна удобная функция – парковка вызова. Она обеспечивает возможность перевести вызов в состояние ожидания, поставить его на «парковку», чтобы он мог быть принят на другом добавочном номере. Все параметры парковки вызовов (такие, как используемые добавочные номера, количество мест и т. д.) задаются в конфигурационном файле features.conf. Раздел [general] файла features.conf содержит четыре настройки, касающиеся парковки вызовов: parkext

Это добавочный номер для парковки. Передайте вызов на этот добавочный номер – и система сообщит, в какой парковочный слот он помещен. Добавочный номер для парковки по умолчанию – 700.

parkpos

Эта опция определяет количество парковочных слотов. Например, задав номера 701-720, вы создадите 20 парковочных слотов с нумерацией от 701 до 720.

context

Это имя контекста парковки. Чтобы иметь возможность парковать вызовы, необходимо включить этот контекст.

parkingtime

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

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

Также обратите внимание, что, поскольку пользователю необходимо иметь возможность переводить вызовы на добавочный номер парковки, в приложении Dial() должны использоваться опции t и/или T. Итак, давайте создадим простой диалплан для демонстрации парковки вызовов: [incoming]

include => parkedcalls

exten => 103,1,Dial(SIP/Bob,,tT) exten => 104,1,Dial(SIP/Charlie,,tT)

Проиллюстрируем принцип работы парковки вызовов. Скажем, Элис звонит в систему и набирает добавочный номер 103, чтобы поговорить с Бобом. Через некоторое время Боб переводит вызов на добавочный номер 700, который сообщает ему, что звонок от Элис был припаркован в слот 701. После этого Боб звонит Чарли на добавочный номер 104 и говорит ему, что Элис ожидает по номеру 701. Чарли набирает добавочный номер 701 и разговаривает с Элис. Это простой и эффективный способ обеспечить возможность переключения вызывающих абонентов между пользователями системы.

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

Организация конференц-связи с помощью MeetMe()

Не менее полезной функцией является установление аудиоконференц– связи с помощью приложения MeetMeQ[78]78
  В мире традиционных офисных АТС этот тип функциональности очень дорог. Приходится или выкладывать бешеные суммы за внешний сервис обеспечения конференц-связи, или доукомплектовывать специализированную офисную АТС дорогим коммутатором для такой возможности.
  Если вы хотите увидеть, как выглядят волны с разной частотой на осциллографе, воспользуйтесь программой Sound Frequency Analyzer от компании Reliable Software. Это на самом деле простое и забавное средство, позволяющее «увидеть» звук. Спектрограф дает хорошее изображение сложных гармонических колебаний, генерируемых нашим голосом, а также позволяет различать фоновые звуки, которые всегда окружают нас. Также советуем попробовать раздражающий, но при этом восхитительный NCH Tone Generator от компании NCH Swift Sound.
  «Последняя миля» – термин, изначально используемый для описания единственного участка PSTN, не переведенного на оптоволоконные кабели: соединение между центральной АТС и абонентом. Однако последняя миля – это более широкое понятие, поскольку она имеет значение как ценный актив традиционных телефонных компаний; они владеют каналом связи, идущим в ваш дом. Последнюю милю становится все сложнее и сложнее описать с технической точки зрения, потому что сегодня существует огромное количество способов подключения абонента к сети. Если рассматривать ее как вещь, имеющую стратегическую ценность для телефонной компании, кабель и прочее оборудование, ее важность очевидна.


[Закрыть]
. Это приложение обеспечивает возможность одновременного общения множества абонентов так, как если бы они все физически находились в одном месте. К основным функциям относятся:

• Возможность создания защищенных паролем конференций.

• Администрирование конференции (отключение звука конференции, блокировка конференции, исключение участников).

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

• Создание статических или динамических конференций.

Давайте поэтапно рассмотрим процесс настройки базового конференц– зала. Конфигурационные опции для системы конференц-связи MeetMe располагаются в файле meetme.conf. В этом конфигурационном файле задаются конференц-залы и необязательные числовые пароли. (Если пароль задан, он будет необходим для входа на все конференции, проводимые с использованием этого конференц-зала.) Для нашего примера настроим конференц-зал по добавочному номеру 600. Сначала зададим все настройки в файле meetme.conf. Назовем этот конференц-зал 600 и на этот раз не будем задавать пароль: [rooms] conf => 600

Закончив работу с конфигурационным файлом, необходимо перезагрузить Asterisk, чтобы она могла повторно прочитать файл meetme.conf. Далее добавим поддержку конференц-зала в диалплан, используя приложение MeetMe(). MeetMe() принимает три аргумента: имя конференц– зала (заданное в meetme.conf), набор опций и пароль, который пользователь должен ввести, чтобы присоединиться к конференции. Настроим простую конференцию, используя конференц-зал 600, опцию i (которая обеспечивает оповещение о том, что кто-то присоединился или покинул конференцию) и пароль 54321:

exten => 600,1,MeetMe(600,i,54321) Вот и все! Когда абоненты попадут на добавочный номер 600, им будет предложено ввести пароль. Если они правильно введут 54321, то попадут на конференцию. Полный список всех опций, поддерживаемых приложением MeetMe(), представлен в приложении В. Другое полезное приложение – MeetMeCount(). Как следует из его имени, это приложение подсчитывает, сколько пользователей находится в том или ином конференц-зале. Оно принимает два аргумента: конференц-зал, где необходимо подсчитать количество участников, и необязательное имя переменной, в которой нужно сохранить это число. Если второй аргумент, то есть имя переменной, не задан, полученное число воспроизводится вызывающему абоненту: exten => 601,1,Playback(conf-thereare) exten => 601,n,MeetMeCount(600) exten => 601,n,Playback(conf-peopleinconf)

Если вторым аргументом в MeetMeCount() передается переменная, итоговое количество участников присваивается этой переменной, а само число не воспроизводится. Так можно ограничивать количество участников:

; ограничить конференц-зал 10 участниками exten => 600,1,MeetMeCount(600,CONFCOUNT)

exten => 600,n,GotoIf($[${CONFCOUNT} <= 10]?meetme:conf_full,1) exten => 600,n(meetme),MeetMe(600,i,54321)

exten => conf_full,1,Playback(conf-full) Разве Asterisk не забавна?

Заключение

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

7

Что такое телефония

Один телефон – это необходимость, два телефона – богатство, три телефона – роскошь, а ни одного телефона – блаженство.

– Дуг Ларсон

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

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

Аналоговая телефония

Назначение коммутируемой телефонной сети общего пользования (Public Switched Telephone Network, PSTN) – установление и обслуживание аудиосвязи между двумя конечными точками с целью передачи речи.

Хотя люди могут воспринимать звуковые колебания частотой в диапазоне 20-20 000 Гц1, большинство создаваемых нами звуков располагаются в диапазоне 250-3000 Гц. Поскольку назначение телефонной сети – передача человеческой речи, она была разработана с полосой пропускания примерно 3-3500 Гц. Такой ограниченный частотный диапазон означает, что некоторое качество звука теряется (что может засвидетельствовать любой, кому приходилось слушать музыку, проигрываемую во время ожидания), особенно на высоких частотах.

Составляющие части аналогового телефона

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

Звонок

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

Н| ' Напряжение звонка может быть высоким. При работе с под-ключенн°й телефонной линией необходимо обязательно пред– V""^'' принимать меры предосторожности.

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

В Северной Америке количество звонковых устройств, которые можно подключить к линии, зависит от коэффициента эквивалентности звонка (Ringer Equivalence Number, REN) используемых устройств. Общий REN всех устройств, подключенных к линии, не может превышать 5,0. Старые аналоговые телефоны с электромеханическим звонком имеют REN 1,0. REN некоторых электронных телефонов равен 0,3 или даже меньше. Если подключить слишком много устройств, для питания которых будет необходимо большое напряжение, ни одно из них не сможет генерировать звонок.

Номеронабиратель

*

При выполнении телефонного звонка необходимо как-то сообщить сети адрес стороны, с которой вы хотите связаться. Номеронабиратель – это часть телефона, предоставляющая такую функциональность. На заре развития PSTN номеронабиратели были роторными устройствами, которые определяли введенные цифры по импульсам. Это был довольно медленный процесс, поэтому телефонные компании в конце концов перешли на тональный набор. Номеронабиратель для тонального набора, также известного как двухканальный многочастотный (Dual-Tone Multi Frequency, DTMF), состоит из 12 кнопок. За каждой кнопкой закреплено две частоты (табл. 7.1).

Таблица 7.1. Символы DTMF


1209 Гц 1336 Гц 1477 Гц 1633 Гц*
697 Гц123A
770 Гц456B
852 Гц789C
941 Гц*0#D

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

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

Гибридный (или сетевой) трансформатор

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

свой голос чересчур громко; очень мало местного эффекта – и абонент решит, что линия отключена.

Рычажный переключатель. Это устройство сигнализирует о состоянии телефонной цепи на центральную АТС. Когда абонент снимает трубку своего телефона, рычажный переключатель замыкает цепь между ним и центральной АТС, что выглядит как запрос на получение тонального сигнала готовности линии. Когда абонент вешает трубку, рычажный переключатель размыкает цепь, что свидетельствует о завершении вы– зова1.

Рычажный переключатель также может использоваться для обмена сигналами. Некоторые электронные аналоговые телефоны имеют кнопку с надписью Link (Связь), при нажатии которой возникает мгновенное событие сброса (flash). Сброс можно выполнить вручную, нажав рычажный переключатель и удерживая его 200-1200 мс. Если удерживать переключатель в нажатом состоянии дольше, канал связи может интерпретировать это как завершение разговора. Назначение кнопки Link – реализация функциональности мгновенного нажатия рычажного переключателя. Если вы когда-нибудь использовали функцию отложенного вызова или вели разговор с подключением третьего абонента на аналоговой линии, вы применяли мгновенное нажатие рычажного переключателя с целью передачи сигналов в сеть.

Телефонная трубка. Телефонная трубка состоит из передатчика и приемника. Она осуществляет преобразования между звуковой энергией, используемой человеком, и электрической энергией, используемой телефонной сетью.

Tip и Ring

В аналоговой телефонной сети имеется два провода. В Серверной Америке эти провода называют Tip (Земля) и Ring (Вход)2. Эта терминология сложилась во времена, когда соединение по телефону выполнялось живыми операторами на пультах коммутации. Используемые ими штекеры имели два контакта: один располагался на верхушке штекера, а другой подключался к кольцу, охватывающему штекер посередине (рис. 7.1).

2

Tip – это провод с положительной полярностью питания. В Северной Америке этот провод обычно зеленого цвета и обеспечивает обратную цепь. Ring – это провод с отрицательной полярностью. В Северной Америке этот провод обычно красный. Для современных кабелей Cat 5 и 6 Tip – это обычно белый провод, а Ring – цветной. Когда трубка те-Говоря о состоянии аналоговой линии, люди часто употребляют понятия «занято» и «свободно». Если линия «занята», значит, выполняется разговор по телефону. Если линия «свободна», телефон, по сути, выключен, или не занят.


    Ваша оценка произведения:

Популярные книги за неделю