fork official Definitive-Guide-5th-Edition
|
@ -0,0 +1,18 @@
|
|||
# Аннотация
|
||||
|
||||
Разрабатывайте систему передачи голоса по IP \(VoIP\) или традиционную систему АТС с Asterisk, даже если у вас только базовые знания в области телекоммуникаций. Это руководство - путеводитель, который проведет вас от установки до настройки этого open source программного обеспечения, независимо от того, обновляете ли вы существующую телефонную систему или создаете с нуля.
|
||||
|
||||
Это обновленное пятое издание, идеально подходящее для администраторов Linux, разработчиков и опытных пользователей, показывает, как настроить АТС на основе VoIP на предприятии. Вы познакомитесь с функциями в Asterisk 16 - актуальный, на данный момент, релиз с долгосрочной поддержкой от Digium. Эта книга также включает в себя новые главы по [WebRTC](glava-20.md) и [Asterisk Real-time Interface \(ARI\)](glava-19.md).
|
||||
|
||||
* Узнайте как WebRTC предоставляет новое направление для Asterisk
|
||||
* Получите знания для постройки простой, но полноценной телефонной системы
|
||||
* Создайте интерактивный диалплан, используя лучшие практики для расширенных возможностей Asterisk
|
||||
* Узнайте как ARI стал предпочтительным API для взаимодействия языков веб-разработки с Asterisk
|
||||
|
||||

|
||||
|
||||
[Содержание книги](summary.md)
|
||||
|
||||
[Электронную версию книги можно скачать здесь](https://clck.ru/RRNqY)
|
||||
|
||||
[](https://github.com/translaster/Definitive-Guide-5th-Edition/network) [](https://github.com/translaster/Definitive-Guide-5th-Edition/stargazers)
|
|
@ -0,0 +1,7 @@
|
|||
# Об авторах
|
||||
|
||||
**Джим Ван Меггелен** является партнером-основателем и техническим директором компании Clearly Core Inc. - канадского поставщика решений для телефонии с открытым исходным кодом. Он имеет почти 30-летний опыт работы в сфере корпоративных телекоммуникаций, обладая обширными знаниями как в области устаревших телекоммуникаций, так и в области VoIP.
|
||||
|
||||
**Рассел Брайант** - выдающийся инженер компании Red Hat, где он работает над проектами облачной инфраструктуры. До работы в Red Hat Рассел провел семь лет работая в Digium над проектом Asterisk. Роль Рассела в Digium началась как разработчика программного обеспечения и завершилась тем, что он стал руководителем проекта Asterisk и инженером-менеджером команды, занимающейся разработкой Asterisk.
|
||||
|
||||
**Лейф Медсен** является архитектором обеспечения облачных услуг в команде CloudOps в Red Hat, где он руководит инженерными разработками по обеспечению гарантий обслуживания как телекоммуникационных, так и корпоративных компаний. Он впервые связался с сообществом Asterisk, когда искал решение для голосовой конференции. Как только он узнал, что официальной документации Asterisk не существует - он стал соучредителем проекта Asterisk Documentation Project.
|
|
@ -0,0 +1,50 @@
|
|||
# Важные изменения
|
||||
|
||||
## 15.11.19
|
||||
|
||||
Перевел [Главу 9](glava-09.md) - Интернационализация
|
||||
|
||||
## 23.10.19
|
||||
|
||||
Перевел [Главу 22](glava-22.md) - Безопасность.
|
||||
|
||||
## 11.10.19
|
||||
|
||||
Перевел [Главу 10](glava-10.md), не перечитывал - возможны неточности.
|
||||
|
||||
## 01.10.19
|
||||
|
||||
Перевел [Главу 19 ARI](glava-19.md), но надо будет перечитать и если что поправить.
|
||||
|
||||
## 26.09.19
|
||||
|
||||
Закончил перевод [1 главы](glava-01.md).
|
||||
|
||||
## 25.09.19
|
||||
|
||||
Закончил перевод [7 главы](glava-07.md), пока никуда на сторонние ресурсы не заливал.
|
||||
|
||||
Частично переведена 10 - продолжу с ней.
|
||||
|
||||
## 30.08.19
|
||||
|
||||
Закончил перевод [6 главы](glava-06.md) - доступна на [atsip.ru](http://atsip.ru/pomoshch/kniga-asterisk-4-redaktsiya/354-glava-6-osnovy-dialplana).
|
||||
|
||||
Возьмусь за 7 и остальные понемногу.
|
||||
|
||||
## 26.08.19
|
||||
|
||||
Закончил перевод [5 главы](glava-05.md), доступно на [atsip.ru](http://atsip.ru/pomoshch/kniga-asterisk-4-redaktsiya/353-glava-5-konfiguratsiya-polzovatelskikh-ustrojstv)
|
||||
|
||||
Берусь за перевод [6 главы](glava-06.md).
|
||||
|
||||
## 21.08.19
|
||||
|
||||
Залито имеющееся содержимое книги.
|
||||
|
||||
Начал перевод 5 главы.
|
||||
|
||||
Уже переведены:
|
||||
|
||||
* Глава 20 - WebRTC
|
||||
* Глава 4 - Сертификаты безопасности для конечных точек
|
|
@ -0,0 +1,119 @@
|
|||
# Глава 1. Революция в телефонии
|
||||
|
||||
> Мы - то, за чем они растут. Это истинное бремя всех мастеров.
|
||||
>
|
||||
> – Джедай Магистр Йода
|
||||
|
||||
Когда мы впервые решили в 2004 году написать книгу об Asterisk (15 лет назад, считая от этого издания!), мы уверенно предсказывали, что Asterisk кардинально изменит телекоммуникационную отрасль. Сегодня революция, которую мы предсказали, является частью истории. Asterisk уже несколько лет является самой успешной управленческой автоматической телефонной станцией (УАТС) в мире и является признанной технологией в телекоммуникационной отрасли.
|
||||
|
||||
Революция, столь же необходимая, как и для телекоммуникационной индустрии того времени-значительно затихла просто потому, что методы, с помощью которых люди любят общаться, изменились. В то время как 25 лет назад телефонные звонки были предпочтительным способом общения на расстоянии, нынешняя тенденция заключается в отправке сообщений или проведении видеоконференций. Телефонный звонок воспринимается как нечто мертвое, особенно будущими поколениями. Мы еще не совсем готовы к похоронам.
|
||||
|
||||
Asterisk остается мощной технологией, и мы считаем, что она по-прежнему является одной из лучших надежд на какую-либо разумную интеграцию между телекоммуникационными и всеми другими технологиями, с которыми могут захотеть соединиться компании. Ему необходимо будет найти свое место в коммуникационной экосистеме, которая больше не ставит телефонные звонки в важное место. Мы ожидаем, что WebRTC, который обещает коммерциализировать веб-коммуникации<sup><a href="#sn1">1</a></sup>, появится в качестве замены для всех подражателей, закрытых и проприетарных продуктов “сотрудничества”, которые в настоящее время наводняют (и запутывают) рынок. Asterisk может сыграть свою роль в этом новом будущем, и сообщество Asterisk охотно и с энтузиазмом взяло на себя эту новую концепцию. Итак, может быть, вам говорят, что голос мертв, но любой, кто обратил внимание на любую научную фантастику любого рода, знает, что возможность разговаривать друг с другом на больших расстояниях не будет единственной областью тех, кто печатает на клавиатурах. Люди любят поговорить, и мы будем продолжать искать способы сделать это.
|
||||
|
||||
Следует отметить, что существует также огромное поколение людей, чьи воспоминания предшествуют интернету, и для этих людей телефон по-прежнему является очень полезной технологией. Если кто-то хочет иметь с ними дело - ему лучше хорошо справляться с телефонными звонками. Эти люди уходят с работы, но их кошельки все еще имеют много влияния. Возможно, АТС - это умирающая вещь, но ее хвост очень длинный.
|
||||
|
||||
В этой книге мы собираемся исследовать гайки и болты Asterisk. Это гибкий, открытый, отвечающий стандартам инструментарий, который, по нашему мнению, все еще очень актуален для бизнеса сегодня и будет оставаться полезным в течение многих лет. Сила Asterisk заключается в его гибкости. Он оказался очень полезным при связывании различных типов коммуникационных технологий вместе, и если он хочет иметь какое-либо будущее - ему нужно будет продолжать это делать. Новые технологии, такие как WebRTC, предлагают всяческие возможности для будущего общения, и сообщество Asterisk очень сосредоточено на этом сдвиге парадигмы.
|
||||
|
||||
Замечательная гибкость Asterisk имеет свою цену: она не так проста для изучения или настройки. Это не потому, что она нелогична, запутана или загадочна; напротив, это очень разумно и практично. Глаза людей загораются, когда они впервые видят диалплан Asterisk и начинают осознавать возможности. Но когда есть буквально тысячи способов достижения результата, процесс, естественно, требует дополнительных усилий. Это можно сравнить со строительством дома: компоненты относительно легко понять, но человек, рассматривающий такую задачу, должен либо а) заручиться компетентной помощью, либо б) развить необходимые навыки посредством обучения, практики и хорошей книги по этому вопросу.
|
||||
|
||||
## Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией
|
||||
|
||||
Иногда кажется, что мы забыли, что цель телефона - позволить людям общаться. На самом деле это простая цель, и мы должны иметь возможность сделать это гораздо более гибкими и творческими способами, чем доступны нам в настоящее время. Новые технологии всегда стремятся доминировать на рынке с помощью собственного предложения. Мало кому это удается. Коммуникационные технологии должны взаимодействовать, и такие технологии как Asterisk, снижают барьеры для входа для тех, кто хочет внедрять инновации.
|
||||
|
||||
Именно по этой причине — коммуникация — мы считаем, что будущее все еще существует для проектов телефонии с открытым исходным кодом, таких как Asterisk. Да, люди могут больше не хотеть делать “телефонные звонки”, но мы считаем, что в разговорах все еще будет ценность. Технологии, которые могут облегчить эти разговоры, иногда развиваются, казалось бы, радикальными способами, но основное желание общаться остается тем же самым.
|
||||
|
||||
Asterisk подключен к будущему, и у него есть длинный послужной список успешной интеграции коммуникационных технологий.
|
||||
|
||||
### Проект телефонии Zapata
|
||||
|
||||
Когда проект Asterisk был запущен (в 1999 году), существовали и другие проекты телефонии с открытым исходным кодом. Тем не менее, Asterisk в сочетании с проектом Zapata Telephony смогла обеспечить интерфейсы телефонной сети общего пользования (ТфОП), что стало важной вехой в переходе программного обеспечения от чего-то чисто сетевого к чему-то более практичному в мире телекоммуникаций в то время, когда он был ориентирован на ТфОП.
|
||||
|
||||
Проект телефонии Zapata был задуман Джимом Диксоном, инженером-консультантом по телекоммуникациям, который был вдохновлен невероятными достижениями в скорости процессора, которые компьютерная индустрия теперь воспринимает как должное. Диксон считал, что гораздо более экономичные системы телефонии можно было бы создать, если бы существовала карта, на которой не было бы ничего, кроме основных электронных компонентов, необходимых для взаимодействия с телефонной линией. Вместо того, чтобы иметь дорогие компоненты на карте, цифровая обработка сигналов (DSP)<sup><a href="#sn2">2</a></sup> будет обрабатываться в процессоре с помощью программного обеспечения. Хотя это наложило бы огромную нагрузку на процессор, Диксон был уверен, что низкая стоимость процессоров по сравнению с их производительностью делает их гораздо более привлекательными, чем дорогие DSP, и, что более важно, что соотношение цены и производительности будет продолжать улучшаться по мере увеличения мощности процессоров.
|
||||
|
||||
Как и многие провидцы, Диксон верил, что многие другие увидят эту возможность и ему просто нужно подождать, пока кто-то другой создаст то, что для него было очевидным улучшением. Через несколько лет он заметил, что не только никто не создавал эти карты, но и казалось маловероятным, что кто-то когда-нибудь собирался. В тот момент было ясно, что если он хочет революции, то должен начать ее сам. Так родился проект телефонии Zapata:
|
||||
|
||||
> Поскольку эта концепция была настолько революционной, что наверняка вызвала бы много волн в индустрии, я выбрал мексиканский революционный мотив и назвал технологию и организацию в честь знаменитого мексиканского революционера Эмилиано Сапаты. Я решил назвать карту "tormenta“, что по-испански означает ”шторм”, но в контексте оно обычно используется для обозначения большого шторма, такого как ураган или что-то подобное.
|
||||
|
||||
Возможно, нам следует называть себя Asteristas. Несмотря на это, мы должны поблагодарить Джима Диксона, частично за то, что он придумал это и частично за то, что довел до конца, но в основном за то, что дал результаты своих усилий сообществу с открытым исходным кодом. В результате вклада Джима появился двигатель ТфОП Asterisk. И благодаря этому сочетанию VoIP и ТфОП родилась телекоммуникационная революция с открытым исходным кодом!
|
||||
|
||||
За прошедшие годы интерфейс телефонии Zapata в Asterisk был изменен и улучшен. Телефония Digium Asterisk Hardware Device Interface (DAHDI), используемая сегодня, является детищем вклада Джима Диксона.
|
||||
|
||||
## Массовые изменения требуют гибкости технологий
|
||||
|
||||
Каждая существующая АТС страдает от недостатков. Независимо от того, насколько полнофункциональной она является, что-то всегда будет упущено, потому что даже самая многофункциональная АТС не сможет предвидеть творчество клиента. Небольшая группа пользователей захочет иметь странную маленькую функцию, о которой проектная группа либо не думала, либо не могла оправдать стоимость её создания, и, поскольку система закрыта - пользователи не смогут создать ее сами.
|
||||
|
||||
Если бы интернет был таким образом затруднен регулированием и коммерческими интересами - сомнительно, что он получил бы широкое признание, которым пользуется в настоящее время. Открытость интернета означала, что любой желающий мог позволить себе принять в нем участие. Так что все так и сделали. Десятки тысяч умов, которые сотрудничали в создании интернета, принесли то, что ни одна корпорация в одиночку никогда не смогла бы получить<sup><a href="#sn3">3</a></sup>.
|
||||
|
||||
Как и во многих других проектах с открытым исходным кодом (как Linux, так и множество важного программного обеспечения, работающего в интернете), разработка Asterisk была подпитана мечтами людей, которые знали, что должно быть что-то большее, чем то, что производят традиционные отрасли. Эти люди знали, что если бы можно было взять лучшие части различных АТС и разделить их на взаимосвязанные компоненты - подобно коробке с кирпичиками LEGO, можно было бы начать понимать вещи, которые не переживут традиционный корпоративный процесс анализа рисков.
|
||||
|
||||
Сама Asterisk стала основой многих массово производимых творений. И все же, под капотом, душа этого проекта остается с открытым исходным кодом.
|
||||
|
||||
## Asterisk: хакерская УАТС
|
||||
|
||||
Asterisk является основной АТС хакера. Термин _хакер_, был искажен средствами массовой информации в значении “злостный взломщик” для необразованных. Это прискорбно, потому что термин фактически существовал задолго до того, как СМИ испортили его значение. Хакеры создали сетевой движок, который стал интернетом. Хакеры создали Apple Macintosh и операционную систему Unix. Хакеры также строят свою следующую телекоммуникационную систему. Да, некоторые из этих людей являются злостными, но умы, которые управляют разработкой Asterisk, хорошо знают об этом, и вы обнаружите, что Asterisk позволяет создавать систему, которая способна довольно быстро реагировать на угрозы безопасности. Программное обеспечение с открытым исходным кодом не скрывает свои недостатки за корпоративными отделами. Грязь вытаскивают на открытое место, где с ней можно справиться. Вместо того чтобы ограничиваться сомнительной и часто плохой безопасностью закрытых систем - сообщество Asterisk быстро реагирует на меняющиеся тенденции в области безопасности, и вы сможете точно настроить свою телефонную систему в соответствии с корпоративной политикой и лучшими отраслевыми практиками.
|
||||
|
||||
Как и другие системы с открытым исходным кодом, Asterisk сможет превратиться в гораздо более безопасную платформу, чем любая проприетарная система, несмотря на свои хакерские корни, а скорее даже благодаря им.
|
||||
|
||||
## Asterisk: профессиональная УАТС
|
||||
|
||||
Asterisk - это технология поддержки, и, как и в случае с Linux, все реже можно найти предприятие, которое не запускает какую-либо версию Asterisk, в каком-то качестве в своей сети, решая проблему так, как может только Asterisk. Вы уже используете Asterisk, даже если об этом не знаете.
|
||||
|
||||
## Сообщество Asterisk
|
||||
|
||||
Нет смысла ходить вокруг да около: сообщество Asterisk - это тень его прежнего "я". Десять лет назад Asterisk была самой крутой вещью с открытым исходным кодом. Сегодня большинство энтузиастов двинулись дальше. Однако остается опытное и проверенное в боях сообщество профессионалов, которые были там и сделали это.
|
||||
|
||||
Не ждите от команды людей, готовых бесплатно работать над вашими проектами. Цена вступления в это сообщество - личная заинтересованность в развитии навыков. Если вы обратитесь к сообществу с наглостью - вам не понравятся ответы. Однако если вы проявите любопытство, энтузиазм и желание погрузиться в работу, запачкать руки и заняться ею, то найдете сообщество, более чем готовое поделиться с вами своими трудами и добытыми знаниями.
|
||||
|
||||
Ниже приведены некоторые из мест, где обитает сообщество Asterisk.
|
||||
|
||||
### Дискусионный сайт сообщества Asterisk
|
||||
|
||||
В 2015 году Asterisk переместила свои официальные форумы на [https://](https://community.asterisk.org/)[community.asterisk.org/](https://community.asterisk.org/). Похоже, что это самое активное сообщество сейчас, и отношение сигнал/шум отличное. Сотрудники Digium хорошо справляются с этой задачей, и некоторые из их старших и опытных людей принимают активное участие.
|
||||
|
||||
Имейте в виду, что это не похоже на платную поддержку. От вас ожидают, что вы будете выполнять работу самостоятельно, но вы можете рассчитывать на получение хороших качественных советов, которые направят вас в правильном направлении.
|
||||
|
||||
### Списки рассылки Asterisk
|
||||
|
||||
Активность в этих списках сократилась до минимума (с сотен сообщений в день до, возможно, дюжины потоков в месяц). Они, вероятно, наиболее полезны в качестве исторического архива, но, возможно, стоит туда обратиться когда вы сталкиваетесь с неразрешимой проблемой. Списки рассылки вы найдете по адресу [lists.digium.com](http://lists.digium.com/), эти два, вероятно, будут наиболее полезными:
|
||||
|
||||
*Asterisk-Users*
|
||||
|
||||
Этот список-тень его прежнего себя. В то время как раньше он генерировал несколько сотен сообщений в день, большая часть этого трафика переместилась на сайт сообщества Digium Asterisk (выше).
|
||||
|
||||
*Asterisk-Dev*
|
||||
|
||||
Разработчики Asterisk тусуются здесь. Целью и направленностью этого списка является обсуждение разработки программного обеспечения Asterisk, и участники активно защищают эту цель. Ожидайте много гнева, если опубликуете что-либо в этом списке, не относящееся конкретно к программированию или разработке базы кода Asterisk. Общие вопросы кодирования (такие как запросы о взаимодействии с AGI или AMI) должны быть направлены в список *Asterisk-Users*.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/warning.png" height="100" align="left">Список <i>Asterisk-Dev</i> не является поддержкой второго уровня! Если вы прокрутите архивы списков рассылки, то увидите, что это строгое правило. Список рассылки <i>Asterisk-Dev</i> посвящен обсуждению основных разработок Asterisk, а вопросы по взаимодействию с внешними программами через AGI или AMI должны быть размещены в списке <i>Asterisk-Users</i>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Сайт Asterisk Wiki
|
||||
|
||||
Это не совсем тусовка сообщества, но она заслуживает упоминания. Digium поддерживает Вики для Asterisk по адресу [wiki.asterisk.org](http://wiki.asterisk.org/), этот сайт постоянно обновляется командой Digium, и автоматизированные скрипты экспортируют документацию на основе XML из источников Asterisk в саму Вики, что помогает гарантировать актуальность данных.
|
||||
|
||||
Более старая Вики существует по адресу [www.voip-info.org](http://www.voip-info.org/), что в наши дни является своего рода историческим курьезом и источником большого просветления и путаницы. Хотя здесь содержится огромное количество информации, большая ее часть устарела. Мы включаем ссылку на неё здесь просто потому, что вы, вероятно, попадёте на неё в один прекрасный день и подумаете что попали в материнскую жилу, но то, что вы на самом деле нашли, больше похоже на музей исторических странностей: увлекательно, но необязательно актуально.
|
||||
|
||||
### IRC-каналы
|
||||
|
||||
Сообщество Asterisk поддерживает каналы Internet Relay Chat (IRC) на _irc.freenode.net_. Двумя наиболее активными каналами являются _#asterisk_ и _#asterisk-dev_<sup><a href="#sn4">4</a></sup>. Чтобы сократить количество вторжений спам-ботов, оба этих канала требуют регистрации для присоединения. Чтобы зарегистрироваться, запустите `/msg nickserv help` при подключении к службе через ваш любимый IRC-клиент.
|
||||
|
||||
## Вывод
|
||||
|
||||
Так с чего начать? Что ж, когда речь заходит об Asterisk, можно говорить гораздо больше, чем мы можем вписать в одну книгу. Эта книга может только заложить основы, но из этого фундамента вы сможете прийти к пониманию концепции Asterisk - и из этого, кто знает, что вы будете строить?
|
||||
|
||||
<ol>
|
||||
<li id="sn1"> И, возможно, еще, учитывая, что WebRTC также революционизирует нативные приложения!</li>
|
||||
|
||||
<li id="sn2"> Термин DSP также означает цифровой сигнальный процессор, который представляет собой устройство (обычно чип), способное интерпретировать и изменять сигналы различных видов. В голосовой сети DSP в первую очередь отвечают за кодирование, декодирование и перекодирование аудиоинформации. Это может потребовать много вычислительных усилий.</li>
|
||||
|
||||
<li id="sn3"> Мы понимаем, что технология интернета сформировалась из государственных и академических институтов, но то, о чем мы здесь говорим - это не столько технология интернета, сколько культурный феномен его, который взорвался в начале 90-х годов.</li>
|
||||
|
||||
<li id="sn4"> Канал <i>#asterisk-dev</i>. предназначен для обсуждения изменений в базовой кодовой базе Asterisk и также не является поддержкой второго уровня. Обсуждения, связанные с программированием внешних приложений, которые взаимодействуют с Asterisk через AGI или AMI, должны быть в <i>#asterisk</i>.</li>
|
||||
</ol>
|
||||
|
||||
[Предисловие](preface.md) | [Содержание](summary.md) | [Глава 2. Архитектура Asterisk](chapter-02.md)
|
|
@ -0,0 +1,396 @@
|
|||
# Глава 2. Архитектура Asterisk
|
||||
|
||||
> *Прежде всего, но не обязательно в таком порядке.*
|
||||
>
|
||||
> – Доктор Кто
|
||||
|
||||
Asterisk очень отличается от других, более традиционных УАТС тем, что диалплан в Asterisk обрабатывает все входящие каналы по существу одинаково, а не разделяя их на станции, транки, периферийные модули и т.д.
|
||||
|
||||
В традиционной АТС существует логическое различие между станциями (телефонными аппаратами) и транками (магистралями - ресурсами, которые подключаются к внешнему миру). Это ограничение делает творческую маршрутизацию в традиционных УАТС очень сложной или невозможной.
|
||||
|
||||
Asterisk, с другой стороны, не имеет внутреннего понятия транков или станций. В Asterisk все, что входит или выходит из системы, проходит через какой-то канал. Существует множество различных типов каналов; однако диалплан Asterisk обрабатывает все каналы аналогичным образом, что означает, например, внутренний пользователь может существовать на конце внешнего транка (например, сотовый телефон) и обрабатываться диалпланом точно так же, как если бы пользователь был на внутреннем номере. Если вы не работали с традиционной АТС[1](#sdfootnote1sym), то может быть не сразу очевидно насколько это является мощным и освобождающим. Рисунок 2-1 иллюстрирует различия между этими двумя архитектурами.
|
||||
|
||||

|
||||
*Рисунок 2-1. Архитектура Asterisk против УАТС*
|
||||
|
||||
## Модули
|
||||
|
||||
Asterisk построена на *модулях*. Модуль — это загружаемый компонент, обеспечивающий определенную функциональность, такую как драйвер канала (например, chan_pjsip.so) или ресурс, который позволяет подключиться к внешней технологии (например func_odbc.so). Модули Asterisk загружаются на основе параметров, определенных в файле */etc/asterisk/modules.conf*. Мы обсудим использование многих модулей в этой книге, но на этом этапе мы просто хотим представить концепцию модулей и дать вам представление о типах модулей, которые доступны.
|
||||
|
||||
На самом деле можно запустить Asterisk вообще без каких-либо модулей, хотя в этом состоянии он ничего не сможет сделать. Это бывает полезно для понимания модульной природы Asterisk для оценки архитектуры.
|
||||
|
||||
В ы можете запустить Asterisk без модулей, загружаемых по умолчанию и загружать каждый нужный модуль вручную из консоли, но это не то, что вы хотели бы запустить в продакшн; это было бы полезно только в том случае, если бы вы настраивали производительность системы, в которой хотели убрать все, что не требуется вашим конкретным приложением Asterisk.
|
||||
|
||||
Типы модулей в Asterisk включают в себя следующие:
|
||||
|
||||
- Приложения - рабочие лошадки диалплана, такие как Dial(), Voicemail(), Playback(), Queue() и т.д.
|
||||
- Модули соединения — механизмы, которые соединяют каналы (вызовы) друг с другом
|
||||
- Модули записи деталей вызовов (CDR)
|
||||
- Модули регистрации событий канала (CEL)
|
||||
- Драйверы каналов — различные соединения с системой и из системы; SIP (Session Initiation Protocol) использует канальный драйвер PJSIP
|
||||
- Трансляторы кодеков — преобразовывают различные кодеки как G729, G711, G722, Speex и так далее
|
||||
- Интерпретаторы форматов — как указано выше, но относящиеся к файлам, хранящимся в файловой системе
|
||||
- Функции диалплана — расширенные возможности диалплана
|
||||
- Модули УАТС
|
||||
- Модули ресурсов
|
||||
- Дополнительные модули
|
||||
- Тестовые модули
|
||||
|
||||
Существует официальный список типов статуса поддержки, включенных в menuselect[2](#sdfootnote2sym).
|
||||
|
||||
### Приложения
|
||||
|
||||
Приложения диалплана используются в *extensions.conf* для определения различных действий, применимых к вызову. Например, приложение Dial() отвечает за создание исходящих соединений с внешними ресурсами и, возможно, является самым важным приложением диалплана. Доступные приложения перечислены в Таблице 2-1.
|
||||
|
||||
*Таблица 2-1. Популярные приложения диалплана*
|
||||
|
||||
| Имя | Назначение |
|
||||
| ------------------- | ------------------------------------------------------------ |
|
||||
| app_authenticate | Сравнивает сигналы набора DTMF с указанной строкой (паролем) |
|
||||
| app_cdr | Записывает данные в CDR |
|
||||
| app_chanspy | Позволяет каналу прослушивать аудио на другом канале |
|
||||
| app_confbridge | Обеспечивает конференц-связь |
|
||||
| app_dial | Используется для соединения каналов вместе (т. е. для совершения телефонных звонков) |
|
||||
| app_directed_pickup | Отвечает на вызов, который вызывает другой добавочный номер |
|
||||
| app_directory | Представляет список имен из *voicemail.conf* |
|
||||
| app_dumpchan | Дамп переменных канала в интерфейс командной строки Asterisk (CLI) |
|
||||
| app_echo | Эхо-сигналы, полученные обратно в исходный канал (может быть полезно для демонстрации задержки) |
|
||||
| app_exec | Содержит Exec(), TryExec() и ExecIf(): выполняет приложение диалплана по условию |
|
||||
| app_mixmonitor | Записывает обе стороны вызова (передача и прием) и смешивает их вместе в один файл |
|
||||
| app_originate | Позволяет логике диалплана инициировать вызов (в отличие от вызова, поступающего на канал) |
|
||||
| app_page | Создает несколько аудио соединений с указанными устройствами для публичного вещания (пейджинг) |
|
||||
| app_parkandannounce | Включает автоматическое оповещение о припаркованных вызовах |
|
||||
| app_playback | Воспроизведение файла в канал (не принимает ввод) |
|
||||
| app_playtones | Воспроизведение пар тонов указанных частот (в основном DTMF) |
|
||||
| app_queue | Обеспечивает автоматическое распределение вызовов (ACD) |
|
||||
| app_read | Запрашивает ввод цифр от абонентов и назначает ввод переменной |
|
||||
| app_readexten | Запрашивает ввод цифр у вызывающих абонентов и передает вызов на указанный добавочный номер и контекст |
|
||||
| app_record | Запись полученного аудио в файл |
|
||||
| app_senddtmf | Передает DTMF вызывающей стороне |
|
||||
| app_stack | Обеспечивает Gosub(), GoSubIf(), Return(), SteckPop(), LOCAL() и Local_PEEK() |
|
||||
| app_stasis | Передает управление вызовами в приложение ARI - многие разработчики Asterisk используют это приложение, а оттуда обрабатывают всю остальную часть своей разработки за пределами диалплана Asterisk |
|
||||
| app_system | Выполняет команды в Linux shell |
|
||||
| app_transfer | Выполняет трансфер на текущем канале |
|
||||
| app_voicemail | Предоставляет голосовую почту |
|
||||
| app_while | Включает While(), EndWhile(), ExitWhile() и ContinueWhile(); обеспечивает функциональность цикла while в диалплане |
|
||||
|
||||
### Модули соединений
|
||||
|
||||
Модули соединений выполняют фактическое соединение каналов. Эти модули, перечисленные в Таблице 2-2, в настоящее время используются только для (и необходимы) *app_confbridge*.
|
||||
|
||||
*Таблица 2-2. Модули соединений*
|
||||
|
||||
| Имя | Назначение |
|
||||
| ----------------------- | ------------------------------------------------------------ |
|
||||
| bridge_builtin_features | Выполняет соединение при использовании встроенных пользовательских функций (например, найденных в *features.conf*). |
|
||||
| bridge_multiplexed | Выполняет сложное мультиплексирование, как требуется в большом конференц-зале (несколько участников). В настоящее время используется только app_confbridge. |
|
||||
| bridge_simple | Выполняет простое соединение канал-канал. |
|
||||
| bridge_softmix | Выполняет простое мультиплексирование, как требуется в большом конференц-зале (несколько участников). В настоящее время используется только app_confbridge. |
|
||||
|
||||
В следующих разделах мы рассмотрели список модулей, которые, по нашему мнению, достаточно важны для обсуждения в этой книге. Вы найдете много других модулей в загрузке Asterisk, но многие старые модули либо устарели, либо имеют слабую поддержку или вовсе не поддерживаются, и поэтому не рекомендуются для производства, если у вас нет доступа к разработчикам, которые могут поддерживать их для вас.
|
||||
|
||||
### Модули записи деталей вызова (CDR)
|
||||
|
||||
Модули CDR, перечисленные в Таблице 2-3, предназначены для обеспечения как можно большего числа методов хранения записей сведений о вызовах. CDR можно хранить в файле (по умолчанию), базе данных, RADIUS или *syslog*.
|
||||
|
||||
З аписи деталей вызовов не предназначены для использования в сложных приложениях биллинга. Если вам требуется больше контроля над биллингом и отчетностью о вызовах - обратите внимание на журнал событий канала (CEL), обсуждаемый далее. Преимущество CDR заключается в том, что он просто работает.
|
||||
|
||||
*Таблица 2-3. Общие модули записи деталей вызова*
|
||||
|
||||
| Имя | Назначение |
|
||||
| ----------------- | ------------------------------------------------------------ |
|
||||
| cdr_adaptive_odbc | Позволяет записывать CDR через платформу ODBC с возможностью добавления пользовательских полей |
|
||||
| cdr_csv | Записывает CDR на диск в файл с разделителями-запятыми (CSV) |
|
||||
| cdr_custom | Записывает CDR в файл CSV, но допускает добавление пользовательских полей |
|
||||
| cdr_odbc | Пишет CDR через ODBC фреймворк |
|
||||
| cdr_syslog | Записывает CDR в *syslog* |
|
||||
|
||||
### Модули **журналирования** событий канала
|
||||
|
||||
Регистрация событий канала (CEL) обеспечивает гораздо более мощный контроль над отчетами об активности вызовов. Кроме того, он требует более тщательного планирования вашего плана набора и ни в коем случае не будет работать автоматически. Модули Asterisk CEL перечислены в Таблице 2-4.
|
||||
|
||||
*Таблица 2-4. Модули логирования событий канала*
|
||||
|
||||
| Имя | Назначение |
|
||||
| ----------- | ---------------- |
|
||||
| cel_custom | CEL на диск/файл |
|
||||
| cel_manager | CEL в AMI |
|
||||
| cel_odbc | CEL в ODBC |
|
||||
|
||||
### Драйверы каналов
|
||||
|
||||
Без драйверов каналов у Asterisk не было бы возможности совершать или принимать вызовы. Каждый драйвер канала специфичен для протокола или типа канала, который он поддерживает (SIP, ISDN и т.д.). Модуль канала действует как шлюз к ядру Asterisk. Некоторые из наиболее популярных драйверов каналов Asterisk перечислены в Таблице 2-5.
|
||||
|
||||
*Таблица 2-5. Популярные драйверы каналов*
|
||||
|
||||
| Имя | Назначение |
|
||||
| ------------------ | ------------------------------------------------------------ |
|
||||
| chan_bridge | Используется внутри приложения ConfBridge(); не должен использоваться напрямую |
|
||||
| chan_dahdi | Обеспечивает подключение к картам ТфОП, использующим драйверы каналов DAHDI |
|
||||
| chan_local | Предоставляет механизм для обработки части диалплана как канала |
|
||||
| chan_motif | Реализует протокол Jingle, включая возможность подключения к Google Talk и Google Voice; представлен в Asterisk 11 |
|
||||
| chan_multicast_rtp | Обеспечивает подключение к потокам многоадресного Realtime Transport Protocol (RTP) |
|
||||
| chan_pjsip | Драйвер канала Session Initiation Protocol (SIP) |
|
||||
|
||||
### Трансляторы кодеков
|
||||
|
||||
Трансляторы кодеков[3](#sdfootnote3sym) (часто называемые *транскодерами*) позволяют Asterisk конвертировать форматы аудиопотоков между вызовами. Поэтому, если вызов поступает по каналу PRI (используя G.711) и должен быть передан в сжатый канал SIP (например, используя G.729 - один из многих кодеков, которые может обрабатывать SIP), соответствующий транслятор кодека выполнит преобразование.
|
||||
|
||||
Кодеки - это сложные алгоритмы, обрабатывающие преобразование аналоговой информации (в данном случае звука, но также может быть и видео) в цифровой формат. Многие кодеки также обеспечивают сжатие и исправление ошибок, но это не является обязательным требованием.
|
||||
|
||||
Е сли кодек (например G.729) использует сложный алгоритм кодирования, интенсивное использование транскодинга может создать огромную нагрузку на процессор. Специализированное оборудование для декодирования/кодирования G.729 доступно от производителей оборудования, таких как Sangoma и Digium (и, вероятно, других).
|
||||
|
||||
Asterisk делает довольно хорошую работу по поддержке кодеков, но в основном сосредоточен на кодеках, обычно используемых телефонными приложениями (в отличие от кодеков, используемых, скажем, для музыки или видео, таких как MP3 или MP4). Они перечислены в Таблице 2-6.
|
||||
|
||||
*Таблица 2-6. Общие трансляторы кодеков*
|
||||
|
||||
| **Название** | Назначение |
|
||||
| -------------- | ------------------------------------------------------------ |
|
||||
| codec_alaw | Кодек PCM A-law используется во всем мире для ТфОП (кроме Канады/США). Этот кодек (вместе с ulaw) должен быть включен на всех ваших каналах. |
|
||||
| codec_g729 | До недавнего времени это был запатентованный кодек, но теперь он является бесплатным. На момент написания этой статьи он по-прежнему продается Digium в качестве дополнения, но его также можно найти в виде бесплатного пакета. Это очень популярный кодек, если требуется сжатие (и использование процессора не является проблемой), но он накладывает нагрузку на процессор, добавляет задержку к вызовам, немного снижает качество и никоим образом не уменьшает накладные расходы. |
|
||||
| codec_a_mu | Прямой конвертер A-law в mu-law. |
|
||||
| codec_g722 | Широкополосный аудиокодек. |
|
||||
| codec_gsm | Кодек Global System for Mobile Communications (GSM). Очень низкое качество звука. |
|
||||
| codec_ilbc | Интернет-кодек с низким битрейтом (iLBC). |
|
||||
| codec_lpc10 | Линейный предсказательный кодирующий вокодер (чрезвычайно низкая пропускная способность). |
|
||||
| codec_opus | Предназначен для замены speex (и vorbis). |
|
||||
| codec_resample | Пересемлирование между 8-ми и 16-тибитными линейными сигналами. |
|
||||
| codec_speex | Кодек Speex. |
|
||||
| codec_ulaw | Кодек PCM Mu-law, используемый на ТфОП в Канаде/США. Более точно описывается как μ-закон, но не у многих людей есть греческая буква μ на клавиатуре, поэтому обычно пишется как ulawa. Часто является кодеком по умолчанию, и должен быть включен на всех ваших каналах. |
|
||||
|
||||
a Произносится как “мью-лоу”, но так же вы часто будете слышать как "ю-лоу".
|
||||
|
||||
D igium предоставляет некоторые дополнительные полезные модули кодеков: codec_g729, codec_silk, codec_siren7 и codec_siren14. Эти модули кодеков не являются open source по различным причинам. Вы должны приобрести лицензию на использование codec_g729, но остальные являются бесплатными. Вы можете найти их на сайте Digium.
|
||||
|
||||
### Интерпретаторы формата
|
||||
|
||||
Интерпретаторы форматов в Таблице 2-7 выполняют ту же функцию, что и трансляторы кодеков, но они работают с файлами, а не с каналами, и обрабатывают не только аудио. Если у вас есть запись в меню, которая была сохранена как GSM - вам нужно будет использовать интерпретатор формата для воспроизведения этой записи на любые каналы, не использующие кодек GSM[4](#sdfootnote4sym).
|
||||
|
||||
Если вы храните запись в нескольких форматах одновременно (например, WAV, GSM и т. д.), Asterisk определит наименее затратный формат[5](#sdfootnote5sym) для использования, когда каналу необходимо воспроизвести эту запись.
|
||||
|
||||
*Таблица 2-7. Интерпретаторы форматов*
|
||||
|
||||
| **Название** | Воспроизведение файлов, хранящихся в |
|
||||
| ----------------- | ------------------------------------------------------------ |
|
||||
| format_g729 | G.729: .*g729* |
|
||||
| format_gsm | RPE-LTP (оригинальный кодек GSM): .*gsm* |
|
||||
| format_h264 | H.264 video: .*h264* |
|
||||
| format_ilbc | Интернет кодек с низким битрейтом: .*ilbc* |
|
||||
| format_jpeg | Графический файл: .*jpeg*, .*jpg* |
|
||||
| format_ogg_vorbis | Ogg контейнер: .*ogg* |
|
||||
| format_pcm | Различные форматы импульсно-кодовой модуляции: .*alaw*, .*al*, .*alw*, .*pcm*, .*ulaw*, .*ul*, .*mu*, .*ulw*, .*g722*, .*au* |
|
||||
| format_siren14 | G.722.1 Annex C (14 kHz): .*siren14* |
|
||||
| format_siren7 | G.722.1 (7 kHz): .*siren7* |
|
||||
| format_sln | 8-bit signed linear: .*sln*, .*raw* |
|
||||
| format_vox | .*vox* |
|
||||
| format_wav | .*wav* |
|
||||
| format_wav_gsm | GSM аудио в контейнере WAV: .*wav*, .*wav49* |
|
||||
|
||||
### Функции диалплана
|
||||
|
||||
Функции диалплана, перечисленные в Таблице 2-8, дополняют приложения диалплана (смотри [“Приложения”](). Они предоставляют множество полезных улучшений для таких вещей, как обработка строк, смещение времени и даты и подключение ODBC.
|
||||
|
||||
|
||||
|
||||
|
||||
*Таблица 2-8. Cписок полезных функций диалплана*
|
||||
|
||||
| **Название** | Назначение |
|
||||
| --------------------- | ------------------------------------------------------------ |
|
||||
| func_audiohookinherit | Позволяет записывать звонки после трансфера |
|
||||
| func_blacklist | Пишет/читает черный список в *astdb* |
|
||||
| func_callcompletion | Получает/устанавливает параметры конфигурации завершения вызова для канала |
|
||||
| func_callerid | Получает/устанавливает идентификатор звонящего (Caller ID) |
|
||||
| func_cdr | Получает/устанавливает переменную CDR |
|
||||
| func_channel | Получает/устанавливает информацию канала |
|
||||
| func_config | Включает AST_CONFIG(); считывает переменные из файла конфигурации |
|
||||
| func_curl | Использует cURL для получения данных из URI |
|
||||
| func_cut | Делит и нарезает строки |
|
||||
| func_db | Предоставляет функции *astdb* |
|
||||
| func_devstate | Получает состояние устройства |
|
||||
| func_dialgroup | Создает группу для одновременного набора |
|
||||
| func_dialplan | Проверяет, что назначенная цель существует в диалплане |
|
||||
| func_env | Включает FILE(), STAT() и ENV(); выполняет действия операционной системы |
|
||||
| func_global | Получает/устанавливает глобальные переменные |
|
||||
| func_groupcount | Получает/устанавливает количество каналов для участников группы |
|
||||
| func_hangupcause | Получает/устанавливает информацию о зависании из канала |
|
||||
| func_logic | Включает ISNULL(), SET(), EXISTS(), IF(), IFTIME()и IMPORT(); выполняет различные логические функции |
|
||||
| func_math | Включает MATH(), INC() и DEC(); выполняет математические функции |
|
||||
| func_odbc | Позволяет интегрировать диалплан с ресурсами ODBC |
|
||||
| func_rand | Возвращает случайное число в заданном диапазоне |
|
||||
| func_realtime | Выполняет поиск в Asterisk Realtime Architecture (ARA) |
|
||||
| func_redirecting | Предоставляет доступ к информации о том, откуда был перенаправлен этот вызов |
|
||||
| func_shell | Выполняет операции оболочки Linux и возвращает результаты |
|
||||
| func_sprintf | Выполняет функции строкового формата, аналогичные функции C с тем же именем |
|
||||
| func_srv | Выполняет поиски SRV в диалплане |
|
||||
| func_strings | Включает в себя более десятка функций обработки строк |
|
||||
| func_timeout | Получает / устанавливает таймауты на канале |
|
||||
| func_uri | Преобразует строки в URI-безопасную кодировку |
|
||||
| func_vmcount | Возвращает количество сообщений в папке голосовой почты для определенного пользователя. |
|
||||
|
||||
### PBX Модули
|
||||
|
||||
Модули PBX - это периферийные модули, обеспечивающие улучшенные механизмы управления и настройки. Например, pbx_config - это модуль, загружающий традиционный диалплан Asterisk. Доступные в настоящее время модули PBX перечислены в Таблице 2-9.
|
||||
|
||||
*Таблица 2-9. PBX модули*
|
||||
|
||||
| **Название** | Назначение |
|
||||
| ------------ | ------------------------------------------------------------ |
|
||||
| pbx_config | Этот модуль предоставляет традиционный, популярный язык диалплана для Asterisk. Без этого модуля Asterisk не может читать *extensions.conf*. |
|
||||
| pbx_dundi | Выполняет поиск данных в удаленных системах Asterisk. |
|
||||
| pbx_realtime | Предоставляет функциональные возможности, связанные с архитектурой Asterisk Realtime. |
|
||||
| pbx_spool | Обеспечивает поддержку исходящих сообщений, относящихся к файлам вызовов Asterisk. |
|
||||
|
||||
### Модули ресурсов
|
||||
|
||||
Модули ресурсов интегрируют Asterisk с внешними ресурсами. Эта группа модулей фактически превратилась в универсальное средство для вещей, которые не вписываются в другие категории. Разобьем их на несколько подгрупп модулей, которые связаны между собой.
|
||||
|
||||
#### Бэкэнды конфигурации
|
||||
|
||||
Asterisk по умолчанию настроен с использованием текстовых файлов в */etc/asterisk*. Модули, перечисленные в Таблице 2-10, предоставлют альтернативные методы настройки. Смотри [Глав]()[у]()[ 15]() для получения подробной документации по настройке конфигурации на основе базы данных.
|
||||
|
||||
*Таблица 2-10. Конфигурационные бэкэнд-модули*
|
||||
|
||||
| **Название** | Назначение |
|
||||
| --------------- | ------------------------------------------------------------ |
|
||||
| res_config_curl | Получает информацию о конфигурации, используя cURL |
|
||||
| res_config_ldap | Получает информацию о конфигурации, используя LDAP |
|
||||
| res_config_odbc | Получает информацию о конфигурации, используя ODBC |
|
||||
|
||||
#### Итеграция календаря
|
||||
|
||||
Asterisk включает некоторую интеграцию с календарными системами. Вы можете читать и записывать информацию календаря из диалплана. Вы также можете иметь звонки на основе записей календаря. Интеграция основного календаря обеспечивается модулем res_calendar. Остальные модули предоставляют возможность подключения к определенным типам календарных серверов. Таблица 2-11 перечисляет модули интеграции календаря.
|
||||
|
||||
*Таблица 2-11. Модули интеграции календаря*
|
||||
|
||||
| **Название** | Назначение |
|
||||
| ---------------------- | ------------------------------------------------------------ |
|
||||
| res_calendar | Обеспечивает базовую интеграцию с календарными системами |
|
||||
| res_calendar_caldav | Позволяет функциям, предоставляемым res_calendar , подключаться к календарям через CalDAV |
|
||||
| res_calendar_exchange | Позволяет функциям res_calendar подключаться к MS Exchange |
|
||||
| res_calendar_icalendar | Позволяет функциям res_calendar подключаться к Apple/Google iCalendar |
|
||||
|
||||
#### Другие модули ресурсов
|
||||
|
||||
Таблица 2-12 включает остальные модули ресурсов, которые не вписываются в одну из подгрупп, которые мы определили ранее в этом разделе.
|
||||
|
||||
*Tаблица 2-12. Модули ресурсов*
|
||||
|
||||
| **Название** | **Назначение** |
|
||||
| ------------------ | ------------------------------------------------------------ |
|
||||
| res_adsi | Предоставляет ADSIa |
|
||||
| res_agi | Предоставляет Asterisk Gateway Interface (смотри [Глав](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)[у](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)[ 18](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)) |
|
||||
| res_corosync | Предоставляет распределенные сообщения индикации ожидания (MWI) и состояние устройства уведомления через Corosync Cluster Engine |
|
||||
| res_crypto | Предоставляет криптографические возможности |
|
||||
| res_curl | Предоставляет общие подпрограммы для других модулей cURL |
|
||||
| res_fax | Предоставляет общие подпрограммы для других факсимильных модулей |
|
||||
| res_fax_spandsp | Плагин для факса с использованием пакета `spandsp` |
|
||||
| res_http_post | Обеспечивает поддержку POST upload для HTTP-сервера Asterisk |
|
||||
| res_http_websocket | Обеспечивает поддержку WebSocket для внутреннего HTTP-сервера Asterisk (требуется WebRTC) |
|
||||
| res_monitor | Предоставляет ресурсы записи разговоров |
|
||||
| res_musiconhold | Предоставляет ресурсы музыки на удержании (MOH) |
|
||||
| res_mutestream | Позволяет заглушить/включить звук аудиопотоков |
|
||||
| res_odbc | Предоставляет общие подпрограммы для других модулей ODBC |
|
||||
| res_phoneprov | Автонастройка телефонов с HTTP-сервера Asterisk |
|
||||
| res_pktccops | Предоставляет ресурсы PacketCable COPS |
|
||||
| res_security_log | Включает ведение журнала событий безопасности, генерируемых другими частями Asterisk |
|
||||
| res_snmp | Предоставляет информацию о состоянии системы в SNMP-managed network |
|
||||
| res_speech | Общий API распознавания речиb |
|
||||
| res_stasis | Связывает различные компоненты инфраструктуры приложений Stasis |
|
||||
| res_xmpp | Предоставляет ресурсы XMPP (FKA Jabber) |
|
||||
|
||||
a Хотя большинство функций ADSI в Asterisk никогда не используется - приложение голосовой почты использует этот ресурс.
|
||||
|
||||
b Для использования требуется отдельно лицензируемый продукт.
|
||||
|
||||
### Дополнительные модули
|
||||
|
||||
Дополнительные модули - это разработанные сообществом модули с правами на использование или распространение, отличными от основного кода (Таблица 2-13). Они хранятся в отдельном каталоге и не компилируются и не устанавливаются по умолчанию. Чтобы включить эти модули, используйте утилиту настройки сборки menuselect.
|
||||
|
||||
*Таблица 2-13. Дополнительные модули*
|
||||
|
||||
| **Название** | Назначение | Популярность/статус |
|
||||
| ---------------- | ------------------------------------------------------------ | ------------------- |
|
||||
| chan_ooh323 | Позволяет совершать и принимать VoIP звонки по протоколу H323 | Usable |
|
||||
| format_mp3 | Позволяет Asterisk воспроизводить MP3 файлы | Usable |
|
||||
| res_config_mysql | Использует базу данных MySQL как сервер конфигурации в режиме реального времени | Useful |
|
||||
|
||||
### Тестовые модули
|
||||
|
||||
Тестовые модули используются командой разработчиков Asterisk для проверки нового кода. Они постоянно меняются и добавляются, и не являются полезными, если вы не разрабатываете программное обеспечение Asterisk.
|
||||
|
||||
Однако если вы являетесь разработчиком Asterisk, то набор тестов Asterisk может представлять для вас интерес, поскольку вы можете создавать автоматизированные тесты для Asterisk и отправлять их обратно в проект, работающий на нескольких различных операционных системах и типах машин. Постоянно расширяя число тестов, проект Asterisk позволяет избежать создания регрессий в коде. Отправляя свои собственные тесты в проект - вы можете чувствовать себя более уверенно в будущих обновлениях.
|
||||
|
||||
Более подробная информация о тестах доступна в разделе [“](http://bit.ly/14SLEqs)[Asterisk Test Suite](http://bit.ly/14SLEqs)[”](http://bit.ly/14SLEqs), или вы можете присоединиться к каналу *#asterisk-testing* в IRC-сети Freenode.
|
||||
|
||||
## Файловая структура
|
||||
|
||||
Asterisk - сложная система, состоящая из множества ресурсов. Эти ресурсы используют файловую систему несколькими способами. Поскольку Linux настолько гибок в этом отношении, полезно понять, какие данные хранятся, чтобы вы могли понять, где вы, вероятно, найдете определенный бит хранимых данных (например, сообщения голосовой почты или файлы журналов).
|
||||
|
||||
### Конфигурационные файлы
|
||||
|
||||
Конфигурационные файлы Asterisk включают в себя *extensions.conf*, *pjsip.conf*, *modules.conf* и десятки других файлов, определяющих параметры для различных каналов, ресурсов, модулей и функций, которые могут использоваться.
|
||||
|
||||
Эти файлы обычно находятся в */etc/asterisk*. Вы будете много работать в этой папке, когда будете настраивать и администрировать свою систему Asterisk.
|
||||
|
||||
### Модули
|
||||
|
||||
Модули Asterisk обычно устанавливаются в папку */usr/lib/asterisk/modules*. Обычно вам не придется взаимодействовать с этой папкой, однако будет полезно узнать где находятся модули. Например, если вы обновите Asterisk и выберете разные модули на этапе установки menuselect, старые (несовместимые) модули из предыдущей версии Asterisk не будут удалены, и вы получите предупреждение от сценария установки. Эти старые файлы необходимо будет удалить из папки *modules*. Это можно сделать либо вручную, либо с помощью make uninstall.
|
||||
|
||||
### Библиотека ресурсов
|
||||
|
||||
Существует несколько ресурсов, которым требуются внешние источники данных. Например, музыка на удержании (MOH) не может воспроизводиться если у вас нет какой-то музыки для воспроизведения. Системные подсказки также должны храниться где-то на жестком диске. В папке */var/lib/asterisk* хранятся системные приглашения, сценарии AGI, музыка на удержание и другие файлы ресурсов.
|
||||
|
||||
### Spool
|
||||
|
||||
Spool - это место, где приложения хранят файлы в системе Linux, которые будут часто меняться или которые будут обрабатываться другими процессами позднее. Например, задания на печать в Linux и ожидающие сообщения электронной почты обычно записываются в спул, пока они не будут обработаны.
|
||||
|
||||
В Asterisk спул используется для хранения временных элементов, таких как голосовые сообщения, записи вызовов[6](#sdfootnote6sym), файлы вызовов и так далее.
|
||||
|
||||
Спул Asterisk находится в каталоге */var/spool/asterisk*.
|
||||
|
||||
### Журналирование
|
||||
|
||||
Asterisk может генерировать несколько разных типов лог-файлов. Папка */var/log/asterisk* - это место, куда записываются подробные записи вызовов (CDR), события канала из CEL, журналы отладки, журналы очереди, сообщения, ошибки и другие выходные данные.
|
||||
|
||||
Эта папка будет чрезвычайно важна для любых предпринимаемых вами действий по устранению неполадок. Мы поговорим подробнее о том, как использовать логи Asterisk в [Главе 21]().
|
||||
|
||||
## Диалплан
|
||||
|
||||
Диалплан - это сердце Asterisk. Все каналы, поступающие в систему, будут проходить через диалплан, содержащий сценарии потока вызовов, определяющие порядок обработки входящих вызовов.
|
||||
|
||||
Диалплан обычно пишется с использованием собственного синтаксиса Asterisk, который хранится в файле с именем */etc/asterisk/extensions.conf* . Существуют и другие способы управления потоком вызовов, и мы рассмотрим их позже, но независимо от того, какой метод вы в конечном итоге используете, вы обнаружите, что базовое понимание традиционной схемы диалплана будет чрезвычайно полезным. Именно на этом мы сосредоточимся большую часть первых двух третей этой книги.
|
||||
|
||||
Позже мы рассмотрим обработку потока вызовов вне диалплана, используя такие технологии, как AMI, AGI и ARI.
|
||||
|
||||
## Аппаратные средства
|
||||
|
||||
Asterisk способен общаться с огромным количеством различных технологий. Как правило, эти соединения выполняются через сетевое соединение TCP/IP (обычно с использованием SIP). Однако подключения к более традиционным телекоммуникационным каналам, таким как PRI (T1, E1 и т.д.), BRI (EuroISDN) SS7 (в основном T1 и E1), и аналоговым (все, от нескольких портов FXO и FXS до крупных банков каналов, питаются через соединения T1/E1 CAS/RBS), также может быть достигнуто с помощью физических карт, установленных на сервере.
|
||||
|
||||
Многие компании производят это оборудование, такие как Digium (спонсор, владелец и основной разработчик Asterisk), Sangoma (который недавно приобрел Digium), Dialogic (также компания Sangoma), OpenVox, Pika, Voicetronix, beroNet и многие другие. Все эти компании были связаны с Asterisk на протяжении многих лет.
|
||||
|
||||
Наиболее популярное оборудование для Asterisk, как правило, предназначено для работы через интерфейс аппаратного устройства Digium Asterisk (известный как DAHDI). Это сложная архитектура и она выходит за рамки этой книги. Все серверные телефонные карты будут иметь требования к установке, уникальные для производителя, и вам потребуются навыки в установке оборудования Linux, а также в устранении неисправностей и подготовке традиционных сетей ТфОП.
|
||||
|
||||
Если вам необходимо взаимодействовать с традиционными линиями ТфОП с использованием Asterisk, мы рекомендуем вам сохранить Asterisk в качестве платформы только для SIP и взаимодействовать с помощью стороннего шлюза какого-либо рода. Имейте в виду: это не материал начального уровня, и если вы только начинаете использовать Asterisk - вам настоятельно рекомендуется оставить свои первоначальные решения только для SIP.
|
||||
|
||||
## Версии Asterisk
|
||||
|
||||
Методология выпуска Asterisk прошла через несколько стилей. В прошлом это приводило к некоторой путанице, но в наши дни управление версиями довольно простое и относительно легкое для понимания. Digium сохранил отличную ссылку на [Asterisk wiki](http://bit.ly/2XTb5Wl), и мы призываем вас перейти на последние подробности о версиях Asterisk.
|
||||
|
||||
Эта книга была написана и протестирована с использованием версии 16, но вы обнаружите, что фундаментальные концепции, которые мы исследуем, будут актуальны для большинства версий Asterisk. Концептуальная структура Asterisk не менялась в течение достаточно долгого времени, и на момент написания этой статьи не было никаких известных планов изменить это в будущем. Будущие версии будут предоставлять более мощные мультимедийные и конференц-возможности, конечно, но они, вероятно, будут реализованы в рамках существующей структуры.
|
||||
|
||||
## Вывод
|
||||
|
||||
Asterisk состоит из множества различных технологий, большинство из которых сложны сами по себе. В результате понимание архитектуры Asterisk может быть ошеломляющим. Тем не менее, реальность такова, что Asterisk хорошо спроектирован для того, что он делает, и, по нашему мнению, достиг замечательного баланса между гибкостью и сложностью.
|
||||
|
||||
[1](#sdfootnote1anc)Хорошим показателем того, что вы работали с традиционными УАТС, является наличие большой мозоли на лбу, полученной в результате слишком большого количества ударов головой о кирпичную стену, чтобы сосчитать.
|
||||
|
||||
[2](#sdfootnote2anc)Эта команда доступна как часть процесса установки. Мы обсудим использование menuselect в главе об установке.
|
||||
|
||||
[3](#sdfootnote3anc)Термин кодек - это сокращение от «кодер-декодер».
|
||||
|
||||
[4](#sdfootnote4anc)Отчасти по этой причине мы не рекомендуем формат GSM по умолчанию для системных записей. WAV-записи будут звучать лучше и использовать меньше тактов процессора.
|
||||
|
||||
[5](#sdfootnote5anc)Некоторые кодеки создают значительную нагрузку на ЦП, настолько, что система, которая может поддерживать несколько сотен каналов без транскодирования, будет обрабатывать только несколько десятков при его использовании.
|
||||
|
||||
[6](#sdfootnote6anc)Не записи деталей вызовов (CDR), а скорее аудиозаписи вызовов, генерируемых MixMonitor() и связанными приложениями.
|
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 20 KiB |
|
@ -0,0 +1,552 @@
|
|||
# Глава 5. Конфигурация пользовательских устройств
|
||||
|
||||
> _Я не всегда знаю о чем говорю, но я знаю, что я прав._
|
||||
>
|
||||
> —Мухаммед Али
|
||||
|
||||
Пришло время подключить некоторые пользовательские устройства SIP к Asterisk. Хотя мы собираемся сосредоточиться на Asterisk как конце вещей, имейте в виду, что определение канала устройства в Asterisk для непосредственного подключения через него – это только половина конфигурации; вам также нужно настроить другой конец — само устройство (обычно телефон) так, чтобы оно знало куда отправлять свои вызовы.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Важное замечание относительно точки SIP</b></p>
|
||||
<p>Настройка другого конца связи SIP конечно необходима, но не является частью конфигурации Asterisk и, в конечном счете, выходит за рамки этой книги. На рынке должно быть тысячи различных типов конечных точек SIP, включая настольные телефоны, программные телефоны, УАТС, прокси-серверы, серверы конференций и всевозможные другие продукты. У каждого производителя есть свои инструменты, позволяющие настраивать его продукцию (а некоторые из них требуют обширных знаний). SIP - это сложный протокол. Сказав это, большинство настольных телефонов SIP имеют какой-то веб-интерфейс, и большинство софтфонов имеют меню конфигурации, встроенное в их графический интерфейс.</p>
|
||||
<p>В самом простом случае настройка SIP-устройства включает в себя предоставление трех параметров:</p>
|
||||
<ul>
|
||||
<li>Адрес сервера, через который оно будет подключаться (ваш сервер Asterisk)</li>
|
||||
<li>Имя пользователя (которое также можно назвать именем подписчика, расширением или чем-то подобным)</li>
|
||||
<li>Пароль</li>
|
||||
</ul>
|
||||
<p>Хотя каждый тип конечной точки будет отличаться, все они будут следовать аналогичному соглашению, и хотя потенциально существуют сотни параметров конфигурации, довольно часто можно настроить только эти три вещи.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Другими словами: есть две отдельные задачи, необходимые для настройки устройства для работы с Asterisk:
|
||||
|
||||
* Сообщение Asterisk об устройстве (настройка учетных данных канала в Asterisk)
|
||||
* Сообщение устройству об Asterisk (доступ к инструментам настройки для устройства и указание ему нахождение сервера и как к нему подключиться)
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Некоторые мысли о протоколе SIP</b></p>
|
||||
<p>SIP - является одноранговым протоколом, и хотя обычно используется настройка, в которой конечные точки (телефоны) ведут себя как клиенты, а какой-то шлюз (например, Asterisk) обеспечивает маршрутизацию и функции, сам протокол работает с точки зрения одноранговых отношений (Рисунок 5-1). Две конечные точки SIP могут напрямую разговаривать друг с другом (т.е. пара SIP-телефонов теоретически должна иметь возможность создавать своего рода “интерком” непосредственно между собой без АТС посередине).</p>
|
||||
<p>При этом, безусловно, большинство SIP-транзакций происходят через какой-либо сервер, который обычно остается в пути вызова и обеспечивает все соединения (также не требуется протоколом). Когда SIP-вызов выполняется с телефона на другой телефон через Asterisk - на самом деле происходит два вызова: вызов от исходного аппарата в Asterisk и другой отдельный вызов из Asterisk в целевой аппарат (этот второй этап вызова может даже не использовать SIP). Asterisk соединяет их вместе. Аналогично, если вы делаете „внешний“ вызов - Asterisk примет вызов от вашего аппарата, а затем отправит вызов по другому каналу, который будет считаться магистральным (транковым) и снова соединит эти каналы вместе. На уровне протокола вызов set-to-set и set-to-trunk выглядят очень похожими.</p>
|
||||
<p>Использование SIP-телефона с Asterisk означает что вы хотите настроить SIP-телефон для совершения всех своих вызовов через Asterisk, даже если устройство вполне способно напрямую подключаться к другой конечной точке SIP без сервера Asterisk. Телефон будет рассматривать Asterisk в качестве своего регистратора и прокси-сервера (хотя Asterisk на самом деле является Back to Back User Agent или B2BUA) и будет искать Asterisk для принятия решений о маршрутизации для всех вызовов.</p>
|
||||
<img src="pics/pic5-1.png" align="center">
|
||||
<p><i>Рисунок 5-1. Asterisk в роли шлюза</i></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Некоторые мысли о провижининге аппаратов</b></p>
|
||||
<p>Хотя большинство устройств будут иметь веб-интерфейс для определения параметров, если вы используете более одного или двух телефонов в продакшене, то должны изучить использование процесса провижининга (подготовки) на основе сервера. Таким образом, аппараты будут подключаться к серверу, идентифицироваться и аутентифицироваться, а также загружать файлы конфигурации, содержащие их параметры (очень часто используется MAC-адрес телефона в качестве идентификатора для именования каждого уникального файла конфигурации). Файлы конфигурации для различных продуктов обычно обслуживаются сервером HTTPS или SFTP и будут отформатированы как XML или некоторой формой пар ключ/значение.</p>
|
||||
<p>К сожалению, точный процесс загрузки, протокол и синтаксис этих файлов будут отличаться от производителя к производителю. Это нетрудно узнать, если вы знакомы с такими понятиями, но попытаться охватить все их (и держать постоянно меняющиеся процессы в актуальном состоянии) было бы невозможно. Производители обычно предлагают свободно загружаемые и подробные руководства по настройке для своих телефонов, поэтому с небольшим количеством исследований и знакомством с настройкой файловых сервисов на Linux вы найдете множество информации, доступной в интернете. По нашему опыту, документация, предоставленная производителями, как правило, превосходна. Она будет предоставлять самую последнюю информацию о провижининге своих устройств.</p>
|
||||
<p>При устранении неполадок провижининга аппарата всегда сначала проверяйте загрузку с помощью компьютера. Если вы не можете загрузить файлы на свой компьютер - ваши устройства, вероятно, также не смогут их загрузить.</p>
|
||||
<p>Мы скажем одно последнее слово об этом: убедитесь, что любой процесс, используемый вами, включает шифрование файлов конфигурации так, что если файлы украдены - только предполагаемый получатель способен их расшифровать. Большинство производителей проделали хорошую работу, чтобы сделать это довольно простой задачей. Не отправляйте незашифрованные файлы конфигурации через общедоступный Интернет.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
В этой главе мы сосредоточимся на конфигурации аппаратов с точки зрения Asterisk - поэтому мы не будем слишком много говорить о самонастраиваемых телефонах; вам нужно будет провести собственное исследование в этом отношении. Мы будем использовать пару софтфонов в нашей лаборатории и Вы так же можете. В наших примерах будет предпринята попытка предоставить достаточно информации, для настройки любых SIP-устройств, используемых Вами. Если мы сможем помочь вам зарегистрировать пару софтфонов в вашей лабораторной системе, то значит направим вас по пути к более сложным сценариям (которые, как правило, требуют некоторых исследований и прототипирования с вашей стороны).
|
||||
|
||||
|
||||
## Концепции именования телефонов
|
||||
|
||||
Прежде чем приступить к настройке Asterisk для наших телефонов - мы предложим некоторые рекомендации по именованию телефонов.
|
||||
Во-первых, вы не должны назначать своим телефонам добавочный номер; вместо этого создайте систему так, чтобы добавочный номер был назначен пользователю, а затем назначьте телефон или другие ресурсы этому пользователю. Сами телефоны должны быть названы в соответствии с чем-то уникальным для них, таким как MAC-адрес или имя компьютера. В гибкой АТС следующего поколения необходимо абстрагировать понятия пользователей, добавочных номеров и телефонов чтобы обеспечить максимальную гибкость и простоту управления.
|
||||
|
||||
В Asterisk действительно нет понятия пользователя вообще. Добавочные номера - это триггеры, которые инициируют последовательность инструкций. Да, вы можете написать небольшой диалплан, указав, что при наборе добавочного номера 100 Asterisk будет звонить на телефон на вашем столе. Однако добавочный 100 может также легко получить доступ к ящику голосовой почты компании или, возможно, воспроизвести приглашение, присоединиться к конференц-залу или сделать любое количество других вещей. Мы даже можем написать диалплан, который указывает, что расширение 100 должно звонить на устройство на вашем столе с понедельника по пятницу между 9 утра и 5 вечера, но в остальное время звонить на устройство на другом столе. И наоборот, когда вызов выполняется с устройства в рабочее время, идентификатор вызывающего абонента может показывать дневной номер, а в остальное время может показывать номер после рабочего дня (многие стойки регистрации становятся столами дежурных в ночное время).
|
||||
|
||||
В Asterisk добавочные номера (расширения) не являются телефонами. Поэтому не давайте идентификаторы телефонов, которые являются добавочными номерами.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Внутренние номера Asterisk</b></p>
|
||||
<p>Концепция внутренних номеров в Asterisk имеет решающее значение. В большинстве УАТС добавочный номер - это номер, который вы набираете для вызова телефона или службы. В Asterisk внутренний номер является именем группы инструкций в диалплане. Подумайте о внутреннем номере Asterisk как об имени скрипта и вы на правильном пути. Да, внутренний номер Asterisk может быть номером, который звонит на телефон, но он может быть также словом (например, <code>voicemail</code>), которое предоставляет простую услугу какого-либо рода, никогда не отправляя вызов по какому-либо каналу.</p>
|
||||
<p>Мы рассмотрим внутренние номера Asterisk более подробно на протяжении всей этой книги, но прежде чем мы это сделаем, мы должны настроить некоторые телефоны.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Абстракция между именем добавочного номера и телефоном, который может звонить - это мощная концепция. Отличным примером этого является функция УАТС, широко известная как _hot-desking_, которая позволяет пользователям совместно использовать один стол и/или перемещаться по разным столам. Допустим, у нас есть три агента по продажам, которые обычно работают вне офиса, но проводят пару дней каждый месяц в офисе для оформления документов. Поскольку они вряд ли будут находиться на месте одновременно - вместо того, чтобы у каждого агента был отдельный телефон, они могли бы использовать один офисный телефон (или в большем масштабе, дюжина людей могла бы разделить пул, скажем, из трех телефонов). Этот сценарий иллюстрирует удобство (и необходимость) предоставления системе возможности отделить концепцию пользователя и внутреннего номера от физического телефона.
|
||||
|
||||
Лучший способ назвать физический настольный телефон (или любую физическую конечную точку SIP) - использовать MAC-адрес устройства, являющийся уникальным для телефона, следующим за ним, и не требующий изменений конфигурации телефона, если меняется пользователь. У некоторых корпораций есть наклейки, которые они размещают на своем оборудовании со штрих-кодом и другой информацией, которая позволяет им хранить запас подготовленного оборудования; эти уникальные коды также будут приемлемым выбором для использования в качестве имен телефонов, поскольку они не обеспечивают никакой логической связи с конкретным человеком, но предоставляют конкретную информацию о самих устройствах.
|
||||
|
||||
Софтфоны (программные телефоны) на ноутбуках также могут использовать MAC-адрес или серийный номер, но убедитесь, что имя аппарата содержит ссылку на то, что это софтфон. `[JIMMY_VANM_SOFT]` - приемлимое имя, но `[JIMS_PHONE]` - нет. Если софтфон работает на настольном компьютере (т.е. он не будет перемещаться с пользователем), то назовите его, используя соглашение, которое вы используете для своих компьютеров (`[DESK-5F23-SOFT]` или `[CUST_SRVC_001_SOFT]` являются потенциально хорошими именами).
|
||||
|
||||
Выбор за вами относительно того, как вы хотите называть свои телефоны. Наша цель - помочь вам понять почему лучшей практикой является абстрагирование любой концепции телефона, принадлежащего человеку. Телефон - это просто способ получить и звук от человека и сигнал туда и обратно, поэтому гораздо лучше сделать возможным смешивание и сопоставление их, когда пользователи перемещаются, а люди приходят и уходят.
|
||||
|
||||
В этой книге, вы увидите имена телефонов, которые выглядят как MAC-адреса (например, `[0000F3000001]` и `[0000F3000002]`), или имя общего рабочего стола (`[DESK-001-SOFT]`, `[DESK-002-SOFT]`), для разделения устройств. Как правило, вы будете использовать имена телефонов, соответствующие используемому оборудованию (или какой-либо другой строке, уникальной для регистрируемого устройства).
|
||||
|
||||
В качестве окончательного рассмотрения мы должны четко указать что то, что мы предлагаем в отношении имен устройств, не является техническим требованием. Вы можете называть свои устройства как угодно, если они соответствуют требованиям соглашений об именах Asterisk для устройств (придерживайтесь буквенно-цифровых символов без пробелов и все будет в порядке).
|
||||
|
||||
Вы увидите множество систем Asterisk, связывающих имя устройства с внутренним номером пользователя, но мы не поклонники этого метода.
|
||||
|
||||
## Телефоны, софтфоны и телефонные адаптеры
|
||||
|
||||
Существует три типа конечных точек, которые вы обычно предоставляете своим пользователям в качестве телефонного аппарата. Они обычно называются телефонами \(или настольными телефонами\), софтфонами и аналоговыми терминальными адаптерами \(ATA\).
|
||||
|
||||
_Аппаратный телефон_ - это физическое устройство - офисный телефон. У него есть трубка, нумерованные кнопки, какой-то экран и так далее. Он подключается непосредственно к сети и, вероятно, он является тем, что люди имеют в виду когда говорят о VoIP-телефоне \(или SIP-телефоне\). Обычно он стоит на столе, но его можно установить на стене, в лифте, на боковом столе или в коробке на обочине дороги.
|
||||
|
||||
_Софтфон_ - это программное приложение, которое работает на ноутбуке, настольном компьютере, смартфоне или другом вычислительном устройстве. Звук должен проходить через звуковую систему устройства, поэтому как правило нужна гарнитура, которая будет хорошо работать с приложениями телефонии. Софтфоны стали популярными приложениями на смартфонах, потому что они позволяют подключаться к телефонным сетям, отличным от сотовой сети \(например, вы можете зарегистрироваться в качестве внутреннего номера на своей корпоративной АТС\). Интерфейс софтфона часто стилизован под физический телефон, но в этом нет необходимости. WebRTC позволит использовать все виды дополнительных возможностей в этой области, так как он по существу позволяет программному телефону просто быть частью сеанса в браузере. Для УАТС софтфон выглядит и ведет себя точно так же, как и аппаратный телефон.
|
||||
|
||||
_ATA_ разработан, чтобы позволить традиционным аналоговым телефонам \(и другим аналоговым устройствам, таким как факсы, беспроводные телефоны, пейджинговые усилители и т.д.\) подключаться к сети SIP,[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408634856) и будет представлять собой коробку размером с сэндвич, которая содержит разъем RJ-11 для телефона \(обычно называемый портом FXS\), разъем RJ-45 для сети и разъем питания. Некоторые ATA могут поддерживать более одного телефона. Другие ATA могут иметь расширенные функции, такие как брандмауэр или порт FXO \(аналоговый порт, который может подключаться к линии ТфОП\). С точки зрения АТС, ATA выглядит точно так же, как SIP-телефон.
|
||||
|
||||
Телефоны имеют преимущество в том, что содержат хорошие акустические свойства для голосовой связи. Любой телефон приличного качества спроектирован так, чтобы улавливать частоты человеческого голоса, отфильтровывать нежелательные фоновые шумы и нормализовать результирующую форму волны. Люди используют телефоны с тех пор, как существует телефонная сеть, и нам, как правило, нравится то, что знакомо, поэтому наличие устройства, которое взаимодействует с Asterisk с помощью знакомого интерфейса, будет привлекательным для многих пользователей. Кроме того, жесткий телефон не требует, чтобы ваш компьютер работал все время.
|
||||
|
||||
Недостатки же телефонов включают в себя тот факт, что они трудно переносятся и стоят дорого по сравнению со многими качественными софтфонами на рынке сегодня, которые доступны бесплатно. Кроме того, дополнительный беспорядок на вашем столе может быть нежелателен, если у вас ограниченное рабочее пространство. Если вы много перемещаетесь и как правило не находитесь в одном и том же месте, аппаратный телефон вряд ли удовлетворит ваши потребности \(хотя, один в каждом месте, которое вы регулярно посещаете, может быть правильным решением\).
|
||||
|
||||
Софтфоны решают проблему переносимости, будучи установленными на устройстве, которое, вероятно, уже движется вместе с вами, например, ваш ноутбук или смартфон. Кроме того, их минимальная стоимость \(как правило бесплатны, или около $30 за один полнофункциональный\) является привлекательной. Поскольку многие софтфоны бесплатны, вполне вероятно, что первым телефонным аппаратом, который вы подключите к Asterisk, будет софтфон. Кроме того, поскольку софтфоны - это просто программное обеспечение, их легко устанавливать и обновлять, и как правило они имеют другие функции, которые используют другие периферийные устройства, такие как веб-камера для видеозвонков или возможность загружать файлы с вашего рабочего стола для отправки факсов. Еще одним потенциально огромным преимуществом софтфона является то, что его часто можно интегрировать с другими приложениями, работающими на устройстве.
|
||||
|
||||
Некоторые из недостатков софтфонов - это не всегда включенное устройство, необходимость надевать гарнитуру каждый раз, когда вы принимаете вызов, и тот факт, что многие ПК будут в произвольное время в течение дня выбирать другое приложение, которым пользователь будет пользоваться, что может привести к тому, что софтфон перестанет работать, пока какая-то фоновая задача захватила процессор. В мобильном устройстве софтфон может потреблять ресурсы, что влияет на время работы батареи, производительность и эксплуатационные расходы.
|
||||
|
||||
У ATAs есть преимущество, позволяющее подключать аналоговые устройства к сети SIP,[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408624504) такие как беспроводные телефоны \(которые все еще превосходят во многих случаях более продвинутые типы беспроводных Wi-Fi телефонов и гораздо менее дорогостоящие[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408623256)\), пейджинговые усилители, звонки и старинные телефоны.[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408622440) ATA также иногда можно использовать для подключения к старой проводке, где сетевое соединение может работать неправильно, или к надворным постройкам \(например, сторожка\), где стандартное подключение ethernet невозможно.
|
||||
|
||||
Основным недостатком ATA является невозможность получения тех же функций через аналоговую линию, что и с SIP-телефона. Это технология, которой уже более ста лет.
|
||||
|
||||
С Asterisk нам не обязательно выбирать между софтфоном, аппаратным телефоном или ATA; вполне возможно и довольно часто иметь один добавочный номер, который одновременно звонит на несколько устройств, таких как настольный телефон, софтфон на ноутбуке, сотовый телефон и, возможно, стробоскоп в задней части завода \(где слишком много шума для звонка\).
|
||||
|
||||
Больше, чем любая другая конечная точка, программный телефон будет развиваться в нечто гораздо более всеобъемлющее, чем простое телефонное приложение. Появление WebRTC может наконец сделать то, что было предсказано в течении многих долгих лет: интеграция голоса в реальном времени в вычислительные \(в частности, веб-приложения\). Конечно, есть много способов достичь этого уже, но преимущество WebRTC заключается в том, что это открытый стандарт, встроенный прямо во все браузеры без каких-либо плагинов. Софтфон мертв; да здравствует софтфон.
|
||||
|
||||
Нам все еще нравится настольный телефон для регулярных телефонных звонков.
|
||||
|
||||
## Настройка Asterisk
|
||||
|
||||
В этом разделе мы рассмотрим, как настроить PJSIP для обработки различных конечных точек SIP. Традиционно это делалось путем редактирования файлов в каталоге _/etc/asterisk/_; однако мы решили продемонстрировать как это делается через базу данных, поскольку в целом это превосходный метод, особенно по мере роста системы. Если вам более удобны в использовании _.conf_ файлы, вы должны найти, что это довольно легко сделать как только вы уяснили основы.[5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408610760)
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Asterisk позволяет устройствам, использующим множество различных протоколов, общаться с ним \(и, следовательно, друг с другом\), но `chan_pjsip` - единственный модуль VoIP, который все еще активно поддерживается; остальные - устаревший код. Вы вряд ли будете использовать другие протоколы VoIP \(такие как IAX2, Skinny/SCCP, Unistim, H323 и MGCP\). Эти протоколы имеют историческое значение, так как это было во многом связано с тем, что Asterisk будет говорить с чем угодно и обо всём, что может оказать влияние на телекоммуникационную отрасль. Однако в настоящее время SIP почти вытеснил их все, поэтому эти драйверы каналов теперь являются историческими курьезами и не более того. Если вы все еще заинтересованы в одном из этих протоколов, сосредоточьтесь на том, чтобы сначала комфортно работать с SIP и признать, что он в значительной степени самодостаточен.
|
||||
|
||||
---
|
||||
|
||||
Таблицы конфигурации каналов в базе данных [6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408603032) содержат сведения о конфигурации, относящиеся к этому драйверу канала, а также параметры и учетные данные, относящиеся к устройствам и поставщикам SIP, которые вы подключите к Asterisk \(входящие и исходящие\). Проще говоря: все звонки в Asterisk и из него должны проходить через канал.
|
||||
|
||||
Большинство параметров имеют значения по умолчанию, которые вы найдете в файлах примеров. Начните с чтения файла _pjsip.conf.sample_ находящегося в вашем каталоге _~/src/asterisk.<TAB>/configs/samples/_. Он предоставит множество информации о значениях по умолчанию, а также о других ресурсах, о которых стоит прочитать. Мы не будем использовать файл для фактической конфигурации \(вместо этого мы используем базу данных\); однако файл является отличной ссылкой, и вы должны держать его под рукой, так как он будет иметь ответы на многие вопросы, которые могут возникнуть о параметрах.
|
||||
|
||||
Мы собираемся сосредоточиться на получении базового устройства для вас как можно проще. Мы обнаружили, что настройка каналов является одной из самых неприятных вещей, которые испытывают новые пользователи Asterisk, и хотим продемонстрировать, что на самом базовом уровне это не должно быть болезненным вообще. После того, как вы преуспели здесь, у вас всегда будет известная хорошая конфигурация, чтобы вернуться, как вы продвинетесь вперед в более сложные сценарии.
|
||||
|
||||
### Как конфигурация канала работает с диалпланом
|
||||
|
||||
Каналы - это то, что Asterisk соединяет вызовы со всем, что находится за его пределами, но именно диалплан определяет что происходит с вызовами по мере их прохождения через систему. Таким образом, каналы и диалплан неразрывно связаны. Диалплан - это сердце системы Asterisk: он управляет тем, как логика вызова применяется к любому соединению, к любому каналу, например что происходит, когда устройство набирает добавочный номер 101 или входящий вызов от внешнего поставщика услуг направляется в DID. Таблицы конфигурации канала PJSIP в базе данных, а также файл _/etc/asterisk/extensions.conf_ будут играть важную роль в большинстве, если не во всех, вызовах, маршрутизируемых через систему. После того, как настроили свои каналы, вы обнаружите, что большая часть вашей работы будет в диалплане. Мы глубоко погрузимся в него в следующих главах.
|
||||
|
||||
Когда вызов поступает в Asterisk, идентификатор входящего вызова сопоставляется с конфигурацией канала используемого протокола \(SIP-соединения обрабатываются драйвером канала PJSIP\). Драйвер канала будет обрабатывать аутентификацию входящего соединения. Конфигурация канала также _определяет где этот канал будет входить в диалплан_.
|
||||
|
||||
Как только Asterisk определит, как будет обрабатывать канал \(т.е. он аутентифицирован и установлены различные параметры вызова\), он может передать управление вызовом в правильный контекст в диалплане. Это параметр контекста в таблице `ps_endpoints`, который сообщает каналу, где вызов будет входить в диалплан \(который содержит всю информацию о том, как обрабатывать и маршрутизировать вызов\).
|
||||
|
||||
На Рисунке 5-2 мы видим, что поток вызовов через конфигурацию для внутреннего вызова \(set-to-set\) будет выглядеть примерно так:
|
||||
|
||||
1. Пользователь устройства `0000f30A0A0101` набирает `102`.
|
||||
2. Asterisk сопоставляет входящий SIP-запрос с конечной точкой \(и проверяет его подлинность\).
|
||||
3. Набранный номер соответствует контексту `[sets]` в диалплане.
|
||||
4. Приложение `Dial()` используется для отправки вызова по каналу PJSIP на контакт, связанный с `0000f30B0B02`.
|
||||
5. Определяется контактный адрес \(обычно на основе регистрации, если это устройство, но также может быть жестко закодирован, если это транк\).
|
||||
6. Сообщение SIP INVITE отправляется в пункт назначения.
|
||||
|
||||
Ключевым моментом является то, что файлы конфигурации каналов управляют не только тем, как вызовы входят в систему, но и тем, как они покидают систему. Так, например, если одно устройство вызывает другое, файл конфигурации канала используется не только для передачи вызова в диалплан, но и для направления вызова из диалплана к месту назначения.
|
||||
|
||||

|
||||
|
||||
_Рисунок 5-2. Отношение pjsip.conf к extensions.conf_
|
||||
|
||||
### chan_pjsip
|
||||
|
||||
Модуль канала PJSIP является одним из новых модулей в Asterisk. Он заменил оригинальный модуль `chan_sip`.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Старый модуль SIP - `chan_sip` был устаревшим, поэтому мы не будем документировать его в этой книге. Если вы новичок в Asterisk, вы должны придерживаться PJSIP, но может быть полезно понять, что `chan_sip` использовался в течение многих лет и до сих пор широко используется на старых системах.
|
||||
|
||||
---
|
||||
|
||||
Платформа PJSIP, реализованная в Asterisk, состоит из многих компонентов. Если вы проверите свою базу данных, то обнаружите что существует более десятка таблиц, относящихся к PJSIP (с префиксом `ps_`). Однако, не все из них относятся к заданной конфигурации.
|
||||
|
||||
---
|
||||
|
||||
PJSIP - это универсальная библиотека с открытым исходным кодом для мультимедийной связи, которая обеспечивает не только сигнализацию SIP, но также функции медиапотока и обхода NAT, которые являются важными компонентами приложений на основе SIP. Он предоставляется и поддерживается компанией Telugu Ltd., и библиотека используется в гораздо большем числе приложений, чем просто Asterisk. Софтфоны, проприетарные продукты и другие проекты с открытым исходным кодом также используют фреймворк. Сообщество Asterisk нуждалось/хотело новый драйвер канала SIP, и вместо того, чтобы строить его с нуля, разработчики решили использовать библиотеку PJSIP.
|
||||
|
||||
---
|
||||
|
||||
Компоненты, перечисленные в [Таблице 5-1](Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition/5.%20User%20Device%20Configuration%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22table0501) будут испольоваться при настройке конечных точек.
|
||||
|
||||
Таблица 5-1. Компоненты PJSIP в Asterisk
|
||||
|
||||
| Компонент | Назначение |
|
||||
| :--- | :--- |
|
||||
| `ps_aors` | Address Of Record \(AOR\) - адрес записи - таблица используется для определения того, как Asterisk может связаться с конечной точкой. Когда комплект пытается зарегистрироваться, Asterisk будет обращаться к AOR, чтобы идентифицировать его. |
|
||||
| `ps_auths` | Раздел Authentication \(проверки подлинности\) содержит учетные данные, которые конечные точки должны будут предоставить системе Asterisk для авторизации. |
|
||||
| `ps_contacts` | Обычно создается автоматически как часть процесса регистрации, именно здесь Asterisk будет хранить сведения о конечной точке, определенной во время регистрации. |
|
||||
| `ps_endpoints` | Сердце конфигурации SIP, именно здесь определяется каждая конечная точка. Здесь также определяются связи с другими записями PJSIP. |
|
||||
|
||||
#### Добавление конечной точки
|
||||
|
||||
Во время установки для вас было создано несколько примеров конечных точек, чтобы упростить процесс представления вам рабочей системы. Если вы хотите добавить дополнительные конечные точки, то нужно просто определить дополнительные записи в каждой из таблиц `ps_aors`, `ps_auths` и `ps_endpoints`.
|
||||
|
||||
Допустим, мы хотим добавить пару софтфонов с именами `SOFTPHONE_A` и `SOFTPHONE_B` в нашу систему.
|
||||
|
||||
Во-первых, в таблицу `ps_endpoints` мы должны добавить следующее:
|
||||
|
||||
```text
|
||||
$ mysql -D asterisk -u asterisk -p
|
||||
```
|
||||
|
||||
Давайте рассмотрим, что у нас там уже есть \(из предыдущих глав\):
|
||||
|
||||
```text
|
||||
mysql> select id,transport,aors,auth,context,disallow,allow from asterisk.ps_endpoints;
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
| id | transport | aors | auth | context | disallow | allow |
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
| 0000f30A0A01 | transport-udp | 0000f30A0A01 | 0000f30A0A01 | starfish | all | ulaw |
|
||||
| 0000f30B0B02 | transport-udp | 0000f30B0B02 | 0000f30B0B02 | starfish | all | ulaw |
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
2 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Мы собираемся вставить пару дополнительных записей.
|
||||
|
||||
```text
|
||||
mysql> insert into asterisk.ps_endpoints
|
||||
(id,transport,aors,auth,context,disallow,allow)
|
||||
values
|
||||
('SOFTPHONE_A','transport-tls','SOFTPHONE_A','SOFTPHONE_A','sets','all','ulaw'),
|
||||
('SOFTPHONE_B','transport-tls','SOFTPHONE_B','SOFTPHONE_B','sets','all','ulaw');
|
||||
Query OK, 2 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
Теперь таблица `ps_endpoints` должна выглядеть примерно так:
|
||||
|
||||
```text
|
||||
mysql> select id,transport,aors,auth,context,disallow,allow from ps_endpoints;
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
| id | transport | aors | auth | context | disallow | allow |
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
| 0000f30A0A01 | transport-udp | 0000f30A0A01 | 0000f30A0A01 | sets | all | ulaw |
|
||||
| 0000f30B0B02 | transport-udp | 0000f30B0B02 | 0000f30B0B02 | sets | all | ulaw |
|
||||
| SOFTPHONE_A | transport-tls | SOFTPHONE_A | SOFTPHONE_A | sets | all | ulaw |
|
||||
| SOFTPHONE_B | transport-tls | SOFTPHONE_B | SOFTPHONE_B | sets | all | ulaw |
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Затем нам понадобятся две связанные записи в таблице `ps_aors`:
|
||||
|
||||
```text
|
||||
mysql> insert into asterisk.ps_aors (id,max_contacts)
|
||||
values ('SOFTPHONE_A',2),('SOFTPHONE_B',2);
|
||||
Query OK, 2 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
Затем таблица `ps_aors` должна возвращать следующее:
|
||||
|
||||
```text
|
||||
mysql> select id from asterisk.ps_aors;
|
||||
+--------------+
|
||||
| id |
|
||||
+--------------+
|
||||
| 0000f30A0A01 |
|
||||
| 0000f30B0B02 |
|
||||
| SOFTPHONE_A |
|
||||
| SOFTPHONE_B |
|
||||
+--------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Наконец, таблица `ps_auths` будет нуждаться в записях для каждого нового устройства..
|
||||
|
||||
```text
|
||||
insert into asterisk.ps_auths (id,auth_type,password,username)
|
||||
values ('SOFTPHONE_A','userpass','iwouldnotifiwereyou','SOFTPHONE_A'),
|
||||
('SOFTPHONE_B','userpass','areyoueventrying','SOFTPHONE_B');
|
||||
|
||||
Query OK, 2 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
И, если все прошло хорошо, у вас будут следующие записи авторизации:[7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408545288)
|
||||
|
||||
```text
|
||||
mysql> select id,auth_type,password,username
|
||||
-> from asterisk.ps_auths;
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
| id | auth_type | password | username |
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
| 0000f30A0A01 | userpass | not very secure | 0000f30A0A01 |
|
||||
| 0000f30B0B02 | userpass | hardly to be trusted | 0000f30B0B02 |
|
||||
| SOFTPHONE_A | userpass | iwouldnotifiwereyou | SOFTPHONE_A |
|
||||
| SOFTPHONE_B | userpass | areyoueventrying | SOFTPHONE_B |
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Новые конечные точки теперь готовы к регистрации устройств на них. Вы можете убедиться, что они существуют с помощью следующей команды Asterisk CLI:
|
||||
|
||||
```text
|
||||
mysql> exit
|
||||
$ sudo asterisk -rvvvvv
|
||||
*CLI> pjsip show endpoints
|
||||
```
|
||||
|
||||
Выходные данные должны содержать список новых конечных точек:
|
||||
|
||||
```text
|
||||
Endpoint: 0000f30A0A01 Unavailable 0 of inf
|
||||
InAuth: 0000f30A0A01/0000f30A0A01
|
||||
Aor: 0000f30A0A01 2
|
||||
Transport: transport-udp tls 0 0 0.0.0.0:5061
|
||||
|
||||
Endpoint: 0000f30B0B02 Not in use 0 of inf
|
||||
InAuth: 0000f30B0B02/0000f30B0B02
|
||||
Aor: 0000f30B0B02 2
|
||||
Contact: 0000f30B0B02/sip:0000f30B0B02@172.29.1.110 7542ca7ce1 Unknown nan
|
||||
Transport: transport-udp udp 0 0 0.0.0.0:5060
|
||||
|
||||
Endpoint: SOFTPHONE_A Unavailable 0 of inf
|
||||
InAuth: SOFTPHONE_A/SOFTPHONE_A
|
||||
Aor: SOFTPHONE_A 2
|
||||
|
||||
Endpoint: SOFTPHONE_B Unavailable 0 of inf
|
||||
InAuth: SOFTPHONE_B/SOFTPHONE_B
|
||||
Aor: SOFTPHONE_B 2
|
||||
```
|
||||
|
||||
Подожди минутку…
|
||||
|
||||
Вы заметили, что для новых конечных точек не определен транспорт? Это потому, что мы еще ничего не определили для TLS; мы только что определили для стандартного UDP-стиля SIP.
|
||||
|
||||
Поскольку у нас есть те причудливые ключи, которые мы создали в предыдущей главе, давайте реализуем их сейчас и посмотрим, сможем ли мы это исправить.
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/pjsip.conf
|
||||
[transport-udp]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=0.0.0.0
|
||||
[transport-tls]
|
||||
type=transport
|
||||
protocol=tls
|
||||
bind=0.0.0.0
|
||||
cert_file=/home/asterisk/certs/self-signed.crt #если вы использовали certbot, то
|
||||
priv_key_file=/home/asterisk/certs/self-signed.key #расположение будет здесь
|
||||
```
|
||||
|
||||
Теперь, поскольку мы помещаем некоторые файлы в папку, которая не была частью нашей конфигурации SELinux, теперь мы должны это исправить. Мы хотим, чтобы SELinux генерировал ошибку, поэтому собираемся перезагрузить модуль `res_pjsip.so`, даже если он не сможет правильно загрузить транспорт:
|
||||
|
||||
```text
|
||||
*CLI> module reload res_pjsip.so
|
||||
```
|
||||
|
||||
Теперь у нас должны быть ошибки, которые мы ожидали, поэтому будем искать их в системном журнале.
|
||||
|
||||
```text
|
||||
$ sudo grep -i sealert /var/log/messages |egrep "cert|crt"
|
||||
```
|
||||
|
||||
Вы увидите некоторые сообщения, которые выглядят примерно так (мы урезали их для краткости):
|
||||
|
||||
```text
|
||||
SELinux is preventing ... on the file /home/asterisk/certs/self-signed.crt.
|
||||
For complete SELinux messages run: sealert -l 1dbe51e2-7321-41d3-a5bb-f8f1b4a6f787
|
||||
SELinux is preventing ... on the directory certs.
|
||||
For complete SELinux messages run: sealert -l 879db542-e0a9-43e8-8763-62fcf068bfee
|
||||
SELinux is preventing ... on the file self-signed.crt.
|
||||
For complete SELinux messages run: sealert -l 8fb85940-ee82-44bd-adcb-e30d31ee516a
|
||||
```
|
||||
|
||||
Полезно то, что SELinux говорит вам именно то, что нужно сделать для решения этой проблемы!
|
||||
|
||||
Для каждого из трех сообщений, относящихся к доступу к сертификатам, которые мы только что настроили, выполните соответствующую команду. А мы просто выполним одну, чтобы показать, что имеем в виду, но вам может потребоваться запустить более одной, пока загрузка не пройдет без ошибок.
|
||||
|
||||
```text
|
||||
$ sealert -l 8fb85940-ee82-44bd-adcb-e30d31ee516a
|
||||
```
|
||||
|
||||
Вы должны получить что-то вроде этого:
|
||||
|
||||
```text
|
||||
SELinux is preventing asterisk from read access on the file self-signed.crt.
|
||||
***** Plugin catchall (100. confidence) suggests **************************
|
||||
You can generate a local policy module to allow this access.
|
||||
allow this access for now by executing:
|
||||
# ausearch -c 'asterisk' --raw | audit2allow -M my-asterisk
|
||||
# semodule -i my-asterisk.pp
|
||||
```
|
||||
|
||||
Вы не root, но вы будете запускать обе команды, которые он определяет:
|
||||
|
||||
```text
|
||||
$ sudo ausearch -c 'asterisk' --raw | audit2allow -M my-asterisk
|
||||
$ sudo semodule -i my-asterisk.pp
|
||||
```
|
||||
|
||||
Помните, как все говорят что нужно просто отключить SELinux? Ну, больше не нужно этого делать.
|
||||
|
||||
Хорошо, перезапустите Asterisk (`$sudo service asterisk restart`) и убедитесь, что ваш файл журнала не генерирует ошибки SELinux (игнорируйте ошибки _ODBC.ini_, поскольку они не относятся к _/etc/odbc.ini_ и не должны ни на что влиять).
|
||||
|
||||
Вы должны увидеть, что `transport-tls` теперь готов к использованию:
|
||||
|
||||
```text
|
||||
*CLI> pjsip show transports
|
||||
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress....................>
|
||||
==========================================================================================
|
||||
Transport: transport-tls tls 0 0 0.0.0.0:5061
|
||||
Transport: transport-udp udp 0 0 0.0.0.0:5060
|
||||
```
|
||||
|
||||
Если вы обнаружите, что он все еще не загружается, вернитесь и отработайте ошибки SELinux в файле _/var/log/messages_. Иногда приходится иметь дело не только с одной.
|
||||
|
||||
## Тестирование чтобы убедиться что ваши устройства зарегистрированы
|
||||
|
||||
После того, как ваши устройства зарегистрировались в Asterisk, вы сможете запросить их местоположение и состояние из Asterisk CLI.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Это распространенное заблуждение, что регистрация - это то, как устройство аутентифицирует себя с целью получения разрешения на выполнение вызовов. Это неверно. Единственная цель регистрации - позволить устройству определить свое местоположение в сети, чтобы Asterisk[8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408511480) знал, куда отправлять вызовы, предназначенные для этого устройства.
|
||||
|
||||
Аутентификация для исходящих вызовов является полностью отдельным процессом и всегда происходит на основе каждого вызова, независимо от того, зарегистрирован ли комплект. Это означает, что ваше устройство может совершать звонки, но не принимать их. Наиболее распространенной причиной этого является брандмауэр, который закрыл входящий порт \(и решение состоит в том, чтобы установить таймер регистрации на более короткое время, чтобы оно перерегистрировалось каждые несколько минут, так что брандмауэр будет держать соответствующий SIP-порт открытым\).
|
||||
|
||||
Можно иметь успешно установленную регистрацию и все же совершать звонки будет запрещено. Дело в том, что только потому, что устройство зарегистрировано не означает, что оно может совершать звонки (хотя это почти всегда будет так).
|
||||
|
||||
---
|
||||
|
||||
Проверка регистрации комплекта - это самый простой способ проверить правильность его настройки.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Помните, что настройка устройства _не_ происходит в Asterisk. Вы должны настроить устройство с помощью любых инструментов, предоставленных производителем.
|
||||
|
||||
---
|
||||
|
||||
Для проверки состояния устройства, просто вызовите CLI Asterisk:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rvvvv
|
||||
```
|
||||
|
||||
При вводе следующей команды возвращается список всех пиров, о которых знает Asterisk (зарегистрированные устройства будут иметь соответствующий `Contact`):
|
||||
|
||||
```text
|
||||
*CLI> pjsip show aors
|
||||
Aor: <Aor..............................................> <MaxContact>
|
||||
Contact: <Aor/ContactUri............................> <Hash....> <Status> <RTT(ms)..>
|
||||
==========================================================================================
|
||||
Aor: 0000f30A0A01 2
|
||||
Aor: 0000f30B0B02 2
|
||||
Contact: 0000f30B0B02/sip:0000f30B0B02@172.29.1.110:5 7542ca7ce1 Unknown nan
|
||||
Aor: SOFTPHONE_A 2
|
||||
Aor: SOFTPHONE_B 2
|
||||
```
|
||||
|
||||
## Базовый диалплан для теста ваших устройств
|
||||
|
||||
В следующей главе мы погрузимся в диалплан Asterisk. Здесь мы собираемся заложить очень простой диалплан, так что если вы регистрируете устройства на различные конечные точки SIP уже в конфигурации PJSIP, вы должны быть в состоянии сделать тестовые вызовы между ними.
|
||||
|
||||
```text
|
||||
$ sudo -u asterisk vim /etc/asterisk/extensions.conf
|
||||
[general]
|
||||
[globals]
|
||||
[sets]
|
||||
exten => 100,1,Dial(PJSIP/0000f30A0A01)
|
||||
exten => 101,1,Dial(PJSIP/0000f30B0B02)
|
||||
exten => 102,1,Dial(PJSIP/SOFTPHONE_A)
|
||||
exten => 103,1,Dial(PJSIP/SOFTPHONE_B)
|
||||
exten => 200,1,Answer()
|
||||
same => n,Playback(hello-world)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
В консоли Asterisk введите следующую команду:
|
||||
|
||||
```text
|
||||
*CLI> dialplan reload
|
||||
*CLI> dialplan show
|
||||
```
|
||||
|
||||
Вы увидите, что в контексте `sets` есть некоторые добавочные номера, которые вы можете вызвать.
|
||||
|
||||
Эта базовая абонентская группа позволит вам набирать ваши устройства SIP с помощью добавочных номеров 100, 101, 102 и 103. Вы также можете прослушать приглашение `hello-world`, созданное для этой книги, набрав добавочный номер 200.
|
||||
|
||||
Зарегистрируйте пару SIP-телефонов \(вы можете скачать софтфон на свой компьютер, а другой - на планшет или смартфон\). Вы должны быть в состоянии набрать между вашими номерами. Откройте CLI для того, чтобы увидеть прохождение звонка. Вы должны увидеть что-то вроде этого \(и устройство, которое вы вызываете, должно звонить\):
|
||||
|
||||
```text
|
||||
-- Executing [102@sets:1] Dial("PJSIP/SOFTPHONE_A-00000001", "PJSIP/0000f30B0B02")
|
||||
-- Called PJSIP/0000f30B0B02
|
||||
-- PJSIP/0000f30B0B02-00000002 is ringing
|
||||
```
|
||||
|
||||
Если этого не происходит, проверьте конфигурацию и регистрацию и убедитесь, что не сделали никаких опечаток.
|
||||
|
||||
---
|
||||
|
||||
**Регистрация устройств в Asterisk**
|
||||
|
||||
Существует так много различных видов SIP-устройств, которые вы можете зарегистрировать в Asterisk, невозможно привести пример, который будет полезен всем. У вас может быть ПК или Mac, или рабочая станция Linux, или iPhone, или Android, или настольный SIP-телефон, или какое-то иное устройство SIP; у каждого типа устройств есть много разных типов доступных клиентов SIP, и все они в основном одинаковы, но достаточно разные, чтобы раздражать новичка.
|
||||
|
||||
Мы не можем показать вам конкретный метод регистрации, но мы обнаружили, что из десятков или, возможно, сотен вариантов в каждом устройстве основной процесс аналогичен для всех из них. Вам нужно будет предоставить:
|
||||
|
||||
* Адрес вашего сервера Asterisk (`hostname`, `domen`, `proxy` и `server` - это все поля, которые мы видели для него)
|
||||
* Идентификатор устройства (`id`, `user`, `subscriber`, `username`, `extension`, `name` и тд)
|
||||
* Пароль
|
||||
|
||||
Если это становится сложным, вы, вероятно, зашли слишком далеко. Пусть все будет просто. Если продукт не имеет хорошей документации, то это может быть неправильный продукт для вас. Для большинства SIP-телефонов вы можете найти инструкции в интернете о том, как зарегистрировать их на Asterisk.
|
||||
|
||||
---
|
||||
|
||||
Если вы зарегистрируете второе устройство (теперь у вас их четыре!), вы можете сделать тестовые вызовы между ними.
|
||||
|
||||
Потратьте немного времени на это и убедитесь, что вы все это поняли. Это имеет решающее значение для всего, что последует далее.
|
||||
|
||||
## Под капотом: Ваш первый звонок
|
||||
|
||||
Чтобы вы задумались о том, что происходит под капотом, мы кратко рассмотрим некоторые вещи из того, что на самом деле происходит с протоколом SIP, когда два устройства в одной системе Asterisk вызывают друг друга.
|
||||
|
||||
---
|
||||
|
||||
## Asterisk как B2BUA
|
||||
|
||||
Имейте в виду, что на самом деле здесь происходит два вызова: один от исходного комплекта в Asterisk, а другой из Asterisk в целевой комплект. SIP - это одноранговый протокол, и с точки зрения протокола происходит два вызова. Протокол SIP не знает, что Asterisk соединяет вызовы; каждое устройство понимает свое соединение как соединение с Asterisk, без реального знания устройства на другой стороне. Именно по этой причине Asterisk часто называют B2BUA \(Back to Back User Agent\). Именно поэтому так легко соединять различные протоколы вместе с помощью Asterisk.
|
||||
|
||||
---
|
||||
|
||||
Для только что сделанного вызова будут созданы диалоги, показанные на Рисунке 5-3.
|
||||
|
||||
Для получения более подробной информации о том, как работает обмен SIP-сообщениями, обратитесь к [SIP RFC](http://www.ietf.org/rfc/rfc3261.txt).
|
||||
|
||||

|
||||
|
||||
_Рисунок 5-3. SIP диалоги_
|
||||
|
||||
## Вывод
|
||||
|
||||
В этой главе вы изучили рекомендации по именованию устройств путем абстрагирования понятий пользователь, добавочный номер и устройство, а также определения параметров конфигурации устройства и проверки подлинности в файлах конфигурации канала. Затем мы углубимся в магию Asterisk, которая является диалпланом, и посмотрим, как простые вещи могут давать отличные результаты.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408634856-marker) Или любой другой сети, если на то пошло. Более формально можно было бы назвать области аналого-цифровых шлюзов, где характер цифрового протокола может варьироваться \(например, проприетарные АТС на традиционных УАТС\). Дело в том, что ATA не обязательно является SIP-устройством.
|
||||
|
||||
[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408624504-marker) ATA - это не единственный способ подключения аналоговых телефонов. Поставщики оборудования, такие как Digium и Sangoma, предлагают карты, которые подключаются к серверу Asterisk и предоставляют аналоговые телефонные порты. Более крупные установки могут также использовать банки каналов или MSANы; однако этот метод подключения устаревших телекоммуникационных схем является более продвинутым предметом, а не предметом этой книги.
|
||||
|
||||
[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408623256-marker) Для действительно удивительного беспроводного аналогового телефона вы должны проверить устройства EnGenius DuraFon, которые дороги, но впечатляют.
|
||||
|
||||
[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408622440-marker) Наш друг Брайан Капуч собрал вместе множество занимательных демонстраций того, как можно использовать старинное телефонное оборудование для работы с Asterisk.
|
||||
|
||||
[5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408610760-marker) Проще говоря, вам нужно будет найти файл _pjsip.conf.sample_, и использовать его в качестве шаблона для создания файла _pjsip.conf_ в папке _/etc/asterisk_, а затем отредактировать этот файл таким же образом, как мы собираемся делать в базе данных.
|
||||
|
||||
[6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408603032-marker) Или в самом файле _.conf_ если вы заходите пойти по этому пути.
|
||||
|
||||
[7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408545288-marker) За исключением, конечно того, что ваши пароли будут намного лучше, чем те, которые мы использовали здесь.
|
||||
|
||||
[8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408511480-marker) Или любой другой сервер регистратора SIP, если на то пошло.
|
||||
|
||||
[Глава 4. Сертификаты для безопасности конечных точек](glava-04.md) | [Содержание](summary.md) | [Глава 6. Основы диалплана](glava-06.md)
|
|
@ -0,0 +1,11 @@
|
|||
# Послесловие
|
||||
|
||||
Животное на обложке _Asterisk: Окончательное руководство_ является морской звездой (_Asteroidea_), группа иглокожих (иглокожие беспозвоночные, встречающиеся только в море). Большинство морских звезд имеют пятикратную радиальную симметрию (плечи или лучи, ответвляющиеся от центрального диска тела кратны пяти), хотя некоторые виды имеют четыре или девять плеч. Существует более 1500 видов морских звезд.
|
||||
|
||||
Морские звезды живут на морском дне и в приливных бассейнах, цепляясь за скалы и передвигаясь (медленно), используя сосудистую систему на водной основе, чтобы манипулировать сотнями крошечных трубчатых ног, называемых _подиями_. Маленькая луковица или _ампула_ в верхней части трубки сжимается, выталкивая воду и расширяя ногу морской звезды. Ампула расслабляется и нога втягивается. На кончике каждой ножки находится присоска, которая позволяет морской звезде вскрывать раковины моллюсков, устриц или мидий. Морские звезды - плотоядные животные, они едят кораллы, рыбу, двустворчатых моллюсков и улиток.
|
||||
|
||||
Морские звезды могут сгибать и манипулировать своими руками, чтобы поместиться в небольших местах. В конце каждой руки находится глазок, примитивный датчик, который обнаруживает свет и помогает морской звезде определить направление. Морские звезды также обладают способностью регенерировать отсутствующую конечность. Некоторые виды могут даже вырастить полную, новую морскую звезду из отрубленной руки.
|
||||
|
||||
Многие животные на обложках О'Рейли находятся под угрозой исчезновения; все они важны для мира. Иллюстрация обложки - Карен Монтгомери, основанная на черно-белой гравюре из _Дуврского живописного архива_. Шрифты обложки - Gilroy Semibold и Guardian Sans. Шрифт текста в Adobe Minion Pro; шрифт заголовка является Adobe Myriad Condensed; и шрифт кода Далтона Маага - Ubuntu Mono.
|
||||
|
||||
[Об авторах](about-the-authors.md) | [Содержание](SUMMARY.md) |
|
|
@ -0,0 +1,41 @@
|
|||
# Вступление
|
||||
|
||||
Когда мы рассматривали предисловие к каждому изданию этой книги - у нас всегда было больше людей, от которых мы хотели бы получить вклад, чем страниц, которые мы могли бы выделить. В этом пятом издании мы снова попросили избранную группу людей из сообщества Asterisk написать несколько слов об Asterisk с их точки зрения.
|
||||
|
||||
## Джошуа Кольп (Старший разработчик программного обеспечения, Sangoma/Digium)
|
||||
|
||||
Более 15 лет назад я загрузил Asterisk на свой ноутбук и сделал свой первый VoIP-звонок с помощью IAX2 на АТС Digium. Я затаил дыхание в предвкушении, ожидая услышать голос, пока, наконец, звук Эллисон не раздался из моего ноутбука. В этот момент я понял, что в Asterisk есть что-то особенное. Это зажгло во мне искру интереса и воображения: мой ноутбук действительно сделал звонок! Осознание того, что всего лишь с небольшим усилием я могу принимать звонки и делать с ними то, что захочу, вызывало привыкание и возбуждение — чувство, разделяемое многими и по сей день.
|
||||
|
||||
Сегодня Asterisk сильно отличается от того, что было в то время. В прошлом она была в первую очередь ориентирован на то, чтобы быть АТС. Она обладала всеми этими особенностями и продолжала приобретать новые, чтобы продвинуться дальше в эту область. Однако со временем проект эволюционировал до такой степени, что Asterisk - это инструментарий, который можно использовать отдельно или в сочетании с другими проектами для создания вещей. Она существует для того, чтобы вызвать вопрос "Могу ли я это сделать?" - в твоем сознании и позволить тебе увидеть все до конца.
|
||||
|
||||
Этот простой вопрос - то, что движет многими решениями, принятыми в отношении Asterisk и ее направления. “Правильно ли это для пользователей?", "Неужели это то, что действительно нужно людям?", “Разве это ломает вещи?" "и “Могут ли они построить то, что они хотят с этим?" Вместе эти вопросы помогают гарантировать, что люди смогут реализовать свои идеи. Что меня сегодня волнует в Asterisk — видеть, как люди используют инструменты для создания чего-то нового без помех.
|
||||
|
||||
Я думаю, что в дальнейшем это будет продолжаться и для Asterisk. Она будет продолжать добавлять новые инструменты и функциональные возможности, для обеспечения большей гибкости и возможности для этих строительных вещей, уважая при этом свое наследие и то, как пользователи уже используют его. Она будет продолжать оставаться частью более крупных и лучших решений, некоторые из которых, возможно, даже не придут в голову сейчас. Мы сделали всего несколько шагов вперед и нам еще многое предстоит сделать.
|
||||
|
||||
Я призываю новых и старых пользователей Asterisk пересмотреть то, что может сделать Asterisk, изучить новые функции, которые были добавлены, и создать что-то новое и захватывающее из вашего обычного набора навыков. Если вы попали в тупик, где Asterisk не может сделать то, что вам нужно - тогда участвуйте в проекте и вносите свой вклад. Помогите другим, кто, возможно, пытается сделать то же самое. Станьте не просто тем, кто использует Asterisk, но и тем, кто помогает другим реализовать свою мечту.
|
||||
|
||||
## Дэн Дженкинс (Основатель компании Nimble Ape Ltd)
|
||||
|
||||
Asterisk был моей первой вылазкой в мир open source телефонии, и как веб-разработчик я обнаружил, что она сильно отличается от того, к чему я привык, исходя из веб-индустрии. С тех пор проект Asterisk продвинулся вперед, и теперь он включает в себя множество API и технологий, которые типичный веб-разработчик привык ожидать. Включение WebRTC и Asterisk Rest Interface имеет жизненно важное значение для интеграции с разработчиками, используемыми для построения веб-платформы. Asterisk — это то, вокруг чего я в конечном итоге построил свой бизнес - это действительно замечательная часть программного обеспечения, и у нее есть блестящее сообщество людей, которые её используют и улучшают. Мне было очень приятно быть частью этого сообщества и корректировать эту книгу для будущего сообщества.
|
||||
|
||||
## Джойс Уилмот (Старший веб-разработчик)
|
||||
|
||||
Я познакомился с Asterisk в 2012 году, когда работал в Voicenation - компании, предоставляющей прямой автоответчик 24/7/365 для тысяч клиентов. В то время колл-центр быстро перерастал стороннее программное обеспечение, которое они использовали. Не найдя гибкого и экономичного решения для своего быстрорасширяющегося колл-центра, Voicenation решила что им необходимо создать собственное программное обеспечение для колл-центра. Мне была поставлена задача создания такого программного обеспечения, с которой началось мое путешествие с Asterisk. То, что начиналось как монументальная задача (поскольку у меня не было предыдущего опыта IP-телефонии), быстро стало очарованием Asterisk, когда я обнаружил, как она упростила нашу установку, не жертвуя мощностью и гибкостью.
|
||||
|
||||
Перенесемся на девять лет вперед и десятки миллионов звонков спустя, а Asterisk по-прежнему верно и надежно управляет нашим колл-центром. Это было мое первое знакомство с программным обеспечением с открытым исходным кодом. Очевидно, что Asterisk - это история успеха open source, которая иллюстрирует, как программное обеспечение с открытым исходным кодом подпитывает предпринимательство — и как предпринимательство, в свою очередь, подпитывает развитие и совершенствование программного обеспечения с открытым исходным кодом. Я очень рад быть частью этого цикла и с нетерпением жду возможности стать частью сообщества, поскольку Asterisk постоянно развивается, чтобы идти в ногу с постоянно меняющимся миром телекоммуникаций.
|
||||
|
||||
## Мэтт Florell (Основатель VICIdial)
|
||||
|
||||
Мое первое знакомство с open source телефонией еще в 2001 году было на самом деле не с Asterisk. Оно состоялось с другим программным пакетом и заняло у меня пару месяцев, чтобы начать работать, используя простой IVR для регистрации запросов на контакт с моим работодателем, в то время. Это была не простая система для работы или модификация, поэтому я не делал с ней ничего другого, кроме того первого проекта IVR. Два года спустя я получил от одного клиента просьбу построить гораздо более сложную телефонную систему, которая требовала бы взаимодействия пользователей через компьютер. Я знал, что платформа, которую я использовал, не будет работать для такого проекта, поэтому я посмотрел на коммерческие и открытые варианты. Именно тогда я узнал об Asterisk, которая выглядела как идеальная платформа для этого проекта. Я купил карту T1, с помощью которой можно было провести некоторые тесты и в течение двух часов после ее прибытия я настроил ее и смог воспроизвести старый проект, на создание которого у меня ушло два месяца. После этого я попался на крючок. Проект VICIdial Open-Source Contact Center вырос из этого проекта; на сегодняшний день более 100 000 систем Asterisk были установлены в составе кластеров VICIdial, и это только те, о которых мы знаем.
|
||||
|
||||
Asterisk сильно отличался от большинства веб-пакетов с открытым исходным кодом, с которыми я работал в прошлом, и у него было довольно много причуд и ошибок в более ранние дни, которые нам приходилось обходить (иногда довольно творчески). Но более поздний опыт работы с веткой Asterisk 13 показал значительные улучшения как в производительности, так и в стабильности по сравнению с более ранними ветками. Кроме того, было добавлено много новых функций, позволивших нам добавить новые функциональные возможности в наш пакет VICIdial. Две из них - это возможность приостанавливать записи вызовов и добавление нескольких уровней регистрации нового носителя SIP.
|
||||
|
||||
Еще в 2003 году, когда я начал использовать Asterisk, настоящих “релизов" не было. Вы должны были найти стабильную сборку из одной из последних версий CVS и протестировать ее. С течением времени развитие и обслуживание различных отраслей стало намного более стабильным, а использование Asterisk в производственных системах по всему миру резко возросло. Сегодня Asterisk - это телефонное ядро тысяч различных предложений услуг, через которое ежедневно проходят миллиарды телефонных звонков. Оно устанавливается на самые разнообразные аппаратные средства, от крошечных встроенных систем до серверных ферм с сотнями мощных машин. В настоящее время миллионы людей, ежедневно использующих Asterisk, понятия не имеют, что они взаимодействуют с частью программного обеспечения с открытым исходным кодом.
|
||||
|
||||
Только среди нашей клиентской базы есть несколько компаний из списка Fortune 500, а также школьные округа, общественные клубы, политические организации, муниципальные службы экстренной помощи и, конечно же, тысячи различных видов коммерческих организаций. В то время как низкая стоимость приобретения является распространенной причиной для использования решения на основе Asterisk, мы часто слышим, что тот факт, что это открытый исходный код - является большим плюсом, а также отсутствие возможности блокировки источника. Один из наших крупных клиентов даже назвал использование программного обеспечения для телефонии с открытым исходным кодом “явным стратегическим преимуществом” по сравнению с конкурентами из-за гибкости систем и их способности самостоятельно управлять ими без необходимости полагаться на внешних источников. Судя по тому, что я видел до сих пор, будущее Asterisk - это постоянно растущая установленная база и постоянные усовершенствования. Я с нетерпением жду возможности поработать с ним еще как минимум 16 лет.
|
||||
|
||||
## Мэтт Фредриксон (Директор Asterisk Engineering, Sangoma/Digium)
|
||||
|
||||
У меня была возможность работать с Asterisk в течение последних 18 лет и я видел, как он вырос из небольшого проекта с одним или двумя людьми в нечто, что имеет свою собственную жизнь с сотнями участников. Удивительно видеть, сколько разных мест он нарушил традиционные телекоммуникации - дома, в офисе и на предприятии. По мере того как традиционные модели коммуникации меняются, проект Asterisk продолжает оставаться там, где он делает это лучше всего — наводя мосты между старыми формами коммуникации и новыми и раздвигая границы того, что можно сделать с новыми. Эта книга поможет вам увидеть самое современное лицо Asterisk и узнать как лучше использовать его в своей телекоммуникационной инфраструктуре. Огромное спасибо Джиму Ван Меггелену за всю тяжелую работу по составлению этого самого последнего издания.
|
||||
|
||||
[Аннотация](README.md) | [Содержание](SUMMARY.md) | [Предисловие](preface.md)
|
|
@ -0,0 +1,119 @@
|
|||
# Глава 1. Революция в телефонии
|
||||
|
||||
> Мы - то, за чем они растут. Это истинное бремя всех мастеров.
|
||||
>
|
||||
> Джедай Магистр Йода
|
||||
|
||||
Когда мы впервые решили в 2004 году написать книгу о Asterisk (15 лет назад, начиная с этого издания!), мы уверенно предсказывали, что Asterisk кардинально изменит телекоммуникационную отрасль. Сегодня революция, которую мы предсказали, является частью истории. Asterisk уже несколько лет является самой успешной частной отраслевой биржей (УАТС) в мире и является признанной технологией в телекоммуникационной отрасли.
|
||||
|
||||
Революция—столь же необходимая, как и для телекоммуникационной индустрии того времени-значительно затихла просто потому, что методы, с помощью которых люди любят общаться, изменились. В то время как 25 лет назад телефонные звонки были предпочтительным способом общения на расстоянии, нынешняя тенденция заключается в отправке сообщений или проведении видеоконференций. Телефонный звонок воспринимается как нечто мертвое, особенно будущими поколениями. Мы еще не совсем готовы к похоронам.
|
||||
|
||||
Asterisk остается мощной технологией, и мы считаем, что она по-прежнему является одной из лучших надежд на какую-либо разумную интеграцию между телекоммуникационными и всеми другими технологиями, с которыми могут захотеть соединиться компании. Ему необходимо будет найти свое место в коммуникационной экосистеме, которая больше не ставит телефонные звонки в важное место. Мы ожидаем, что WebRTC,который обещает коммерциализировать веб-коммуникации<sup><a href="#sn1">1</a></sup>, появится в качестве замены для всех подражателей, закрытых и проприетарных продуктов “сотрудничества”, которые в настоящее время наводняют \(и запутывают\) рынок. Asterisk может сыграть свою роль в этом новом будущем, и сообщество Asterisk охотно и с энтузиазмом взяло на себя эту новую концепцию. Итак, может быть, вам говорят, что голос мертв, но любой, кто обратил внимание на любую научную фантастику любого рода, знает, что возможность разговаривать друг с другом на больших расстояниях не будет единственной областью тех, кто печатает на клавиатурах. Люди любят поговорить, и мы будем продолжать искать способы сделать это.
|
||||
|
||||
Следует отметить, что существует также огромное поколение людей, чьи воспоминания предшествуют интернету, и для этих людей телефон по-прежнему является очень полезной технологией. Если кто-то хочет иметь с ними дело, ему лучше хорошо справляться с телефонными звонками. Эти люди уходят с работы, но их кошельки все еще имеют много влияния. Возможно, АТС-это умирающая вещь, но ее хвост очень длинный.
|
||||
|
||||
В этой книге мы собираемся исследовать гайки и болты Asterisk. Это гибкий, открытый, отвечающий стандартам инструментарий, который, по нашему мнению, все еще очень актуален для бизнеса сегодня и будет оставаться полезным в течение многих лет. Сила Asterisk заключается в его гибкости. Он оказался очень полезным при связывании различных типов коммуникационных технологий вместе, и если он хочет иметь какое-либо будущее, ему нужно будет продолжать это делать. Новые технологии, такие как WebRTC, предлагают всевозможные возможности для будущего общения, и сообщество Asterisk очень сосредоточено на этом сдвиге парадигмы.
|
||||
|
||||
Замечательная гибкость Asterisk имеет свою цену: это не простая система для изучения или настройки. Это не потому, что это нелогично, запутанно или загадочно; напротив, это очень разумно и практично. Глаза людей загораются, когда они впервые видят диалплан Asterisk и начинают осознавать возможности. Но когда есть буквально тысячи способов достижения результата, процесс, естественно, требует дополнительных усилий. Возможно, это можно сравнить со строительством дома: компоненты относительно легко понять, но человек, рассматривающий такую задачу, должен либо а) заручиться компетентной помощью, либо б) развить необходимые навыки посредством обучения, практики и хорошей книги по этому вопросу.
|
||||
|
||||
## Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией
|
||||
|
||||
Иногда кажется, что мы забыли, что цель телефона-позволить людям общаться. На самом деле это простая цель, и мы должны иметь возможность сделать это гораздо более гибкими и творческими способами, чем в настоящее время доступны нам. Новые технологии всегда стремятся доминировать на рынке с помощью собственного предложения. Мало кому это удается. Коммуникационные технологии должны взаимодействовать, и такие технологии, как Asterisk, снижают барьеры для входа для тех, кто хочет внедрять инновации.
|
||||
|
||||
Именно по этой причине—коммуникация—мы считаем, что будущее все еще существует для проектов телефонии с открытым исходным кодом, таких как Asterisk. Да, люди могут больше не хотеть делать ”телефонные звонки", но мы считаем, что в разговорах все еще будет ценность. Технологии, которые могут облегчить эти разговоры, могут развиваться, казалось бы, радикальными способами, но основное желание общаться остается тем же самым.
|
||||
|
||||
Asterisk подключен к будущему, и у него есть длинный послужной список успешной интеграции коммуникационных технологий.
|
||||
|
||||
### Проект телефонии Zapata
|
||||
|
||||
Когда проект Asterisk был запущен (в 1999 году), существовали и другие проекты телефонии с открытым исходным кодом. Тем не менее, Asterisk в сочетании с проектом Zapata Telephony смогла обеспечить интерфейсы телефонной сети общего пользования (ТфОП), что стало важной вехой в переходе программного обеспечения от чего-то чисто сетевого к чему-то более практичному в мире телекоммуникаций в то время, когда он был ориентирован на ТфОП.
|
||||
|
||||
Проект телефонии Zapata был задуман Джимом Диксоном, инженером-консультантом по телекоммуникациям, который был вдохновлен невероятными достижениями в скорости процессора, которые компьютерная индустрия теперь воспринимает как должное. Диксон считал, что гораздо более экономичные системы телефонии можно было бы создать, если бы существовала карта, на которой не было бы ничего, кроме основных электронных компонентов, необходимых для взаимодействия с телефонной линией. Вместо того, чтобы иметь дорогие компоненты на карте, цифровая обработка сигналов (DSP)<sup><a href="#sn2">2</a></sup> будет обрабатываться в процессоре с помощью программного обеспечения. Хотя это наложило бы огромную нагрузку на процессор, Диксон был уверен, что низкая стоимость процессоров по сравнению с их производительностью делает их гораздо более привлекательными, чем дорогие DSP, и, что более важно, что это соотношение цены и производительности будет продолжать улучшаться по мере увеличения мощности процессоров.
|
||||
|
||||
Как и многие провидцы, Диксон верил, что многие другие увидят эту возможность, и ему просто нужно подождать, пока кто-то другой создаст то, что для него было очевидным улучшением. Через несколько лет он заметил, что не только никто не создавал эти карты, но и казалось маловероятным, что кто-то когда-нибудь собирался. В тот момент было ясно, что если он хочет революции, то должен начать ее сам. Так родился проект телефонии Zapata:
|
||||
|
||||
> Поскольку эта концепция была настолько революционной, что наверняка вызвала бы много волн в индустрии, я выбрал мексиканский революционный мотив и назвал технологию и организацию в честь знаменитого мексиканского революционера Эмилиано Сапаты. Я решил назвать карту "tormenta“, что по-испански означает” шторм", но в контексте оно обычно используется для обозначения большого шторма, такого как ураган или что-то подобное.
|
||||
|
||||
Возможно, нам следует называть себя Asteristas. Несмотря на это, мы должны поблагодарить Джима Диксона, частично за то, что он придумал это и частично за то, что довел это до конца, но в основном за то, что дал результаты своих усилий сообществу с открытым исходным кодом. В результате вклада Джима появился двигатель ТфОП Asterisk. И благодаря этому сочетанию VoIP и ТфОП родилась телекоммуникационная революция с открытым исходным кодом!
|
||||
|
||||
За прошедшие годы интерфейс телефонии Zapata в Asterisk был изменен и улучшен. Телефония Digium Asterisk Hardware Device Interface (DAHDI), используемая сегодня, является детищем вклада Джима Диксона.
|
||||
|
||||
## Массовые изменения требуют гибкости технологий
|
||||
|
||||
Каждая существующая АТС страдает от недостатков. Независимо от того, насколько полнофункциональной она является, что-то всегда будет упущено, потому что даже самая многофункциональная АТС не сможет предвидеть творчество клиента. Небольшая группа пользователей захочет иметь странную маленькую функцию, о которой проектная группа либо не думала, либо не могла оправдать стоимость её создания, и, поскольку система закрыта, пользователи не смогут создать ее сами.
|
||||
|
||||
Если бы интернет был таким образом затруднен регулированием и коммерческими интересами, сомнительно, что он получил бы широкое признание, которым пользуется в настоящее время. Открытость интернета означала, что любой желающий мог позволить себе принять в нем участие. Так что все так и сделали. Десятки тысяч умов, которые сотрудничали в создании интернета, принесли то, что ни одна корпорация в одиночку никогда не смогла бы получить<sup><a href="#sn3">3</a></sup>.
|
||||
|
||||
Как и во многих других проектах с открытым исходным кодом (как Linux и так множество важного программного обеспечения, работающего в интернете), разработка Asterisk была подпитана мечтами людей, которые знали, что должно быть что-то большее, чем то, что производят традиционные отрасли. Эти люди знали, что если бы можно было взять лучшие части различных АТС и разделить их на взаимосвязанные компоненты - подобно коробке с кирпичиками LEGO, можно было бы начать понимать вещи, которые не переживут традиционный корпоративный процесс анализа рисков.
|
||||
|
||||
Сама Asterisk стала основой многих массово производимых творений. И все же, под капотом, душа этого проекта остается с открытым исходным кодом.
|
||||
|
||||
## Asterisk: хакерская УАТС
|
||||
|
||||
Asterisk является основной АТС хакера. Термин _хакер_, был искажен средствами массовой информации в значении “злостный взломщик” для необразованных. Это прискорбно, потому что термин фактически существовал задолго до того, как СМИ испортили его значение. Хакеры создали сетевой движок, который стал интернетом. Хакеры создали Apple Macintosh и операционную систему Unix. Хакеры также строят свою следующую телекоммуникационную систему. Да, некоторые из этих людей являются злостными, но умы, которые управляют разработкой Asterisk, хорошо знают об этом, и вы обнаружите, что Asterisk позволяет создавать систему, которая гораздо более способна быстро реагировать на угрозы безопасности. Программное обеспечение с открытым исходным кодом не скрывает свои недостатки за корпоративными отделами. Грязь вытаскивают на открытое место, где с ней можно справиться. Вместо того чтобы ограничиваться сомнительной и часто плохой безопасностью закрытых систем, сообщество Asterisk быстро реагирует на меняющиеся тенденции в области безопасности, и вы сможете точно настроить свою телефонную систему в соответствии с корпоративной политикой и лучшими отраслевыми практиками.
|
||||
|
||||
Как и другие системы с открытым исходным кодом, Asterisk сможет превратиться в гораздо более безопасную платформу, чем любая проприетарная система, несмотря на свои хакерские корни, а скорее даже благодаря им.
|
||||
|
||||
## Asterisk: профессиональная УАТС
|
||||
|
||||
Asterisk - это технология поддержки, и, как и в случае с Linux, все реже можно найти предприятие, которое не запускает какую-либо версию Asterisk, в каком-то качестве, где-то в сети, решая проблему так, как может только Asterisk. Вы уже используете Asterisk, даже если вы этого не знаете.
|
||||
|
||||
## Сообщество Asterisk
|
||||
|
||||
Нет смысла ходить вокруг да около: сообщество Asterisk - это тень его прежнего "я". Десять лет назад Asterisk была самой крутой вещью с открытым исходным кодом. Сегодня большинство энтузиастов двинулись дальше. Однако остается опытное и проверенное в боях сообщество профессионалов, которые были там и сделали это.
|
||||
|
||||
Не ждите от команды людей, готовых бесплатно работать над вашими проектами. Цена вступления в это сообщество - личная заинтересованность в развитии навыков. Если вы принесете чувство права в это сообщество - вам не понравятся ответамы. Однако если вы проявите любопытство, энтузиазм и желание погрузиться в работу, запачкать руки и заняться ею, то найдете сообщество, более чем готовое поделиться с вами своими трудами и добытыми знаниями.
|
||||
|
||||
Ниже приведены некоторые из мест, где обитает сообщество Asterisk.
|
||||
|
||||
### Дискусионный сайт сообщества Asterisk
|
||||
|
||||
В 2015 году Asterisk переместила свои официальные форумы на [https://community.asterisk.org/](https://community.asterisk.org/). Похоже, что это самое активное сообщество сейчас, и отношение сигнал/шум отличное. Сотрудники Digium хорошо справляются с этой задачей, и некоторые из их старших и опытных людей принимают активное участие.
|
||||
|
||||
Имейте в виду, что это не похоже на платную поддержку. От вас ожидают, что вы будете выполнять работу самостоятельно, но вы можете рассчитывать на получение хороших качественных советов, которые направят вас в правильном направлении.
|
||||
|
||||
### Списки рассылки Asterisk
|
||||
|
||||
Активность в этих списках сократилась до минимума (с сотен сообщений в день до, возможно, дюжины потоков в месяц). Они, вероятно, наиболее полезны в качестве исторического архива, но, возможно, стоит туда обратиться когда вы сталкиваетесь с неразрешимой проблемой. Списки рассылки вы найдете по адресу [lists.digium.com](http://lists.digium.com/), эти два, вероятно, будут наиболее полезными:
|
||||
|
||||
_Asterisk-Users_
|
||||
|
||||
Этот список-тень его прежнего себя. В то время как раньше он генерировал несколько сотен сообщений в день, большая часть этого трафика переместилась на сайт сообщества Digium Asterisk (выше).
|
||||
|
||||
_Asterisk-Dev_
|
||||
|
||||
Разработчики Asterisk тусуются здесь. Целью и направленностью этого списка является обсуждение разработки программного обеспечения Asterisk, и участники активно защищают эту цель. Ожидайте много гнева, если опубликуете что-либо в этом списке, не относящееся конкретно к программированию или разработке базы кода Asterisk. Общие вопросы кодирования (такие как запросы о взаимодействии с AGI или AMI) должны быть направлены в список _Asterisk-Users_.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/warning.png" height="100" align="left">Список <i>Asterisk-Dev</i> не является поддержкой второго уровня! Если вы прокрутите архивы списков рассылки, то увидите, что это строгое правило. Список рассылки <i>Asterisk-Dev</i> посвящен обсуждению основных разработок Asterisk, а вопросы по взаимодействию с внешними программами через AGI или AMI должны быть размещены в списке <i>Asterisk-Users</i>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Сайт Asterisk Wiki
|
||||
|
||||
Это не совсем тусовка сообщества, но она заслуживает упоминания. Digium поддерживает Вики для Asterisk по адресу [wiki.asterisk.org](http://wiki.asterisk.org/), этот сайт постоянно обновляется командой Digium, и автоматизированные скрипты экспортируют документацию на основе XML из источников Asterisk в саму Вики, что помогает гарантировать актуальность данных.
|
||||
|
||||
Более старая Вики существует по адресу [www.voip-info.org](http://www.voip-info.org/), что в наши дни является своего рода историческим курьезом и источником большого просветления и путаницы. Хотя здесь содержится огромное количество информации, большая ее часть устарела. Мы включаем ссылку на неё здесь просто потому, что вы, вероятно, попадёте на неё в один прекрасный день и подумаете, что попали в материнскую жилу, но то, что вы на самом деле нашли, больше похоже на музей исторических странностей: увлекательно, но необязательно актуально.
|
||||
|
||||
### IRC-каналы
|
||||
|
||||
Сообщество Asterisk поддерживает каналы Internet Relay Chat (IRC) на _irc.freenode.net_. Двумя наиболее активными каналами являются _#asterisk_ и _#asterisk-dev_ <sup><a href="#sn4">4</a></sup>. Чтобы сократить количество вторжений спам-ботов, оба этих канала требуют регистрации для присоединения. Чтобы зарегистрироваться, запустите `/msg nickserv help` при подключении к службе через ваш любимый IRC-клиент.
|
||||
|
||||
## Вывод
|
||||
|
||||
Так с чего начать? Что ж, когда речь заходит об Asterisk, можно говорить гораздо больше, чем мы можем вписать в одну книгу. Эта книга может только заложить основы, но из этого фундамента вы сможете прийти к пониманию концепции Asterisk - и из этого, кто знает, что вы будете строить?
|
||||
##
|
||||
<ol>
|
||||
<li id="sn1"> И, возможно, еще, учитывая, что WebRTC также революционизирует нативные приложения!</li>
|
||||
|
||||
<li id="sn2"> Термин DSP также означает цифровой сигнальный процессор, который представляет собой устройство (обычно чип), способное интерпретировать и изменять сигналы различных видов. В голосовой сети DSP в первую очередь отвечают за кодирование, декодирование и перекодирование аудиоинформации. Это может потребовать много вычислительных усилий.</li>
|
||||
|
||||
<li id="sn3"> Мы понимаем, что технология интернета сформировалась из государственных и академических институтов, но то, о чем мы здесь говорим - это не столько технология интернета, сколько культурный феномен его, который взорвался в начале 90-х годов.</li>
|
||||
|
||||
<li id="sn4"> Канал <i>#asterisk-dev</i>. предназначен для обсуждения изменений в базовой кодовой базе Asterisk и также не является поддержкой второго уровня. Обсуждения, связанные с программированием внешних приложений, которые взаимодействуют с Asterisk через AGI или AMI, должны быть в <i>#asterisk</i>. </li>
|
||||
</ol>
|
||||
|
||||
[Предисловие](preface.md) | [Содержание](SUMMARY.md) | [Глава 2. Архитектура Asterisk](glava-02.md)
|
|
@ -0,0 +1,494 @@
|
|||
# Глава 2. Архитектура Asterisk
|
||||
|
||||
> _Прежде всего, но не обязательно в таком порядке._
|
||||
>
|
||||
> -- Доктор Кто
|
||||
|
||||
Asterisk очень отличается от других, более традиционных УАТС тем, что диалплан в Asterisk обрабатывает все входящие каналы по существу одинаково, а не разделяет их на станции, транки, периферийные модули и т.д.
|
||||
|
||||
В традиционной АТС существует логическое различие между станциями (телефонными аппаратами) и транками (магистралями - ресурсами, которые подключаются к внешнему миру). Это ограничение делает творческую маршрутизацию в традиционных УАТС очень сложной или невозможной.
|
||||
|
||||
Asterisk, с другой стороны, не имеет внутреннего понятия транков или станций. В Asterisk все, что входит или выходит из системы, проходит через какой-то канал. Существует множество различных типов каналов; однако диалплан Asterisk обрабатывает все каналы аналогичным образом, что означает, например, внутренний пользователь может существовать на конце внешнего транка (например, сотовый телефон) и обрабатываться диалпланом точно так же, как если бы пользователь был на внутреннем номере. Если вы не работали с традиционной АТС<sup><a href="#sn1">1</a></sup>, то может быть не сразу очевидно насколько это является мощным и освобождающим. [Рисунок 2-1](pics/pic2-1.png) иллюстрирует различия между этими двумя архитектурами.
|
||||
|
||||

|
||||
|
||||
_Рисунок 2-1. Архитектура Asterisk против УАТС_
|
||||
|
||||
## Модули
|
||||
|
||||
Asterisk построен на модулях. Модуль - это загружаемый компонент, который обеспечивает определенную функциональность, такую как драйвер канала (например, `chan_pjsip.so`) или ресурс, который позволяет подключиться к внешней технологии (например `func_odbc.so`). Модули Asterisk загружаются на основе параметров, определенных в файле _/etc/asterisk/modules.conf_. Мы обсудим использование многих модулей в этой книге, но на этом этапе мы просто хотим представить концепцию модулей и дать вам представление о типах модулей, которые доступны.
|
||||
|
||||
На самом деле можно запустить Asterisk вообще без каких-либо модулей, хотя в этом состоянии он ничего не сможет сделать. Это бывает полезно, чтобы понять модульную природу Asterisk для оценки архитектуры.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Вы можете запустить Asterisk без модулей, загружаемых по умолчанию и загружать каждый нужный модуль вручную из консоли, но это не то, что вы хотели бы запустить в продакшен; это было бы полезно только в том случае, если бы вы настраивали производительность системы, в которой хотели убрать все, что не требуется вашим конкретным приложением Asterisk.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Типы модулей в Asterisk включают в себя следующие:
|
||||
|
||||
* Приложения - рабочие лошадки диалплана, такие как `Dial()`, `Voicemail()`, `Playback()`, `Queue()` и т.д.
|
||||
* Модули соединения - механизмы, которые соединяют каналы (вызовы) друг с другом
|
||||
* Модули записи деталей вызовов (CDR)
|
||||
* Модули регистрации событий канала (CEL)
|
||||
* Драйверы каналов — различные соединения с системой и из системы; SIP (Session Initiation Protocol) использует канальный драйвер PJSIP
|
||||
* Трансляторы кодеков — преобразовывают различные кодеки как G729, G711, G722, Speex и так далее
|
||||
* Интерпретаторы форматов — как указано выше, но относящиеся к файлам, хранящимся в файловой системе
|
||||
* Функции диалплана — расширенные возможности диалплана
|
||||
* Модули УАТС
|
||||
* Модули ресурсов
|
||||
* Дополнительные модули
|
||||
* Тестовые модули
|
||||
|
||||
Существует официальный список типов статуса поддержки, включенных в `menuselect`<sup><a href="#sn2">2</a></sup>.
|
||||
|
||||
### Приложения
|
||||
|
||||
Приложения диалплана используются в _extensions.conf_ для определения различных действий, применимых к вызову. Например, приложение `Dial()` отвечает за создание исходящих соединений с внешними ресурсами и, возможно, является самым важным приложением диалплана. Доступные приложения перечислены в Таблице 2-1.
|
||||
|
||||
Таблица 2-1. _Популярные приложения диалплана_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :--- | :--------- |
|
||||
| `app_authenticate` | Сравнивает сигналы набора DTMF с указанной строкой (паролем) |
|
||||
| `app_cdr` | Записывает данные в CDR |
|
||||
| `app_chanspy` | Позволяет каналу прослушивать аудио на другом канале |
|
||||
| `app_confbridge` | Обеспечивает конференц-связь |
|
||||
| `app_dial` | Используется для соединения каналов вместе (т. е. для совершения телефонных звонков) |
|
||||
| `app_directed_pickup` | Отвечает на вызов, который вызывает другой добавочный номер |
|
||||
| `app_directory` | Представляет список имен из _voicemail.conf_ |
|
||||
| `app_dumpchan` | Дамп переменных канала в интерфейс командной строки Asterisk (CLI) |
|
||||
| `app_echo` | Эхо получило звук обратно на исходный канал (может помочь в демонстрации задержки) |
|
||||
| `app_exec` | Содержит `Exec()`, `TryExec()` и `ExecIf()`: выполняет приложение плана набора условно |
|
||||
| `app_mixmonitor` | Записывает обе стороны вызова (передача и прием) и смешивает их вместе в один файл |
|
||||
| `app_originate` | Позволяет логике схемы набора номера инициировать вызов (в отличие от вызова, поступающего на канал ) |
|
||||
| `app_page` | Создает несколько аудио соединений с указанными устройствами для публичного адреса (пейджинг) |
|
||||
| `app_parkandannounce` | Включает автоматическое оповещение о припаркованных звонках |
|
||||
| `app_playback` | Воспроизведение файла на канал (не принимает ввод) |
|
||||
| `app_playtones` | Воспроизведение пар тонов указанных частот (в основном DTMF) |
|
||||
| `app_queue` | Обеспечивает автоматическое распределение вызовов (ACD) |
|
||||
| `app_read` | Запрашивает ввод цифр от абонентов и назначает ввод переменной |
|
||||
| `app_readexten` | Запрашивает ввод цифр у вызывающих абонентов и передает вызов на указанный добавочный номер и контекст. |
|
||||
| `app_record` | Запись полученного аудио в файл |
|
||||
| `app_senddtmf` | Передает DTMF вызывающей стороне |
|
||||
| `app_stack` | Обеспечивает `Gosub()`, `GoSubIf()`, `Return()`, `SteckPop()`, `LOCAL()` и `Local_PEEK()` |
|
||||
| `app_stasis` | Передает Управление вызовами в приложение ARI-многие разработчики Asterisk используют это приложение, а оттуда обрабатывают всю остальную часть своей разработки за пределами плана набора Asterisk |
|
||||
| `app_system` | Выполняет команды в Linux shell |
|
||||
| `app_transfer` | Выполняет передачу по текущему каналу |
|
||||
| `app_voicemail` | Предоставляет голосовую почту |
|
||||
| `app_while` | Включает `While()`, `EndWhile()`, `ExitWhile()` и `ContinueWhile()`; обеспечивает функциональность цикла `while` в диалплане |
|
||||
|
||||
### Модули соединений
|
||||
|
||||
Модули соединений выполняют фактическое соединение каналов. Эти модули, перечисленные в Таблице 2-2, в настоящее время используются только для (и необходимы) _app\_confbridge_.
|
||||
|
||||
_Таблица 2-2. Модули соединений_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :------------------------ | :--------- |
|
||||
| `bridge_builtin_features` | Выполняет соединение при использовании встроенных пользовательских функций (например, найденных в _features.conf_). |
|
||||
| `bridge_multiplexed` | Выполняет сложное мультиплексирование, как требуется в большом конференц-зале (несколько участников). В настоящее время используется только `app_confbridge`. |
|
||||
| `bridge_simple` | Выполняет простое соединение канал-канал. |
|
||||
| `bridge_softmix` | Выполняет простое мультиплексирование, как требуется в большом конференц-зале (несколько участников). В настоящее время используется только `app_confbridge`. |
|
||||
|
||||
В следующих разделах мы рассмотрели список модулей, которые, по нашему мнению, достаточно важны для обсуждения в этой книге. Вы найдете много других модулей в загрузке Asterisk, но многие старые модули либо устарели, либо имеют небольшую поддержку или не поддерживаются, и поэтому не рекомендуются для производства, если у вас нет доступа к разработчикам, которые могут поддерживать их для вас.
|
||||
|
||||
### Модули записи деталей вызова (CDR)
|
||||
|
||||
Модули CDR, перечисленные в Таблице 2-3, предназначены для обеспечения как можно большего числа методов хранения записей сведений о вызовах. CDR можно хранить в файле (по умолчанию), базе данных, RADIUS или _syslog_.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Записи деталей вызовов не предназначены для использования в сложных приложениях биллинга. Если вам требуется больше контроля над биллингом и отчетностью о вызовах - обратите внимание на журнал событий канала (CEL), обсуждаемый далее. Преимущество CDR заключается в том, что он просто работает.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Таблица 2-3. _Общие модули записи деталей вызова_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :------------------ | :--------- |
|
||||
| `cdr_adaptive_odbc` | Позволяет записывать CDR через платформу ODBC с возможностью добавления пользовательских полей |
|
||||
| `cdr_csv` | Записывает CDR на диск с разделителями-запятыми (CSV) файл |
|
||||
| `cdr_custom` | Записывает CDR в файл CSV, но допускает добавление пользовательских полей |
|
||||
| `cdr_odbc` | Пишет CDR через ODBC фреймворк |
|
||||
| `cdr_syslog` | Записывает CDR в системный журнал |
|
||||
|
||||
### Модули логирования событий канала
|
||||
|
||||
Регистрация событий канала (CEL) обеспечивает гораздо более мощный контроль над отчетами об активности вызовов. Кроме того, он требует более тщательного планирования вашего плана набора и ни в коем случае не будет работать автоматически. Модули Asterisk CEL перечислены в Таблице 2-4.
|
||||
|
||||
Таблица 2-4. _Модули логирования событий канала_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :----------- | :--------- |
|
||||
| `cel_custom` | CEL на диск/файл |
|
||||
| `cel_manager` | CEL в AMI |
|
||||
| `cel_odbc` | CEL в ODBC |
|
||||
|
||||
### Драйверы каналов
|
||||
|
||||
Без драйверов каналов у Asterisk не было бы возможности совершать или принимать вызовы. Каждый драйвер канала специфичен для протокола или типа канала, который он поддерживает (SIP, ISDN и т.д.). Модуль канала действует как шлюз к ядру Asterisk. Некоторые из наиболее популярных драйверов каналов Asterisk перечислены в Таблице 2-5.
|
||||
|
||||
Таблица 2-5. _Популярные драйверы каналов_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :------------ | :--------- |
|
||||
| `chan_bridge` | Используется внутри приложения `ConfBridge()`; не должен использоваться напрямую |
|
||||
| `chan_dahdi` | Обеспечивает подключение к картам ТфОП, использующим драйверы каналов DAHDI |
|
||||
| `chan_local` | Предоставляет механизм для обработки части диалплана как канала |
|
||||
| `chan_motif` | Реализует протокол Jingle, включая возможность подключения к Google Talk и Google Voice; представлен в Asterisk 11 |
|
||||
| `chan_multicast_rtp` | Обеспечивает подключение к потокам многоадресного Realtime Transport Protocol (RTP) |
|
||||
| `chan_pjsip` | Драйвер канала Session Initiation Protocol (SIP) |
|
||||
|
||||
### Трансляторы кодеков
|
||||
|
||||
Трансляторы кодеков<sup><a href="#sn3">3</a></sup> (часто называемые _транскодерами_) позволяют Asterisk конвертировать форматы аудиопотоков между вызовами. Поэтому, если вызов поступает по каналу PRI (используя G.711) и должен быть передан в сжатый канал SIP (например, используя G.729, один из многих кодеков, которые может обрабатывать SIP), соответствующий транслятор кодека выполнит преобразование.
|
||||
|
||||
Кодеки-это сложные алгоритмы, которые обрабатывают преобразование аналоговой информации (в данном случае звука, но также может быть и видео) в цифровой формат. Многие кодеки также обеспечивают сжатие и исправление ошибок, но это не является обязательным требованием.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Если кодек (например G.729) использует сложный алгоритм кодирования, интенсивное использование транскодинга может создать огромную нагрузку на процессор. Специализированное оборудование для декодирования/кодирования G.729 доступно от производителей оборудования, таких как Sangoma и Digium (и, вероятно, других).</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Asterisk делает довольно хорошую работу по поддержке кодеков, но в основном сосредоточен на кодеках, обычно используемых телефонными приложениями (в отличие от кодеков, используемых, скажем, для музыки или видео, таких как MP3 или MP4). Они перечислены в Таблице 2-6.
|
||||
|
||||
Таблица 2-6. _Общие трансляторы кодеков_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :----------- | :--------- |
|
||||
| `codec_alaw` | Кодек PCM A-law используется во всем мире на ТфОП (кроме Канады/США). Этот кодек (вместе с ulaw) должен быть включен на всех ваших каналах. |
|
||||
| `codec_g729` | До недавнего времени это был запатентованный кодек, но теперь он является бесплатным. На момент написания этой статьи он по-прежнему продается Digium в качестве дополнения, но его также можно найти в виде бесплатного пакета. Это очень популярный кодек, если требуется сжатие (и использование процессора не является проблемой), но он накладывает нагрузку на процессор, добавляет задержку к вызовам, немного снижает качество и никоим образом не уменьшает накладные расходы. |
|
||||
| `codec_a_mu` | Прямой конвертер A-law в mu-law. |
|
||||
| `codec_g722` | Широкополосный аудиокодек. |
|
||||
| `codec_gsm` | Кодек Global System for Mobile Communications (GSM). Очень низкое качество звука. |
|
||||
| `codec_ilbc` | Интернет-кодек с низким битрейтом (iLBC). |
|
||||
| `codec_lpc10` | Линейный предсказательный кодирующий вокодер (чрезвычайно низкая пропускная способность). |
|
||||
| `codec_opus` | Предназначен для замены speex (и vorbis). |
|
||||
| `codec_resample` | Пересемлирование между 8-ми и 16-тибитными линейными сигналами. |
|
||||
| `codec_speex` | Кодек Speex. |
|
||||
| `codec_ulaw` | Кодек PCM Mu-law, используемый на ТфОП в Канаде/США. Это более формально написано как μ-закон, но не у многих людей есть греческая буква μ на клавиатуре, поэтому обычно пишется как ulaw<sup><a href="#snta">a</a></sup>. Часто является кодеком по умолчанию, и должен быть включен на всех ваших каналах. |
|
||||
|
||||
<sup><a name="snta">a</a></sup> Произносится как “мью-лоу,” но так же вы часто будете слышать как "ю-лоу".
|
||||
|
||||
---
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/tip.png" height="100" align="left">Digium предоставляет некоторые дополнительные полезные модули кодеков: <code>codec_g729</code>, <code>codec_silk</code>, <code>codec_siren7</code> и <code>codec_siren14</code>. Эти модули кодеков не являются open source по различным причинам. Вы должны приобрести лицензию на использование <code>codec_g729</code>, но остальные являются бесплатными. Вы можете найти их на <a href="http://downloads.digium.com/pub/telephony/">сайте Digium</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Интерпретаторы формата
|
||||
|
||||
Интерпретаторы форматов в Таблице 2-7 выполняют ту же функцию, что и переводчики кодеков, но они работают с файлами, а не с каналами, и обрабатывают не только аудио. Если у вас есть запись в меню, которое было сохранено как GSM, вам нужно будет использовать интерпретатор формата для воспроизведения этой записи на любые каналы, не использующие кодек GSM<sup><a href="#sn4">4</a></sup>.
|
||||
|
||||
Если вы храните запись в нескольких форматах одновременно (например, WAV, GSM и т. д.), Asterisk определит наименее затратный формат<sup><a href="#sn5">5</a></sup> для использования, когда каналу необходимо воспроизвести эту запись.
|
||||
|
||||
Таблица 2-7. _Интерпретаторы форматов_
|
||||
|
||||
| Имя | Воспроизведение файлов, хранящихся в |
|
||||
| :------------ | :--- |
|
||||
| `format_g729` | G.729: ._g729_ |
|
||||
| `format_gsm` | RPE-LTP (оригинальный кодек GSM): ._gsm_ |
|
||||
| `format_h264` | H.264 video: ._h264_ |
|
||||
| `format_ilbc` | Интернет кодек с низким битрейтом: ._ilbc_|
|
||||
| `format_jpeg` | Графический файл: ._jpeg_, ._jpg_ |
|
||||
| `format_ogg_vorbis` | Ogg контейнер: ._ogg_ |
|
||||
| `format_pcm` | Различные форматы импульсно-кодированной модуляции: ._alaw_, ._al_, ._alw_, ._pcm_, ._ulaw_, ._ul_, ._mu_, ._ulw_, ._g722_, ._au_ |
|
||||
| `format_siren14` | G.722.1 Annex C (14 kHz): ._siren14_ |
|
||||
| `format_siren7` | G.722.1 (7 kHz): ._siren7_ |
|
||||
| `format_sln` | 8-bit signed linear: ._sln_, ._raw_ |
|
||||
| `format_vox` | ._vox_ |
|
||||
| `format_wav` | ._wav_ |
|
||||
| `format_wav_gsm` | GSM аудио в контейнере WAV: ._wav_, ._wav49_ |
|
||||
|
||||
### Функции диалплана
|
||||
|
||||
Функции диалплана, перечисленные в Таблице 2-8, дополняют приложения диалплана (смотри [“Приложения”](glava-02.md#приложения). Они предоставляют множество полезных улучшений для таких вещей, как обработка строк, смещение времени и даты и подключение ODBC.
|
||||
|
||||
Таблица 2-8. _Cписок полезных функций диалплана_
|
||||
|
||||
| Name | Назначение |
|
||||
| :---------------------- | :--------- |
|
||||
| `func_audiohookinherit` | Позволяет записывать звонки после трансфера |
|
||||
| `func_blacklist` | Пишет/читает черный список в _astdb_ |
|
||||
| `func_callcompletion` | Получает/устанавливает параметры конфигурации завершения вызова для канала |
|
||||
| `func_callerid` | Получает/устанавливает идентификатор звонящего (Caller ID) |
|
||||
| `func_cdr` | Получает/устанавливает переменную CDR |
|
||||
| `func_channel` | Получает/устанавливает информацию канала |
|
||||
| `func_config` | Включает `AST_CONFIG()`; считывает переменные из файла конфигурации |
|
||||
| `func_curl` | Использует cURL для получения данных из URI |
|
||||
| `func_cut` | Делит и нарезает строки |
|
||||
| `func_db` | Предоставляет функции _astdb_ |
|
||||
| `func_devstate` | Получает состояние устройства |
|
||||
| `func_dialgroup` | Создает группу для одновременного набора |
|
||||
| `func_dialplan` | Проверяет, что назначенная цель существует в диалплане |
|
||||
| `func_env` | Включает `FILE()`, `STAT()` и `ENV()`; выполняет действия операционной системы |
|
||||
| `func_global` | Получает/устанавливает глобальные переменные |
|
||||
| `func_groupcount` | Получает/устанавливает количество каналов для участников группы |
|
||||
| `func_hangupcause` | Получает/устанавливает информацию о зависании из канала |
|
||||
| `func_logic` | Включает `ISNULL()`, `SET()`, `EXISTS()`, `IF()`, `IFTIME() `и `IMPORT()`; выполняет различные логические функции |
|
||||
| `func_math` | Включает `MATH()`, `INC()` и `DEC()`; выполняет математические функции |
|
||||
| `func_odbc` | Позволяет интегрировать диалплан с ресурсами ODBC |
|
||||
| `func_rand` | Возвращает случайное число в заданном диапазоне |
|
||||
| `func_realtime` | Выполняет поиск в Asterisk Realtime Architecture (ARA) |
|
||||
| `func_redirecting` | Предоставляет доступ к информации о том, откуда был перенаправлен этот вызов |
|
||||
| `func_shell` | Выполняет операции оболочки Linux и возвращает результаты |
|
||||
| `func_sprintf` | Выполняет функции строкового формата, аналогичные функции `C` с тем же именем |
|
||||
| `func_srv` | Выполняет поиски SRV в диалплане |
|
||||
| `func_strings` | Включает в себя более десятка функций обработки строк |
|
||||
| `func_timeout` | Получает / устанавливает таймауты на канале |
|
||||
| `func_uri` | Преобразует строки в URI-безопасную кодировку |
|
||||
| `func_vmcount` | Возвращает количество сообщений в папке голосовой почты для определенного пользователя. |
|
||||
|
||||
### PBX Модули
|
||||
|
||||
Модули PBX это периферийные модули, которые обеспечивают улучшенные механизмы управления и настройки. Например, `pbx_config` это модуль, который загружает традиционный диалплан Asterisk. Доступные в настоящее время модули PBX перечислены в Таблице 2-9.
|
||||
|
||||
Таблица 2-9. _PBX модули_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :----------- | :--------- |
|
||||
| `pbx_config` | Этот модуль предоставляет традиционный, популярный язык диалплана для Asterisk. Без этого модуля Asterisk не может читать _extensions.conf_. |
|
||||
| `pbx_dundi` | Выполняет поиск данных в удаленных системах Asterisk. |
|
||||
| `pbx_realtime` | Предоставляет функциональные возможности, связанные с архитектурой Asterisk Realtime. |
|
||||
| `pbx_spool` | Обеспечивает поддержку исходящих сообщений, относящихся к файлам вызовов Asterisk. |
|
||||
|
||||
### Модули ресурсов
|
||||
|
||||
Модули ресурсов интегрируют Asterisk с внешними ресурсами. Эта группа модулей фактически превратилась в универсальное средство для вещей, которые не вписываются в другие категории. Разобьем их на несколько подгрупп модулей, которые связаны между собой.
|
||||
|
||||
#### Конфигурация бэкэнда
|
||||
|
||||
Asterisk по умолчанию настроен с использованием текстовых файлов в _/etc/asterisk_. Модули, перечисленные в Таблице 2-10, предоставлют альтернативные методы настройки. Смотри [Глава 15](glava-15.md) для получения подробной документации по настройке конфигурации на основе базы данных.
|
||||
|
||||
Таблица 2-10. _Конфигурационные бэкэнд-модули_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :---------------- | :--------- |
|
||||
| `res_config_curl` | Получает информацию о конфигурации, используя cURL |
|
||||
| `res_config_ldap` | Получает информацию о конфигурации, используя LDAP |
|
||||
| `res_config_odbc` | Получает информацию о конфигурации, используя ODBC |
|
||||
|
||||
#### Итеграция календаря
|
||||
|
||||
Asterisk включает некоторую интеграцию с календарными системами. Вы можете читать и записывать информацию календаря из плана набора. Вы также можете иметь звонки на основе записей календаря. Интеграция основного календаря обеспечивается модулем `res_calendar`. Остальные модули предоставляют возможность подключения к определенным типам календарных серверов. Таблица 2-11 перечисляет модули интеграции календаря.
|
||||
|
||||
Таблица 2-11. _Модули интеграции календаря_
|
||||
|
||||
| Имя | Назначение |
|
||||
| :---------------------- | :--------- |
|
||||
| `res_calendar` | Обеспечивает базовую интеграцию с календарными системами |
|
||||
| `res_calendar_caldav` | Позволяет функциям, предоставляемым `res_calendar` , подключаться к календарям через CalDAV |
|
||||
| `res_calendar_exchange` | Позволяет функциям `res_calendar` подключаться к MS Exchange |
|
||||
| `res_calendar_icalendar` | Позволяет функциям `res_calendar` подключаться к Apple/Google iCalendar |
|
||||
|
||||
#### Другие модули ресурсов
|
||||
|
||||
Таблица 2-12 включает остальные модули ресурсов, которые не вписываются в одну из подгрупп, которые мы определили ранее в этом разделе.
|
||||
|
||||
Tаблица 2-12. _Модули ресурсов_
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left">Name</th>
|
||||
<th style="text-align:left">Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align:left">res_adsi</td>
|
||||
<td style="text-align:left">Предоставляет ADSI<sup><a href="#sn6">6</a></sup>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_agi</td>
|
||||
<td style="text-align:left">Предоставляет Asterisk Gateway Interface (смотри <a href="glava-18.md">Главу 18</a></td>)
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_corosync</td>
|
||||
<td style="text-align:left">Предоставляет распределенные сообщения индикации ожидания (MWI) и состояние устройства уведомления через Corosync Cluster Engine</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_crypto</td>
|
||||
<td style="text-align:left">Предоставляет криптографические возможности</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_curl</td>
|
||||
<td style="text-align:left">Предоставляет общие подпрограммы для других модулей cURL</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_fax</td>
|
||||
<td style="text-align:left">Предоставляет общие подпрограммы для других факсимильных модулей</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_fax_spandsp</td>
|
||||
<td style="text-align:left">Плагин для факса с использованием пакета <code>spandsp</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_http_post</td>
|
||||
<td style="text-align:left">Обеспечивает поддержку POST upload для HTTP-сервера Asterisk</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_http_websocket</td>
|
||||
<td style="text-align:left">Обеспечивает поддержку WebSocket для внутреннего HTTP-сервера Asterisk (требуется WebRTC)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_monitor</td>
|
||||
<td style="text-align:left">Предоставляет ресурсы записи разговоров</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_musiconhold</td>
|
||||
<td style="text-align:left">Предоставляет ресурсы музыки на удержании (MOH)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_mutestream</td>
|
||||
<td style="text-align:left">Позволяет заглушить / включить звук аудиопотоков</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_odbc</td>
|
||||
<td style="text-align:left">Предоставляет общие подпрограммы для других модулей ODBC</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_phoneprov</td>
|
||||
<td style="text-align:left">Автонастройка телефонов с HTTP сервера Asterisk</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_pktccops</td>
|
||||
<td style="text-align:left">Предоставляет ресурсы PacketCable COPS</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_security_log</td>
|
||||
<td style="text-align:left">Включает ведение журнала событий безопасности, генерируемых другими частями Asterisk</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_snmp</td>
|
||||
<td style="text-align:left">Предоставляет информацию о состоянии системы в SNMP-managed network</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_speech</td>
|
||||
<td style="text-align:left">Общий API распознавания речи<sup><a href="#sn7">7</a></sup>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_stasis</td>
|
||||
<td style="text-align:left">Связывает различные компоненты инфраструктуры приложений Stasis</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">res_xmpp</td>
|
||||
<td style="text-align:left">Предоставляет ресурсы XMPP (FKA Jabber)</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
### Дополнительные модули
|
||||
|
||||
Дополнительные модули - это разработанные сообществом модули с правами на использование или распространение, отличными от основного кода (Таблица 2-13). Они хранятся в отдельном каталоге и не компилируются и не устанавливаются по умолчанию. Чтобы включить эти модули, используйте утилиту настройки сборки `menuselect`.
|
||||
|
||||
Таблица 2-13. _Дополнительные модули_
|
||||
|
||||
| Имя | Назначение | Популярность/статус |
|
||||
| :------------ | :--------- | :--- |
|
||||
| `chan_ooh323` | Позволяет совершать и принимать VoIP звонки по протоколу H323 | Usable |
|
||||
| `format_mp3` | Позволяет Asterisk воспроизводить MP3 файлы | Usable |
|
||||
| `res_config_mysql` | Использует базу данных MySQL как сервер конфигурации в режиме реального времени | Useful |
|
||||
|
||||
### Тестовые модули
|
||||
|
||||
Тестовые модули используются командой разработчиков Asterisk для проверки нового кода. Они постоянно меняются и добавляются, и не являются полезными, если вы не разрабатываете программное обеспечение Asterisk.
|
||||
|
||||
Однако если вы являетесь разработчиком Asterisk, то набор тестов Asterisk может представлять для вас интерес, поскольку вы можете создавать автоматизированные тесты для Asterisk и отправлять их обратно в проект, который работает на нескольких различных операционных системах и типах машин. Постоянно расширяя число тестов, проект Asterisk позволяет избежать создания регрессий в коде. Отправляя свои собственные тесты в проект, вы можете чувствовать себя более уверенно в будущих обновлениях.
|
||||
|
||||
Более подробная информация о тестах построения доступна в разделе [“Asterisk Test Suite”](http://bit.ly/14SLEqs), или вы можете присоединиться к каналу _#asterisk-testing_ в IRC-сети Freenode.
|
||||
|
||||
### Файловая структура
|
||||
|
||||
Asterisk - сложная система, состоящая из множества ресурсов. Эти ресурсы используют файловую систему несколькими способами. Поскольку Linux настолько гибок в этом отношении, полезно понять, какие данные хранятся, чтобы вы могли понять, где вы, вероятно, найдете определенный бит хранимых данных (например, сообщения голосовой почты или файлы журналов).
|
||||
|
||||
### Конфигурационные файлы
|
||||
|
||||
Конфигурационные файлы Asterisk включают в себя _extensions.conf_, _pjsip.conf_, _modules.conf_ и десятки других файлов, которые определяют параметры для различных каналов, ресурсов, модулей и функций, которые могут использоваться.
|
||||
|
||||
Эти файлы обычно находятся в _/etc/asterisk_. Вы будете много работать в этой папке, когда будете настраивать и администрировать свою систему Asterisk.
|
||||
|
||||
### Модули
|
||||
|
||||
Модули Asterisk обычно устанавливаются в папку _/usr/lib/asterisk/modules_. Обычно вам не придется взаимодействовать с этой папкой, однако иногда будет полезно узнать, где находятся модули. Например, если вы обновите Asterisk и выберете разные модули на этапе menuselect установки, старые (несовместимые) модули из предыдущей версии Asterisk не будут удалены, и вы получите предупреждение от сценария установки. Эти старые файлы необходимо будет удалить из папки modules. Это можно сделать либо вручную, либо with the “uninstall” make (`make uninstall`) target.
|
||||
|
||||
### Библиотека ресурсов
|
||||
|
||||
Существует несколько ресурсов, которым требуются внешние источники данных. Например, музыка на удержании (MOH) не может произойти, если у вас нет какой-то музыки для воспроизведения. Системные подсказки также должны храниться где-то на жестком диске. В папке _/var/lib/asterisk_ хранятся системные приглашения, сценарии AGI, музыка на удержании и другие файлы ресурсов.
|
||||
|
||||
### Spool
|
||||
|
||||
Спул - это место, где приложения хранят файлы в системе Linux, которые будут часто меняться или которые будут обрабатываться другими процессами позднее. Например, задания на печать в Linux и ожидающие сообщения электронной почты обычно записываются в спул, пока они не будут обработаны.
|
||||
|
||||
В Asterisk спул используется для хранения временных элементов, таких как голосовые сообщения, записи вызовов<sup><a href="#sn8">8</a></sup>, файлы вызовов и так далее.
|
||||
|
||||
Спул Asterisk находится в каталоге _/var/spool/asterisk_.
|
||||
|
||||
### Журналирование
|
||||
|
||||
Asterisk может генерировать несколько разных типов лог-файлов. Папка _/var/log/asterisk_ - это место, где записываются подробные записи вызовов (CDR), события канала из CEL, журналы отладки, журналы очереди, сообщения, ошибки и другие выходные данные.
|
||||
|
||||
Эта папка будет чрезвычайно важна для любых предпринимаемых вами действий по устранению неполадок. Мы поговорим подробнее о том, как использовать логи Asterisk в [Главе 21](glava-21.md).
|
||||
|
||||
## Диалплан
|
||||
|
||||
Диалплан - это сердце Asterisk. Все каналы, поступающие в систему, будут проходить через dialplan, который содержит сценарии потока вызовов, определяющие порядок обработки входящих вызовов.
|
||||
|
||||
Диалплан обычно пишется с использованием собственного синтаксиса Asterisk, который хранится в файле с именем _/etc/asterisk/extensions.conf_ . Существуют и другие способы управления потоком вызовов, и мы рассмотрим их позже, но независимо от того, какой метод вы в конечном итоге используете, вы обнаружите, что базовое понимание традиционной схемы набора номеров будет чрезвычайно полезным. Именно на этом мы сосредоточимся большую часть первых двух третей этой книги.
|
||||
|
||||
Позже мы рассмотрим обработку потока вызовов вне диалплана, используя такие технологии, как AMI, AGI и ARI.
|
||||
|
||||
## Аппаратные средства
|
||||
|
||||
Asterisk способен общаться с огромным количеством различных технологий. Как правило, эти соединения выполняются через сетевое соединение TCP/IP (обычно с использованием SIP). Однако подключения к более традиционным телекоммуникационным каналам, таким как PRI (T1, E1 и т.д.), BRI (EuroISDN) SS7 (в основном T1 и E1), и аналоговым (все, от нескольких портов FXO и FXS до крупных каналов каналов, питаются через соединения T1/E1 CAS/RBS), также может быть достигнуто с помощью физических карт, установленных на сервере.
|
||||
|
||||
Многие компании производят это оборудование, такие как Digium (спонсор, владелец и основной разработчик Asterisk), Sangoma (который недавно приобрел Digium), Dialogic (также компания Sangoma), OpenVox, Pika, Voicetronix, beroNet и многие другие. Все эти компании были связаны с Asterisk на протяжении многих лет.
|
||||
|
||||
Наиболее популярное оборудование для Asterisk, как правило, предназначено для работы через интерфейс аппаратного устройства Digium Asterisk (известный как DAHDI). Это сложная архитектура, и она выходит за рамки этой книги. Все серверные телефонные карты будут иметь требования к установке, уникальные для производителя, и вам потребуются сильные навыки в установке оборудования Linux, а также в устранении неисправностей и подготовке традиционных сетей PSTN.
|
||||
|
||||
Если вам необходимо взаимодействовать с традиционными сетями ТфОП с использованием Asterisk, мы рекомендуем вам сохранить Asterisk в качестве платформы только для SIP и взаимодействовать с помощью стороннего шлюза какого-либо рода. Имейте в виду: это не материал начального уровня, и если вы только начинаете использовать Asterisk, вам настоятельно рекомендуется оставить свои первоначальные решения только для SIP.
|
||||
|
||||
## Версии Asterisk
|
||||
|
||||
Методология выпуска Asterisk прошла через несколько стилей. В прошлом это приводило к некоторой путанице, но в наши дни управление версиями довольно простое и относительно простое для понимания. Digium сохранил отличную ссылку на [Asterisk wiki](http://bit.ly/2XTb5Wl), и мы призываем вас перейти на последние подробности о версиях Asterisk.
|
||||
|
||||
Эта книга была написана и протестирована с использованием версии 16, но вы обнаружите, что фундаментальные концепции, которые мы исследуем, будут актуальны для большинства версий Asterisk. Концептуальная структура Asterisk не менялась в течение достаточно долгого времени, и на момент написания этой статьи не было никаких известных планов изменить это в будущем. Будущие версии будут предоставлять более мощные мультимедийные и конференц-возможности, конечно, но они, вероятно, будут реализованы в рамках существующей структуры.
|
||||
|
||||
## Вывод
|
||||
|
||||
Asterisk состоит из множества различных технологий, большинство из которых сложны сами по себе. В результате понимание архитектуры Asterisk может быть ошеломляющим. Тем не менее, реальность такова, что Asterisk хорошо спроектирован для того, что он делает, и, по нашему мнению, достиг замечательного баланса между гибкостью и сложностью.
|
||||
##
|
||||
<ol>
|
||||
<li id="sn1"> Хорошим показателем того, что вы работали с традиционными УАТС, является наличие большой мозоли на лбу, полученной в результате слишком большого количества ударов головой о кирпичную стену, чтобы сосчитать.</li>
|
||||
|
||||
<li id="sn2"> Эта команда доступна как часть процесса установки. Мы обсудим использование <code>menuselect</code> в главе об установке.</li>
|
||||
|
||||
<li id="sn3"> Термин кодек - это сокращение от «кодер-декодер».</li>
|
||||
|
||||
<li id="sn4"> Отчасти по этой причине мы не рекомендуем формат GSM по умолчанию для системных записей. WAV-записи будут звучать лучше и использовать меньше тактов процессора.</li>
|
||||
|
||||
<li id="sn5"> Некоторые кодеки создают значительную нагрузку на ЦП, настолько, что система, которая может поддерживать несколько сотен каналов без транскодирования, будет обрабатывать только несколько десятков, когда транскодирование используется.</li>
|
||||
<li id="sn6"> Хотя большинство функций ADSI в Asterisk никогда не используется, приложение голосовой почты использует этот ресурс.</li>
|
||||
|
||||
<li id="sn7"> Для использования требуется отдельно лицензируемый продукт.</li>
|
||||
|
||||
<li id="sn8"> Не подробные записи вызовов (CDRs), а скорее аудиозаписи вызовов, генерируемых <code>MixMonitor()</code> и связанными приложениями.</li>
|
||||
</ol>
|
||||
|
||||
[Глава 1. Революция в телефонии](glava-01.md) | [Содержание](SUMMARY.md) | [Глава 3. Установка Asterisk](glava-03.md)
|
|
@ -0,0 +1,218 @@
|
|||
# Глава 4. Сертификаты для безопасности конечных точек
|
||||
|
||||
> _Нам должно повезти только один раз. Тебе должно везти каждый раз._
|
||||
>
|
||||
> - IRA к Маргарет Тэтчер после неудачной попытки убийства
|
||||
|
||||
> _Если вы действительно хотите что-то сделать, вы найдете способ. Если вы этого не сделаете, вы найдете оправдание._
|
||||
>
|
||||
> - Джим Рон
|
||||
|
||||
## Неудобство безопасности
|
||||
|
||||
Безопасность VoIP можно рассматривать как две отдельные (но взаимосвязанные) проблемы:
|
||||
|
||||
* Защита система от мошенничества с платными услугами (что, как правило, является целью попыток атак на основе SIP)
|
||||
* Защита системы от перехвата вызовов (что касается конфиденциальности, а также улучшения защиты от мошенничества)
|
||||
|
||||
Конечно, есть много других аспектов безопасности вашей системы, но большинство из них являются общими понятиями безопасности, не специфичными для VoIP.
|
||||
|
||||
В этой главе мы сосредоточимся на области безопасности, которая слишком часто упускается из виду, а именно на создании и применении сертификатов и ключей для обеспечения безопасности связи между конечными точками и вашей системой. В SIP-связи шифрование является необязательным (и, к сожалению, не используется большую часть времени). В WebRTC это необходимо.
|
||||
|
||||
Эта глава ни в коем случае не должна рассматриваться как последнее слово в защите вашей системы Asterisk; в Главе 22 будет рассмотрено больше. Однако мы надеемся, что это обеспечит вам прочную основу для построения безопасного решения.
|
||||
|
||||
## Безопасность SIP
|
||||
|
||||
Если вы создадите какой-либо сервер, который доступен из интернета, и подождёте несколько часов после его включения, то вы заметите, что система уже привлекла зонды, пытающиеся определить, есть ли у нее какие-либо уязвимые службы SIP. Вскоре вы заметите, что все большее количество атак на сервер пытается поставить под угрозу безопасность учетной записи. Поздравляем — ваш сервер был автоматически добавлен в списки SIP-серверов, совместно используемых преступниками с целью мошенничества. Если одно из этих вторжений удастся, скомпрометированная платформа, скорее всего, станет частью организованной преступной сети, и вы оплатите счет за неотслеживаемые звонки в различные дорогостоящие пункты назначения.
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left">
|
||||
<p><b>ПРЕДУПРЕЖДЕНИЕ</b>
|
||||
</p>
|
||||
<p>Мы не шутим здесь; не пренебрегайте вашей безопасностью SIP или вы, вероятно, окажетесь жертвой очень дорогой атаки мошенничества.</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
|
||||
### Имена подписчиков
|
||||
|
||||
Абонентская часть учетных данных SIP (userinfo часть URI) слишком часто устанавливается как добавочный номер. Эта практика хороша для целей адресации вызовов, но совсем не рекомендуется для целей аутентификации конечной точки. Имя подписчика конечных точек не должно иметь значения за пределами организации. MAC-адрес идеально подходит для этого. Без фактического адреса для исследования работа злоумышленника станет намного сложнее.
|
||||
|
||||
Вы увидите множество УАТС типа SIP \(включая на основе Asterisk, к сожалению\), которые назначают добавочный номер учетным данным телефона. В этой книге вы увидите, что добавочный номер не является частью учетных данных телефона. В этом есть несколько преимуществ, но с точки зрения безопасности преимущество заключается в том, что если злоумышленник знает внутренний номер, он не имеет никаких знаний о том, как аутентифицировать вызов через систему.
|
||||
|
||||
Таким образом, у вас может быть пользователь с SIP-адресом [100@shifteight.org](mailto:100@shifteight.org), которого система Asterisk свяжет с устройством по адресу [0000f3101010@yourpbx.com.](mailto:0000f3101010@yourpbx.com.) Когда вызов направлен на 100, он будет звонить на 0000f3101010, но вызывающий абонент никогда ничего не знает об этой конечной точке.
|
||||
|
||||
На протяжении всей этой книги вы увидите, что мы установим связь между внутренним номером (расширением) (который, по нашему мнению, должен быть связан с пользователем или услугой) с идентификатором устройства (который может быть устройством SIP или номером телефона) и что простая таблица может использоваться для их связи (и впоследствии повысит как безопасность, так и гибкость).
|
||||
|
||||
### Безопасность SIP-сигнализации
|
||||
|
||||
По умолчанию сообщения SIP передаются в открытом виде без эффективной защиты. При атаке человек посередине ([MITM](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%B0%D0%BA%D0%B0_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0)) злоумышленник способен получить всевозможную информацию о Ваших звонках. Протокол защиты транспортного уровня (TLS) используется, чтобы минимизировать этот риск.
|
||||
|
||||
О том, как настроить устройства на использование TLS, мы поговорим в следующей главе. Все, что нам нужно сделать сейчас — это создать сертификаты.
|
||||
|
||||
Существует три распространенных способа создания сертификатов. Мы приведем примеры для двух из них \(самозаверенные - self-signed и LetsEncrypt\), но оставим осуществление получения официально выданных сертификатов читателю.
|
||||
|
||||
### **САМОЗАВЕРЕННЫЕ СЕРТИФИКАТЫ**
|
||||
|
||||
Основное преимущество самозаверенного сертификата заключается в том, что его не нужно проверять с помощью внешнего объекта. Недостатком является то, что из-за этого, внешние объекты не будут доверять ему.
|
||||
|
||||
Если вы защищаете устройства SIP только для использования в контролируемой сетевой среде, самозаверенный сертификат может быть тем, что вам нужно. Он не считается лучшим подходом, но в некоторых случаях этого может быть достаточно, и это, как правило, лучше чем ничего.
|
||||
|
||||
В этом мире, полном автоматизированной преступности, многое можно узнать о конфиденциальности и безопасности, а также криптографии, необходимой для обоех сторон. Тем не менее, это книга об Asterisk, так что мы собираемся предоставить шаблон для создания необходимых компонентов, и вам необходимо продолжить исследование.
|
||||
|
||||
Инструментарий openssl предоставляет инструмент, который сделает работу за нас.
|
||||
|
||||
Мы запустим его следующим образом:
|
||||
|
||||
```text
|
||||
$ sudo su asterisk -
|
||||
$ mkdir /home/asterisk/certs
|
||||
$ openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
|
||||
-keyout /home/asterisk/certs/self-signed.key \
|
||||
-out /home/asterisk/certs/self-signed.crt
|
||||
```
|
||||
|
||||
Вам будет предложено предоставить некоторую информацию, а затем ваш ключ и сертификат будут записаны в папку _/home/asterisk/certs_.
|
||||
|
||||
Вы можете добавить следующее в команду, чтобы обойти вопросы \(измените информацию в соответствии с вашей ситуацией\):
|
||||
|
||||
```text
|
||||
-subj "/C=CA/ST=Ontario/L=Toronto/O=ShiftEight/CN=shifteight.org"
|
||||
```
|
||||
|
||||
Полная команда будет выглядеть примерно так:
|
||||
|
||||
```text
|
||||
$ openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
|
||||
> -keyout /home/asterisk/certs/self-signed.key \
|
||||
> -out /home/asterisk/certs/self-signed.crt \
|
||||
> -subj "/C=CA/ST=Ontario/L=Toronto/O=ShiftEight/CN=shifteight.org"
|
||||
```
|
||||
|
||||
Это создаст самозаверенный сертификат и закрытый ключ и сохранит их в /home/asterisk/certs/. Мы сможем использовать их позже, когда будем настраивать наши конечные точки SIP.
|
||||
|
||||
Вероятно, это хорошая идея, чтобы применить `chmod` к вашим сертификатам так, чтобы только соответствующий пользователь/группа могли получить к ним доступ:
|
||||
|
||||
```text
|
||||
$ chmod 640 /home/asterisk/certs/*
|
||||
```
|
||||
|
||||
Выйдите из аккаунта пользователя asterisk.
|
||||
|
||||
```text
|
||||
$ exit
|
||||
$ who am i # You should be astmin again.
|
||||
```
|
||||
|
||||
Существует альтернатива использованию самозаверенных сертификатов: если у вас есть доменное имя, назначенное вашему серверу, доступному из общедоступного интернета, вы можете создать проверенный сертификат с помощью LetsEncrypt. Читайте дальше.
|
||||
|
||||
### **СЕРТИФИКАТЫ LETSENCRYPT**
|
||||
|
||||
Если вы заинтересованы в безопасной связи через общедоступный Интернет (которому вы будете доверять), то наличие сертификатов домена, предоставляемых Центром сертификации (ЦС) полезно.
|
||||
|
||||
Проект LetsEncrypt предоставляет цифровые сертификаты бесплатной проверки домена (Domen Validation - DV). Бесплатный инструмент, предоставляемый Let's Encrypt Foundation под названием certbot, позволяет автоматизировать получение и обслуживание доверенных сертификатов.
|
||||
|
||||
Как минимум, вашему серверу потребуется полное доменное имя ([FQDN](https://ru.wikipedia.org/wiki/FQDN)), которое сопоставляется с внешним IP-адресом, поступающим на компьютер. Любой брандмауэр между ними должен будет передавать трафик для этого имени хоста в систему, для которой вы получаете сертификат. Если вы не можете сделать это по какой-либо причине, получение доверенного сертификата становится более сложным \(и выходит за рамки этой книги\).
|
||||
|
||||
`certbot` может быть установлен посредством yum следующим образом:
|
||||
|
||||
```text
|
||||
$ sudo yum -y install certbot
|
||||
```
|
||||
|
||||
После его установки Вам просто нужно выполнить следующее:
|
||||
|
||||
```text
|
||||
$ sudo certbot certonly
|
||||
How would you like to authenticate with the ACME CA?
|
||||
-------------------------------------------------------------------------------
|
||||
1: Spin up a temporary webserver (standalone)
|
||||
2: Place files in webroot directory (webroot)
|
||||
-------------------------------------------------------------------------------
|
||||
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
|
||||
```
|
||||
|
||||
Если у вас работает веб-сервер или вы уверены в Варианте 2, это нормально, но эти шаги предполагают, что у вас нет веб-сервера и, следовательно, вам необходимо/требуется использовать встроенный временный веб-сервер, который certbot будет использовать для аутентификации. Этот сервер используется для подтверждения управления доменом, для которого запрашивается сертификат.
|
||||
|
||||
При необходимости ответьте на следующие вопросы, а затем вставьте имя хоста, назначенное IP-адресу сервера:
|
||||
|
||||
```text
|
||||
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
|
||||
to cancel): asteriskbook.shifteight.org
|
||||
```
|
||||
|
||||
(замените _asteriskbook.shifteight.org_ на назначенное доменное имя).
|
||||
|
||||
`certbot` будет выполнять свою магию, и если все прошло хорошо, вы должны получить сообщение похожее на следующее:
|
||||
|
||||
```text
|
||||
IMPORTANT NOTES:
|
||||
- Congratulations! Your certificate and chain have been saved at:
|
||||
/etc/letsencrypt/live/asteriskbook.shifteight.org/fullchain.pem
|
||||
Your key file has been saved at:
|
||||
/etc/letsencrypt/live/asteriskbook.shifteight.org/privkey.pem
|
||||
Your cert will expire on 2018-07-23. To obtain a new or tweaked
|
||||
version of this certificate in the future, simply run certbot
|
||||
again. To non-interactively renew *all* of your certificates, run
|
||||
"certbot renew"
|
||||
- Your account credentials have been saved in your Certbot
|
||||
configuration directory at /etc/letsencrypt. You should make a
|
||||
secure backup of this folder now. This configuration directory will
|
||||
also contain certificates and private keys obtained by Certbot so
|
||||
making regular backups of this folder is ideal.
|
||||
- If you like Certbot, please consider supporting our work by:
|
||||
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
|
||||
Donating to EFF: https://eff.org/donate-le
|
||||
```
|
||||
|
||||
Не забудьте сделать пожертвование Internet Security Research Group (ISRG) или Electronic Frontier Foundation (EFF); они выполняют важную работу и заслуживают нашей поддержки.
|
||||
|
||||
Теперь у вас есть сертификаты, необходимые для включения различных служб TLS в вашей системе. Мы применим их в следующей главе.
|
||||
|
||||
Не слишком сложно, а?
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left">
|
||||
<p>ЗАМЕЧАНИЕ</p>
|
||||
<p>Имейте в виду, что большинство сертификатов, которые вы получаете из внешнего источника, будут иметь срок действия.</p>
|
||||
<p>В случае LetsEncrypt текущий срок действия составляет три месяца.</p>
|
||||
<p>Если вы собираетесь запустить сертификаты в продакшен, Вам нужно понять как ими управлять (например, автоматизировать обновление, где люди из LetsEncrypt проделали хорошую работу по упрощению).</p>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
|
||||
### **ПРИОБРЕТЕНИЕ СЕРТИФИКАТОВ В ОФИЦИАЛЬНОМ ЦЕНТРЕ СЕРТИФИКАЦИИ**
|
||||
|
||||
Если сертификаты LetsEncrypt не обеспечивают требуемый уровень проверки (например, если вам нужна проверка организации (OV) или расширенная проверка (EV)), вам нужно будет получить услуги центра сертификации, который предоставляет такие вещи. Эти вопросы выходят за рамки данной книги.
|
||||
|
||||
Если вы проработали примеры для разделов самозаверенных и LetsEncrypt сертификатов, у Вас будет хотя бы базовое представление о некоторых процессах получения сертификатов из центра сертификации, так как многие шаги будут аналогичны.
|
||||
|
||||
## Защита медиапотока
|
||||
|
||||
Сертификаты, которые мы получили, могут быть использованы для защиты как нашей сигнализации, так и самой полезной нагрузки (т.е. того, что говорится или передаваемого видео). Обратите внимание, что механизмы для безопасности сигналов - это вещь протокола SIP, а механизмы обеспечения безопасности медиапотока - являются вещью протокола RTP. Имейте в виду, что шифрование сигнализации SIP не означает, что вы автоматически также шифруете медиатрафик (RTP).
|
||||
|
||||
## Шифрование RTP
|
||||
|
||||
Шифрование протокола реального времени позволит достичь эффекта защиты наших медиа-потоков.
|
||||
|
||||
Для обеспечения шифрования медиа обычно используются два механизма: SDES и DTLS-SRTP. SDES — это механизм шифрования мультимедиа, который доверяет безопасности сигнализации. Другими словами, если вы используете TLS для защиты сигнализации SIP, то SDES, вероятно, также обрабатывает шифрование мультимедиа.
|
||||
|
||||
DTLS-SRTP, с другой стороны, не доверяет сигнализации. Это важно, потому что стандарт WebRTC требует чтобы медиапоток был зашифрован таким образом.
|
||||
|
||||
Сертификаты, которые мы создали здесь, должны работать в обоих сценариях. В следующих главах, когда мы будем настраивать конечные точки SIP или WebRTC, мы рассмотрим более подробно как использовать сертификаты. На данный момент достаточно того, что мы сгенерировали сертификаты и сделали их доступными для использования.
|
||||
|
||||
## Вывод
|
||||
|
||||
Не ошибитесь: безопасность все усложняет. В старые добрые времена вы могли запустить SIP-соединение с полудюжиной строк конфигурации и назвать это днем. Это больше не летает, и хотя этот тип конфигурации по-прежнему будет работать (просто используйте UDP вместо TLS, и все, что вам нужно — это пароль), мы решили что начиная с этого выпуска все примеры конфигурации будут выбирать более безопасные параметры где это возможно. Мы не претендуем на то, чтобы представить последнее слово о безопасности VoIP, но мы собираемся привести примеры, которые заплатят больше, чем на словах концепции.
|
||||
|
||||
Далее мы обсудим, как настроить конечные точки в системе Asterisk (используя ключи и сертификаты, которые мы только что создали).
|
||||
|
||||
[Глава 3. Установка Asterisk](glava-03.md) | [Содержание](SUMMARY.md) | [Глава 5. Конфигурация пользовательских устройств](glava-05.md)
|
|
@ -0,0 +1,557 @@
|
|||
# Глава 5. Конфигурация пользовательских устройств
|
||||
|
||||
> _Я не всегда знаю, о чем говорю, но я знаю, что я прав._
|
||||
>
|
||||
> —Мухаммед Али
|
||||
|
||||
Пришло время подключить некоторые пользовательские устройства SIP к Asterisk. Хотя мы собираемся сосредоточиться на Asterisk как конце вещей, имейте в виду, что определение канала устройства в Asterisk для непосредственного подключения через него - это только половина конфигурации; вам также нужно настроить другой конец — само устройство \(обычно телефон\)—так чтобы оно знало, куда отправлять свои вызовы.
|
||||
|
||||
---
|
||||
|
||||
#### Важное замечание относительно точки SIP
|
||||
|
||||
Настройка другого конца связи SIP конечно необходима, но не является частью конфигурации Asterisk и, в конечном счете, выходит за рамки этой книги. На рынке должно быть тысячи различных типов конечных точек SIP, включая настольные телефоны, программные телефоны, УАТС, прокси-серверы, серверы конференций и всевозможные другие продукты. У каждого производителя есть свои инструменты, позволяющие настраивать его продукцию \(а некоторые из них требуют обширных знаний). SIP - это сложный протокол. Сказав это, большинство настольных телефонов SIP имеют какой-то веб-интерфейс, и большинство софтфонов имеют меню конфигурации, встроенное в их графический интерфейс.
|
||||
|
||||
В самом простом случае настройка SIP-устройства включает в себя предоставление трех параметров:
|
||||
|
||||
* Адрес сервера, через который оно будет подключаться \(ваш сервер Asterisk\)
|
||||
* Имя пользователя \(которое также можно назвать именем подписчика, расширением или чем-то подобным\)
|
||||
* Пароль
|
||||
|
||||
Хотя каждый тип конечной точки будет отличаться, все они будут следовать аналогичному соглашению, и хотя потенциально существуют сотни параметров конфигурации, довольно часто можно настроить только эти три вещи.
|
||||
|
||||
---
|
||||
|
||||
Другими словами, есть две отдельные задачи, необходимые для настройки устройства для работы с Asterisk:
|
||||
|
||||
* Сообщение Asterisk об устройстве \(настройка учетных данных канала в Asterisk\)
|
||||
* Сообщение устройству об Asterisk \(доступ к инструментам настройки для устройства и указание ему где находится сервер и как к нему подключиться\)
|
||||
|
||||
---
|
||||
|
||||
**Некоторые мысли о протоколе SIP**
|
||||
|
||||
SIP - является одноранговым протоколом, и хотя обычно используется настройка, в которой конечные точки \(телефоны\) ведут себя как клиенты, а какой-то шлюз \(например, Asterisk\) обеспечивает маршрутизацию и функции, сам протокол работает с точки зрения одноранговых отношений \(Рисунок 5-1\). Две конечные точки SIP могут напрямую разговаривать друг с другом \(т.е. пара SIP-телефонов теоретически должна иметь возможность создавать своего рода “интерком” непосредственно между собой без АТС посередине\).
|
||||
|
||||
При этом, безусловно, большинство SIP-транзакций происходят через какой-либо сервер, который обычно остается в пути вызова и обеспечивает все соединения \(также не требуется протоколом\). Когда SIP-вызов выполняется с телефона на другой телефон через Asterisk, на самом деле происходит два вызова: вызов от исходного аппарата в Asterisk и другой отдельный вызов из Asterisk в целевой аппарат \(этот второй этап вызова может даже не использовать SIP\). Asterisk соединяет их вместе. Аналогично, если вы делаете ”внешний" вызов, Asterisk примет вызов от вашего аппарата, а затем отправит вызов по другому каналу, который будет считаться магистральным \(транковым\), и снова соединит эти каналы вместе. На уровне протокола вызов set-to-set и set-to-trunk выглядят очень похожими.
|
||||
|
||||
Использование SIP-телефона с Asterisk означает, что вы хотите настроить SIP-телефон для совершения всех своих вызовов через Asterisk, даже если устройство вполне способно напрямую подключаться к другой конечной точке SIP без сервера Asterisk. Телефон будет рассматривать Asterisk в качестве своего регистратора и прокси-сервера \(хотя Asterisk на самом деле является Back to Back User Agent или B2BUA\) и будет искать Asterisk для принятия решений о маршрутизации для всех вызовов.
|
||||
|
||||

|
||||
|
||||
_Рисунок 5-1. Asterisk в роли шлюза_
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
**Некоторые мысли о провижинге аппаратов**
|
||||
|
||||
Хотя большинство устройств будут иметь веб-интерфейс для определения параметров, если вы используете более одного или двух телефонов в продакшене, вы должны изучить использование процесса провижинга (подготовки) на основе сервера. Таким образом, аппараты будут подключаться к серверу, идентифицироваться и аутентифицироваться, а также загружать файлы конфигурации, содержащие их параметры \(очень часто используется MAC-адрес телефона в качестве идентификатора для именования каждого уникального файла конфигурации\). Файлы конфигурации для различных продуктов обычно обслуживаются сервером HTTPS или SFTP и будут отформатированы как XML или некоторой формой пар ключ/значение.
|
||||
|
||||
К сожалению, точный процесс загрузки, протокол и синтаксис этих файлов будут отличаться от производителя к производителю. Это нетрудно узнать, если вы знакомы с такими понятиями, но попытаться охватить все их \(и держать постоянно меняющиеся процессы в актуальном состоянии\) было бы невозможно. Производители обычно предлагают свободно загружаемые и подробные руководства по настройке для своих телефонов, поэтому с небольшим количеством исследований и знакомством с настройкой файловых сервисов на Linux вы найдете множество информации, доступной в интернете. По нашему опыту, документация, предоставленная производителями, как правило, превосходна. Она будет предоставлять самую последнюю информацию о подготовке своих устройств.
|
||||
|
||||
При устранении неполадок подготовки аппарата всегда сначала проверяйте загрузку с помощью компьютера. Если вы не можете загрузить файлы на свой компьютер, ваши устройства, вероятно, также не смогут их загрузить.
|
||||
|
||||
Мы скажем одно последнее слово об этом: убедитесь, что любой процесс, который вы используете, включает шифрование файлов конфигурации так, что если файлы украдены, только предполагаемый получатель способен их расшифровать. Большинство производителей проделали хорошую работу, чтобы сделать это довольно простой задачей. Не отправляйте незашифрованные файлы конфигурации через общедоступный Интернет.
|
||||
|
||||
---
|
||||
|
||||
В этой главе мы сосредоточимся на конфигурации аппаратов с точки зрения Asterisk, поэтому мы не будем слишком много говорить о самонастраиваемых телефонах; вам нужно будет провести собственное исследование в этом отношении. Мы будем использовать пару софтфонов в нашей лаборатории и Вы так же можете. В наших примерах будет предпринята попытка предоставить достаточно информации, для настройки любых SIP-устройств, которые вы используете. Если мы сможем помочь вам зарегистрировать пару софтфонов в вашей лабораторной системе, мы направим вас по пути к более сложным сценариям \(которые, как правило, требуют некоторых исследований и прототипирования с вашей стороны\).
|
||||
|
||||
## Концепции именования телефонов
|
||||
|
||||
Прежде чем приступить к настройке Asterisk для наших телефонов, мы предложим некоторые рекомендации по именованию телефонов.
|
||||
|
||||
Во-первых, вы не должны назначать своим телефонам добавочный номер; вместо этого создайте систему так, чтобы добавочный номер был назначен пользователю, а затем назначьте телефон или другие ресурсы этому пользователю. Сами телефоны должны быть названы в соответствии с чем-то уникальным для них, таким как MAC-адрес или имя компьютера. В гибкой АТС следующего поколения необходимо абстрагировать понятия пользователей, добавочных номеров и телефонов чтобы обеспечить максимальную гибкость и простоту управления.
|
||||
|
||||
В Asterisk действительно нет понятия пользователя вообще. Добавочные номера - это триггеры, которые инициируют последовательность инструкций. Да, вы можете написать небольшой диалплан, указав, что при наборе добавочного номера 100 Asterisk будет звонить на телефон на вашем столе. Однако добавочный 100 может также легко получить доступ к ящику голосовой почты компании или, возможно, воспроизвести приглашение, присоединиться к конференц-залу или сделать любое количество других вещей. Мы даже можем написать диалплан, который указывает, что расширение 100 должно звонить на устройство на вашем столе с понедельника по пятницу между 9 утра и 5 вечера, но в остальное время звонить на устройство на другом столе. И наоборот, когда вызов выполняется с устройства в рабочее время, идентификатор вызывающего абонента может показывать дневной номер, а в остальное время может показывать номер после рабочего дня \(многие стойки регистрации становятся столами безопасности в ночное время\).
|
||||
|
||||
В Asterisk добавочные номера \(расширения\) не являются телефонами. Поэтому не давайте идентификаторы телефонов, которые являются добавочными номерами.
|
||||
|
||||
---
|
||||
|
||||
**Внутренние номера Asterisk**
|
||||
|
||||
Концепция внутренних номеров в Asterisk имеет решающее значение. В большинстве УАТС добавочный номер - это номер, который вы набираете для вызова телефона или службы. В Asterisk внутренний номер является именем группы инструкций в диалплане. Подумайте о внутр.номере Asterisk как об имени скрипта и вы на правильном пути. Да, внутр.номер Asterisk может быть номером, который звонит на телефон, но это может быть также словом \(например, `voicemail`\), которое предоставляет простую услугу какого-либо рода, никогда не отправляя вызов по какому-либо каналу.
|
||||
|
||||
Мы рассмотрим внутр.номера Asterisk более подробно на протяжении всей этой книги, но прежде чем мы это сделаем, мы должны настроить некоторые телефоны.
|
||||
|
||||
---
|
||||
|
||||
Абстракция между именем добавочного номера и телефоном, который может звонить - это мощная концепция. Отличным примером этого является функция УАТС, широко известная как _hot-desking_, которая позволяет пользователям совместно использовать один стол и/или перемещаться по разным столам. Допустим, у нас есть три агента по продажам, которые обычно работают вне офиса, но проводят пару дней каждый месяц в офисе, чтобы оформить документы. Поскольку они вряд ли будут находиться на месте одновременно, вместо того, чтобы у каждого агента был отдельный телефон, они могли бы использовать один офисный телефон \(или в большем масштабе, дюжина людей могла бы разделить пул, скажем, из трех телефонов\). Этот сценарий иллюстрирует удобство \(и необходимость\) предоставления системе возможности отделить концепцию пользователя и расширения от физического телефона.
|
||||
|
||||
Лучший способ назвать физический настольный телефон \(или любую физическую конечную точку SIP\) - использовать MAC-адрес устройства, который является уникальным для телефона, следует за ним, и не требует изменений конфигурации телефона, если меняется пользователь. У некоторых корпораций есть наклейки, которые они размещают на своем оборудовании со штрих-кодом и другой информацией, которая позволяет им хранить запас подготовленного оборудования; эти уникальные коды также будут приемлемым выбором для использования в качестве имен телефонов, поскольку они не обеспечивают никакой логической связи с конкретным человеком, но предоставляют конкретную информацию о самих устройствах.
|
||||
|
||||
Софтфоны \(программные телефоны\) на ноутбуках также могут использовать MAC-адрес или серийный номер, но убедитесь, что имя аппарата содержит ссылку на то, что это софтфон. `[JIMMY_VANM_SOFT]` - приемлимое имя, но `[JIM S_PHONE]` - нет. Если софтфон работает на настольном компьютере \(т.е. он не будет перемещаться с пользователем\), то назовите его, используя соглашение, которое вы используете для своих компьютеров \(`[DESK-5F23-SOFT]` или `[CUST_SRVC_001_SOFT]` являются потенциально хорошими именами\).
|
||||
|
||||
Выбор за вами относительно того, как вы хотите называть свои телефоны. Наша цель - помочь вам понять почему лучшей практикой является абстрагирование любой концепции телефона, принадлежащего человеку. Телефон - это просто способ получить и звук от человека и сигнал туда и обратно, поэтому гораздо лучше сделать возможным смешивание и сопоставление их, когда пользователи перемещаются, а люди приходят и уходят.
|
||||
|
||||
В этой книге, вы увидите имена телефонов, которые выглядят как MAC-адреса \(например, `[0000F3000001]` и `[0000F3000002]`\), или имя общего рабочего стола \(`[DESK-001-SOFT]`, `[DESK-002-SOFT]`\), для разделения устройств. Как правило, вы будете использовать имена телефонов, соответствующие используемому оборудованию \(или какой-либо другой строке, уникальной для регистрируемого устройства\).
|
||||
|
||||
В качестве окончательного рассмотрения мы должны четко указать что то, что мы предлагаем в отношении имен устройств, не является техническим требованием. Вы можете называть свои устройства как угодно, если они соответствуют требованиям соглашений об именах Asterisk для устройств \(оставайтесь с буквенно-цифровыми символами без пробелов и все будет в порядке\).
|
||||
|
||||
Вы увидите множество систем Asterisk, которые связывают имя устройства с расширением пользователя, но мы не поклонники этого метода.
|
||||
|
||||
## Телефоны, софтфоны и телефонные адаптеры
|
||||
|
||||
Существует три типа конечных точек, которые вы обычно предоставляете своим пользователям в качестве телефонного аппарата. Они обычно называются телефонами \(или настольными телефонами\), софтфонами и аналоговыми терминальными адаптерами \(ATA\).
|
||||
|
||||
_Аппаратный телефон_ - это физическое устройство - офисный телефон. У него есть трубка, нумерованные кнопки, какой-то экран и так далее. Он подключается непосредственно к сети и, вероятно, он является тем, что люди имеют в виду когда говорят о VoIP-телефоне \(или SIP-телефоне\). Обычно он стоит на столе, но его можно установить на стене, в лифте, на боковом столе или в коробке на обочине дороги.
|
||||
|
||||
_Софтфон_ - это программное приложение, которое работает на ноутбуке, настольном компьютере, смартфоне или другом вычислительном устройстве. Звук должен проходить через звуковую систему устройства, поэтому как правило нужна гарнитура, которая будет хорошо работать с приложениями телефонии. Софтфоны стали популярными приложениями на смартфонах, потому что они позволяют подключаться к телефонным сетям, отличным от сотовой сети \(например, вы можете зарегистрироваться в качестве внутреннего номера на своей корпоративной АТС\). Интерфейс софтфона часто стилизован под физический телефон, но в этом нет необходимости. WebRTC позволит использовать все виды дополнительных возможностей в этой области, так как он по существу позволяет программному телефону просто быть частью сеанса в браузере. Для УАТС софтфон выглядит и ведет себя точно так же, как и аппаратный телефон.
|
||||
|
||||
_ATA_ разработан, чтобы позволить традиционным аналоговым телефонам \(и другим аналоговым устройствам, таким как факсы, беспроводные телефоны, пейджинговые усилители и т.д.\) подключаться к сети SIP,[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408634856) и будет представлять собой коробку размером с сэндвич, которая содержит разъем RJ-11 для телефона \(обычно называемый портом FXS\), разъем RJ-45 для сети и разъем питания. Некоторые ATA могут поддерживать более одного телефона. Другие ATA могут иметь расширенные функции, такие как брандмауэр или порт FXO \(аналоговый порт, который может подключаться к линии ТфОП\). С точки зрения АТС, ATA выглядит точно так же, как SIP-телефон.
|
||||
|
||||
Телефоны имеют преимущество в том, что содержат хорошие акустические свойства для голосовой связи. Любой телефон приличного качества спроектирован так, чтобы улавливать частоты человеческого голоса, отфильтровывать нежелательные фоновые шумы и нормализовать результирующую форму волны. Люди используют телефоны с тех пор, как существует телефонная сеть, и нам, как правило, нравится то, что знакомо, поэтому наличие устройства, которое взаимодействует с Asterisk с помощью знакомого интерфейса, будет привлекательным для многих пользователей. Кроме того, жесткий телефон не требует, чтобы ваш компьютер работал все время.
|
||||
|
||||
Недостатки же телефонов включают в себя тот факт, что они трудно переносятся и стоят дорого по сравнению со многими качественными софтфонами на рынке сегодня, которые доступны бесплатно. Кроме того, дополнительный беспорядок на вашем столе может быть нежелателен, если у вас ограниченное рабочее пространство. Если вы много перемещаетесь и как правило не находитесь в одном и том же месте, аппаратный телефон вряд ли удовлетворит ваши потребности \(хотя, один в каждом месте, которое вы регулярно посещаете, может быть правильным решением\).
|
||||
|
||||
Софтфоны решают проблему переносимости, будучи установленными на устройстве, которое, вероятно, уже движется вместе с вами, например, ваш ноутбук или смартфон. Кроме того, их минимальная стоимость \(как правило бесплатны, или около $30 за один полнофункциональный\) является привлекательной. Поскольку многие софтфоны бесплатны, вполне вероятно, что первым телефонным аппаратом, который вы подключите к Asterisk, будет софтфон. Кроме того, поскольку софтфоны - это просто программное обеспечение, их легко устанавливать и обновлять, и как правило они имеют другие функции, которые используют другие периферийные устройства, такие как веб-камера для видеозвонков или возможность загружать файлы с вашего рабочего стола для отправки факсов. Еще одним потенциально огромным преимуществом софтфона является то, что его часто можно интегрировать с другими приложениями, работающими на устройстве.
|
||||
|
||||
Некоторые из недостатков софтфонов - это не всегда включенное устройство, необходимость надевать гарнитуру каждый раз, когда вы принимаете вызов, и тот факт, что многие ПК будут в произвольное время в течение дня выбирать другое приложение, которым пользователь будет пользоваться, что может привести к тому, что софтфон перестанет работать, пока какая-то фоновая задача захватила процессор. В мобильном устройстве софтфон может потреблять ресурсы, что влияет на время работы батареи, производительность и эксплуатационные расходы.
|
||||
|
||||
У ATAs есть преимущество, позволяющее подключать аналоговые устройства к сети SIP,[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408624504) такие как беспроводные телефоны \(которые все еще превосходят во многих случаях более продвинутые типы беспроводных Wi-Fi телефонов и гораздо менее дорогостоящие[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408623256)\), пейджинговые усилители, звонки и старинные телефоны.[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408622440) ATA также иногда можно использовать для подключения к старой проводке, где сетевое соединение может работать неправильно, или к надворным постройкам \(например, сторожка\), где стандартное подключение ethernet невозможно.
|
||||
|
||||
Основным недостатком ATA является невозможность получения тех же функций через аналоговую линию, что и с SIP-телефона. Это технология, которой уже более ста лет.
|
||||
|
||||
С Asterisk нам не обязательно выбирать между софтфоном, аппаратным телефоном или ATA; вполне возможно и довольно часто иметь один добавочный номер, который одновременно звонит на несколько устройств, таких как настольный телефон, софтфон на ноутбуке, сотовый телефон и, возможно, стробоскоп в задней части завода \(где слишком много шума для звонка\).
|
||||
|
||||
Больше, чем любая другая конечная точка, программный телефон будет развиваться в нечто гораздо более всеобъемлющее, чем простое телефонное приложение. Появление WebRTC может наконец сделать то, что было предсказано в течении многих долгих лет: интеграция голоса в реальном времени в вычислительные \(в частности, веб-приложения\). Конечно, есть много способов достичь этого уже, но преимущество WebRTC заключается в том, что это открытый стандарт, встроенный прямо во все браузеры без каких-либо плагинов. Софтфон мертв; да здравствует софтфон.
|
||||
|
||||
Нам все еще нравится настольный телефон для регулярных телефонных звонков.
|
||||
|
||||
## Настройка Asterisk
|
||||
|
||||
В этом разделе мы рассмотрим, как настроить PJSIP для обработки различных конечных точек SIP. Традиционно это делалось путем редактирования файлов в каталоге _/etc/asterisk/_; однако мы решили продемонстрировать как это делается через базу данных, поскольку в целом это превосходный метод, особенно по мере роста системы. Если вам более удобны в использовании _.conf_ файлы, вы должны найти, что это довольно легко сделать как только вы уяснили основы.[5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408610760)
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Asterisk позволяет устройствам, использующим множество различных протоколов, общаться с ним \(и, следовательно, друг с другом\), но `chan_pjsip` - единственный модуль VoIP, который все еще активно поддерживается; остальные - устаревший код. Вы вряд ли будете использовать другие протоколы VoIP \(такие как IAX2, Skinny/SCCP, Unistim, H323 и MGCP\). Эти протоколы имеют историческое значение, так как это было во многом связано с тем, что Asterisk будет говорить с чем угодно и обо всём, что может оказать влияние на телекоммуникационную отрасль. Однако в настоящее время SIP почти вытеснил их все, поэтому эти драйверы каналов теперь являются историческими курьезами и не более того. Если вы все еще заинтересованы в одном из этих протоколов, сосредоточьтесь на том, чтобы сначала комфортно работать с SIP и признать, что он в значительной степени самодостаточен.
|
||||
|
||||
---
|
||||
|
||||
Таблицы конфигурации каналов в базе данных [6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408603032) содержат сведения о конфигурации, относящиеся к этому драйверу канала, а также параметры и учетные данные, относящиеся к устройствам и поставщикам SIP, которые вы подключите к Asterisk \(входящие и исходящие\). Проще говоря: все звонки в Asterisk и из него должны проходить через канал.
|
||||
|
||||
Большинство параметров имеют значения по умолчанию, которые вы найдете в файлах примеров. Начните с чтения файла _pjsip.conf.sample_ находящегося в вашем каталоге _~/src/asterisk.<TAB>/configs/samples/_. Он предоставит множество информации о значениях по умолчанию, а также о других ресурсах, о которых стоит прочитать. Мы не будем использовать файл для фактической конфигурации \(вместо этого мы используем базу данных\); однако файл является отличной ссылкой, и вы должны держать его под рукой, так как он будет иметь ответы на многие вопросы, которые могут возникнуть о параметрах.
|
||||
|
||||
Мы собираемся сосредоточиться на получении базового устройства для вас как можно проще. Мы обнаружили, что настройка каналов является одной из самых неприятных вещей, которые испытывают новые пользователи Asterisk, и хотим продемонстрировать, что на самом базовом уровне это не должно быть болезненным вообще. После того, как вы преуспели здесь, у вас всегда будет известная хорошая конфигурация, чтобы вернуться, как вы продвинетесь вперед в более сложные сценарии.
|
||||
|
||||
### Как конфигурация канала работает с диалпланом
|
||||
|
||||
Каналы - это то, что Asterisk соединяет вызовы со всем, что находится за его пределами, но именно диалплан определяет что происходит с вызовами по мере их прохождения через систему. Таким образом, каналы и диалплан неразрывно связаны. Диалплан - это сердце системы Asterisk: он управляет тем, как логика вызова применяется к любому соединению, к любому каналу, например что происходит, когда устройство набирает добавочный номер 101 или входящий вызов от внешнего поставщика услуг направляется в DID. Таблицы конфигурации канала PJSIP в базе данных, а также файл _/etc/asterisk/extensions.conf_ будут играть важную роль в большинстве, если не во всех, вызовах, маршрутизируемых через систему. После того, как настроили свои каналы, вы обнаружите, что большая часть вашей работы будет в диалплане. Мы глубоко погрузимся в него в следующих главах.
|
||||
|
||||
Когда вызов поступает в Asterisk, идентификатор входящего вызова сопоставляется с конфигурацией канала используемого протокола \(SIP-соединения обрабатываются драйвером канала PJSIP\). Драйвер канала будет обрабатывать аутентификацию входящего соединения. Конфигурация канала также _определяет где этот канал будет входить в диалплан_.
|
||||
|
||||
Как только Asterisk определит, как будет обрабатывать канал \(т.е. он аутентифицирован и установлены различные параметры вызова\), он может передать управление вызовом в правильный контекст в диалплане. Это параметр контекста в таблице `ps_endpoints`, который сообщает каналу, где вызов будет входить в диалплан \(который содержит всю информацию о том, как обрабатывать и маршрутизировать вызов\).
|
||||
|
||||
На Рисунке 5-2 мы видим, что поток вызовов через конфигурацию для внутреннего вызова \(set-to-set\) будет выглядеть примерно так:
|
||||
|
||||
1. Пользователь устройства `0000f30A0A0101` набирает `102`.
|
||||
2. Asterisk сопоставляет входящий SIP-запрос с конечной точкой \(и проверяет его подлинность\).
|
||||
3. Набранный номер соответствует контексту `[sets]` в диалплане.
|
||||
4. Приложение `Dial()` используется для отправки вызова по каналу PJSIP на контакт, связанный с `0000f30B0B02`.
|
||||
5. Определяется контактный адрес \(обычно на основе регистрации, если это устройство, но также может быть жестко закодирован, если это транк\).
|
||||
6. Сообщение SIP INVITE отправляется в пункт назначения.
|
||||
|
||||
Ключевым моментом является то, что файлы конфигурации каналов управляют не только тем, как вызовы входят в систему, но и тем, как они покидают систему. Так, например, если одно устройство вызывает другое, файл конфигурации канала используется не только для передачи вызова в диалплан, но и для направления вызова из диалплана к месту назначения.
|
||||
|
||||

|
||||
|
||||
_Рисунок 5-2. Отношение pjsip.conf к extensions.conf_
|
||||
|
||||
### chan_pjsip
|
||||
|
||||
Модуль канала PJSIP является одним из новых модулей в Asterisk. Он заменил оригинальный модуль `chan_sip`.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Старый модуль SIP - `chan_sip` был устаревшим, поэтому мы не будем документировать его в этой книге. Если вы новичок в Asterisk, вы должны придерживаться PJSIP, но может быть полезно понять, что `chan_sip` использовался в течение многих лет и до сих пор широко используется на старых системах.
|
||||
|
||||
---
|
||||
|
||||
Платформа PJSIP, реализованная в Asterisk, состоит из многих компонентов. Если вы проверите свою базу данных, то обнаружите что существует более десятка таблиц, относящихся к PJSIP (с префиксом `ps_`). Однако, не все из них относятся к заданной конфигурации.
|
||||
|
||||
---
|
||||
|
||||
PJSIP - это универсальная библиотека с открытым исходным кодом для мультимедийной связи, которая обеспечивает не только сигнализацию SIP, но также функции медиапотока и обхода NAT, которые являются важными компонентами приложений на основе SIP. Он предоставляется и поддерживается компанией Telugu Ltd., и библиотека используется в гораздо большем числе приложений, чем просто Asterisk. Софтфоны, проприетарные продукты и другие проекты с открытым исходным кодом также используют фреймворк. Сообщество Asterisk нуждалось/хотело новый драйвер канала SIP, и вместо того, чтобы строить его с нуля, разработчики решили использовать библиотеку PJSIP.
|
||||
|
||||
---
|
||||
|
||||
Компоненты, перечисленные в [Таблице 5-1](Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition/5.%20User%20Device%20Configuration%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22table0501) будут испольоваться при настройке конечных точек.
|
||||
|
||||
Таблица 5-1. Компоненты PJSIP в Asterisk
|
||||
|
||||
| Компонент | Назначение |
|
||||
| :--- | :--- |
|
||||
| `ps_aors` | Address Of Record \(AOR\) - адрес записи - таблица используется для определения того, как Asterisk может связаться с конечной точкой. Когда комплект пытается зарегистрироваться, Asterisk будет обращаться к AOR, чтобы идентифицировать его. |
|
||||
| `ps_auths` | Раздел Authentication \(проверки подлинности\) содержит учетные данные, которые конечные точки должны будут предоставить системе Asterisk для авторизации. |
|
||||
| `ps_contacts` | Обычно создается автоматически как часть процесса регистрации, именно здесь Asterisk будет хранить сведения о конечной точке, определенной во время регистрации. |
|
||||
| `ps_endpoints` | Сердце конфигурации SIP, именно здесь определяется каждая конечная точка. Здесь также определяются связи с другими записями PJSIP. |
|
||||
|
||||
#### Добавление конечной точки
|
||||
|
||||
Во время установки для вас было создано несколько примеров конечных точек, чтобы упростить процесс представления вам рабочей системы. Если вы хотите добавить дополнительные конечные точки, то нужно просто определить дополнительные записи в каждой из таблиц `ps_aors`, `ps_auths` и `ps_endpoints`.
|
||||
|
||||
Допустим, мы хотим добавить пару софтфонов с именами `SOFTPHONE_A` и `SOFTPHONE_B` в нашу систему.
|
||||
|
||||
Во-первых, в таблицу `ps_endpoints` мы должны добавить следующее:
|
||||
|
||||
```text
|
||||
$ mysql -D asterisk -u asterisk -p
|
||||
```
|
||||
|
||||
Давайте рассмотрим, что у нас там уже есть \(из предыдущих глав\):
|
||||
|
||||
```text
|
||||
mysql> select id,transport,aors,auth,context,disallow,allow from asterisk.ps_endpoints;
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
| id | transport | aors | auth | context | disallow | allow |
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
| 0000f30A0A01 | transport-udp | 0000f30A0A01 | 0000f30A0A01 | starfish | all | ulaw |
|
||||
| 0000f30B0B02 | transport-udp | 0000f30B0B02 | 0000f30B0B02 | starfish | all | ulaw |
|
||||
+--------------+---------------+--------------+--------------+----------+----------+-------+
|
||||
2 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Мы собираемся вставить пару дополнительных записей.
|
||||
|
||||
```text
|
||||
mysql> insert into asterisk.ps_endpoints
|
||||
(id,transport,aors,auth,context,disallow,allow)
|
||||
values
|
||||
('SOFTPHONE_A','transport-tls','SOFTPHONE_A','SOFTPHONE_A','sets','all','ulaw'),
|
||||
('SOFTPHONE_B','transport-tls','SOFTPHONE_B','SOFTPHONE_B','sets','all','ulaw');
|
||||
Query OK, 2 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
Теперь таблица `ps_endpoints` должна выглядеть примерно так:
|
||||
|
||||
```text
|
||||
mysql> select id,transport,aors,auth,context,disallow,allow from ps_endpoints;
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
| id | transport | aors | auth | context | disallow | allow |
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
| 0000f30A0A01 | transport-udp | 0000f30A0A01 | 0000f30A0A01 | sets | all | ulaw |
|
||||
| 0000f30B0B02 | transport-udp | 0000f30B0B02 | 0000f30B0B02 | sets | all | ulaw |
|
||||
| SOFTPHONE_A | transport-tls | SOFTPHONE_A | SOFTPHONE_A | sets | all | ulaw |
|
||||
| SOFTPHONE_B | transport-tls | SOFTPHONE_B | SOFTPHONE_B | sets | all | ulaw |
|
||||
+--------------+---------------+--------------+--------------+---------+----------+-------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Затем нам понадобятся две связанные записи в таблице `ps_aors`:
|
||||
|
||||
```text
|
||||
mysql> insert into asterisk.ps_aors (id,max_contacts)
|
||||
values ('SOFTPHONE_A',2),('SOFTPHONE_B',2);
|
||||
Query OK, 2 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
Затем таблица `ps_aors` должна возвращать следующее:
|
||||
|
||||
```text
|
||||
mysql> select id from asterisk.ps_aors;
|
||||
+--------------+
|
||||
| id |
|
||||
+--------------+
|
||||
| 0000f30A0A01 |
|
||||
| 0000f30B0B02 |
|
||||
| SOFTPHONE_A |
|
||||
| SOFTPHONE_B |
|
||||
+--------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Наконец, таблица `ps_auths` будет нуждаться в записях для каждого нового устройства..
|
||||
|
||||
```text
|
||||
insert into asterisk.ps_auths (id,auth_type,password,username)
|
||||
values ('SOFTPHONE_A','userpass','iwouldnotifiwereyou','SOFTPHONE_A'),
|
||||
('SOFTPHONE_B','userpass','areyoueventrying','SOFTPHONE_B');
|
||||
|
||||
Query OK, 2 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
И, если все прошло хорошо, у вас будут следующие записи авторизации:[7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408545288)
|
||||
|
||||
```text
|
||||
mysql> select id,auth_type,password,username
|
||||
-> from asterisk.ps_auths;
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
| id | auth_type | password | username |
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
| 0000f30A0A01 | userpass | not very secure | 0000f30A0A01 |
|
||||
| 0000f30B0B02 | userpass | hardly to be trusted | 0000f30B0B02 |
|
||||
| SOFTPHONE_A | userpass | iwouldnotifiwereyou | SOFTPHONE_A |
|
||||
| SOFTPHONE_B | userpass | areyoueventrying | SOFTPHONE_B |
|
||||
+--------------+-----------+----------------------+--------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
Новые конечные точки теперь готовы к регистрации устройств на них. Вы можете убедиться, что они существуют с помощью следующей команды Asterisk CLI:
|
||||
|
||||
```text
|
||||
mysql> exit
|
||||
$ sudo asterisk -rvvvvv
|
||||
*CLI> pjsip show endpoints
|
||||
```
|
||||
|
||||
Выходные данные должны содержать список новых конечных точек:
|
||||
|
||||
```text
|
||||
Endpoint: 0000f30A0A01 Unavailable 0 of inf
|
||||
InAuth: 0000f30A0A01/0000f30A0A01
|
||||
Aor: 0000f30A0A01 2
|
||||
Transport: transport-udp tls 0 0 0.0.0.0:5061
|
||||
|
||||
Endpoint: 0000f30B0B02 Not in use 0 of inf
|
||||
InAuth: 0000f30B0B02/0000f30B0B02
|
||||
Aor: 0000f30B0B02 2
|
||||
Contact: 0000f30B0B02/sip:0000f30B0B02@172.29.1.110 7542ca7ce1 Unknown nan
|
||||
Transport: transport-udp udp 0 0 0.0.0.0:5060
|
||||
|
||||
Endpoint: SOFTPHONE_A Unavailable 0 of inf
|
||||
InAuth: SOFTPHONE_A/SOFTPHONE_A
|
||||
Aor: SOFTPHONE_A 2
|
||||
|
||||
Endpoint: SOFTPHONE_B Unavailable 0 of inf
|
||||
InAuth: SOFTPHONE_B/SOFTPHONE_B
|
||||
Aor: SOFTPHONE_B 2
|
||||
```
|
||||
|
||||
Подожди минутку…
|
||||
|
||||
Вы заметили, что для новых конечных точек не определен транспорт? Это потому, что мы еще ничего не определили для TLS; мы только что определили для стандартного UDP-стиля SIP.
|
||||
|
||||
Поскольку у нас есть те причудливые ключи, которые мы создали в предыдущей главе, давайте реализуем их сейчас и посмотрим, сможем ли мы это исправить.
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/pjsip.conf
|
||||
[transport-udp]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=0.0.0.0
|
||||
[transport-tls]
|
||||
type=transport
|
||||
protocol=tls
|
||||
bind=0.0.0.0
|
||||
cert_file=/home/asterisk/certs/self-signed.crt #если вы использовали certbot, то
|
||||
priv_key_file=/home/asterisk/certs/self-signed.key #расположение будет здесь
|
||||
```
|
||||
|
||||
Теперь, поскольку мы помещаем некоторые файлы в папку, которая не была частью нашей конфигурации SELinux, теперь мы должны это исправить. Мы хотим, чтобы SELinux генерировал ошибку, поэтому собираемся перезагрузить модуль `res_pjsip.so`, даже если он не сможет правильно загрузить транспорт:
|
||||
|
||||
```text
|
||||
*CLI> module reload res_pjsip.so
|
||||
```
|
||||
|
||||
Теперь у нас должны быть ошибки, которые мы ожидали, поэтому будем искать их в системном журнале.
|
||||
|
||||
```text
|
||||
$ sudo grep -i sealert /var/log/messages |egrep "cert|crt"
|
||||
```
|
||||
|
||||
Вы увидите некоторые сообщения, которые выглядят примерно так (мы урезали их для краткости):
|
||||
|
||||
```text
|
||||
SELinux is preventing ... on the file /home/asterisk/certs/self-signed.crt.
|
||||
For complete SELinux messages run: sealert -l 1dbe51e2-7321-41d3-a5bb-f8f1b4a6f787
|
||||
SELinux is preventing ... on the directory certs.
|
||||
For complete SELinux messages run: sealert -l 879db542-e0a9-43e8-8763-62fcf068bfee
|
||||
SELinux is preventing ... on the file self-signed.crt.
|
||||
For complete SELinux messages run: sealert -l 8fb85940-ee82-44bd-adcb-e30d31ee516a
|
||||
```
|
||||
|
||||
Полезно то, что SELinux говорит вам именно то, что нужно сделать для решения этой проблемы!
|
||||
|
||||
Для каждого из трех сообщений, относящихся к доступу к сертификатам, которые мы только что настроили, выполните соответствующую команду. А мы просто выполним одну, чтобы показать, что имеем в виду, но вам может потребоваться запустить более одной, пока загрузка не пройдет без ошибок.
|
||||
|
||||
```text
|
||||
$ sealert -l 8fb85940-ee82-44bd-adcb-e30d31ee516a
|
||||
```
|
||||
|
||||
Вы должны получить что-то вроде этого:
|
||||
|
||||
```text
|
||||
SELinux is preventing asterisk from read access on the file self-signed.crt.
|
||||
***** Plugin catchall (100. confidence) suggests **************************
|
||||
You can generate a local policy module to allow this access.
|
||||
allow this access for now by executing:
|
||||
# ausearch -c 'asterisk' --raw | audit2allow -M my-asterisk
|
||||
# semodule -i my-asterisk.pp
|
||||
```
|
||||
|
||||
Вы не root, но вы будете запускать обе команды, которые он определяет:
|
||||
|
||||
```text
|
||||
$ sudo ausearch -c 'asterisk' --raw | audit2allow -M my-asterisk
|
||||
$ sudo semodule -i my-asterisk.pp
|
||||
```
|
||||
|
||||
Помните, как все говорят что нужно просто отключить SELinux? Ну, больше не нужно этого делать.
|
||||
|
||||
Хорошо, перезапустите Asterisk (`$sudo service asterisk restart`) и убедитесь, что ваш файл журнала не генерирует ошибки SELinux (игнорируйте ошибки _ODBC.ini_, поскольку они не относятся к _/etc/odbc.ini_ и не должны ни на что влиять).
|
||||
|
||||
Вы должны увидеть, что `transport-tls` теперь готов к использованию:
|
||||
|
||||
```text
|
||||
*CLI> pjsip show transports
|
||||
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress....................>
|
||||
==========================================================================================
|
||||
Transport: transport-tls tls 0 0 0.0.0.0:5061
|
||||
Transport: transport-udp udp 0 0 0.0.0.0:5060
|
||||
```
|
||||
|
||||
Если вы обнаружите, что он все еще не загружается, вернитесь и отработайте ошибки SELinux в файле _/var/log/messages_. Иногда приходится иметь дело не только с одной.
|
||||
|
||||
## Тестирование чтобы убедиться что ваши устройства зарегистрированы
|
||||
|
||||
После того, как ваши устройства зарегистрировались в Asterisk, вы сможете запросить их местоположение и состояние из Asterisk CLI.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Это распространенное заблуждение, что регистрация - это то, как устройство аутентифицирует себя с целью получения разрешения на выполнение вызовов. Это неверно. Единственная цель регистрации - позволить устройству определить свое местоположение в сети, чтобы Asterisk[8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html#idm46178408511480) знал, куда отправлять вызовы, предназначенные для этого устройства.
|
||||
|
||||
Аутентификация для исходящих вызовов является полностью отдельным процессом и всегда происходит на основе каждого вызова, независимо от того, зарегистрирован ли комплект. Это означает, что ваше устройство может совершать звонки, но не принимать их. Наиболее распространенной причиной этого является брандмауэр, который закрыл входящий порт \(и решение состоит в том, чтобы установить таймер регистрации на более короткое время, чтобы оно перерегистрировалось каждые несколько минут, так что брандмауэр будет держать соответствующий SIP-порт открытым\).
|
||||
|
||||
Можно иметь успешно установленную регистрацию и все же совершать звонки будет запрещено. Дело в том, что только потому, что устройство зарегистрировано не означает, что оно может совершать звонки (хотя это почти всегда будет так).
|
||||
|
||||
---
|
||||
|
||||
Проверка регистрации комплекта - это самый простой способ проверить правильность его настройки.
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Помните, что настройка устройства _не_ происходит в Asterisk. Вы должны настроить устройство с помощью любых инструментов, предоставленных производителем.
|
||||
|
||||
---
|
||||
|
||||
Для проверки состояния устройства, просто вызовите CLI Asterisk:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rvvvv
|
||||
```
|
||||
|
||||
При вводе следующей команды возвращается список всех пиров, о которых знает Asterisk (зарегистрированные устройства будут иметь соответствующий `Contact`):
|
||||
|
||||
```text
|
||||
*CLI> pjsip show aors
|
||||
Aor: <Aor..............................................> <MaxContact>
|
||||
Contact: <Aor/ContactUri............................> <Hash....> <Status> <RTT(ms)..>
|
||||
==========================================================================================
|
||||
Aor: 0000f30A0A01 2
|
||||
Aor: 0000f30B0B02 2
|
||||
Contact: 0000f30B0B02/sip:0000f30B0B02@172.29.1.110:5 7542ca7ce1 Unknown nan
|
||||
Aor: SOFTPHONE_A 2
|
||||
Aor: SOFTPHONE_B 2
|
||||
```
|
||||
|
||||
## Базовый диалплан для теста ваших устройств
|
||||
|
||||
В следующей главе мы погрузимся в диалплан Asterisk. Здесь мы собираемся заложить очень простой диалплан, так что если вы регистрируете устройства на различные конечные точки SIP уже в конфигурации PJSIP, вы должны быть в состоянии сделать тестовые вызовы между ними.
|
||||
|
||||
```text
|
||||
$ sudo -u asterisk vim /etc/asterisk/extensions.conf
|
||||
[general]
|
||||
[globals]
|
||||
[sets]
|
||||
exten => 100,1,Dial(PJSIP/0000f30A0A01)
|
||||
exten => 101,1,Dial(PJSIP/0000f30B0B02)
|
||||
exten => 102,1,Dial(PJSIP/SOFTPHONE_A)
|
||||
exten => 103,1,Dial(PJSIP/SOFTPHONE_B)
|
||||
exten => 200,1,Answer()
|
||||
same => n,Playback(hello-world)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
В консоли Asterisk введите следующую команду:
|
||||
|
||||
```text
|
||||
*CLI> dialplan reload
|
||||
*CLI> dialplan show
|
||||
```
|
||||
|
||||
Вы увидите, что в контексте `sets` есть некоторые добавочные номера, которые вы можете вызвать.
|
||||
|
||||
Эта базовая абонентская группа позволит вам набирать ваши устройства SIP с помощью добавочных номеров 100, 101, 102 и 103. Вы также можете прослушать приглашение `hello-world`, созданное для этой книги, набрав добавочный номер 200.
|
||||
|
||||
Зарегистрируйте пару SIP-телефонов \(вы можете скачать софтфон на свой компьютер, а другой - на планшет или смартфон\). Вы должны быть в состоянии набрать между вашими номерами. Откройте CLI для того, чтобы увидеть прохождение звонка. Вы должны увидеть что-то вроде этого \(и устройство, которое вы вызываете, должно звонить\):
|
||||
|
||||
```text
|
||||
-- Executing [102@sets:1] Dial("PJSIP/SOFTPHONE_A-00000001", "PJSIP/0000f30B0B02")
|
||||
-- Called PJSIP/0000f30B0B02
|
||||
-- PJSIP/0000f30B0B02-00000002 is ringing
|
||||
```
|
||||
|
||||
Если этого не происходит, проверьте конфигурацию и регистрацию и убедитесь, что не сделали никаких опечаток.
|
||||
|
||||
---
|
||||
|
||||
**Регистрация устройств в Asterisk**
|
||||
|
||||
Существует так много различных видов SIP-устройств, которые вы можете зарегистрировать в Asterisk, невозможно привести пример, который будет полезен всем. У вас может быть ПК или Mac, или рабочая станция Linux, или iPhone, или Android, или настольный SIP-телефон, или какое-то иное устройство SIP; у каждого типа устройств есть много разных типов доступных клиентов SIP, и все они в основном одинаковы, но достаточно разные, чтобы раздражать новичка.
|
||||
|
||||
Мы не можем показать вам конкретный метод регистрации, но мы обнаружили, что из десятков или, возможно, сотен вариантов в каждом устройстве основной процесс аналогичен для всех из них. Вам нужно будет предоставить:
|
||||
|
||||
* Адрес вашего сервера Asterisk (`hostname`, `domen`, `proxy` и `server` - это все поля, которые мы видели для него)
|
||||
* Идентификатор устройства (`id`, `user`, `subscriber`, `username`, `extension`, `name` и тд)
|
||||
* Пароль
|
||||
|
||||
Если это становится сложным, вы, вероятно, зашли слишком далеко. Пусть все будет просто. Если продукт не имеет хорошей документации, то это может быть неправильный продукт для вас. Для большинства SIP-телефонов вы можете найти инструкции в интернете о том, как зарегистрировать их на Asterisk.
|
||||
|
||||
---
|
||||
|
||||
Если вы зарегистрируете второе устройство (теперь у вас их четыре!), вы можете сделать тестовые вызовы между ними.
|
||||
|
||||
Потратьте немного времени на это и убедитесь, что вы все это поняли. Это имеет решающее значение для всего, что последует далее.
|
||||
|
||||
## Под капотом: Ваш первый звонок
|
||||
|
||||
Чтобы вы задумались о том, что происходит под капотом, мы кратко рассмотрим некоторые вещи из того, что на самом деле происходит с протоколом SIP, когда два устройства в одной системе Asterisk вызывают друг друга.
|
||||
|
||||
---
|
||||
|
||||
## Asterisk как B2BUA
|
||||
|
||||
Имейте в виду, что на самом деле здесь происходит два вызова: один от исходного комплекта в Asterisk, а другой из Asterisk в целевой комплект. SIP - это одноранговый протокол, и с точки зрения протокола происходит два вызова. Протокол SIP не знает, что Asterisk соединяет вызовы; каждое устройство понимает свое соединение как соединение с Asterisk, без реального знания устройства на другой стороне. Именно по этой причине Asterisk часто называют B2BUA \(Back to Back User Agent\). Именно поэтому так легко соединять различные протоколы вместе с помощью Asterisk.
|
||||
|
||||
---
|
||||
|
||||
Для только что сделанного вызова будут созданы диалоги, показанные на Рисунке 5-3.
|
||||
|
||||
Для получения более подробной информации о том, как работает обмен SIP-сообщениями, обратитесь к [SIP RFC](http://www.ietf.org/rfc/rfc3261.txt).
|
||||
|
||||

|
||||
|
||||
_Рисунок 5-3. SIP диалоги_
|
||||
|
||||
## Вывод
|
||||
|
||||
В этой главе вы изучили рекомендации по именованию устройств путем абстрагирования понятий пользователь, добавочный номер и устройство, а также определения параметров конфигурации устройства и проверки подлинности в файлах конфигурации канала. Затем мы углубимся в магию Asterisk, которая является диалпланом, и посмотрим, как простые вещи могут давать отличные результаты.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408634856-marker) Или любой другой сети, если на то пошло. Более формально можно было бы назвать области аналого-цифровых шлюзов, где характер цифрового протокола может варьироваться \(например, проприетарные АТС на традиционных УАТС\). Дело в том, что ATA не обязательно является SIP-устройством.
|
||||
|
||||
[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408624504-marker) ATA - это не единственный способ подключения аналоговых телефонов. Поставщики оборудования, такие как Digium и Sangoma, предлагают карты, которые подключаются к серверу Asterisk и предоставляют аналоговые телефонные порты. Более крупные установки могут также использовать банки каналов или MSANы; однако этот метод подключения устаревших телекоммуникационных схем является более продвинутым предметом, а не предметом этой книги.
|
||||
|
||||
[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408623256-marker) Для действительно удивительного беспроводного аналогового телефона вы должны проверить устройства EnGenius DuraFon, которые дороги, но впечатляют.
|
||||
|
||||
[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408622440-marker) Наш друг Брайан Капуч собрал вместе множество занимательных демонстраций того, как можно использовать старинное телефонное оборудование для работы с Asterisk.
|
||||
|
||||
[5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408610760-marker) Проще говоря, вам нужно будет найти файл _pjsip.conf.sample_, и использовать его в качестве шаблона для создания файла _pjsip.conf_ в папке _/etc/asterisk_, а затем отредактировать этот файл таким же образом, как мы собираемся делать в базе данных.
|
||||
|
||||
[6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408603032-marker) Или в самом файле _.conf_ если вы заходите пойти по этому пути.
|
||||
|
||||
[7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408545288-marker) За исключением, конечно того, что ваши пароли будут намного лучше, чем те, которые мы использовали здесь.
|
||||
|
||||
[8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch05.html%22%20/l%20%22idm46178408511480-marker) Или любой другой сервер регистратора SIP, если на то пошло.
|
||||
|
||||
[Глава 4. Сертификаты для безопасности конечных точек](glava-04.md) | [Содержание](SUMMARY.md) | [Глава 6. Основы диалплана](glava-06.md)
|
|
@ -0,0 +1,552 @@
|
|||
# Глава 7. Внешние подключения
|
||||
|
||||
> _Вы не всегда можете контролировать то, что происходит снаружи. Но вы всегда можете контролировать то, что происходит внутри._
|
||||
>
|
||||
> -- Уэйн Дайер
|
||||
|
||||
В предыдущих главах мы рассмотрели много важной информации, которая необходима для работы системы Asterisk. Однако нам еще предстоит обсудить то, что жизненно важно для любой АТС: а именно, подключение ее к внешнему миру. В этой главе мы обсудим внешние подключения.
|
||||
|
||||
Новаторская архитектура Asterisk была знаменательной в значительной степени из-за того, что она рассматривала все типы каналов как равные. Это отличается от традиционной АТС, где транки \(линии соединяющие АТС с внешним миром\) и расширения \(линии соединяющие пользователей и ресурсы\) логически разделены. Тот факт, что диалплан Asterisk обрабатывает все каналы аналогичным образом означает, что в системе Asterisk вы можете очень легко выполнить то, что гораздо сложнее \(или невозможно\) достичь на традиционной АТС.
|
||||
|
||||
Однако, эта гибкость имеет цену. Поскольку система по своей сути не знает разницы между внутренним ресурсом \(например, телефонным аппаратом\) и внешним \(например, каналом телефонной связи\), вы должны убедиться, что ваш диалплан обрабатывает каждый тип ресурса соответствующим образом.
|
||||
|
||||
## Основы транкинга
|
||||
|
||||
Целью _транкинга_ является обеспечение общего соединения между двумя объектами. У деревьев есть стволы \(англ. trunks\), и все, что проходит между корнями и листьями, происходит через ствол. Железные дороги используют термин "магистраль \(trunks\)" для обозначения основной линии, которая соединяет фидерные линии вместе.
|
||||
|
||||
В телекоммуникациях транк соединяет две системы вместе. Операторы связи используют транки \(магистрали\) для подключения своих сетей друг к другу. В АТС линии, которые соединяют АТС с внешним миром \(с точки зрения АТС\), обычно называются транками \(хотя сами операторы связи обычно не считают их транками\). С технической точки зрения определение транка не так ясно, как это было раньше \(транки АТС использовали совершенно другую технологию от станционных линий, но теперь обе, как правило, являются SIP\), но как концепция, транки по-прежнему важны. С SIP все технически одноранговое, поэтому с точки зрения технологии больше нет такой вещи, как транк \(или, возможно, точнее сказать, что все является транком\). С функциональной точки зрения все еще полезно иметь возможность различать ресурсы VoIP, которые подключаются к внешнему миру \(транки \(магистрали\), схемы и т.д.\) и средства IP-телефонии подключенных конечных пользователей \(радиостанции, устройства, расширения, телефонные трубки, телефоны и т.д.\).
|
||||
|
||||
В УАТС Asterisk у вас могут быть транки, которые идут к вашему VoIP-провайдеру для междугородних звонков внутри страны, транки для звонков за границу и транки, которые соединяют ваши офисы вместе. Эти транки могут фактически работать через одно и то же сетевое соединение, но в диалплане вы можете относиться к ним совершенно по-разному. У вас даже может быть транк в Asterisk, который просто зацикливается на себе \(обычно это какой-то хитрый хак, который решает некоторую проблему с пространством имен или CDR, которую не удалось решить другим способом\).
|
||||
|
||||
## Фундаментальный диалплан для исходящих соединений
|
||||
|
||||
В традиционной АТС доступ к внешним линиям обычно осуществляется с помощью кода доступа, который необходимо набрать перед номером.\[^1\] Для этой цели обычно используется цифра 9.
|
||||
|
||||
В Asterisk аналогично можно назначить 9 для маршрутизации внешних вызовов, но поскольку диалплан Asterisk намного более интеллектуальный, на самом деле нет необходимости заставлять пользователей набирать 9 перед вызовом. Как правило, у вас будет диапазон номеров для вашей системы \(скажем, 100-199\) и диапазон кодов функций \(от \*00 до _\*_99\). Все, что находится за пределами этих диапазонов и соответствует шаблону набора номера для вашей страны или региона и может рассматриваться как внешний вызов.
|
||||
|
||||
Если у вас есть один оператор, обеспечивающий всю внешнюю маршрутизацию, то вы можете обрабатывать свой внешний набор через несколько простых совпадений шаблонов. Пример в этом разделе действителен для североамериканского плана нумерации \(NANP\). Если ваша страна не входит в NANP \(который обслуживает Канаду, США и многие страны Карибского бассейна\), вам понадобится другой шаблон соответствия.
|
||||
|
||||
Раздел `[globals]` содержит две переменные, названные `LOCAL` и `TOLL`.\[^2\] Целью этих переменных является упрощение управления вашим диалпланом, если вам когда-либо понадобится изменить провайдера. Они позволяют внести одно изменение в диалплан, которое повлияет на все места, где указан данный канал:
|
||||
|
||||
```text
|
||||
[globals]
|
||||
; Эти каналы одинаковы для asterisk, как и любая конечная точка PJSIP,
|
||||
; поэтому они будут настроены аналогично телефонным аппаратам.
|
||||
; Каждый поставщик услуг будет иметь свои собственные требования к конфигурации
|
||||
; (хотя все они будут похожи)
|
||||
LOCAL=PJSIP/my-itsp
|
||||
TOLL=PJSIP/my-other-itsp
|
||||
```
|
||||
|
||||
Раздел `[external]` содержит фактический код диалплана, который распознает набранные номера и передает их в приложение `Dial()`: \[^3\]
|
||||
|
||||
```text
|
||||
[external]
|
||||
exten => _NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN}) ; 10-значный шаблон для NANP
|
||||
exten => _NXXXXXX,1,Dial(${LOCAL}/${EXTEN}) ; 7-значный шаблон NANP
|
||||
exten => _1NXXNXXXXXX,1,Dial(${TOLL}/${EXTEN}) ; шаблон международного направления
|
||||
; для NANP
|
||||
exten => _011.,1,Dial(${TOLL}/${EXTEN}) ; Шаблон международного вызова,
|
||||
; сделанного из NANP
|
||||
; Этот раздел функционально совпадает с приведенным выше разделом.
|
||||
; Это для людей, которым нравится набирать '9' для их звонков.
|
||||
exten => _9NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN:1})
|
||||
exten => _9NXXXXXX,1,Dial(${LOCAL}/${EXTEN:1})
|
||||
exten => _91NXXNXXXXXX,1,Dial(${TOLL}/${EXTEN:1})
|
||||
exten => _9011.,1,Dial(${TOLL}/${EXTEN:1})
|
||||
```
|
||||
|
||||
В любом контексте, который будет использоваться комплектами или пользовательскими устройствами, вы будете использовать директиву `include=>`, чтобы разрешить доступ к контексту `external`:
|
||||
|
||||
```text
|
||||
[sets]
|
||||
include => external
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Предупреждение**
|
||||
|
||||
Крайне важно, чтобы вы не включали доступ к внешним линиям в любом контексте, который может обрабатывать входящий вызов. Риск здесь заключается в том, что фишинговый бот может в итоге получить доступ к вашим исходящим транкам (вы будете удивлены тем, насколько эти фишинговые боты распространены).
|
||||
|
||||
_**Мы не можем не подчеркнуть, насколько важно, чтобы вы гарантировали, что никакой внешний ресурс не может получить доступ к вашим платным линиям.**_
|
||||
|
||||
---
|
||||
|
||||
## ТфОП
|
||||
|
||||
Телефонная сеть общего пользования (ТфОП, на англ. PSTN) существует уже более ста лет. Это предшественник многих технологий, которые формируют наш мир сегодня, от интернета до MP3-плееров.
|
||||
|
||||
Использование линий ТфОП старой школы в системах Asterisk больше не является распространенным явлением. Технические сложности, затраты и ограничения устаревшей технологии оправданы только в ситуациях, когда надежное подключение к интернету недоступно (и даже тогда традиционные линии будут проблематичным выбором). Даже сами операторы связи в значительной степени перешли на VoIP для своих внутренних транков.
|
||||
|
||||
---
|
||||
|
||||
**ТфОП пора на пенсию**
|
||||
|
||||
Больше, чем любой технический фактор, пожалуй, самым значительным гвоздем в гробу ТфОП является тот факт, что большинство технических экспертов в области традиционной телефонии близки или достигли пенсионного возраста, и современные дети не интересуются такими вещами. Суть в том, что вы все чаще обнаружите, что поставщики услуг больше не имеют квалифицированного персонала, необходимого для развертывания традиционных услуг ТфОП. Все крутые ребята изучают VoIP \(который в конечном счете является просто сетевой технологией\), и все операторы связи делают все возможное и самое яркое в сфере бизнеса VoIP/SIP.
|
||||
|
||||
Таким образом, если раньше вы не могли не подключиться через PRI, в настоящее время это уже не так. На самом деле многие компании поставляют PRI через SIP соединения, что для Asterisk является избыточным и не нужным.
|
||||
|
||||
---
|
||||
|
||||
Там, где ТфОП все еще может оставаться в силе в течение нескольких лет - это телефонные номера. Если бы VoIP был изобретен без предшествующего ему ТфОП маловероятно, что когда-либо было бы изобретено что-то вроде телефонного номера. Тем не менее, они у нас есть, и мы их используем, и причина, по которой мы делаем это, возможно, не столько из-за какой-либо полезности, которую они обеспечивают, а скорее из-за того, что они управляются сложным, многонациональным консорциумом органов по стандартизации и кураторами, которые обеспечивают целостность глобального плана маршрутизации вызовов.
|
||||
|
||||
Можно представить, что если бы интернет определял телефонную сеть \(и телефонные звонки были такими же бесплатными, как электронная почта\), все наши SIP-телефоны, вероятно, звонили бы весь день с одним спам-предложением за другим. Это так и происходит, но в значительно меньших масштабах из-за того, что телефонный звонок стоит денег. И даже если он стоит всего лишь копейки, этого достаточно, чтобы делать невыгодным большую часть бессмысленного спама.
|
||||
|
||||
Еще одной особенностью ТфОП является соответствие стандартам и совместимость. Если вы посмотрите на любой интернет-голосовой продукт, он либо является проприетарным, огороженным садами, либо управляется сообществом и не сможет получить какую-либо полезную тягу. Мы считаем, что это не изменится до тех пор, пока не будет создан какой-то механизм доверия, который гарантирует проверку личности входящих абонентов каким-то широко признанным органом.
|
||||
|
||||
### Традиционные транки ТфОП
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Этот раздел был написан как дань уважения телекоммуникационной отрасли и истории самой Asterisk. Отчасти это связано с тем, что раз Asterisk мог взаимодействовать со столькими различными типами линий старой школы, потому он и добился раннего успеха. В наши дни использование этих старых линий по большей части исчезло в истории.
|
||||
|
||||
---
|
||||
|
||||
Существует два типа фундаментальных технологий, которые используются поставщиками услуг ТфОП для предоставления телефонных линий: аналоговые и цифровые.
|
||||
|
||||
#### Аналоговая телефония
|
||||
|
||||
Первые телефонные сети были полностью аналоговыми. Звуковой сигнал, который вы сгенерировали своим голосом, использовался для генерации электрического сигнала, который передавался на другой конец провода. Электрический сигнал имел те же характеристики, что и производимый звук.
|
||||
|
||||
Аналоговые линии имеют несколько характеристик, отличающих их от других линий, которые вы можете подключить к Asterisk:
|
||||
|
||||
* Отсутствует сигнальный канал — сигнализация состояния линии является электромеханической, а адресация осуществляется с использованием внутриполосных звуковых сигналов.
|
||||
* Механизм наблюдения за отключением обычно задерживается на несколько секунд и не является полностью надежным.
|
||||
* Контроль дальнего конца минимален \(например, контроль ответа отсутствует\).
|
||||
* Различия в линиях означают, что звуковые характеристики будут варьироваться от линии к линии и потребуют настройки.
|
||||
|
||||
Входящие аналоговые линии, которые вы захотите подключить к системе Asterisk, должны быть подключены к порту Foreign eXchange Office \(FXO\). Поскольку в любом стандартном компьютере не существует такого понятия, как порт FXO, то перед подключением традиционных аналоговых линий системе должен быть предоставлен какой-либо порт FXO. Такие компании, как Digium и Sangoma предлагают карты с таким функционалом, но вы также можете приобрести устройство SIP, которое предоставляет эти порты.
|
||||
|
||||
---
|
||||
|
||||
**FXO и FXS**
|
||||
|
||||
Для любой аналоговой линии есть два конца: офис \(как правило, центральный офис ТфОП\) и станция \(как правило, телефон, но также может быть карта, такая как модем или линейная карта в АТС\).
|
||||
|
||||
Центральный офис отвечает за:
|
||||
|
||||
* Питание на линии \(номинально 48 Вольт постоянного тока\)
|
||||
* Напряжение звонка \(номинально 90 Вольт переменного тока\)
|
||||
* Предоставление гудка \(сигнала ответа станции\)
|
||||
* Обнаружение состояния трубки \(положена или поднята\)
|
||||
* Отправка дополнительной сигнализации, такой как идентификатор вызывающего абонента \(Caller ID\)
|
||||
|
||||
Станция отвечает за:
|
||||
|
||||
* Обеспечение звонка \(или, по крайней мере, возможности каким-то образом обрабатывать напряжение звонка\)
|
||||
* Предоставление номеронабирателя \(или какой-либо способ отправки DTMF\)
|
||||
* Предоставление рычажного переключателя для указания состояния линии
|
||||
|
||||
Порт Foreign eXchange (FX) _называется тем, к чему он подключается_, а не тем, что он делает. Так, например, порт Foreign Exchange Office (FXO) на самом деле является станцией: он соединяется с центральным офисом. Порт Foreign eXchange Station (FXS) - это фактически порт, который предоставляет услуги центрального офиса (другими словами, вы бы подключили аналоговый аппарат к порту FXS).
|
||||
|
||||
Обратите внимание, что мы не можем перейти с FXO на FXS просто изменив настройки. Порты FXO и FXS требуют совершенно разную электронику.
|
||||
|
||||
Это старая школа, ребята. Вы можете запускать старые телефоны возрастом более 100 лет с порта FXS!
|
||||
|
||||
---
|
||||
|
||||
Мы не рекомендуем использовать аналоговые транки в системе Asterisk. Их конфигурация и использование выходят за рамки данной книги.[^4](4)
|
||||
|
||||
#### Цифровая телефония
|
||||
|
||||
Цифровая телефония была разработана для преодоления многих ограничений аналоговой. Некоторые из преимуществ цифровых линий включают:
|
||||
|
||||
* Отсутствие потери амплитуды на больших расстояниях
|
||||
* Снижение уровня шума на линиях (особенно на междугородних дистанциях)
|
||||
* Возможность выполнять более одного вызова через физический канал
|
||||
* Более быстрая установка соединения и разъединение
|
||||
* Более богатая сигнальная информация (особенно при использовании ISDN)
|
||||
* Более низкая стоимость для поставщиков услуг
|
||||
* Более низкая цена для клиентов (на более высоких плотностях)
|
||||
|
||||
Существует несколько типов цифровых линий, которые получили широкое применение в телекоммуникационной отрасли:
|
||||
|
||||
T1 (24 канала)
|
||||
|
||||
Используется в Канаде и США(в основном для ISDN-PRI)[^5](5)
|
||||
|
||||
E1 (32 канала)
|
||||
|
||||
Используется в остальном мире (ISDN-PRI или MFC/R2)
|
||||
|
||||
BRI (2 канала)
|
||||
|
||||
Используется для линий ISDN-BRI (Евро-ISDN)
|
||||
|
||||
Обратите внимание, что физическая линия может быть дополнительно определена протоколом, работающим по схеме. Например, T1 может использоваться для ISDN-PRI или CAS, а E1 может использоваться для ISDN-PRI, CAS или MFC/R2.
|
||||
|
||||
Трудно обосновать использование этих типов линий. По сравнению с протоколами VoIP, они стали дорогими, сложными и несколько негибкими. Если вам нужно подключить такие линии к системе Asterisk, мы рекомендуем какое-то шлюзовое устройство для преобразования линии в SIP, а затем подключиться через SIP к вашей системе Asterisk. Если вам нужна система с одним шасси, такие компании как Digium и Sangoma предлагают цифровые карты ТфОП, которые могут быть установлены непосредственно на ваш сервер Asterisk; они подключаются к Asterisk через драйвер канала DAHDI. Использование этой технологии выходит за рамки данной книги.[^6](6)
|
||||
|
||||
## VoIP
|
||||
|
||||
По сравнению с длительной историей телекоммуникационной отрасли, [^7](7) VoIP по-прежнему является относительно новой концепцией. За столетие, или около того, до появления VoIP единственным способом подключить вас к ТфОП было использование каналов, предоставленных для этой цели вашей местной телефонной компанией. Теперь же VoIP позволяет устанавливать соединения между конечными точками без участия ТфОП \(хотя в большинстве сценариев VoIP в какой-то момент все равно будет присутствовать компонент ТфОП, особенно если используется традиционный телефонный номер E.164\). ТфОП по-прежнему контролирует телефонные номера и мы будем использовать их до тех пор, пока кто-нибудь не придумает механизм адресации на основе интернета, который не будет подвергаться злоупотреблениям, как электронная почта[^8](8).
|
||||
|
||||
### Преобразование сетевых адресов (NAT)
|
||||
|
||||
Если вы собираетесь использовать VoIP через любой вид глобальной сети \(например, интернет\), вы будете иметь дело с брандмауэрами и довольно часто с преобразованием сетевых адресов \(NAT\).[^9](9) Базовое понимание того, как протоколы SIP и RTP работают вместе для создания VoIP-вызова может быть полезно в понимании и в отладке функциональных проблем \(таких как проблема “односторонней слышимости” часто возникающая при ошибках конфигурации NAT\). NAT позволяет использовать один внешний IP-адрес совместно несколькими устройствами за маршрутизатором. Поскольку NAT обычно обрабатывается в брандмауэре, он также является частью уровня безопасности между частной сетью и интернетом.
|
||||
|
||||
VoIP-вызов с использованием SIP не состоит только из сигнальных сообщений для настройки вызова (часть SIP-соединения). Он также требует потоков RTP (медиапотоки), которые несут фактическое аудио соединение[^10](10), как показано на Рисунке 7-1.
|
||||
|
||||

|
||||
|
||||
_Рисунок 7-1. SIP и RTP_
|
||||
|
||||
Использование отдельного протокола для передачи звука - это то, что может сделать обход NAT трудным для VoIP-соединений, особенно если удаленные телефоны находятся за одним NAT, а УАТС - за другим. Проблема вызвана тем фактом, что в то время как SIP-сигнализация обычно разрешена в брандмауэрах на обоих концах, потоки RTP не могут быть распознаны как часть сеанса SIP, и, таким образом, будут проигнорированы или заблокированы, как показано на Рисунке 7-2. Эффект блокировки одного или обоих потоков RTP заключается в том, что пользователи будут видеть что их вызовы проходят, и смогут отвечать на них, но не смогут слышать другого абонента (или не смогут быть услышаны).
|
||||
|
||||

|
||||
|
||||
_Рисунок 7-2. RTP заблокирован брандмауэром_
|
||||
|
||||
В этом разделе мы обсудим некоторые методы, которые вы можете использовать для устранения проблем, вызванных NAT. Существует два различных сценария, которые необходимо рассмотреть, каждый из которых требует определения параметров в файле _pjsip.conf_. Проблемы NAT могут быть раздражающими при устранении неполадок, поскольку в продакшене существует множество различных типов брандмауэров и множество различных способов их настройки.
|
||||
|
||||
В общем, вам нужно добавить следующие параметры в секцию транспорта вашего файла _/etc/asterisk/pjsip.conf_:
|
||||
|
||||
```text
|
||||
[transport-udp]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=0.0.0.0
|
||||
local_net=x.x.x.x/xx ; IP/CIDR вашей внутренней сети
|
||||
external_media_address=x.x.x.x ; Внешний IP-адрес для использования в обработке RTP
|
||||
external_signaling_address=x.x.x.x ; Внешний адрес для SIP-сигнализации
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Если вы хотите узнать внешний адрес вашей УАТС, выполните следующие действия из командной строки:
|
||||
|
||||
`$ dig +short myip.opendns.com @resolver1.opendns.com`
|
||||
|
||||
---
|
||||
|
||||
Вероятно, установка этих параметров безопасна для всех случаев, но будьте готовы экспериментировать, комментируя настройки и перезагружая PJSIP для тестирования различных сценариев.
|
||||
|
||||
#### Устройства за NAT
|
||||
|
||||
Если ваши телефонные аппараты находятся за удаленным NAT, в таблице `ps_endpoints` вашей базы данных могут быть параметры, которые следует настроить из настроек по умолчанию. Вам нужно будет поэкспериментировать с изменением следующих значений выбрав между `yes` и `no`.
|
||||
|
||||
```text
|
||||
MySQL> update ps_endpoints set rtp_symmetric='yes',force_rport='yes',rewrite_contact='yes'
|
||||
```
|
||||
|
||||
Другие параметры, которые вы можете посмотреть, включают `media_address` и `direct_media`.
|
||||
|
||||
При внесении изменений учитывайте значения по умолчанию. Если вы сомневаетесь - установите значение поля, которое вы изменили на `NULL`, это фактически вернет его к значению по умолчанию.
|
||||
|
||||
---
|
||||
|
||||
**Сохранение удаленного брандмауэра открытым**
|
||||
|
||||
Иногда возникает проблема с SIP-телефоном, когда телефон регистрируется и функционирует при первой загрузке, но затем внезапно становится недоступным. Это часто происходит если удаленный брандмауэр не видя никакой активности поступающей от устройства закрывает внешнее соединение с телефоном, и таким образом, АТС теряет возможность подавать сигнал на его вызов. Эффект заключается в том, что если АТС попытается отправить вызов на телефон, он не сможет подключиться (удаленный брандмауэр отклонит соединение). Если, с другой стороны, пользователь делает вызов, то в течение нескольких минут устройство снова сможет принимать входящие вызовы. Естественно это может путать пользователей.
|
||||
|
||||
Относительно простое решение этой проблемы[^11](11) включает в себя установку таймера регистрации на удаленном телефоне на достаточно низкое значение, которое будет стимулировать соединение каждую минуту или около того, и, таким образом, убедить брандмауэр, что этому соединению может быть позволено существовать на некоторое время дольше. Это небольшой хак, но он оказался успешным. Проблема с предложением универсального решения заключается в том, что существует множество различных моделей брандмауэров, от недорогих устройств потребительского класса до сложных контроллеров границ сеанса, и это одно из немногих решений, которое, по-видимому, надежно решает проблему почти во всех случаях.
|
||||
|
||||
Этот подход лучше всего подходит для небольших систем \(менее 100 телефонов\). Большая система с сотнями или тысячами телефонов не будет хорошо обслуживаться этим решением, так как будет увеличена нагрузка на систему из-за почти постоянного потока регистраций с удаленных телефонов. В таком случае необходимо будет более тщательно продумать общую конструкцию \(например, вместо Asterisk можно было бы использовать выделенный сервер регистратора для обработки регистрационного трафика\).
|
||||
|
||||
В идеальном мире вы могли бы указать конкретную модель брандмауэра и разработать конфигурацию для этих брандмауэров, которая бы обеспечивала правильную обработку вашего SIP-трафика. На самом деле, вы столкнетесь не только с разными моделями брандмауэров, но даже с разными версиями прошивки для одной и той же модели брандмауэра.
|
||||
|
||||
---
|
||||
|
||||
#### Asterisk за NAT
|
||||
|
||||
Во-первых, мы должны сказать вам, что размещение вашей АТС за NAT не рекомендуется. Гораздо лучше обеспечить брандмауэр без уровня NAT \(особенно если у вас есть конечные точки, которые не находятся в той же сети, что и УАТС\).
|
||||
|
||||
Если у вас возникли сложности с работой АТС за NAT, вам нужно будет плотно взаимодействовать с вашей командой сетевых инженеров, чтобы убедиться в корректной работе вашего устройства NAT \(как правило брандмауэром\). Если же их навыки окажутся недостаточными для решения этой задачи, Вам могут потребоваться услуги внешнего консультанта, который обладает достаточной квалификацией для настройки прохождения трафика SIP/RTP через NAT. Как мы уже говорили, нахождение вашей АТС за NAT не рекомендуется.
|
||||
|
||||
Как правило, конечные точки также будут находиться за NAT, и, таким образом, у вас будет сценарий с двойным NAT, который, вероятно, потребует нескольких часов экспериментов с различными настройками не только в Asterisk, но и в брандмауэре чтобы добиться успеха. Помните - очень важно чтобы вы проверяли звук в обоих направлениях; недостаточно просто проверить, что звонки можно набирать и отвечать.
|
||||
|
||||
В сценарии, где нет выбора, кроме как использовать двойной NAT, мы рекомендуем выяснить, можно ли использовать VPN между УАТС и удаленными конечными точками. Во многих случаях его будет легче настроить. Мы хотели бы сказать, что есть простой и надежный способ, который будет работать во всех случаях, но, к сожалению, такого метода нет.
|
||||
|
||||
Для работы с NAT Вы также можете изучить такие технологии как STUN, TURN и ICE. Подробности использования этих технологий выходят за рамки данной книги, так как они требуют внешних серверов, но многие люди успешно применили эти протоколы там, где другие методы потерпели неудачу.
|
||||
|
||||
### Терминация и инициирование ТфОП
|
||||
|
||||
Передача вызовов между средой VoIP и ТфОП требует некоего шлюза для преобразования сигнализации VoIP \(обычно SIP\) в нечто совместимое с протоколами ТфОП. Эти процессы называются _инициированием_ и _терминацией_ (Рисунок 7-3).
|
||||
|
||||

|
||||
|
||||
_Рисунок 7-3. Терминация и инициирование ТфОП_
|
||||
|
||||
Люди часто путают термины _инициирование_ и _терминация_. Для нас полезно помнить, что, поскольку ТфОП уже существовал когда появился VoIP, термины развивались по отношению к нему. В идеале процессы, вероятно, должны называться _инициирование_ ТфОП и _терминация_ ТфОП, и мы рекомендуем вам запомнить их таким образом.[^12](12)
|
||||
|
||||
#### Терминация ТфОП
|
||||
|
||||
До тех пор, пока VoIP полностью не заменит ТфОП будет необходимость подключения вызовов из VoIP-сетей к телефонной сети общего пользования. Этот процесс называется _терминацией_ (Рисунок 7-4).
|
||||
|
||||

|
||||
|
||||
_Рисунок 7-4. Терминация ТфОП_
|
||||
|
||||
Хотя вы можете сконструировать систему Asterisk для работы в качестве шлюза терминации \(используя некоторые интерфейсы ТфОП\), на практике вы с большей вероятностью будете использовать _поставщика услуг интернет-телефонии_ \(ITSP, также иногда называемый _оператором VoIP_\) для терминации ваших телефонных звонков. Интернет-провайдеры обычно вкладывают огромные инвестиции в инфраструктуру и вам будет трудно сделать что-то лучше не тратя кучу денег.
|
||||
|
||||
---
|
||||
|
||||
Если вам действительно нужно подключить систему Asterisk непосредственно к ТфОП, вам потребуется следующее:
|
||||
|
||||
* Соответствующая линия\(и\) от тел.комп. ТфОП (аналоговая, BRI, PRI, SS7, MFC/R2 и т.д.\)
|
||||
* Подходящее оборудование для подключения к этой линии \(FXO, BRI, T1, E1 и т.д.\)
|
||||
* Эхоподавление \(аппаратное или программное\)
|
||||
* Навыки, необходимые для правильной настройки вашего оборудования для оператора, с которым вы имеете дело \(есть множество вариантов каждой из этих типов линий, и это может быть трудно даже для тех, кто хорошо знает технологию\)[^13](13)
|
||||
|
||||
Кроме того, вам часто придется обрабатывать гораздо более сложную логику маршрутизации, которая учитывает такие вещи, как география, корпоративная политика, стоимость, доступные ресурсы и т.д.
|
||||
|
||||
---
|
||||
|
||||
Для того, чтобы отправить ваши вызовы на ITSP, ваш диалплан должен выглядеть примерно так:
|
||||
|
||||
```text
|
||||
; Для систем NANP
|
||||
[to-pstn] ; Да, мы проходим через ITSP, но ТфОП - это наш пункт назначения
|
||||
exten => _1NXXNXXXXXX.,1,Dial(${TOLL}/${EXTEN}) ; код страны плюс номер телефона
|
||||
; Добавляем '1' и отправляем
|
||||
exten => _NXXNXXXXXX.,1,Dial(${LOCAL}/1${EXTEN}) ; код страны плюс номер телефона
|
||||
; Отбрасываем '011' и отправляем
|
||||
exten => _011X.,1,Dial(${TOLL}/${EXTEN:3}) ; код страны плюс номер телефона
|
||||
; Вызов экстренных служб
|
||||
exten => 911,1,Dial(${LOCAL}/911) ; определение этого потребует информации от вашего оператора
|
||||
|
||||
; Большая часть остального мира
|
||||
[to-pstn]
|
||||
; Убрать префикс NDD, добавить код страны и отправить
|
||||
exten => _0X.,1,Dial(${TOLL}/<добавить сюда код страны>${EXTEN:1})
|
||||
; Убрать префикс IDD и отправить
|
||||
exten => _00X,1,Dial(${LOCAL}/${EXTEN:2}) ; код страны плюс номер телефона
|
||||
; Вызов экстренных служб (и других служб)
|
||||
exten => 11X,1,Dial(${LOCAL}/${EXTEN}) ; для определения этого потребуется информация от вашего оператора
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Предупреждение**
|
||||
|
||||
Учитывая, что большинство каналов ТфОП позволит вам набрать любой номер в любой точке мира, и учитывая, что вы будете платить за все понесенные расходы, мы ЕЩЕ РАЗ ПОДЧЕРКИВАЕМ важность обеспечения безопасности на машине шлюза, которая обеспечивает терминацию ТфОП. Преступники прикладывают много усилий для взлома телефонных систем \(особенно плохо защищенных систем Asterisk\), и если вы не уделите пристального внимания всем аспектам безопасности, то станете жертвой мошенничества. Это лишь вопрос времени.
|
||||
|
||||
_Не допускайте никаких незащищенных VoIP-соединений в любой контекст, содержащий терминацию ТфОП._
|
||||
|
||||
---
|
||||
|
||||
Терминация как правило будет более сложной, чем мы описали здесь — даже если вы используете ITSP в качестве своего оператора, но основная концепция довольно проста: сопоставьте шаблон номера, который ваши пользователи могут набрать, подготовьте его для оператора, удалив или добавив необходимые цифры, и отправьте вызов соответствующей конечной точке PJSIP (транку). Мы здесь только обсудили диалплан; в более позднем разделе мы обсудим, как настроить SIP-транки для передачи этого трафика.
|
||||
|
||||
#### Инициирование ТфОП
|
||||
|
||||
Вы также можете принимать звонки от ТфОП в свою сеть VoIP. Процесс выполнения этого обычно называют _инициированием_. Это просто означает что вызов инициирован в ТфОП (Рисунок7-5).
|
||||
|
||||

|
||||
|
||||
_Рисунок 7-5. Инициирование ТфОП_
|
||||
|
||||
Для того, чтобы обеспечить инициирование, требуется номер телефона.
|
||||
|
||||
В старые добрые времена, когда VoIP и Asterisk были молоды, для людей было довольно распространено обрабатывать подключение линии к ТфОП самостоятельно, используя аналоговые или цифровые транки, предоставляемые местной телефонной компанией. По большей части этот тип соединения теперь обрабатывается ITSP, и вам просто нужно подключить вашу систему к VoIP-оператору через SIP-транк.
|
||||
|
||||
Телефонные номера — при использовании в целях инициирования обычно называются DID'ами \(номера Direct Inward Dialing\). Ваш оператор связи отправит вызов вниз по каналу в вашу систему и передаст DID \(или специальные полученные цифры в некоторых случаях[^14](14)), которые будет интерпретировать диалплан Asterisk. Другими словами, вам понадобится контекст диалплана, который принимает входящие вызовы от вашего оператора, с расширениями или шаблонами, которые будут коррелировать с вашими DID.
|
||||
|
||||
Чтобы принять вызов по линии VoIP, вам нужно будет обработать цифры, которые поставщик услуг будет посылать вам \(DID или номер телефона\). Номера DNIS и DID не должны совпадать, но, как правило, будут. Ранее провайдер обычно спрашивал, в каком формате вы хотите получать цифры. В настоящее время оператор VoIP, как правило, говорит вам в каком формате будет отправлять, и вы должны принять его. Два распространенных формата: DNIS \(который по сути является цифрами вызываемого DID\) или E.164, что означает, что они будут включать код страны с номером.
|
||||
|
||||
В диалплане входящий канал связывается с контекстом, который будет знать, как обрабатывать входящие номера. Он может выглядеть примерно так:
|
||||
|
||||
```text
|
||||
[from-pstn]
|
||||
exten => _X.,1,Verbose(2,Incoming call to ${EXTEN})
|
||||
same => n,Goto(number-mapping,${EXTEN},1)
|
||||
|
||||
[number-mapping]
|
||||
exten => 4165550100,1,Goto(sets,100,1)
|
||||
exten => 4165550101,1,Goto(sets,101,1)
|
||||
exten => 4165550102,1,Goto(sets,102,1)
|
||||
exten => 4165550103,1,Goto(sets,103,1)
|
||||
exten => 4165554321,1,Goto(main-menu,${EXTEN},1)
|
||||
exten => 4165559876,1,VoiceMailMain() ; удобный ход для прослушивания голосовых сообщений
|
||||
exten => i,1,Verbose(2,Incoming call to invalid number)
|
||||
```
|
||||
|
||||
В контексте `number-mapping` вы явно перечисляете все идентификаторы DID, которые ожидаете принимать, а также обработчик ошибок для всех неперечисленных DID \(вы можете отправлять недопустимые номера в приёмную или в автосекретарь или даже в некоторый контекст, который воспроизводит оповещение об ошибке\).
|
||||
|
||||
Теперь мы готовы обсудить, как настроить транки для передачи вашего внешнего трафика.
|
||||
|
||||
### Настройка SIP-транков
|
||||
|
||||
SIP является самым популярным из VoIP-протоколов. Настолько, что термины _VoIP_ и _SIP_ стали означать почти одно и то же. В предыдущих изданиях этой книги мы рассмотрели некоторые из других протоколов, которые были популярны в то время \(в первую очередь IAX2 и H.323\), но для этого издания больше нет реальной причины обсуждать что-либо, кроме SIP. Драйверы каналов для этих старых протоколов по-прежнему доступны в Asterisk, но они больше не поддерживаются.
|
||||
|
||||
Протокол SIP является одноранговым и на самом деле не имеет формальной спецификации транка. Это означает, что независимо от того, подключаете ли вы один телефон к серверу или соединяете два сервера вместе, SIP-соединения будут одинаковыми. По правде говоря, есть некоторые различия в том, как эти ресурсы могут быть настроены, и определенно будет разница в том, как ваш диалплан будет обрабатывать маршрутизацию по транкам.
|
||||
|
||||
#### Подключение системы Asterisk к SIP-провайдеру
|
||||
|
||||
Довольно часто используется один и тот же поставщик услуг ITSP для терминации и инициирования, но имейте в виду, что эти два процесса не связаны друг с другом. Если звонки, идущие в одном направлении, проходят ваше тестирование, это не означает, что звонки в другом направлении в порядке. При изменении конфигурации каждый раз проверяйте маршрутизацию как внутри, так и снаружи.
|
||||
|
||||
Многие компании предоставляют примеры конфигураций для Asterisk. К сожалению, эти документы обычно относятся к устаревшему драйверу `chan_sip`. Digium разработал мастер настройки PJSIP, который призван значительно упростить конфигурацию провайдера. Вы все еще можете настроить транки ITSP, используя те же методы, которые мы показывали ранее для настройки других конечных точек (создание записей в `ps_endpoint`, `ps_aors`, `ps_auths` и т.д.), но вместо того, чтобы снова повторять все это, мы рассмотрим мастер настройки, поскольку он объединяет несколько компонентов в один файл конфигурации. Мы обнаружили, что в отличии от часто меняющихся конечных точек пользователей, конечные точки провайдеров меняются редко, поэтому бывает полезно настроить провайдеров в файле конфигурации, а не в базе данных.
|
||||
|
||||
Перед созданием любой конфигурации важно определить, как оператор будет взаимодействовать с вашей системой. Есть две фундаментальные модели, которые мы видели:
|
||||
|
||||
_Аутентификация на основе пароля, включая регистрацию_[^15](15)
|
||||
|
||||
Это характерно для небольших провайдеров, ориентированных на рынок малого бизнеса. Представляет такой же тип услуги, которую вы получите, если просто регистрируете SIP-телефон непосредственно в службе.
|
||||
|
||||
_IP-аутентификация_
|
||||
|
||||
Без пароля и без регистрации. Это чаще встречается у провайдеров, которые предоставляют услуги оптового транкинга более крупным предприятиям и реселлерам. \(Как правило, они также сопровождаются каким-то минимальным обязательством с точки зрения объема.\) От вас ожидают, что у вас будут хорошие навыки работы с SIP и сетью.
|
||||
|
||||
Это не строгие ограничения, но они наиболее часто встречаются на практике.
|
||||
|
||||
Таким образом, существует два способа настройки ITSP в файле _/etc/asterisk/pjsip\_wizard.conf_.
|
||||
|
||||
Во–первых, если провайдер использует IP-аутентификацию - он будет ожидать, что вы будете отправлять трафик со статического IP-адреса (и если ваш адрес изменится, то нужно будет сообщить его, чтобы он мог перенастроить свое оборудование). Ваш файл _pjsip\_wizard.conf_ может выглядеть примерно так:
|
||||
|
||||
```text
|
||||
; ITSP используя IP-аутентификацию
|
||||
[itsp-no-auth]
|
||||
type=wizard
|
||||
remote_hosts=itsp.example.com
|
||||
endpoint/context=pstn-in
|
||||
endpoint/allow = !all,ulaw,g722
|
||||
sends_registrations=no
|
||||
accepts_registrations=no
|
||||
sends_auth=no
|
||||
accepts_auth=no
|
||||
```
|
||||
|
||||
Кроме того, если ваш IP-адрес часто меняется \(или ваш оператор требует этот метод\), вы можете зарегистрировать свою систему у провайдера \(что потребует от вас отправки учетных данных для проверки подлинности, чтобы доказать, что это действительно Вы\). Ваши звонки, как правило, также потребуется аутентифицировать:
|
||||
|
||||
```text
|
||||
[itsp-with-auth]
|
||||
type=wizard
|
||||
remote_hosts=itsp.example.com
|
||||
endpoint/context=pstn-in
|
||||
endpoint/allow = !all,ulaw,g722
|
||||
sends_registration=yes
|
||||
accepts_registrations=no
|
||||
sends_auth=yes
|
||||
accepts_auth=no
|
||||
outbound_auth/username=itsp_provided_username
|
||||
outbound_auth/password= itsp_provided_password
|
||||
```
|
||||
|
||||
Обратите внимание, что имена `[itsp-no-auth]` и `[itsp-with-auth]` не имеют смысла для Asterisk. Они становятся именами каналов PJSIP, на которые вы отправляете свои звонки.
|
||||
|
||||
_**Настройка транков для терминирования**_
|
||||
|
||||
Мастер PJSIP создал определения каналов, необходимые для нашего оператора связи. Чтобы отправить вызов, нам нужно только внести незначительные изменения в раздел `[globals]` нашего файла _extensions.conf_, как показано ниже:
|
||||
|
||||
```text
|
||||
[globals]
|
||||
UserA_DeskPhone=PJSIP/0000f30A0A01
|
||||
UserA_SoftPhone=PJSIP/SOFTPHONE_A
|
||||
UserB_DeskPhone=PJSIP/0000f30B0B02
|
||||
UserB_SoftPhone=PJSIP/SOFTPHONE_B
|
||||
TOLL=PJSIP/itsp-no-auth
|
||||
LOCAL=${TOLL}
|
||||
;OR
|
||||
;TOLL=PJSIP/itsp-with-auth
|
||||
;LOCAL=${TOLL}
|
||||
```
|
||||
|
||||
_**Настройка транков для инициирования**_
|
||||
|
||||
Для входящих звонков в файле _/etc/asterisk/extensions.conf,_ вам понадобится контекст соответствующий контексту, указанному для канала ITSP. Предположим, что у нас есть два DID'а NANP: 4169671111 и 4167363636. Данный код необходимо поместить над контекстом `[sets]`:
|
||||
|
||||
```text
|
||||
TOLL=PJSIP/itsp-no-auth
|
||||
LOCAL=${TOLL}
|
||||
;OR
|
||||
;TOLL=PJSIP/itsp-with-auth
|
||||
;LOCAL=${TOLL}
|
||||
[pstn-in]
|
||||
exten => 4169671111,1,Dial(sets,100,1)
|
||||
exten => 4167363636,1,Dial(sets,101,1)
|
||||
[sets]
|
||||
exten => 100,1,Dial(${UserA_DeskPhone})
|
||||
```
|
||||
|
||||
В небольшой системе это довольно легко администрировать. В более крупной системе целесообразно поместить DID'ы в таблицу своей базы данных и заставить диалплан искать нужную цель. Мы будем работать с базами данных далее в этой книге.[^16](16)
|
||||
|
||||
В этом и заключается суть настройки связи с оператором. Она может показаться достаточно сложной, потому что есть много вариантов, но на самом деле всё довольно просто. Обычно обнаруживаются проблемы с незначительными несоответствиями конфигурации. Будьте методичны, и, пожалуйста, пожалуйста, пожалуйста, будьте параноиком по поводу безопасности!
|
||||
|
||||
## Набор экстренных служб
|
||||
|
||||
В Северной Америке люди привыкли иметь возможность набрать 911, чтобы позвонить в экстренные службы. За пределами Северной Америки хорошо известны номера экстренных служб 112 и 999. Если вы сделаете свою систему Asterisk доступной для людей, то обязаны \(во многих случаях регулируется\) гарантировать совершение звонков в экстренные службы с любого телефона, подключенного к системе \(даже с телефонов, которые ограничены от совершения звонков\).
|
||||
|
||||
Одна из важных частей информации, которую экстренная организация должна знать - это то, где произошла чрезвычайная ситуация \(например, куда направить пожарные машины\). В традиционном транке ТфОП эта информация уже известна оператору и впоследствии передается любому местному органу, который выполняет эти задачи \(в Канаде и США они называются пунктами ответов на вопросы общественной безопасности или PSAP\). С VoIP-линиями все может стать немного сложнее, в силу того, что они физически не привязаны к какому-либо географическому местоположению.
|
||||
|
||||
Вы должны убедиться, что ваша система будет правильно обрабатывать экстренные вызовы с любого телефона, подключенного к нему, и вам необходимо сообщить, что доступно вашим пользователям. Например, если вы разрешаете пользователям регистрироваться в системе с софтфонов на своих ноутбуках, что произойдет, если они находятся в гостиничном номере в другой стране, и кто-то набирает 911?\[^17\]
|
||||
|
||||
Диалплан для обработки экстренных вызовов не должен быть сложным. На самом деле гораздо лучше держать его простым. Администраторы часто испытывают соблазн реализовать все виды причудливых функций в контекстах вызова аварийных служб своих диалпланов, но ошибка в одной из этих функций может вызвать сбой экстренного вызова и стоить кому-то жизни. _Здесь не место для игр_. Раздел `[emergency-services]` вашего диалплана может выглядеть примерно так:
|
||||
|
||||
```text
|
||||
[emergency-services]
|
||||
exten => 911,1,Goto(dialpsap,1)
|
||||
exten => 9911,1,Goto(dialpsap,1) ; некоторые люди будут набирать '9'
|
||||
; потому что они привыкли делать это с АТС
|
||||
exten => 999,1,Goto(dialpsap,1)
|
||||
exten => 112,1,Goto(dialpsap,1)
|
||||
exten => dialpsap,1,Verbose(1,Call initiated to PSAP!)
|
||||
same => n,Dial(${LOCAL}/911) ; ЗАМЕНИТЕ 911 ЗДЕСЬ НА ЧТО УГОДНО
|
||||
; ПОДХОДЯЩЕЕ ДЛЯ ВАШЕГО РАЙОНА
|
||||
[internal]
|
||||
include => emergency-services ; эта запись должна быть в любом контексте,
|
||||
; который используется людьми
|
||||
```
|
||||
|
||||
В контекстах с пользователями работающими удаленно, лучше использовать следующий код:
|
||||
|
||||
```text
|
||||
[no-emergency-services]
|
||||
exten => 911,1,Goto(nopsap,1)
|
||||
exten => 9911,1,Goto(nopsap,1) ; для людей, которые набирают '9' перед внешними вызовами
|
||||
exten => 999,1,Goto(nopsap,1)
|
||||
exten => 112,1,Goto(nopsap,1)
|
||||
exten => nopsap,1,Verbose(1,Call initiated to PSAP!)
|
||||
same => n,Playback(no-emerg-service) ; вам нужно будет записать эту подсказку
|
||||
[remote-users]
|
||||
include => no-emergency-services
|
||||
```
|
||||
|
||||
В Северной Америке правила обязали многих VoIP-операторов предлагать то, что в народе известно как _E911_\[^18\]. Когда вы регистрируетесь в их сервисах, им потребуется адресная информация для каждого из DID, которые вы хотите связать с исходящими вызовами. Эта адресная информация будет затем отправлена в PSAP, соответствующий этому адресу, и ваши экстренные вызовы должны обрабатываться так же, как если бы они были набраны по традиционной схеме ТфОП.
|
||||
|
||||
Суть в том, что вы должны убедиться, что телефонная система, которую вы создаете, обрабатывает экстренные вызовы в соответствии с местными правилами и ожиданиями пользователей.
|
||||
|
||||
## Вывод
|
||||
|
||||
Обычно прогнозируется, что ТфОП в конечном итоге полностью исчезнет. Однако, прежде чем это произойдет, потребуется широко используемый и надежный распределенный механизм, который позволит организациям и отдельным лицам публиковать адресную информацию, чтобы их можно было найти. Любая голосовая технология, которая не использует PSTN, в настоящее время является либо запатентованным продуктом, закрытой экосистемой, либо игровой площадкой спамеров и преступников. Мы подозреваем, что ТфОП будет существовать еще некоторое время, и поэтому инициирование и терминация должны быть частью вашей системы Asterisk.
|
||||
|
||||
[^1] В системе клавиш каждая линия имеет соответствующую кнопку на каждом телефоне, и доступ к линиям осуществляется нажатием нужной клавиши линии.
|
||||
|
||||
[^2] Вы можете назвать их как угодно.
|
||||
|
||||
[^3] Дополнительную информацию о совпадениях шаблонов см. в [Главе 6](glava-06.md).
|
||||
|
||||
[^4] Мы должны отметить, что в прошлом мы много писали на эту тему, и эта работа была выпущена под лицензией Creative Commons и находится в свободном доступе.
|
||||
|
||||
[^5] В Японии также используется линия, называемая J-1, которую проще всего назвать 24-канальной E1.
|
||||
|
||||
[^6] Мы хотели бы еще раз отметить, что мы много писали о цифровых микросхемах и DAHDI в предыдущих выпусках, и этот объем работ был выпущен по лицензии Creative Commons и находится в свободном доступе. Также Sangoma/Digium предоставляют подробные инструкции по установке и настройке своих карт PSTN. Если вы хотите использовать эту технологию, воспользуйтесь услугами профессионального технического ресурса. Это сложный материал полный нюансов, с которым вам не понравится играть, если у вас не было какого-то предыдущего опыта. Данный материал также не обязателен для изучения или понимания Asterisk.
|
||||
|
||||
[^7] «Длительной» по отношению к другим электронным технологиям.
|
||||
|
||||
\[^8\] На мгновение просто представьте, что на ваш телефон приходит такое же количество спам звонков, как спам писем на ваш адрес электронной почты. Фактически, то что ТфОП регулируется, стоит денег и использование телефонных номеров служит для ограничения чумы спама, от которого пострадала электронная почта.
|
||||
|
||||
[^9] [Страница Wikipedia по трансляции сетевых адресов](https://ru.wikipedia.org/wiki/NAT) является всеобъемлющей и полезной. Эта страница является неплохим началом для получения дополнительной информации о различных типах NAT и о том, как он работает в целом.
|
||||
|
||||
\[^10\] SIP-это не единственный протокол, использующий RTP для передачи медиапотоков.
|
||||
|
||||
\[^11\] Вопрос о том, является ли это наилучшим решением, все еще обсуждается.
|
||||
|
||||
\[^12\] И, возможно, даже использовать их таким образом в разговоре, так как многие люди смущены этими терминами, и мало кто признает это, когда вы говорите с ними.
|
||||
|
||||
\[^13\] Поверьте нам, Джим Ван Меггелен работал с этим материалом в течение многих лет, прежде чем попасть в VoIP.
|
||||
|
||||
\[^14\] В традиционных УАТС назначение DID состояло в том, чтобы разрешить подключение непосредственно к дополнительному номеру в офисе. Многие УАТС не могут поддерживать такие понятия, как перевод номера или гибкие длины цифр, и поэтому оператор должен передавать добавочный номер, а не номер, который был набран \(который также назывался номером DNIS, от Directory Number Information Service\). Например, телефонный номер 416-555-1234 мог бы быть сопоставлен с добавочным номером 100, и таким образом оператор отправил бы цифры 100 в УАТС вместо DNIS 4165551234. Если вы когда-нибудь замените старую АТС системой Asterisk, вы можете обнаружить данные переводы при миграции диалпланов, и вам нужно будет получить список сопоставлений между номерами, которые набирает абонент, и номерами, которые отправляются на УАТС. Было также распространено видеть, что оператор передает только последние четыре цифры номера DNIS, который УАТС затем переводит во внутренний номер. С VoIP-транками это будет редко иметь место, но имейте в виду, что это возможно.
|
||||
|
||||
\[^15\] Помните, что регистрация - это просто механизм, посредством которого конечная точка SIP сообщает серверу регистратора где она расположена. Это полезно, если ваш IP-адрес изменяется, как это может быть в случае потребителей или малого бизнеса где часто используются динамические адреса.
|
||||
|
||||
\[^16\] Для этой обработки в таблице просто потребуется поле для DID и еще три для целевого контекста, расширения и приоритета.
|
||||
|
||||
\[^17\] Не думайте, что это не сможет произойти. Звонки в службу спасения происходят в чрезвычайной ситуации, и небезопасно предполагать, что человек будет в рациональном, адекватном состоянии. Запись, которая сообщает пользователям программного телефона, какой адрес система будет отправлять в PSAP, может указывать на то, что пожарные машины будут отправляться не туда, где они нужны. \(«Этот телефон зарегистрирован в нашей системе Торонто. Экстренные службы будут отправлены в наш офис по адресу 301 Front St W. Нажмите 1, чтобы продолжить этот вызов».\).
|
||||
|
||||
\[^18\] На самом деле это не оператор предлагает эту услугу; скорее это возможность PSAP. E911 также используется и на транках ТфОП, но поскольку это происходит без какого-либо участия с вашей стороны \(операторы ТфОП предоставляют эту информацию за вас\), вы как правило даже не знаете, что на ваших местных линиях есть E911.
|
||||
|
||||
[Глава 6. Основы диалплана](glava-06.md) | [Содержание](SUMMARY.md) | [Глава 8. Голосовая почта](glava-08.md)
|
|
@ -0,0 +1,422 @@
|
|||
# Глава 8. Голосовая почта
|
||||
|
||||
> _Просто оставьте сообщение, может быть, я перезвоню._
|
||||
>
|
||||
> -- Джо Уолш
|
||||
|
||||
До того как почта и мгновенные сообщения стали широко распространены, голосовая почта была очень популярна. Даже теперь, когда большинство людей предпочитает обмениваться текстовыми сообщениями, голосовая почта является важным компонентом любой телефонной станции.
|
||||
|
||||
В Asterisk есть достаточно гибкая система голосовой почты называемая Comedian Mail<sup><a href="#sn1">1</a></sup>. В диалплане она реализуется посредством модуля `app_voicemail.so`.
|
||||
|
||||
#### Предупреждение о модуле голосовой почты в Asterisk
|
||||
|
||||
Модуль `app_voicemail` один из старейших в Asterisk, как следствие он имеет много ограничений, особенно если сравнивать его с другими, постоянно совершенствуемыми модулями. Код модуля настолько устарел, что ни у кого не возникает желания с ним разбираться, и поэтому очень маловероятно появление в нем новых функций. Вы должны понимать что `app_voicemail` не просто предоставляет элемент диалплана; для работы голосовой почты должно произойти много событий, например хранение и управление файлами, взаимодействие с почтовой системой операционной системы, распознавание часовых поясов, работы с форматами файлов, вопросы безопасности и еще куча вещей. И хотя `app_voicemail` все это делает, в итоге получается довольно неуклюжая подсистема (стоит заметить, что в традиционных АТС для голосовой почты выделяется отдельная машина).
|
||||
|
||||
Было предпринято множество попыток реинжинировать голосовую почту, но все они оказались неудачными. Причина проста: объем работ (а следовательно и стоимость), необходимых для перепроектирования модуля (таким образом, чтобы удовлетворить потребности сообщества), в сочетании с отсутствием интереса к технологии голосовой почты в целом, быстро убивали любую инициативу.
|
||||
|
||||
Тем не менее важно отметить, что голосовая почта в Asterisk работает, и работает хорошо. Возможно, она даже удовлетворит ваши потребности. В ином случае сообщество будет более чем благодарно, если вы попытаетесь перепроектировать её.
|
||||
|
||||
Вот некоторые функции, которые включает в себя модуль голосовой почты:
|
||||
|
||||
* Неограниченное количество защищенных паролем ящиков голосовой почты, каждый из которых содержит подкаталоги для сортировки голосовой почты
|
||||
* Различные приветствия для различных статусов, таких как "недоступен" или "занят"
|
||||
* Наличие предустановленных приветствий и возможность создания собственных
|
||||
* Возможность ассоциирования телефонов с несколькими почтовыми ящиками и почтового ящика с несколькими телефонами
|
||||
* Уведомление о голосовом сообщении на электронную почту, опционально с прикрепленным аудио файлом
|
||||
* Широковещательная голосовая почта и перенаправление голосовой почты
|
||||
* Индикатор ожидания сообщения (мигающий светодиод или специальный сигнал) поддерживаемый на многих типах телефонов
|
||||
* Справочник сотрудников на основе голосовой почты
|
||||
|
||||
Теперь давайте познакомимся с основными частями конфигурационного файла голосовой почты, включая настройки в общем разделе, различными возможными региональными настройками, интеграцией голосовой почты в ваш диалплан и проведем краткий обзор того, как Asterisk хранит голосовую почту в файловой системе Linux.
|
||||
|
||||
## Файл конфигурации voicemail.conf
|
||||
|
||||
Ранее в базе данных MySQL мы установили таблицу, необходимую для голосовой почты, и поэтому сейчас мы можем создавать в ней почтовые ящики без какой-либо другой конфигурации. Однако, также можно создавать почтовые ящики в конфигурационном файле _/etc/asterisk/voicemail.conf_ (в том числе в этом файле можно изменять различные настройки по умолчанию). Мы продолжим использовать базу данных для создания пользователей и управления ими, поскольку она гораздо лучше подходит для этой задачи, но также исследуем конфигурационный файл, чтобы вы могли почувствовать гибкость настройки голосовой почты Asterisk.
|
||||
|
||||
Файл _voicemail.conf_ содержит несколько секций, в которых могут быть переопределены различные предустановленные параметры. В большинстве случаев вам не понадобится их менять; однако вы можете посмотреть в файл примера _~/src/asterisk-1.15.<your version>/configs/samples/voicemail.conf.sample_. Он содержит полезную информацию о различных настройках.
|
||||
|
||||
Далее мы рассмотрим простейший _voicemail.conf_ файл. Если у вас возникнет желание доработать базовую конфигурацию, просто добавьте или измените соответствующие опции.
|
||||
|
||||
### Исходный файл voicemail.conf
|
||||
|
||||
Мы рекомендуем использовать следующий пример кофигурации как базовый. Вы можете ознакомиться с файлом _~/asterisk-complete/asterisk/11/configs/voicemail.conf.sample_ для детализации различных настроек.
|
||||
|
||||
Разместите следующий код в файле _/etc/asterisk/voicemail.conf_:
|
||||
|
||||
```
|
||||
; Voicemail Configuration
|
||||
[general]
|
||||
format=wav49|wav
|
||||
serveremail=voicemail@shifteight.org
|
||||
attach=yes
|
||||
skipms=3000
|
||||
maxsilence=10
|
||||
silencethreshold=128
|
||||
maxlogins=3
|
||||
emaildateformat=%A, %B %d, %Y at %r
|
||||
pagerdateformat=%A, %B %d, %Y at %r
|
||||
sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
|
||||
[zonemessages]
|
||||
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
|
||||
central=America/Chicago|'vm-received' Q 'digits/at' IMp
|
||||
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
|
||||
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
|
||||
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Настройка Linux сервера для отправки почтовых сообщений администратору выходит за рамки данной книги. Вы должны будете протестировать вашу службу голосовой почты чтобы убедиться что она корректно обрабатывается почтовым агентом <sup><a href="#sn2">2</a></sup> и что нижеследующие спам-фильтры не отклоняют эти сообщения (одна из причин почему это может происходить — использование сервером Asterisk в теле письма имени хоста которое не может быть разрешено)
|
||||
|
||||
---
|
||||
|
||||
Вы можете создать массивный и сложный файл `voicemail.conf` (и даже хранить в нем почтовые ящики пользователей), но для упрощения задачи мы сосредоточимся на нескольких примерах.
|
||||
|
||||
### Секция [general]
|
||||
|
||||
В первой секции файла _voicemail.conf_, `[general]`, определяются глобальные настройки. Многие из этих настроек могут быть переопределены в настройках каждого конкретного ящика. В Таблице 8-1 мы перечислили некоторые опции, которые, как мы считаем, наиболее важно рассмотреть.
|
||||
|
||||
Таблица 8-1. _Настройки секции \[General\] файла voicemail.conf_
|
||||
|
||||
| Опция | Значение/пример | Примечание |
|
||||
| :------------ | :--- | :--- |
|
||||
| `format` | wav49\|gsm\|wav | Для каждого перечисленного формата, Asterisk создает отдельную запись в этом формате, каждый раз когда остается сообщение. Преимущество этого механизма в экономии ресурсов на транскодировании, которое не надо выполнять, если для записи используется тот же самый кодек что и для канала. Мы любим WAV за высокое качество, и WAV49 потому что он хорошо сжимается и легок для передачи по почте. Мы не любим GSM за шумы в записи, но он пользуется некторой популярностью <sup><a href="#sn3">3</a></sup>. |
|
||||
| `serveremail` | user@domain | Адрес в заголовке письма FROM, отображаемый в отправленном с Asterisk письме <sup><a href="#sn4">4</a></sup>. |
|
||||
| `attach` | yes,no | Если для ящика голосовой почты указан адрес электронной почты, эта опция определяет, будет ли прикреплено записанное сообщение к письму \(если нет, то будет отправлено простое уведомление, и пользователю нужно будет позвонить на голосовую почту чтобы получить свое сообщение\). |
|
||||
| `maxmsg` | `9999` | По умолчанию, Asterisk разрешает хранить максимум 100 сообщений на пользователя. Для пользователей удаляющих прослушанные сообщения это не является проблемой. Для пользователей которые предпочитают сохранять свои сообщения, этот лимит будет достигнут очень быстро. С размерами жестких дисков в наши дни, вы можете легко хранить тысячи сообщений для каждого пользователя. Поэтому, по нашему мнению, можно выставить эту опцию в максимальное значение и позволить пользователям самим управлять этими данными. Имейте в виду, что после нескольких лет хранения, старые сообщения голосовой почты в больших системах могут занимать много места на жестком диске. |
|
||||
| `maxsecs` | 600 | Эта установка может быть полезной, когда большая система голосовой почты имеет хранилище размером в 40МБ <sup><a href="#sn5">5</a></sup> : В данном случае необходимо ограничение длины сообщения, иначе система легко использует весь объем хранилища. Этот параметр может раздражать вызывающих абонентов (хотя он заставляет их переходить к сути сообщения, поэтому некоторым людям это нравится). В настоящее время с терабайтными дисками, нет никаких технических причин для ограничения длины сообщения. Но есть два соображения: 1) Если канал завис, то хорошо бы иметь какое-либо ограничение, чтобы система не записывала бесконечное пустое сообщение 2)Если абонент использует свой почтовый ящик как голосовую записную книжку, он не обрадуется если вы его отключите через три минуты. Вероятно, будет правильным установить значение где-то между 600 секундами (10 минут) и 3600 секундами (1 час). |
|
||||
| `emailsubject` |\[PBX\]: New message ${VM\_MSGNUM} in mailbox ${VM\_MAILBOX}| Этой настройкой вы можете задать вид темы письма которое отсылает Asterisk. Подробное описание смотрите в файле примера _voicemail.conf.sample_. |
|
||||
| `emailbody` | Dear ${VM\_NAME}:\n\n\t you have a ${VM\_DUR} long message (number ${VM\_MSGNUM})\n in mailbox ${VM\_MAILBOX} \n\n\t\t\t\t --Asterisk\n| Этой настройкой вы определяете как будет выглядеть тело письма. Подробное описание смотрите в файле примера _voicemail.conf.sample_. |
|
||||
| `emaildateformat` | %A, %d %B %Y at %H:%M:%S | Эта опция позволяет определить формат даты в письме. Используется тот же синтаксис, что и в функции `STRFTIME` языка C. |
|
||||
| `pollmailboxes` | `no`, `yes` | Если содержимое почтового ящика меняется чем-нибудь кроме `app_voicemail` (Например внешним приложением или другой системой Asterisk), эта настройка выставленная в "yes" указывает периодически опрашивать почтовые ящики на предмет изменений и выставляет правильную индикацию ожидающих сообщений (MWI). |
|
||||
| `pollfreq` | `30` | Используется в сочетании с параметром `pollmailboxes` и в секундах задает частоту опроса почтового ящика. |
|
||||
|
||||
---
|
||||
|
||||
#### Проверка паролей голосовой почты внешними средствами
|
||||
|
||||
По умолчанию, Asterisk не проверяет пароли пользователей на устойчивость к взлому. Любой кто разрабатывает системы голосовой почты скажет вам, что подавляющее число пользователей устанавливает такие пароли к своим ящикам, которые легко запомнить, например `1234` или `1111`. Хотя обычно Фрод-боты не предназначены для баловства, наличие слабых паролей представляет собой дыру в системе безопасности голосовой почты.
|
||||
|
||||
Поскольку модуль `app_voicemail.so` не имеет встроенной возможности проверки паролей, настройки `externpass`, e`xternpassnotify`, и `externpasscheck` позволяют проверять их с помощью внешней программы. Asterisk вызовет приложение находящееся по указанному вами пути и передаст следующие аргументы:
|
||||
|
||||
`mailbox context oldpass newpass`
|
||||
|
||||
Затем скрипт будет оценивать аргументы основываясь на правилах, которые вы в нем определили, и, соответственно, он должен вернуть в Asterisk значение `VALID` в случае успеха или `INVALID` в случае неуспеха (На самом деле возвращаемое значение для пароля не прошедшего проверку может быть любое, кроме слов `VALID` и `FAILURE`). Это значение выводится в `stdout` -- на стандартный вывод. Если сценарий вернул значение `INVALID`, Asterisk будет воспроизводить запись ошибочного пароля и пользователю будет нужно попробовать набрать что-то иное.
|
||||
|
||||
Возможно вам стоит реализовать следующие правила:
|
||||
|
||||
* Минимальная длина пароля должна составлять 6 символов
|
||||
* Пароль не должен представлять собой строку повторяющихся цифр \(т.к. `111111`\)
|
||||
* Пароль не должен представлять собой последовательность цифр \(т.к. `123456` или `456789`\)
|
||||
|
||||
Asterisk поставляется с простейшим сценарием, значительно усовершенствующим безопасность вашей системы голосовой почты. Он расположен в каталоге исходного кода: _/contrib/scripts/voicemailpwcheck.py_.
|
||||
|
||||
Мы настоятельно рекомендуем вам скопировать его в ваш каталог _/usr/local/bin_ \(или туда где вы держите подобные вещи\), и затем раскомментировать опцию `externpasscheck=` в вашем файле _voicemail.conf_.
|
||||
|
||||
---
|
||||
|
||||
Часть секции `[general]`, это раздел дополнительных опций \(Они упоминаются в конфигурационном файле как расширенные опции, хотя ничего особенного в них нет\). Эти опции \(перечисленные в Таблице 8-2\) определены также как и другие в секции `[general]`, но выделяет их то, что они могут быть переопределены для каждого отдельного почтового ящика, что перезапишет свойства установленные в этой области секции `[general]`. Другими словами нижеследующие опции могут быть установлены в базе данных когда вы создаете новый почтовый ящик.
|
||||
|
||||
_Таблица 8-2. Утвержденный список дополнительных опций для voicemail.conf_
|
||||
|
||||
| Опция | Значение/пример | Примечание |
|
||||
| :--- | :--- | :--- |
|
||||
| tz | eastern, european, etc. | Указывает имя временной зоны, также определенной в разделе \[zonemessages\] \(мы будем говорить об этом в следующей части главы\). |
|
||||
| locale | de\_DE.utf8, es\_US.utf8, etc. | Используется для определения того, как Asterisk задает формат строки с данными даты и времени в различных локалях. Для определения локали корректной для вашей Linux системы, выполните в консоли операционной системы команду locale -a. |
|
||||
| attach | yes, no | Если для вашего голосового почтового ящика определен адрес электронной почты, эта опция определяет, будут ли сообщения прикреплены к почтовым уведомлениям \(В ином случае будет отправлено простое уведомление\). |
|
||||
| attachfmt | wav49, wav, etc. | Если опция attach включена и сообщения хранятся в различных форматах, данная опция определяет формат в котором будут отправлены записанные сообщения в почтовых уведомлениях. Обычно wav49 является хорошим выбором, так как использует лучший алгоритм сжатия, а следовательно использует меньшую полосу пропускания, и в тоже время не так жутко звучит как формат gsm. |
|
||||
| exitcontext | context | Эта опция позволяет звонящим абонентам выйти из системы голосовой почты, когда они находятся в процессе записи сообщений \(для примера, нажатие на 0 переключает на оператора\). По умолчанию, контекст с которого пришел вызов будет использоваться как выходной. По желанию этот параметр может быть определен в иной контекст. |
|
||||
| review | yes, no | Этот параметр почти всегда должен быть установлен в yes \(Хотя его значение по умолчанию no\). Люди расстраиваются, если ваша система голосовой почты не позволяет им прослушать свое сообщение перед отправкой. |
|
||||
| operator | yes, no | В соответствии с лучшими практиками вы должны разрешить своим абонентам в любой момент прекратить запись, если они передумали оставлять голосовое сообщение. Обратите внимание, что для обработки этих вызовов контексте exitcontext, требуется расширение o (не «ноль», а буква «о»). |
|
||||
| delete | no, yes | После того как почтовое уведомление (которое может включать само голосовое сообщение) будет отправлено, оно будет удалено. Эта опция рискованна, так как факт отправки сообщения не гарантирует его получения \(Спам фильтры любят удалять сообщения голосовой почты Asterisk\). На новых системах оставьте эту опцию в значении \"no\", до тех пор пока не убедитесь, что сообщения не теряются из-за спам-фильтров. |
|
||||
| nextaftercmd | yes, no | Эта удобная маленькая опция сэкономит вам немного времени, так как переключает вас на следующее сообщение сразу после завершения работы с предыдущим. |
|
||||
| passwordlocation | spooldir | Если вы захотите, то можете хранить пароли в собственных spool каталогах каждого почтового ящика<sup><a href="#sn6">6</a></sup>. Одно из преимуществ использования опции `spooldir` в том, что она позволяет вам определять операторы `#include` в файле _voicemail.conf_ (Имеется в виду что вы можете хранить ссылки на почтовые ящики в нескольких файлах, как, например, с кодом диалплана). По другому так сделать невозможно, потому что в обычном случае `app_voicemail` записывает изменение пароля в файловую систему и не может обновлять пароль почтового ящика хранящийся за пределами _voicemail.conf_ или spool. Если вы не используете опцию `passwordlocation`, вы не сможете определять почтовые ящики снаружи _voicemail.conf_ так как пароль не будет обновлен. Хранение паролей в файле в специальном spool каталоге решает эту проблему. |
|
||||
|
||||
### Секция [zonemessages]
|
||||
|
||||
Следующей в файле _voicemail.conf_ идет секция `[zonemessages]`. Цель этой секции, разрешить обработку сообщений в соответствии с часовым поясом, таким образом вы можете воспроизводить сообщения пользователей с правильными отметками времени. Вы можете установить имя зоны в нужное вам значение. Затем вы можете определить на какой часовой пояс будет ссылаться это имя зоны, а так же некоторые параметры которые определяют как воспроизводятся временные метки. Примеры синтаксиса вы можете посмотреть в файле _~/src/asterisk-16.*/configs/samples/voicemail.conf.sample_. Asterisk включает примеры показанные в Таблице 8-3. Можно настроить любую временную зону, известную Linux-системе. Просто используйте для зон имена как в Linux и затем определите как вы хотите чтобы они обрабатывались.
|
||||
|
||||
_Таблица 8-3. Настройки секции \[zonemessages\] для voicemail.conf_
|
||||
|
||||
| Имя пояса | Значение/пример | Примечание |
|
||||
| :--- | :--- | :--- |
|
||||
| eastern | America/New\_York\|'vm-received' Q 'digits/at' IMp | Это значение подойдет для восточных часовых поясов \(EST/EDT\). |
|
||||
| central | America/Chicago\|'vm-received' Q 'digits/at' IMp | Это значение подойдет для центрального часового пояса \(CST/CDT\). |
|
||||
| central24 | America/Chicago\|'vm-received' q 'digits/at' H N 'hours' | Это значение так же подойдет для CST/CDT, но будет отображать время в 24 часовом формате. |
|
||||
| military | Zulu\|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z\_p' | Это значение подойдет для UTC - Всемирное координированное время \(Zulu time, formerly GMT\). |
|
||||
| european | Europe/Copenhagen\|'vm-received' a d b 'digits/at' HM | Это значение подойдет для Центральной Европы \(CEST\). |
|
||||
|
||||
### Почтовые ящики
|
||||
|
||||
Вы можете настраивать почтовые ящики в конфигурационном файле _voicemail.conf_, но это не рекомендуемый путь. Для определения ваших ящиков мы будем использовать базу данных.
|
||||
Первая вещь которую нам надо сделать -- это сказать Asterisk, что голосовая почта пользователей доступна в базе данных. Это можно сделать отредактировав файл /_etc/asterisk/extconfig.conf_:
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/extconfig.conf
|
||||
|
||||
[settings] ; older mechanism for connecting all other modules to the database
|
||||
ps_endpoints => odbc,asterisk
|
||||
ps_auths => odbc,asterisk
|
||||
ps_aors => odbc,asterisk
|
||||
ps_domain_aliases => odbc,asterisk
|
||||
ps_endpoint_id_ips => odbc,asterisk
|
||||
ps_contacts => odbc,asterisk
|
||||
voicemail => odbc,asterisk,voicemail
|
||||
```
|
||||
Вы должны перезапустить Asterisk для применения этих изменений.
|
||||
```text
|
||||
$ sudo service asterisk restart
|
||||
```
|
||||
В системе голосовой почты, почтовый ящик должен быть определен в контексте. Это не имеет отношения к какому-нибудь контексту диалплана; Этот контекст является специфичной меткой голосовой почты, которая определяет, какие почтовые ящики будут сгруппированы вместе, а также используется для именования папки в спуле, который содержит различные файлы связанные с этим почтовым ящиком (Приветствия, сообщения, конверты, и т.д.). Обычно вам не стоит волноваться об этом, так как все почтовые ящики окажутся в контексте по умолчанию. На самом деле вам нужно определить только контексты, настройки которых отличаются от остальных -- если вы используете сложную, мультитенантную систему, в которой возможно перекрытие расширений, или если вы не хотите, чтобы определенные группы пользователей были доступны другим группам пользователей.
|
||||
|
||||
Таблица `asterisk`.`voicemail` поддерживает много опций; Однако, для создания почтового ящика необходимо заполнить только три поля, плюс еще два рекомендовано. Требуются поля `context`, `mailbox`, и `password`, а `fullname` и `email` являются строго рекомендованными. Вот простой MySQL запрос позволяющий вам создать несколько почтовых ящиков:
|
||||
|
||||
```
|
||||
INSERT INTO `asterisk`.`voicemail` (context,mailbox,password,fullname,email)
|
||||
VALUES
|
||||
('default','100','486541','Russell Bryant', 'russell@shifteight.org'),
|
||||
('default','101','957642','Leif Madsen', 'leif@shifteight.org'),
|
||||
('default','102','656844','Jared Smith', 'jared@shifteight.org'),
|
||||
('default','103','375416','Jim VanMeggelen', 'jim@shifteight.org')
|
||||
;
|
||||
```
|
||||
|
||||
Ниже части определений почтового ящика:
|
||||
|
||||
_mailbox_
|
||||
Это номер почтового ящика. Обычно он соответствует добавочному номеру абонента.
|
||||
|
||||
_password_
|
||||
Это числовой пароль с помощью которого владелец почтового ящика сможет получить доступ к своей голосовой почте. Если пользователь меняет пароль, система обновит это поле в базе данных.
|
||||
|
||||
Если перед паролем стоит знак дефиса \(-\), пользователь не сможет изменить свой пароль почтового ящика.
|
||||
|
||||
_fullname \(FirstName LastName\)_
|
||||
Это имя владельца почтового ящика. Каталог компании использует текст в этом поле для проверки имен пользователей. вы можете использовать только один пробел, чтобы отделить имя от фамилии, поэтому если ваша фамилия Ван Меггелен, вы должны записать ее как ВанМеггелен. Другие знаки пунктуации также могут вызвать проблемы. \(Мы смотрим на тебя, О'Рейли. \)
|
||||
|
||||
_email address_
|
||||
Это почтовый адрес владельца ящика. Asterisk может выслать запись голосовой почты на определенный адрес электронной почты.
|
||||
|
||||
**Внимание**
|
||||
|
||||
Asterisk не может обрабатывать концепцию фамилии отличающуюся от простого слова. Это значит, что перед добавлением в _voicemail.conf_, во всех таких фамилиях как О'Рейли, Брайан-Мэдсен-Смитт, и, да, даже Ван Меггелен, должны быть удалены все пунктуационные символы и пробелы.
|
||||
|
||||
Есть довольно много других опций, которые вы можете определить для каждого пользователя. Маловероятно что вы будете использовать их все, но в Таблице 8-4 содержится список тех из них которые могут быть вам полезны:
|
||||
|
||||
_Таблица 8-4. Параметры почтового ящика_
|
||||
|
||||
| Опция | Описание |
|
||||
| :--- | :--- |
|
||||
| delete | Asterisk удалит с сервера отправленное по электронной почте голосовое сообщение. Эта опция полезна для пользователей, которые хотят получать голосовую почту только по почте. После того, как Asterisk отправит голосовую почту по электронной почте, она будет удалена с сервера. Эта опция полезна для пользователей, которые хотят получать голосовую почту только по электронной почте. Допустимые значения `yes` или `no.` Параметр устанавливается на каждый отдельный ящик. |
|
||||
| envelope | Включает или выключает проигрывание даты и времени звонка перед воспроизведением голосового сообщения. Допустимые значения `yes` или `no`. По умолчанию стоит значение `yes`.|
|
||||
| exitcontext | Контекст диалплана в который будет произведен выход из приложения голосовой почты, когда нажата клавиша \* или 0. Хорошо работает в сочетании с опцией operator. Для выхода по \*, в контексте необходимо иметь расширение "a", или расширение "о" для выхода по 0. Вам нужно будет поработать над своим диалпланом чтобы включить эти функции, поэтому лучше оставить эту опцию пока пустой, до того момента когда будете уверены что сделали все что хотели. |
|
||||
| forcegreeting | Принудительно записывает приветствие для новых почтовых ящиков. Новый почтовый ящик определяется его номером и паролем. Допустимые значения `yes` или `no`. По умолчанию стоит значение `no.` |
|
||||
| forcename | Принудительно записывает имя человека для новых почтовых ящиков. Новый почтовый ящик определяется его номером и паролем. Допустимые значения `yes` или `no`. По умолчанию стоит значение `no.` |
|
||||
| hidefromdir | Если установлено значение `yes`, этот почтовый ящик будет скрыт от приложения `Directory()`. По умолчанию `no`. |
|
||||
| locale | Позволяет установить языковой стандарт для почтового ящика, чтобы контролировать форматирование строк даты/времени. Смотри _voicemail.sample.conf_ для получения дополнительной информации. |
|
||||
| messagewrap | Позволяет зацикливать очередь сообщений (то есть позволяет переходить к первому сообщению после последнего или к последнему, если мы хотим прослушать предыдущее первому сообщению). Допустимые значения `yes` или `no`. По умолчанию стоит значение `no`. |
|
||||
| minpassword | Устанавливает минимальную длину пароля. Аргумент должен быть задан числом. |
|
||||
| nextaftercmd | Переходит к следующему сообщению после нажатия пользователем клавиши 7 \(delete\) или 9 клавиши \(save\). Допустимые значения `yes` или `no`. По умолчанию стоит значение \"yes\". |
|
||||
| operator | Позволяет отправителю голосовой почты набрать 0 до, во время, или после записи голосовой почты. Завершит работу с расширением "o" в том же контексте или в контексте, заданном параметром exitcontext. Допустимые значения `yes `или `no`. По умолчанию стоит значение `no`. С этим связаны риски безопасности, поэтому лучше не использовать его до тех пор, пока вы не убедитесь, что `exitcontext` не разрешает вызовам выходить из системы \(т. е. В итоге вы совершаете дорогой зарубежный вызов\). |
|
||||
| passwordlocation | По умолчанию, пароль для голосовой почты хранится в конфигурационном файле _voicemail.conf_, и изменяется Asterisk всякий раз, когда изменяется пароль. Это может быть нежелательно, особено если вы хотите распарсить пароль из внешнего местоположения \(или сценария\). Альтернативной опцией для установки пароля является spooldir, который помещает пароль для пользователя голосовой почты в файл с именем _secret.conf_ в каталоге спулинга голосовой почты пользователя. Допустимые параметры: `voicemail.conf` и `spooldir`. Опция по умолчанию - `voicemail.conf`. |
|
||||
| review | Если этот параметр включен, пользователь, записывающий сообщение голосовой почты, сможет перезаписать свое сообщение. После нажатия клавиши \# для сохранения голосовой почты ему будет предложено перезаписать или сохранить сообщение. Допустимые значения `yes `или `no`. По умолчанию стоит значение `no`. |
|
||||
| saycid | Если этот параметр включен и в _/var/spool/asterisk/voicemail/recordings/callerids_ имеется приглашение, оно будет воспроизводиться перед сообщением, вместо произнесения цифр идентификационного номера вызывающего абонента. Допустимые значения `yes `или `no`. По умолчанию стоит значение `no`. |
|
||||
| sayduration | Озвучивает длительность записи перед сообщением. Допустимые значения `yes` или `no`. По умолчанию стоит значение `yes`. |
|
||||
| saydurationm | Позволяет установить минимальную продолжительность воспроизведения \(в минутах\). Например, если вы установите значение 2, вы не будете проинформированы о длине сообщения длиной менее 2 минут. Допустимые значения - целые числа. По умолчанию 2. |
|
||||
| searchcontexts | Для таких приложений, как `Voicemail()`, `VoicemailMain()` и `Directory()`, контекст голосовой почты является необязательным аргументом. Если контекст голосовой почты не указан, то по умолчанию выполняется поиск в контексте по умолчанию. Если эта опция включена, то поиск будет происходить во всех контекстах. Предупреждаем, что, если параметр включен, номер почтового ящика должен быть уникальным во всех контекстах, иначе произойдет коллизия, и система не поймет, какой почтовый ящик использовать. Допустимые значения `yes` или `no`. По умолчанию стоит значение `no`. |
|
||||
| sendvoicemail | Позволяет пользователю создавать и отправлять сообщения голосовой почты из приложения `VoicemailMain()`. Доступно как опция 5 в расширенном меню. Если эта опция отключена, то опция 5 в расширенном меню не будет предложена. Допустимые значения `yes` или `no`. По умолчанию стоит значение \"no\". |
|
||||
| tempgreetwarn | Включает уведомление для пользователя, когда его временное приветствие включено. Допустимые значения `yes` или `no`. По умолчанию стоит значение `no`. |
|
||||
| tz | Устанавливает часовой пояс для пользователя голосовой почты \(или глобально\). Смотрите /_usr/share/timezone_ для различных доступных часовых поясов. Не применимо, если `envelope=no`. |
|
||||
| volgain | Опция `volgain` позволяет вам установить уровень громкости для сообщений голосовой почты. Значение указывается в децибелах \(дБ\). Для этого должно быть установлено приложение _sox_. |
|
||||
|
||||
## Интеграция диалплана голосовой почты
|
||||
|
||||
Существует два основных приложения диалплана, предоставляемых модулем `app_voicemail.so` в Asterisk. Первый, называемый просто `VoiceMail()`, делает именно то, что вы ожидаете, то есть записывает сообщение в почтовый ящик. Второй -- `VoiceMailMain()`, позволяет пользователю входить в почтовый ящик для получения сообщений.
|
||||
|
||||
### Приложение диалплана VoiceMail()
|
||||
|
||||
Если вы хотите передать вызов на голосовую почту, вам нужно предоставить два аргумента: почтовый ящик (или почтовые ящики), в котором должно быть оставлено сообщение, и любые относящиеся к этому параметры, например, какое приветствие следует воспроизвести или отметка срочности сообщения. Структура команды `VoiceMail()` такова:
|
||||
|
||||
<code><i>VoiceMail\(mailbox\[@context\]\[&mailbox\[@context\]\[&...\]\]\[,options\]\)</i></code>
|
||||
|
||||
Параметры, которые вы можете передать `VoiceMail()`, обеспечивающие более высокий уровень контроля, подробно описаны в Таблице 8-5.
|
||||
|
||||
Таблица 8-5. _Необязательные аргументы VoiceMail()_
|
||||
|
||||
| Аргумент | Цель |
|
||||
| :--- | :--- |
|
||||
| b | Предписывает Asterisk воспроизводить приветствие \"занято\" для почтового ящика (если приветствие \"занято\" отсутствует, будет воспроизводиться приветствие \"недоступно\"). |
|
||||
| d\(\[c\]\) | Принимает цифры, подлежащие обработке в контексте \"c\". Если контекст не указан, по умолчанию будет использоваться текущий контекст. |
|
||||
| g\(\#\) | Применяет заданную величину усиления (в децибелах) к записи. Работает только на каналах DAHDI. |
|
||||
| s | Подавляет воспроизведение инструкций вызывающим абонентам после воспроизведения приветствия. |
|
||||
| u | Поручает Asterisk воспроизводить уведомление о недоступном почтовом ящике (это поведение по умолчанию). |
|
||||
| U | Указывает, что сообщение должно быть отмечено как срочное. Этот эффект наиболее заметен, когда голосовая почта хранится на IMAP сервере, в этом случае электронное письмо будет также отмечено как срочное. Когда владелец почтового ящика звонит в систему голосовой почты Asterisk, он также будет проинформирован, что запись является срочной. |
|
||||
| P | Указывает, что сообщение должно быть помечено как приоритетное. |
|
||||
|
||||
Приложение `VoiceMail()` перенаправляет абонентов в указанный почтовый ящик, чтобы они могли оставить сообщение. Почтовый ящик должен быть указан как mailbox@context, где _context_ -- это имя контекста голосовой почты \(не контекст диалплана\).
|
||||
Буквы опций b или u могут быть добавлены для запроса типа приветствия. Если используется буква b, вызывающий абонент услышит сообщение о занятости владельца почтового ящика \(если оно существует\). Если используется буква u, вызывающий абонент услышит сообщение о недоступности владельца почтового ящика \(также при условии, что оно существует\). Если приветствия не существует, система сгенерирует общее сообщение: <codi><i>Aбонент с почтовым ящиком `<mailbox>` не доступен. Пожалуйста, оставьте сообщение после сигнала.</i></code>
|
||||
|
||||
В диалплане, который мы создали в [Главе 6](glava-06.md), было создано несколько расширений. Рассмотрим пример добавочного номера 102, который позволяет вызывать абонентов `UserB_DeskPhone`:
|
||||
|
||||
```
|
||||
exten => 102,1,Dial(${UserB_DeskPhone},10)
|
||||
same => n,Playback(vm-nobodyavail)
|
||||
same => n,Hangup()
|
||||
```
|
||||
В примере выше, вместо почтового ящика, мы просто проигрываем приветствие, и больше ничего. Давайте поменяем диалплан, чтобы звонок приходил на действительный почтовый ящик.
|
||||
Для начала мы просто дадим голосовой почте воспроизвести общее приветствие, которое услышит звонящий. Помните, что вторым аргументом приложения `Dial()` является время ожидания. Если в течении времени ожидания на вызов не ответили, он отправляется на следующий приоритет. У нас есть 10-секундный интервал времени ожидания и новый приоритет для отправки звонящего на голосовую почту после ожидания набора:
|
||||
|
||||
```
|
||||
exten => 102,1,Dial(${UserB_DeskPhone},10)
|
||||
same => n,Voicemail(${EXTEN}@default,u))
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Если захотим, мы можем сделать больше, и изменить код так, что если пользователь занят \(разговаривает по другой линии\), вызывающий абонент услышит сообщение "занято". Для этого мы будем использовать переменную `${DIALSTATUS}`, которая содержит одно из нескольких значений состояния \(наберите core show application Dial в консоли Asterisk для получения списка всех возможных значений\):
|
||||
|
||||
```text
|
||||
exten => 102,1,Dial(${UserA_SoftPhone})
|
||||
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
|
||||
same => n(unavail),VoiceMail(101@default,u)
|
||||
same => n,Hangup()
|
||||
same => n(busy),VoiceMail(101@default,b)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Теперь звонящие получат ответ голосовой почты (с соответствующим приветствием), если пользователь занят или недоступен. Альтернативный синтаксис для определения нужного сообщения ("недоступен" или "занят") заключается в использовании функции `IF()` <sup><a href="#sn7">7</a></sup>
|
||||
|
||||
```
|
||||
exten => 103,1,Dial(${UserB_SoftPhone})
|
||||
same => n,Voicemail(${EXTEN}@default,${IF($["${DIALSTATUS}" = "BUSY"]?b:u)})
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Небольшая проблема заключается в том, что наши пользователи не могут ни получать свои сообщения, ни настраивать свои приветствия, ни какие-либо другие параметры голосовой почты. Мы исправим это в следующей секции.
|
||||
|
||||
|
||||
### Приложение диалплана VoiceMailMain()
|
||||
|
||||
Пользователи могут получать сообщения голосовой почты, изменять параметры и записывать приветствия с помощью приложения `VoiceMailMain()`. `VoiceMailMain()` принимает два аргумента: номер почтового ящика (и, если необходимо, контекст), а также несколько параметров. Оба аргумента являются необязательными.
|
||||
|
||||
Структура приложения `VoiceMailMain()` выглядит следующим образом:
|
||||
```
|
||||
VoiceMailMain([mailbox][@context][,options])
|
||||
```
|
||||
|
||||
При использовании приложения `VoiceMailMain()` без аргументов, будет воспроизведено сообщение предлагающее вызывающему абоненту предоставить номер своего почтового ящика. Варианты, которые могут быть предоставлены, перечислены в Таблице 8-6
|
||||
|
||||
_Таблица 8-6. Необязательные аргументы VoiceMailMain()._
|
||||
|
||||
| Аргумент | Цель |
|
||||
| :--- | :--- |
|
||||
| p | Позволяет обрабатывать параметр почтового ящика как префикс к номеру почтового ящика |
|
||||
| g(#) | Увеличивает громкость на # децибел при воспроизведении сообщений |
|
||||
| s | Пропускает проверку пароля |
|
||||
| a(folder) | Запускает сессию в одной из следующих папок голосовой почты (по умолчанию 0):<br> 0 - `INBOX`<br>1 - `Old`<br>2 - `Work`<br>3 - `Family`<br>4 - `Friends`<br>5 - `Cust1`<br>6 - `Cust2`<br>7 - `Cust3`<br>8 - `Cust4`<br>9 - `Cust5` |
|
||||
|
||||
Чтобы позволить пользователям набирать добавочный номер для проверки своей голосовой почты, вы можете добавить этот номер в абонентскую группу следующим образом:
|
||||
|
||||
```
|
||||
exten => *98,1,NoOp(Access voicemail retrieval.)
|
||||
same => n,VoiceMailMain()
|
||||
```
|
||||
|
||||
Любой пользователь, чье устройство обозначено в контексте `[sets]`, теперь может набрать \*98, и войти в свой почтовый ящик, чтобы прослушивать сообщения, записывать свое имя, устанавливать приветствие и т.д.
|
||||
|
||||
### Стандартные комбинации кнопок голосовой почты
|
||||
|
||||
[Рисунок 8-1](pics/pic8-1.png) Показывает стандартную конфигурацию комбинаций клавиш для почты Asterisk. Некоторые параметры могут быть включены или отключены в зависимости от конфигурации _voicemail.conf_ (например, `envelope=no`). Рисунок можно дать пользователям в качестве памятки.
|
||||
|
||||

|
||||
|
||||
_Рисунок 8-1. Конфигурация клавиш для Comedian Mail_
|
||||
|
||||
|
||||
### Создание каталога набор-по-имени
|
||||
|
||||
Еще одной особенностью голосовой почты Asterisk, которую мы должны рассмотреть является каталог набора-по-имени. Он создается приложением `Directory()`. Это приложение использует имена определенные в почтовых ящиках в _voicemail.conf_ чтобы предоставить вызывающему абоненту каталог для набора пользователей по имени.
|
||||
|
||||
`Directory()` принимает до трех аргументов: контекст голосовой почты из которого будут считываться имена, необязательный контекст диалплана, в котором будет набираться пользователь, и строка параметров (так же являющаяся необязательной). По умолчанию `Directory()` ищет пользователя по фамилии, но установка параметра `f` заставляет вместо этого искать по имени. Давайте добавим два каталога набора-по-имени в контекст TestMenu нашего диалплана, так чтобы звонящие абоненты могли осуществлять поиск по имени или фамилии:
|
||||
|
||||
```
|
||||
exten => 4,1,Dial(${UserB_SoftPhone},10)
|
||||
same => n,Playback(vm-nobodyavail)
|
||||
same => n,Hangup()
|
||||
exten => 8,1,Directory(default,sets,f)
|
||||
exten => 9,1,Directory(default,sets)
|
||||
exten => i,1,Playback(pbx-invalid)
|
||||
same => n,Goto(TestMenu,start,1)
|
||||
```
|
||||
|
||||
Если вы набираете 201 и затем нажимаете 8, вы получаете каталог с поиском по имени, если вы нажали 9 то каталог с поиском по фамилии.
|
||||
|
||||
## Голосовая почта по электронной почте
|
||||
|
||||
Когда Asterisk впервые вышел, он делал нечто очень простое но тем не менее революционным на рынке АТС того времени. Ни один из крупных брендов АТС не смог предоставить технологию эффективной отправки голосовых сообщений на электронную почту (проще говоря просто отправку на электронную почту сообщения как прикрепление WAV файла). Конечно некоторые производители предлагали такую функциональность, но она была излишне сложной, ненадежной и дорогой. Asterisk прекратил это недоразумение и просто разрешил ящику голосовй почты иметь прикрепленный адрес электронной почты, таким образом сообщения отправлялись нормальными механизмами отправки электронной почты Linux. Это оказалось и просто и эффективнои и действительно показало насколько устарели традиционные производители АТС.
|
||||
|
||||
К сожалению, в каждой хорошей истории есть плохой парень, а в этом случае из них случилась эпидемия: Спамеры почти поставили интернет на колени. Больше нельзя было доверять простому SMTP релею, так как любая машина открытая для пересылки писем быстро становилась бы целью для спамеров.
|
||||
|
||||
|
||||
Таким образом электронная почта стала более сложной. Если вы хотите послать письмо из системы Asterisk, то как показано в Таблице 8-7, у вас есть три основных способа это сделать.
|
||||
|
||||
_Таблица 8-7. Обзор методов передачи голосовой почты по e-mail_
|
||||
|
||||
| Метод | Недостатки | Достоинства |
|
||||
| :--- | :--- | :--- |
|
||||
| 1. Отправить письмо непосредственно на SMTP порт адреса указанного в MX записи возвращаемого от запроса к домену. Почти всегда обречены на провал. | Спам-фильтры будут стремится отбрасывать подозрительный трафик. А этот трафик будет выглядеть очень подозрительным | На сервере Asterisk не требуется дополнительной настройки. |
|
||||
| 2. Ретрансляция вашей почты через хост который знает и доверяет вашей системе. Команде, которая занимается сервером ретрансляции необходимы твердые знания технологий DNS и почтовых серверов. | Необходимо настроить нижеследующий релей сервер \(это необходимо для доверия сообщениям ретранслируемым с вашего сервера Asterisk\). | Относительно простая настройка на сервере Asterisk. |
|
||||
| 3. Создать нормальный аккаунт пользователя на почтовом сервере \(С действительным почтовым адресом\), и посылать сообщения как аутентифицированный пользователь через эту платформу. Мы рекомендуем этот метод, так как он обычно хорошо работает и требования могут быть легко сообщены команде, которая поддерживает вашу почту. | Чуть сложнее в настройке на сервере Asterisk | Легко настроить учетную запись электронной почты для Asterisk: вам просто нужно создать в своей почтовой системе пользователя с именем «УАТС компании» или имя, которое его идентифицирует, а затем использовать учетные данные этого пользователя для отправки всей электронной почты. |
|
||||
|
||||
По существу вам нужно убедиться, что почтовый агент \(MTA\)<sup><a href="#sn8">8</a></sup> вашего Asterisk сервера может посылать почту из оболочки/пользовательского аккаунта Asterisk. Движок голосовой почты Asterisk будет использовать теже механизмы для отправки сообщений по электронной почте.
|
||||
|
||||
Для получения подробной информации по почтовым агентам, вы можете ознакомиться с книгами по администрированию линукса такими как "Unix и Linux. Руководство системного администратора, 5-е издание" или "Postfix: The Definitive Guide" издательства O’Reilly’s.
|
||||
|
||||
## Внутреннее хранилище голосовой почты
|
||||
Хранение сообщений в традиционных системах голосовой почты всегда было чрезмерно сложным<sup><a href="#sn9">9</a></sup>.
|
||||
Аsterisk, не только предоставляет вам простой, основанный на файловой системе механизм хранения данных, но также предлагает несколько дополнительных параметров хранения
|
||||
сообщений.
|
||||
|
||||
## Файловая система Linux
|
||||
|
||||
По умолчанию, Asterisk хранит голосовые сообщения в spool-каталоге /var/spool/asterisk/voicemail/<voicemailcontext>/<mailbox>. Сообщения могут хранится в нескольких форматах
|
||||
\(Таких как wav и wav49\), в зависимости от того, какой формат вы указали в секции \[general\] вашего файла voicemail.conf. Ваши приветствия также хранятся в этом каталоге.
|
||||
|
||||
**Примечание**
|
||||
|
||||
Asterisk не создает каталог для почтового ящика в котором нет записей (как в случае с новыми почтовыми ящиками), поэтому наличие этого каталога не может использоваться как надежный метод определения существования почтового ящика голосовой почты.
|
||||
|
||||
[Рисунок 8-2](pics/pic8-2.png) показывает на примере, что может находиться в каталоге почтового ящика. Этот почтовый ящик не имеет новых сообщений во входящих (каталог INBOX), Имеет два сохраненных сообщения в каталоге Old, и записи для приветствия и статусов занято и недоступен.
|
||||
|
||||

|
||||
|
||||
_Рисунок 8-2. Пример каталога ящика голосовой почты_
|
||||
|
||||
**Примечание**
|
||||
|
||||
Для каждого сообщения есть соответствующий файл _msg\#\#\#\#.txt_, который содержит информацию о конверте для сообщения. Файл _msg\#\#\#\#.txt_ также имеет критически важное значение для индикации ожидающего сообщения (MWI), так как это файл, который Asterisk ищет в INBOX, чтобы определить необходимость включения индикатора сообщения для пользователя.
|
||||
|
||||
### IMAP
|
||||
|
||||
Некоторые организации предпочитают управлять голосовой почтой как частью их почтовой системы. Это называется унифицированным обменом сообщениями в телекоммуникационной отрасли, и его реализация традиционно является дорогостоящей и сложной. Asterisk позволяет довольно просто интегрировать голосовую и электронную почту либо через встроенный обработчик голосовой почты, либо через связь с сервером IMAP. Мы не рекомендуем IMAP интеграцию из-за большого объема работы при малой отдаче, и выносим это за рамки данной книги.
|
||||
|
||||
### Хранение сообщений в базе данных
|
||||
|
||||
Возможно настроить голосовую почту Asterisk для хранения сообщений в базе данных как Binary Large OBject (BLOB). Это выглядит как простой путь чтобы позволить синхронизировать сообщения между системами. Мы никогда не были поклонниками этой идеи, так как базы данных не создавались для хранения больших объемов бинарных данных. Кроме того есть много других путей синхронизации файлов между системами.
|
||||
|
||||
## Заключение
|
||||
|
||||
Система голосовой почты Asterisk является зрелым и функциональным модулем и неотъемлемой частью любой АТС. Она вряд ли будет улучшена сверх того что делает, но это тоже не является проблемой.
|
||||
|
||||
<ol>
|
||||
<li id="sn1"> Это название было игрой слов, отчасти вдохновленной системой голосовой почты Nortel Meridian Mail. Nortel (и Meridian Mail) ушли,но Comedian Mail продолжает работать.</li>
|
||||
<li id="sn2"> Также иногда называют агентом передачи сообщений.</li>
|
||||
<li id="sn3"> Разделителем для каждого формата служит знак вертикальной черты - pipe <code>(|)</code>. </li>
|
||||
<li id="sn4"> Рассылка писем от Asterisk требует аккуратной настройки, так как многие спам-фильтры находят сообщения от Asterisk очень подозрительными и просто блокируют их.</li>
|
||||
<li id="sn5"> Да, вы все верно прочитали: мегабайт.</li>
|
||||
<li id="sn6"> Обычно каталог spool находится по пути <i>/var/spool/asterisk</i>, и может быть переопределен в <i>/etc/asterisk/asterisk.conf</i>.</li>
|
||||
<li id="sn7"> Мы углубимся в такие функции, как <code>IF()</code> в <a href="glava-10.md">Главе 10</a>.</li>
|
||||
<li id="sn8"> Популярные MTA в эти дни - Postfix и Exim. Вездесущий sendmail все еще существует, хотя его популярность за последние несколько лет снизилась. По умолчанию вы найдете Postfix на ваших компьютерах с RHEL / CentOS и, скорее всего, Exim на ваших платформах Debian / Ubuntu (хотя Postfix там же часто рекомендуется в качестве MTA).</li>
|
||||
<li id="sn9"> Nortel обычно хранила свои сообщения в некоем специальном разделе, в собственном формате, что делало практически невозможным извлечение сообщений из системы, отправку их по электронной почте, их архивирование, или что-то действительно с ними делать. Ах, старые добрые времена закрытых, проприетарных систем. Мы скучаем ... нет ... подождите ... мы не скучаем по ним!</li>
|
||||
</ol>
|
||||
|
||||
[Глава 7. Внешние подключения](glava-07.md) | [Содержание](SUMMARY.md) | [Глава 9. Интернационализация](glava-09.md)
|
|
@ -0,0 +1,424 @@
|
|||
# Глава 9. Интернационализация
|
||||
|
||||
> **Дэвид Дюффетт**
|
||||
>
|
||||
> _Английский? Кто должен тратить время на его изучение? Я никогда не поеду в Англию!_
|
||||
>
|
||||
> -- Дэн Касталланета
|
||||
|
||||
Телефония - одна из тех сфер жизни, где люди не любят сюрпризов, будь они дома или на работе. Когда люди пользуются телефонами, все, что выходит за рамки нормы, не оправдывается, и, как человек, который, вероятно занимается поставками телефонных систем, вы будете знать, что неудовлетворенные ожидания могут привести к неописуемым страданиям с точки зрения дополнительной работы, потерянных денег и других проблем, связанных с недовольством клиентов.
|
||||
|
||||
Помимо того, что пользовательский интерфейс соответствует тому, что ожидают пользователи, также необходимо, чтобы ваш Asterisk чувствовал себя «как дома». Например, если исходящий вызов сделан по аналоговой линии (FXO), Asterisk будет нужно интерпретировать тоны, которые он «слышит» на линии (занято, вызов и т.д.).
|
||||
|
||||
По умолчанию (а возможно, как и следовало бы ожидать, поскольку он был “рожден в США”), Asterisk настроен на работу в Северной Америке. Однако, поскольку Asterisk развертывается во многих местах и (к счастью) люди со всего мира вносят свой вклад в него, вполне возможно настроить Asterisk для правильной работы практически в любом месте, где вы решите его развернуть.
|
||||
|
||||
Если вы читали эту книгу с самого начала - глава за главой, вы уже сделали некоторый выбор во время установки и начальной конфигурации, которая настроила ваш Asterisk для работы в вашем регионе (и оправдает ожидания ваших клиентов).
|
||||
|
||||
Довольно много глав в этой книге содержат информацию, которая поможет вам интернационализировать<sup><a href="#sn1">1</a></sup> или (возможно, более правильно) локализовать вашу реализацию Asterisk. Цель этой главы - обеспечить единое место, куда можно будет ссылаться, обсуждать и объяснять все аспекты изменений, которые необходимо внести в телефонную систему на базе Asterisk в этом контексте. Причина использования фразы "телефонная система на основе Asterisk", а не просто” Asterisk", заключается в том, что некоторые изменения необходимо будет внести в другие части системы (IP-телефоны, ATAs и т. д.), в то время как другие изменения будут реализованы в конфигурационных файлах Asterisk и DAHDI.
|
||||
|
||||
Давайте начнем с составления списка (не в определенном порядке) вещей, которые возможно потребуется изменить для оптимизации вашей телефонной системы на основе Asterisk для данного местоположения за пределами Северной Америки. Вы можете выкрикнуть что-нибудь ещё, если хотите.…
|
||||
|
||||
* Язык/акцент подсказок
|
||||
* Физическое подключение для интерфейсов ТфОП (FXO, BRI, PRI)
|
||||
* Тоны, слышимые пользователями IP-телефонов и/или ATA
|
||||
* Формат идентификатора вызывающего абонента (CallerID), передаваемый и/или принимаемый аналоговыми интерфейсами
|
||||
* Сигналы для аналоговых интерфейсов, подаваемые или определяемые Asterisk
|
||||
* Формат меток времени/даты для голосовой почты
|
||||
* Способ, которым вышеуказанные метки времени/даты объявляются системой Asterisk
|
||||
* Шаблоны в диалплане (IP-телефонов, ATA и самой Asterisk, если вы используете образец диалплана)
|
||||
* Способ указания аналоговому устройству об ожидании голосовой почты (MWI)
|
||||
* Тоны, подаваемые абонентам Asterisk (они вступают в игру, когда пользователь находится “внутри " системы; например, тоны, услышанные во время трансфера вызова)
|
||||
|
||||
Мы рассмотрим все в этом списке, приняв стратегию работы от внешнего края системы к самому ядру (самой Asterisk). Мы закончим с удобным контрольным списком того, что вам может понадобится изменить и где это сделать.
|
||||
|
||||
Хотя принципы, описанные в этой главе, позволят вам адаптировать установку Asterisk специально для вашего региона (или для вашего клиента), для обеспечения согласованности все наши примеры будут сосредоточены на том, как адаптировать Asterisk для одного региона: Соединенного Королевства.
|
||||
|
||||
## Внешние устройства по отношению к серверу Asterisk
|
||||
|
||||
Существуют огромные различия между хорошим старомодным аналоговым телефоном и любым из большого количества IP-телефонов, и нам нужно подобрать одно из действительно фундаментальных различий, чтобы пролить свет на следующее объяснение, которое охватывает настройки, которые нам, возможно, придется изменить на устройствах, внешних по отношению к Asterisk, таких как IP-телефоны.
|
||||
|
||||
Вы когда-нибудь задумывались о том, что аналоговый телефон - это совершенно немое устройство (мы знаем, что базовая модель очень, очень дешевая), которое должно подключаться к интеллектуальной сети (ТфОП), тогда как IP-телефон (например, SIP или IAX2) - это очень умное устройство, которое подключается к немой сети (Интернет или любая обычная IP-сеть)? Рисунки 9-1 и 9-2 проиллюстрируют разницу.
|
||||
|
||||

|
||||
|
||||
_Рисунок 9-1. Старые времена: немые устройства подключаются к умной сети_
|
||||
|
||||

|
||||
|
||||
_Рисунок 9-2. Ситуация на сегодняшний день: умные устройства подключаются через немую сеть_
|
||||
|
||||
Можем ли мы взять два аналоговых телефона, подключить их непосредственно друг к другу и иметь функциональность, которую мы обычно связываем с обычным телефоном? Нет, конечно нет, потому что сеть предоставляет все: фактическое питание телефона, сигнал вызова (от местной станции или центрального офиса), информацию об идентификаторе вызывающего абонента (CallerID), сигнал вызова (от удаленной [ближайшего к телефону назначения] станции или ЦО), всю необходимую сигнализацию и так далее.
|
||||
|
||||
И наоборот, можем ли мы взять два IP-телефона, подключить их непосредственно друг к другу и получить некоторую разумную функциональность? Конечно можем, потому что весь интеллект находится внутри самих IP—телефонов - они обеспечивают тоны, которые мы слышим (сигнал вызова, звонок, занято) и запускают протокол, который выполняет всю необходимую сигнализацию (обычно SIP). Фактически, вы можете попробовать это для себя - большинство средних IP-телефонов имеют встроенный коммутатор Ethernet, поэтому вы можете подключить два IP-телефона непосредственно друг к другу с помощью обычного (прямого) кабеля Ethernet или просто подключить их через обычный коммутатор. Они должны иметь фиксированные IP-адреса в отсутствие DHCP-сервера, и вы сможете набрать IP-адрес другого телефона, просто используя клавишу \* для точек в адресе.
|
||||
|
||||
Рисунок 9-2 указывает на тот факт, что на IP-телефоне мы несем ответственность за настройку всех тонов, которые предоставила бы сеть в былые времена. Это можно сделать одним \(по крайней мере\) из двух способов. Первый заключается в настройке тонов, предоставляемых IP-телефоном на собственном веб-интерфейсе устройства. Вы делаете это, просматривая IP-адрес телефона \(IP-адрес обычно можно получить с помощью опции меню на телефоне\), а затем выбрав соответствующие параметры. Например, на IP-телефоне Yealink тоны устанавливаются на странице веб-графического интерфейса _Телефон_ под вкладкой _Тоны_ \(где вы найдете список различных типов тонов, которые можно изменить — в случае Yealink это набор, КПВ, занято, перегрузка, ожидание вызова, повторный вызов, запись, информация, заикание, сообщение и автоответ\).
|
||||
|
||||
Другой способ, которым эта конфигурация может быть применена - это автоматическое предоставление телефону этих настроек. Полное объяснение механизма автопровижинга выходит за рамки этой книги, но как правило вы можете настроить тоны в соответствующих атрибутах необходимых элементов в XML-файле.
|
||||
|
||||
В то время как мы меняем настройки на IP-телефонах, есть еще две вещи, которые может потребоваться изменить, чтобы телефоны выглядели правильно и функционировали как часть системы.
|
||||
|
||||
Большинство телефонов отображают время в режиме ожидания, и, поскольку многие люди находят это особенно раздражающим, когда их телефоны показывают неправильное время, мы должны убедиться, что отображается правильное местное время. Должно быть довольно легко найти соответствующую страницу веб-интерфейса \(или атрибутов XML\) для указания сервера синхронизации времени. Вы также обнаружите что есть настройки для перехода на летнее время и другие важные вещи.
|
||||
|
||||
Последнее, что нужно изменить - это потенциальный showstopper, когда речь идет о телефонном звонке - диалплан. Мы говорим не о диалплане, который находится в _/etc/asterisk/extensions.conf_, а о диалплане телефона. Не все понимают что IP-телефоны также имеют схемы набора номеров, хотя эти диалпланы больше связаны с тем, какие строки набора разрешены, чем с тем, что делать с данным набором.
|
||||
|
||||
Общее правило, по-видимому, заключается в том, что если вы набираете при положенной трубке - встроенная схема набора номера проигнорируется, но если вы поднимаете трубку - в игру вступает диалплан телефона и может случиться так, что диалплан не позволит набрать необходимую строку. Хотя эта проблема может проявляться в отказе телефона передавать определенные типы номеров в Asterisk, она также может повлиять на любые коды функций, которые вы планируете использовать. Это может быть легко исправлено путем поиска номера модели телефона вместе с «UK dialplan» \(или конкретным нужным вам регионом\) или вы можете перейти на соответствующую страницу в веб-интерфейсе пользователя и там либо вручную настроить диалплан, либо выбрать страну из выпадающего списка \(в зависимости от типа телефона, с которым вы работаете\).
|
||||
|
||||
Предварительное обсуждение конфигурации IP-телефона также относится к любым аналоговым телефонным адаптерам (ATA), которые вы планируете использовать, в частности к тем, которые поддерживают интерфейс FXS. Кроме того, может потребоваться указать некоторые электрические характеристики телефонного интерфейса, такие как линейное напряжение и импеданс, а также формат идентификатора вызывающего абонента, который будет работать с локальными телефонами. Все, что отличается - это способ получения IP-адреса для веб-интерфейса - обычно это делается набором определенного кода на подключенном аналоговом телефоне, что приводит к тому, что IP-адрес произносится вызывающему абоненту.
|
||||
|
||||
Конечно, ATA также может иметь интерфейс FXO, который также должен быть настроен для правильного взаимодействия с аналоговой линией, предоставляемой в вашем регионе. Типы настроек, которые необходимо изменить, аналогичны интерфейсу FXS.
|
||||
|
||||
Что делать, если вы подключаете аналоговый телефон или линию к карте Digium? Мы рассмотрим это в следующий раз.
|
||||
|
||||
## Подключение ТфОП, DAHDI, карт Digium и аналоговых телефонов
|
||||
|
||||
Прежде чем мы перейдем к конфигурации DAHDI и Asterisk, нам нужно физически подключиться к ТфОП. К сожалению, общемировых стандартов для подобных соединений не существует; на самом деле, даже в разных частях одной страны часто существуют различия.
|
||||
|
||||
Primary Rate Interfaces (PRI) обычно оканчиваются соединением RJ45 в настоящее время, хотя импеданс соединений может варьироваться. В некоторых странах \(в частности, в Южной Америке\) все еще можно найти PRI, обжатый двумя разъемами BNC: один для передачи и один для приема.
|
||||
|
||||
Проще говоря PRI, оконеченный RJ45, будет соединением ISDN, а если вы обнаружите, что соединение выполнено парой разъемов BNC \(push-and-twist coaxial connectors\), велика вероятность что вы имеете дело с более старым протоколом на основе CAS \(например, MFCR2\).
|
||||
|
||||
На Рисунке 9-3 показан адаптер, необходимый в том случае, если ваша телефонная компания поставила разъемы BNC \(карты Sangoma/Digium требуют подключения RJ45\). Он называется _balun_, поскольку преобразует из сбалансированного соединения \(RJ45\) в несбалансированное соединение \(BNCs\) в дополнение к изменению импеданса соединения.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Basic Rate Interfaces (BRI) распроастранены в континентальной Европе и почти всегда поставляются через соединение RJ45.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||

|
||||
|
||||
_Рисунок 9-3. Balun_
|
||||
|
||||
Аналоговые соединения сильно различаются в зависимости от местоположения - вы должны знать, какой тип разъема используется в вашей местности. Важно помнить, что аналоговая линия - это только два провода, и они должны подключаться к двум средним контактам разъема RJ11, который входит в плату Digium, другой конец является локальным. На Рисунке 9-4 показан коннектор, используемый в Великобритании, где два провода подключены к контактам 2 и 5.
|
||||
|
||||

|
||||
|
||||
_Рисунок 9-4. Штекер BT, используемый для аналоговых соединений ТфОП в Великобритании (обратите внимание, присутствуют только контакты 2–5)_
|
||||
|
||||
Интерфейс аппаратного устройства Digium Asterisk (Digium Asterisk Hardware Device Interface) или DAHDI на самом деле охватывает несколько вещей. Он содержит драйверы ядра для плат адаптеров телефонии, которые работают в рамках DAHDI, а также утилиты автоматической настройки и инструменты тестирования. Эти части содержатся в двух отдельных пакетах (_dahdi-linux_ и _dahdi-tools_), но мы также можем использовать один полный пакет, который называется _dahdi-linux-complete_. Все три пакета доступны [на сайте Digium](http://downloads.digium.com/pub/telephony/).
|
||||
|
||||
После того, как вы установили тип соединения PRI, предоставленного вам телекоммуникационным оператором, вам понадобятся некоторые дополнительные сведения для правильной настройки DAHDI и Asterisk (например, является ли соединение ISDN или протоколом на основе CAS). Опять же, вы найдете их в [Главе 7](glava-07.md).
|
||||
|
||||
### Драйверы DAHDI
|
||||
|
||||
Соединения, в которых потребуется реальная локализация - это аналоговые интерфейсы. Для того, чтобы настроить телефонную систему на базе Asterisk так, чтобы она лучше всего работала в данной местности, сначала необходимо настроить некоторые низкоуровневые аспекты взаимодействия карты Digium с подключенным устройством или линией. Это делается через драйвер(ы) ядра DAHDI, в файле с именем _/etc/dahdi/system.conf_.
|
||||
|
||||
В следующих строках (взятых из примера конфигурации, который вы получаете с новой установкой DAHDI), вы найдете настройки `loadzone` и `defaultzone`. Настройка `loadzone` позволяет выбрать набор(ы) тонов, которые карта будет генерировать (подавать на аналоговые телефоны) и распознавать (на подключенных аналоговых телефонных линиях):
|
||||
|
||||
```text
|
||||
# Tone Zone Data
|
||||
# ^^^^^^^^^^^^^^
|
||||
# Наконец, вы можете предварительно загрузить некоторые тональные
|
||||
# зоны, чтобы предотвратить их перезапись другими пользователями (если
|
||||
# вы разрешаете пользователям (не root), открывать интерфейсы /dev/dahdi/*).
|
||||
# Кроме того, это означает, что они не должны быть загружены во время выполнения.
|
||||
# Формат - "loadzone=<zone>", где zone представляет собой двухбуквенный код страны.
|
||||
# Вы также можете указать зону по умолчанию в "defaultzone=<zone>",
|
||||
# где zone - это двухбуквенный код страны.
|
||||
# Актуальный список зон можно найти в файле zonedata.с
|
||||
#
|
||||
loadzone = us
|
||||
#loadzone = us-old
|
||||
#loadzone=gr
|
||||
#loadzone=it
|
||||
#loadzone=fr
|
||||
#loadzone=de
|
||||
#loadzone=uk
|
||||
#loadzone=fi
|
||||
#loadzone=jp
|
||||
#loadzone=sp
|
||||
#loadzone=no
|
||||
#loadzone=hu
|
||||
#loadzone=lt
|
||||
#loadzone=pl
|
||||
defaultzone=us
|
||||
#
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Подсказка</b></p>
|
||||
<p>В файле <i>/etc/dahdi/system.conf</i> используется символ решётка (<b>#</b>) для обозначения комментария вместо точки с запятой (<b>;</b>), как в файлах <i>/etc/asterisk</i>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Хотя можно загрузить несколько различных наборов тонов (вы можете увидеть все наборы в zonedata.c) и переключаться между ними, в большинстве случаев вам понадобится только:
|
||||
|
||||
```text
|
||||
loadzone=uk # загружаемый набор тонов
|
||||
defaultzone=uk # по умолчанию DAHDI использует этот набор
|
||||
```
|
||||
|
||||
…или тоны, необходимые для Вашего региона.
|
||||
|
||||
Если вы выполняете _dahdi\_genconf_ для автоматической (или она должна быть автомагическая?) настройки своих адаптеров DAHDI, то заметите, что сгенерированный _/etc/dahdi/system.conf_ объявит как `loadzone`, так и `defaultzone` как `us`. Несмотря на предупреждения не редактировать файл вручную, нормальная практика - изменить эти параметры на то, что Вам нужно.
|
||||
|
||||
Если вам интересно как проверить почтовый ящик, связанный с каналом, к которому подключен аналоговый телефон, на наличие голосовых сообщений, то это делается заикающимся тоном. Формат этой заикнутой мелодии определяется выбранной комбинацией `loadzone/defaultzone`.
|
||||
|
||||
В качестве быстрого отступления, аналоговые телефоны, у которых есть индикатор ожидания сообщения (например, светодиод или лампа, которая мигает, чтобы указать на новую голосовую почту), достигают этого, автоматически периодически отключаясь и слушая заикающийся тон. Вы можете увидеть это, посмотрев вывод командной строки Asterisk, чтобы увидеть как канал DAHDI становится активен (если у вас нет ничего лучше!).
|
||||
|
||||
Вот и все на уровне DAHDI. Мы выбрали протокол(ы) для соединений PRI или BRI, тип сигнализации для аналоговых каналов (все рассмотрено в [Главе 7](glava-07.md)) и тональные сигналы для аналоговых соединений, которые только что были обсуждены.
|
||||
|
||||
Связь между Linux, DAHDI и Asterisk (и, следовательно, _/etc/dahdi/system.conf_ и _/etc/asterisk/chan\_dahdi.conf_) показана на Рисунке 9-5.
|
||||
|
||||

|
||||
|
||||
_Рисунок 9-5. Связь между Linux, DAHDI и Asterisk_
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Подсказка</b></p>
|
||||
<p>После завершения настройки на уровне DAHDI (в файле <i>/etc/dahdi/system.conf</i>), вам нужно выполнить <i>dahdi_cfg -vvv</i> чтобы DAHDI перечитал конфигурацию. Это также хороший шанс, чтобы использовать <i>dahdi_tool</i> для проверки что все в порядке на уровне Linux.</p>
|
||||
<p>Таким образом, если что-то не работает должным образом после настройки Asterisk для работы с адаптерами DAHDI, вы можете быть уверены, что проблема ограничена <i>chan_dahdi.conf</i> (или <i>#include dahdi-channels.conf</i>_ если вы используете эту часть вывода <i>dahdi_genconf</i>).</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Интернационализация в Asterisk
|
||||
|
||||
Теперь, когда все настроено на уровне Linux, нам нужно только настроить Asterisk, чтобы использовать каналы, которые мы только что включили на уровне Linux, и настроить способ, которым Asterisk интерпретирует и генерирует информацию, поступающую из этих каналов или исходящую через них. Эта работа выполняется в файле _/etc/asterisk/chan\_dahdi.conf_.
|
||||
|
||||
В этом файле мы не только расскажем Asterisk, какие каналы у нас есть (эти настройки будут соответствовать тому, что мы уже сделали в DAHDI), но и настроим ряд вещей, которые гарантируют, что Asterisk хорошо подходит для своего нового дома.
|
||||
|
||||
### Caller ID
|
||||
|
||||
Ключевым компонентом этого изменения является CallerID (идентификатор вызывающего абонента). Хотя методы доставки CallerID являются довольно стандартными в мире BRI и PRI, в аналоговом мире они сильно различаются; таким образом, если вы подключите американский аналоговый телефон к телефонной сети Великобритании, он, фактически, будет работать как телефон, но CallerID отображаться не будет. Это потому, что эта информация передается разными способами в разных местах по всему миру, и американский телефон будет искать сигнализацию CallerID в формате США, в то время как телефонная сеть Великобритании будет поставлять ее в формате Великобритании (если он включен - CallerID не является стандартным в Великобритании, вы должны попросить, а иногда даже заплатить за это!).
|
||||
|
||||
Мало того, что формат отличается, но и способ сообщить телефону (или Asterisk) искать CallerID также может варьироваться от места к месту. Это важно, так как мы не хотим, чтобы Asterisk тратил время на поиск информации о CallerID, если он не отображается на линии.
|
||||
|
||||
Опять же, Asterisk по умолчанию использует североамериканский формат идентификатора (записи в _/etc/asterisk/chan\_dahdi.conf_ не описывают этого, это просто значение по умолчанию) и для его изменения нам потребуется сделать несколько записей, которые опишут технические детали системы идентификации вызывающего абонента. В случае Великобритании о доставке информации CallerID сигнализирует смена полярности на телефонной линии (другими словами, жилы A и B пары телефонных проводов временно переключаются) и фактическая информация о CallerID доставляется в формате, известном как V.23 (частотная манипуляция или FSK). Таким образом, записи в файле _chan\_dahdi.conf_ для получения идентификатора вызывающего абонента в британском стиле на любых интерфейсах FXO будут выглядеть следующим образом:
|
||||
|
||||
```text
|
||||
cidstart=polarity ; доставка caller ID будет осуществляться
|
||||
; методом изменения полярности
|
||||
cidsignalling=v23 ; доставка информации о вызываемом идентификаторе
|
||||
; будет в формате V23
|
||||
```
|
||||
|
||||
Конечно, вам также может понадобиться отправить CellrID, используя ту же информацию локальной сигнализации, на любые аналоговые телефоны, которые подключены к интерфейсам FXS, и может потребоваться еще одна запись, поскольку в некоторых местах информация CallerID отправляется после указанного количества звонков. Если это так - вы должны использовать эту запись:
|
||||
|
||||
```text
|
||||
sendcalleridafter=2
|
||||
```
|
||||
|
||||
Прежде чем вы сможете сделать эти записи, вам нужно будет установить детали вашей локальной системы CallerID (кто-то из вашей местной телефонной компании или Google может помочь в этом, но также есть некоторая полезная информация в файле примера _/etc/asterisk/chan\_dahdi.conf_).
|
||||
|
||||
### Язык и/или акцент подсказок
|
||||
|
||||
Как вы знаете, подсказки (или записи), используемые Asterisk, хранятся в _/var/lib/asterisk/sounds/_. В более старых версиях Asterisk все звуки были в этом фактическом каталоге, но в наши дни вы найдете ряд подкаталогов, которые позволяют использовать различные языки или акценты. Имена этих подкаталогов произвольны; вы можете называть их как угодно.
|
||||
|
||||
Обратите внимание, что имена файлов в этих каталогах должны соответствовать ожиданиям Asterisk — например файл _/var/lib/asterisk/sound/en-hello.gsm_ будет содержать слово "Hello" (произнесенное прекрасной Элисон), тогда как _hello.gsm_ в _/var/lib/asterisk/sounds/es_ (для испанского в данном случае) будет содержать слово "Hola" (произнесенное испанским эквивалентом прекрасной Эллисон<sup><a href="#sn2">2</a></sup>).
|
||||
|
||||
По умолчанию используется каталог _/var/lib/asterisk/sounds/en/_, так как же это изменить?
|
||||
|
||||
Есть два способа. Один из них - установить язык в файле конфигурации канала, на который поступают вызовы, используя директиву `language`. Например, строка:
|
||||
|
||||
```text
|
||||
language=en_UK
|
||||
```
|
||||
|
||||
помещенная в _chan\_dahdi.conf_, _sip.conf_ и т.д. (Для применения в целом или только для данного канала или профиля) укажет Asterisk использовать звуковые файлы, найденные в _/var/lib/asterisk/sounds/en\_UK/_ (которые могут содержать подсказки с британским акцентом) для всех вызовов, поступающих через эти каналы.
|
||||
|
||||
Другой способ - изменить язык во время телефонного звонка через диалплан. Этот параметр (наряду со многими атрибутами отдельного вызова) можно задать с помощью функции диалплана `Channel()`. Полное описание функций диалплана см. в [Главе 10](glava-10.md).
|
||||
|
||||
В следующем примере вызывающий абонент может выбрать один из трех языков для продолжения вызова:
|
||||
|
||||
```text
|
||||
; дает выбор (1) Французского, (2) Испанского или (3) Немецкого
|
||||
exten => s,1,Background(choose-language)
|
||||
same => n,WaitExten(5)
|
||||
|
||||
exten => 1,1,Set(CHANNEL(language)=fr)
|
||||
|
||||
exten => 2,1,Set(CHANNEL(language)=es)
|
||||
|
||||
exten => 3,1,Set(CHANNEL(language)=de)
|
||||
|
||||
; следующий приоритет для расширений 1, 2 или 3 будет обрабатываться здесь
|
||||
exten => _[123],n,Goto(menu,s,1)
|
||||
```
|
||||
|
||||
Если вызывающий абонент нажмет 1, звуки будут воспроизводиться из _/var/lib/asterisk/sounds/fr/_; если он нажмет 2, звуки будут браться из _/var/lib/asterisk/sounds/es/_ и так далее.
|
||||
|
||||
Как уже упоминалось, имена этих каталогов произвольны и необязательно должны быть длиной всего два символа - главное, чтобы вы соответствовали имени подкаталога, который создали в директиве `language` в конфигурации канала, или когда установили в качестве аргумента в `CHANNEL(language)` через диалплан.
|
||||
|
||||
### Штампы времени/даты и произношение
|
||||
|
||||
Asterisk использует системное время Linux с хост-сервера как и следовало ожидать, но у нас могут быть пользователи системы, которые находятся в разных часовых поясах или даже в разных странах. Голосовая почта - это место, где резина попадает в дорогу, так как именно здесь пользователи вступают в контакт с информацией о времени/дате.
|
||||
|
||||
Рассмотрим сценарий, в котором одни пользователи системы находятся в США, а другие - в Великобритании.
|
||||
|
||||
Помимо разницы во времени, еще одна вещь, которую следует учитывать — это то, какой формат даты и времени используют люди в разных местах - в США даты обычно упорядочиваются по месяцам, дням, годам, а время указывается в 12-часовом формате (например, 2:54 P.M.).
|
||||
|
||||
В отличие от этого, в Великобритании даты упорядочены как день, месяц, год и время указывается в 24-часовом формате (14:54 hrs), хотя некоторые люди в Великобритании предпочитают 12-часовой формат часов, поэтому мы рассмотрим его тоже.
|
||||
|
||||
Поскольку все эти вещи связаны с голосовой почтой, Вы были бы правы, предположив, что мы настраиваем это в _/etc/asterisk/voicemail.conf_ - в частности, в разделе файла `[zonemessages]`.
|
||||
|
||||
Вот часть `[zonemessages]` образца файла _voicemail.conf_, который поставляется с Asterisk, добавлены зоны `UK24` (для британцев, которые любят 24-часовой формат) и `UK12` (для британцев, предпочитающих 12-часовой формат):
|
||||
|
||||
```text
|
||||
[zonemessages]
|
||||
; Пользователи могут находиться в разных часовых поясах или иметь разные
|
||||
; объявления для сообщения при входе в систему голосовой почты. Здесь можно
|
||||
; установить сообщение и часовой пояс для каждого пользователя. Определите
|
||||
; пользователя в одну из этих зон с помощью tz=атрибут в параметрах почтового
|
||||
; ящика. Конечно, замена языка здесь всё еще применяется, поэтому у вас
|
||||
; может быть несколько деревьев каталогов, которые имеют альтернативные
|
||||
; варианты языка.
|
||||
;
|
||||
; Найдите в /usr/share/zoneinfo/ названия часовых поясов.
|
||||
; Посмотрите страницу руководства для strftime для быстрой справки о том,
|
||||
; как выполняется подстановка переменных на значениях ниже.
|
||||
;
|
||||
; Поддерживаемые значения:
|
||||
; 'filename' имя звукового файла (требует одиночные кавычки вокруг имени
|
||||
; файла)
|
||||
; ${VAR} подстановка переменных
|
||||
; A или a - день недели (Saturday, Sunday, ...)
|
||||
; B или b или h - название месяца (January, February, ...)
|
||||
; d или e - число в месяце (first, second, ... thirty-first)
|
||||
; Y - год
|
||||
; I или l - час, 12-часовой формат
|
||||
; H - час, 24-часовой формат (одноразрядные часы перед "oh")
|
||||
; k - час, 24-часовой формат (одноразрядные часы НЕ перед "oh")
|
||||
; M - минута, с 00 произносится как "o'clock"
|
||||
; N - минута, с 00 произносится как "hundred" (военное время США)
|
||||
; P или p - AM или PM
|
||||
; Q "today", "yesterday" или ABdY
|
||||
; (*примечание: нестандартное значение strftime)
|
||||
; q " (для today), "yesterday", weekday или ABdY
|
||||
; (*примечание: нестандартное значение strftime)
|
||||
; R - 24-часовой формат, включая минуты
|
||||
;
|
||||
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
|
||||
central=America/Chicago|'vm-received' Q 'digits/at' IMp
|
||||
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
|
||||
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
|
||||
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
|
||||
UK24=Europe/London|'vm-received' q 'digits/at' H N 'hours'
|
||||
UK12=Europe/London|'vm-received' Q 'digits/at' IMp
|
||||
```
|
||||
|
||||
Эти зоны не только определяют время, но и указывают порядок следования и считывания времени и дат.
|
||||
|
||||
Создав эти зоны, мы можем перейти к контекстной части _voicemail.conf_, чтобы связать соответствующие почтовые ящики с правильными зонами:
|
||||
|
||||
```text
|
||||
[default]
|
||||
4001 => 1234,Russell Bryant,rb@shifteight.org,,|tz=central
|
||||
4002 => 4444,David Duffett,dd@shifteight.org,,|tz=UK24
|
||||
4003 => 4450,Mary Poppins,mp@shifteight.org,,|tz=UK12|attach=yes
|
||||
```
|
||||
|
||||
Как вы могли заметить, когда мы объявляем почтовый ящик, мы также (необязательно) связываем его с определенной зоной. Полную информацию о голосовой почте можно найти в [Главе 8](glava-08.md).
|
||||
|
||||
Последнее, что нужно локализовать в нашей конфигурации Asterisk - это тоны, воспроизводимые для абонентов Asterisk, когда они находятся внутри системы (например, тоны, которые абонент слышит во время трансфера).
|
||||
|
||||
Как было указано ранее в этой главе, исходные сигналы, которые люди слышат, когда звонят в систему, будут поступать с IP-телефона или с DAHDI для аналоговых каналов.
|
||||
|
||||
Эти тоны задаются в _/etc/asterisk/indication.conf_. Вот часть файла примера, где вы можете увидеть данный регион, указанный в директиве `country`. Нам просто нужно изменить код страны соответствующим образом:
|
||||
|
||||
```text
|
||||
;
|
||||
; indications.conf
|
||||
;
|
||||
; Конфигурационный файл для индикаций конкретного местоположения
|
||||
;
|
||||
; ПРИМЕЧАНИЕ:
|
||||
; При добавлении стран в этот файл, пожалуйста, держите их в алфавитном
|
||||
; порядке в соответствии с 2-символьными кодами стран!
|
||||
;
|
||||
; Категория [general] предназначена для некоторых глобальных переменных.
|
||||
; Все остальные категории интерпретируются как индикации для
|
||||
; конкретного местоположение
|
||||
;
|
||||
[general]
|
||||
country=uk ; по умолчанию - US, поэтому мы изменили его на uk
|
||||
```
|
||||
|
||||
Ваш диалплан должен будет отражать схему нумерации для вашего региона. Если вы еще не знаете схему для своего региона, местный регулятор электросвязи обычно предоставляет подробную информацию об этом. Кроме того, пример диалплана в _/etc/asterisk/extensions.conf_ конечно же содержит номера и шаблоны для Северной Америки.
|
||||
|
||||
## Вывод - простая шпаргалка
|
||||
|
||||
Как вы теперь можете видеть - есть довольно много вещей, которые необходимо изменить, чтобы полностью локализовать вашу телефонную систему на основе Asterisk и не все из них находятся в конфигурации Asterisk или даже DAHDI — некоторые параметры должны быть изменены на подключенных IP-телефонах или ATA.
|
||||
|
||||
Прежде чем мы покинем главу, взгляните на Таблицу 9-1: шпаргалка, подсказывающая что и где изменить для дальнейшего использования.
|
||||
|
||||
_Таблица 9-1. Шпаргалка интернационализации_
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left">Что изменить</th>
|
||||
<th style="text-align:left">Где это изменить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align:left">Тоны выполнения вызова</td>
|
||||
<td style="text-align:left">
|
||||
<p></p>
|
||||
<ul>
|
||||
<li>IP-телефоны—в самом телефоне</li>
|
||||
<li>ATAs—в самом ATA</li>
|
||||
<li>Аналогвоые телефоны—DAHDI (<em>/etc/dahdi/system.conf</em>)</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Тип PRI/BRI и протокол</td>
|
||||
<td style="text-align:left">DAHDI—<em>/etc/dahdi/system.conf</em> и <em>/etc/asterisk/chan_dahdi.conf</em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Физические подключения ТфОП</td>
|
||||
<td style="text-align:left">
|
||||
<p></p>
|
||||
<ul>
|
||||
<li>Balun если требуется для PRI</li>
|
||||
<li>Подключить аналоговую пару к средним двум контактам RJ11, подключенному к плате Digium
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Caller ID на аналоговой линии</td>
|
||||
<td style="text-align:left">Asterisk—<em>/etc/asterisk/chan_dahdi.conf</em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Языковые подсказки и/или акцент</td>
|
||||
<td style="text-align:left">
|
||||
<p></p>
|
||||
<ul>
|
||||
<li>Канал—<em>/etc/asterisk/sip.conf</em>, <em>/etc/asterisk/iax.conf</em>, <em>/etc/asterisk/chan_dahdi.conf</em>,
|
||||
и тд.</li>
|
||||
<li>Диалплан—функция <code>CHANNEL(language)</code></li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Штампы время/дата и произношение для голосовой почты</td>
|
||||
<td style="text-align:left">Asterisk—<em>/etc/asterisk/voicemail.conf</em>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left">Тоны, предоставляемые Asterisk</td>
|
||||
<td style="text-align:left">Asterisk—<em>/etc/asterisk/indications.conf</em>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>Пусть все ваши развертывания Asterisk чувствуют себя как дома…
|
||||
---
|
||||
|
||||
<a name="sn1">1</a> _i18n_ -это термин, используемый для сокращения слова _internationalization_, из-за его длины. Формат:_<первый_символ><число><последний_символ>_, где _<число>_ - это количество букв между первой и последней буквами. Другие слова, такие как localization \(L10n\) и modularization \(m12n\), также нашли применение с этой схемой, которую Лейф находит немного смешной. Дополнительную информацию можно найти в [W3C глоссарий онлайн](https://www.w3.org/2001/12/Glossary#I18N).
|
||||
|
||||
<a name="sn2">2</a> который, по сути, та же самая Эллисон, которая делает английские подсказки; Джун Уоллак делает французские подсказки. Мужские подсказки с австралийским акцентом сделаны Камероном Туми. Все таланты озвучки также доступны для записи дополнительных подсказок. Смотрите страницу [Digium IVR](http://www.digium.com/en/products/ivr/) для получения дополнительной информации.
|
||||
|
||||
[Глава 8. Голосовая почта](glava-08.md) | [Содержание](SUMMARY.md) | [Глава 10. Погружение в диалплан](glava-10.md)
|
|
@ -0,0 +1,546 @@
|
|||
# Глава 11. Функции АТС, включая парковку, пейджинг и конференц-связь
|
||||
|
||||
> _Я не верю в ангелов, нет. Но у меня есть крошечный парковочный ангел. Он у меня на приборной панели, и ты его заводишь. Крылья хлопают, и это должно дать вам место для парковки. Это работало до сих пор._
|
||||
>
|
||||
> -- Билли Коннолли
|
||||
|
||||
В этой главе рассматриваются некоторые периферийные функции, общие для бизнес-телефонных сред. Мы кратко рассмотрим файл _features.conf_, а затем посвятим несколько разделов пейджингу и парковке и, наконец, немного поработаем с механизмом конференц-связи Asterisk - `confbridge`.
|
||||
|
||||
Во-первых, давайте скопируем файл _features.conf_ из каталога установки и рассмотрим его:
|
||||
|
||||
```text
|
||||
$ sudo cp ~/src/asterisk-16.<TAB>/configs/samples/features.conf.sample \
|
||||
/etc/asterisk/features.conf
|
||||
$ sudo chown asterisk:asterisk /etc/asterisk/features.conf
|
||||
```
|
||||
|
||||
## features.conf
|
||||
|
||||
Asterisk предоставляет несколько функций, общих для большинства УАТС, многие из которых имеют необязательные параметры. Файл *features.conf* - это место, где вы можете настроить или определить различные параметры объектов в Asterisk.
|
||||
|
||||
---
|
||||
**Функции на основе DTMF**
|
||||
|
||||
Многие параметры в _features.conf_ применяются только при вызовах, которые были совершены с помощью приложений диалплана `Dial()` или `Queue()`, используя один или несколько параметров `k`, `K`, `H`, `h`, `T`, `t`, `W`, `w`, `X` или `x`. Функции доступны путем передачи DTMF-сигналов (т.е. они не могут быть доступны через SIP-сообщения, а только в аудиоканале через тональные сигналы, запускаемые пользователями, набирающими необходимые цифры на своих клавиатурах).[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406491144)
|
||||
|
||||
Трансферы SIP-каналов (например через SIP-телефон) могут быть обработаны с использованием возможностей самого телефона и не будут затронуты файлом `features.conf`.
|
||||
|
||||
---
|
||||
### Раздел [general]
|
||||
|
||||
В разделе `[general]` _features.conf_, вы можете определить параметры, которые точно настраивают поведение функции трансфера в Asterisk. Они не имеют ничего общего с тем, как SIP-телефоны обрабатывают трансфер вызовов. Вместо этого вы получаете доступ к этим функциям с помощью DTMF во время вызова (вызов должен быть установлен, поэтому звонящие или выполняющиеся вызовы, не будут иметь доступа к этим функциям).
|
||||
|
||||
Пример файла _features.conf.sample_ в папке _~/asterisk/_ содержит подробные сведения о различных параметрах и примеры их установки.
|
||||
|
||||
Эти функции не так часто используются как в прошлом, главным образом потому, что многие из этих вещей могут быть обработаны более продвинутыми способами чем набор DTMF с телефонного аппарата (например, через какую-то внешнюю интеграцию или, если на то пошло, с самого телефона, используя свои собственные внутренние функции трансфера).
|
||||
|
||||
### Раздел [featuremap]
|
||||
|
||||
Раздел `[featuremap]`, приведенный в Таблице 11-1, позволяет определить определенные последовательности DTMF, которые будут запускать функции на каналах, соединенных с помощью опций в приложении `Dial()` или `Queue()`. Два варианта, которые вы, скорее всего, будете использовать, это `parkcall` и `automixmon`.
|
||||
|
||||
_Таблица 11-1. features.conf раздел \[featuremap\]_
|
||||
|
||||
| Параметр | Значение/пример | Примечание | флаги Dial\(\)/Queue\(\) |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `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` |
|
||||
|
||||
### Раздел [applicationmap]
|
||||
|
||||
Раздел `[applicationmap]` в _features.conf_ возможно, является самым изящным, поскольку он позволяет сопоставлять коды DTMF с приложениями диалплана. Вызывающий абонент будет поставлен на удержание, пока приложение не завершит выполнение.
|
||||
|
||||
Синтаксис для определения сопоставления приложения выглядит следующим образом (оно должно отображаться в одной строке; разрывы строк недопустимы):[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178)
|
||||
|
||||
```
|
||||
Name => DTMF_sequence,ActivateOn[/ActivatedBy],App([Args])[,MOH_Class]
|
||||
```
|
||||
|
||||
То, что вы делаете, заключается в следующем:
|
||||
1. Присвоение сопоставлению имени, позволяющему включить его в диалплан с помощью переменной канала `DYNAMIC_FEATURES` (подробнее об этом чуть позже).
|
||||
2. Определение последовательности DTMF, которая активирует эту функцию (мы рекомендуем использовать для этого по крайней мере две цифры).
|
||||
3. Определение того, на каком канале будет активирована функция и (необязательно) какому участнику разрешено активировать её (по умолчанию обоим каналам разрешено использовать/активировать).
|
||||
4. Задает имя приложения, которое вызовет это сопоставление, и его аргументы.
|
||||
5. Предоставление дополнительного класса музыки на удержание (MOH) для назначения этой функции (который будет слышать противоположный канал при выполнении приложения). Если вы не определяете какой-либо класс, вызывающий абонент будет слышать просто тишину.
|
||||
|
||||
Вот пример сопоставления приложения, которое вызовет скрипт AGI:[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406440184)
|
||||
|
||||
```
|
||||
agi_test => *6,self/callee,AGI(agi-test.agi),default
|
||||
```
|
||||
|
||||
Вы можете добавить это в свой файл _/etc/asterisk/features.conf_ если пожелаете.
|
||||
|
||||
---
|
||||
**ПРИМЕЧАНИЕ**
|
||||
|
||||
Поскольку приложения, вызванные сопоставлением приложений, выполняются вне ядра АТС, вы не можете выполнять приложения, запускающие диалплан (например, `Goto()`, `Macro()`, `Background()` и т.д.). Если вы хотите использовать сопоставление приложений для создания внешних процессов (включая выполнение кода диалплана), то вам нужно будет вызвать внешнее приложение через вызов `AGI()` или приложение `System()`. Дело в том, что если вы хотите выполнить что-то сложное с помощью сопоставления приложения, вам нужно будет это очень тщательно протестировать, так как не все будет работать так, как вам хотелось бы.
|
||||
|
||||
---
|
||||
Чтобы использовать сопоставление приложения, вы должны объявить его в диалплане, установив переменную `DYNAMIC_FEATURES` где-то перед командой `Dial()`, оединяющей каналы. Используйте модификатор двойного подчеркивания в имени переменной для гарантии того, что сопоставление приложения будет доступно обоим каналам в течение всего жизненного цикла вызова. Давайте добавим его в нашу подпрограмму `subDialUser`, чтобы он был доступен всякий раз, когда любое из наших расширений вызывает друг друга:
|
||||
|
||||
```
|
||||
[subDialUser]
|
||||
exten => _[0-9].,1,Noop(Dial extension ${EXTEN},channel: ${ARG1}, mailbox: ${ARG2})
|
||||
same => n,Noop(mboxcontext: ${ARG3}, timeout ${ARG4})
|
||||
same => n,Set(__DYNAMIC_FEATURES=agi_test)
|
||||
same => n,Dial(${ARG1},${ARG4})
|
||||
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
|
||||
```
|
||||
|
||||
---
|
||||
**ПРИМЕЧАНИЕ**
|
||||
|
||||
Если вы хотите, чтобы при вызове было доступно более одного сопоставления приложения, вам нужно использовать символ \# в качестве разделителя между несколькими именами сопоставлений:
|
||||
```
|
||||
Set(__DYNAMIC_FEATURES=agi_test#my_other_map)
|
||||
```
|
||||
Причина, по которой символ \# был выбран вместо простой запятой, заключается в том, что более старые версии приложения `Set()` интерпретировали запятую иначе, чем более поздние и синтаксис для сопоставления приложений никогда не обновлялся.
|
||||
|
||||
---
|
||||
Не забудьте перезагрузить модуль `features` после внесения изменений в файл *features.conf*:
|
||||
```
|
||||
*CLI> module reload features
|
||||
```
|
||||
Вы можете проверить что ваши изменения произошли через команду CLI `features show`.
|
||||
|
||||
Кроме того, поскольку мы представляем здесь скрипт AGI, есть некоторые команды, которые необходимо выполнить, чтобы сделать упомянутый скрипт AGI доступным для Asterisk.
|
||||
```
|
||||
$ sudo cp ~/src/asterisk-16.<TAB>/agi/agi-test.agi /var/lib/asterisk/agi-bin/
|
||||
|
||||
$ sudo chown asterisk:asterisk /var/lib/asterisk/agi-bin/*
|
||||
|
||||
$ sudo chmod 755 /var/lib/asterisk/agi-bin/*
|
||||
```
|
||||
Убедитесь, что вы протестировали сопоставление приложения, прежде чем передать его в пользование своим пользователям!
|
||||
|
||||
---
|
||||
**Динамическое создание сопоставления приложения из диалплана**
|
||||
|
||||
Вы можете создавать сопоставления объектов непосредственно из диалплана, делая динамическое определение объекта (и его DTMF) для каждого канала. Это делается с помощью функций набора номеров `FEATURE()` и `FEATUREMAP()`. Допустимые значения для `FEATUREMAP()` включают следующие, устанавливающие или извлекающие последовательность DTMF, используемую для запуска функциональности:
|
||||
|
||||
`atxfer`
|
||||
|
||||
Трансфер с уведомлением
|
||||
|
||||
`blindxfer`
|
||||
|
||||
Слепой трансфер
|
||||
|
||||
`automon`
|
||||
|
||||
Авто `Monitor()` (запись вызовов)
|
||||
|
||||
`disconnect`
|
||||
|
||||
Разъединение вызова
|
||||
|
||||
`parkcall`
|
||||
|
||||
Парковка вызова
|
||||
|
||||
`automixmon`
|
||||
|
||||
Авто `MixMonitor()` (запись вызова)
|
||||
|
||||
Функция `FEATUREMAP()` позволяет получить текущую последовательность DTMF для этой функции:
|
||||
```
|
||||
exten => 232,1,Noop(Current DTMF for parkcall: ${FEATUREMAP(parkcall)})
|
||||
```
|
||||
Или вы можете использовать последовательность DTMF для особой функции на текущем канале:
|
||||
```
|
||||
exten => 233,1,NoOp()
|
||||
same => n,Set(FEATUREMAP(parkcall)=*9)
|
||||
same => n,Noop(DTMF for parkcall now: ${FEATUREMAP(parkcall)})
|
||||
```
|
||||
Если вы хотите установить тайм-аут парковки для канала, то можете сделать это с помощью функции `FEATURE()`. Она будет содержать единственный аргумент - `parkingtime`, который является значением в секундах до того, как припаркованный вызов будет возвращен вызывающему абоненту (или месту назначения, в зависимости от того, как вы настроили парковку):
|
||||
```
|
||||
exten => 234,1,NoOp()
|
||||
same => n,Set(FEATURE(parkingtime)=60)
|
||||
```
|
||||
---
|
||||
### Группировка сопоставлений приложений
|
||||
|
||||
Если у вас есть множество объектов, которое необходимо активировать для определенного контекста или расширения, вы можете сгруппировать несколько объектов в группу сопоставлений приложений, чтобы одно назначение переменной `DYNAMIC_FEATURES` назначило все объекты этого сопоставления.
|
||||
|
||||
Группировки сопоставлений приложений добавляются в конце файла *features.conf*. Каждой группе присваивается имя, а затем перечисляются соответствующие объекты:
|
||||
```
|
||||
[shifteight]
|
||||
unpauseMonitor => *1 ; пользовательское сопоставление клавиш
|
||||
pauseMonitor => *2 ; пользовательское сопоставление клавиш
|
||||
agi_test => ; непользовательское сопоставление клавиш
|
||||
```
|
||||
---
|
||||
**ПРИМЕЧАНИЕ**
|
||||
|
||||
Если вы хотите задать пользовательское сопоставление клавиш для объекта в группе сопоставления приложения, просто сопоставьте `=>` с нужным сопоставлением клавиш. Если вы не зададите сопоставление клавиш, то для этого объекта будет использоваться сопоставление клавиш по умолчанию (как указано в разделе `[featuremap]`). Независимо от того, хотите ли вы назначить пользовательское сопоставление клавиш или нет, требуется оператор `=>`.
|
||||
|
||||
---
|
||||
В диалплане эту группировку карт приложений можно назначить через приложение `Set()`:
|
||||
```
|
||||
same => Set(__DYNAMIC_FEATURES=shifteight) ; используйте двойное подчеркивание,
|
||||
; если хотите убедиться, что обе
|
||||
; ветви вызова имеют назначенную переменную.
|
||||
```
|
||||
## Парковка и пейджинг
|
||||
|
||||
Хотя эти две функции полностью отделены друг от друга, они так часто используются вместе, что мы могли бы рассматривать их как одну отдельную функцию.
|
||||
|
||||
Парковка вызовов позволяет удерживать вызовы, а затем извлекать их из места, отличного от того, на котором им первоначально ответили. Пейджинг использует систему громкой связи, позволяющую отправлять объявления из телефонной системы (например, чтобы сообщить для кого предназначен припаркованный вызов и как его можно получить).
|
||||
|
||||
Некоторые компании, возможно, с большими складами, открытыми площадками или сотрудниками, передвигающимися по офису, используют функции пейджинга и парковки своих систем для прямых звонков по офису. В этой главе мы покажем вам, как использовать парковку и пейджинг в традиционных настройках (park’n’page), а также несколько более современных подходов к этим часто используемым функциям.
|
||||
|
||||
### Парковка вызовов
|
||||
|
||||
Парковка позволяет удерживать вызов в системе без привязки к определенному добавочному номеру. Затем вызов может быть извлечен любым, кто знает код парковки для этого вызова. Эта функция часто используется вместе с публичным адресом (PA) или системой «пейджинга». По этой причине его часто называют «park-and-page». Следует отметить, что парковка и пейджинг на самом деле разделены. Мы кратко рассмотрим пейджинг, но сначала давайте поговорим о парковке вызовов.
|
||||
|
||||
Давайте возьмем копию файла примера, который будем использовать для настройки парковки вызовов:
|
||||
```
|
||||
$ sudo cp ~/src/asterisk-16.<TAB>/configs/samples/res_parking.conf.sample \
|
||||
/etc/asterisk/res_parking.conf
|
||||
|
||||
$ sudo chown asterisk:asterisk /etc/asterisk/res_parking.conf
|
||||
|
||||
$ sudo asterisk -rx 'module load res_parking.so'
|
||||
```
|
||||
Для парковки вызова в Asterisk Вам необходимо перевести вызывающего абонента на код функции, назначенный для парковки в файле *res\_parking.conf* с помощью директивы `parkext`. По умолчанию это `700`:
|
||||
```
|
||||
parkext => 700 ; расширение, набираемое для парковки (все слоты парковки)
|
||||
```
|
||||
Вам нужно подождать завершения перевода пока вы не получите номер слота поиска парковки из системы, или у вас не будет возможности получить вызов. По умолчанию слоты поиска, назначенные с помощью директивы `parkpos` в _res\_parking.conf_, нумеруются от `701` до `720`:
|
||||
```
|
||||
parkpos => 701-720 ; расширения для парковки вызовов (слоты парковки по умолчанию)
|
||||
```
|
||||
После того, как вызов припаркован, любой пользователь системы может получить его, набрав номер слота поиска (`parkpos`), назначенного этому вызову. Затем вызов будет соединен с каналом, который набрал код поиска.
|
||||
|
||||
Существует два распространенных способа определения назначения слотов поиска. Это делается с помощью директивы `findlot` в файле _res\_parking.conf_. Метод по умолчанию (`findlot => first`) всегда использует слот с наименьшим номером, если он доступен, и назначает коды с более высоким номером только в случае необходимости. Второй метод (`findlot => next`) будет чередовать слоты поиска при каждой последующей парковке, возвращаясь к первому слоту поиска только после того, как использовался последний. Какой метод вы выберете, будет зависеть от того, насколько загружена ваша парковка. Если вы редко пользуетесь парковкой - лучше всего подойдет `findslot` как `first` по умолчанию (люди будут привыкать к тому, что их припаркованные вызовы всегда находятся в одном и том же слоте). Если вы постоянно используете функцию парковки (например, в автосалоне), гораздо лучше для каждой последующей парковки назначать следующий слот, поскольку вы часто будете парковать более одного вызова одновременно. Ваши пользователи привыкнут внимательно слушать фактический номер парковки (вместо того, чтобы просто набирать 701), и это сведет к минимуму вероятность случайного получения неправильного вызова в занятой системе.
|
||||
|
||||
---
|
||||
**Обработка тайм-аутов припаркованных вызовов с опцией comebacktoorigin**
|
||||
|
||||
Этот параметр настраивает поведение парковки вызова, когда время ожидания вызова на парковке истекает (см. параметр `parkingtime`). `comebacktoorigin` может иметь одно из двух значений:
|
||||
|
||||
`yes` (по умолчанию)
|
||||
|
||||
Когда тайм-аут припаркованного вызова превышен, Asterisk попытается отправить вызов обратно узлу, который совершил этот вызов. Если канал больше недоступен для Asterisk, вызывающий абонент будет отключен.
|
||||
|
||||
`no`
|
||||
|
||||
Эта опция будет использоваться если вы хотите выполнить пользовательские функции диалплана для припаркованных вызовов, превысивших тайм-ауты. Вызывающий абонент будет отправлен в определенную область диалплана, где логика может быть применена для изящной обработки оставшейся части вызова (это может включать в себя простой возврат вызова на другой внутренний номер или выполнение какого-либо вида поиска).
|
||||
|
||||
Также может потребоваться учитывать вызовы, когда исходный канал не может обработать возвращенный припаркованный вызов. Если, например, вызов был припаркован каналом, который также является транком для другой системы, не будет достаточно информации, чтобы отправить вызов обратно правильному абоненту в той системе. Действия после тайм-аута будут более сложными, чем при `comebacktoorigin=yes`, которые можно обрабатывать изящно.
|
||||
|
||||
"Припаркованные вызовы", с параметром `comebacktoorigin=no` всегда будут отправляться в контекст `parkedcallstimeout`.
|
||||
|
||||
---
|
||||
**Примечание**
|
||||
|
||||
Диалплан (и контексты) были подробно рассмотрены в [Главе 6](glava-06.md).
|
||||
|
||||
---
|
||||
|
||||
Внутренний номер, на который они будут отправлены, будет построен на основе имени канала, который запарковал вызов. Например, если узел SIP-пир с именем `0004F2040808` запарковал этот вызов, добавочный номер будет `SIP_0004F2040808`.
|
||||
|
||||
Если это расширение не существует, вместо этого вызов будет отправлен на расширение `s` в контексте `parkedcallstimeout`. Наконец, если расширение `s` в `parkedcallstimeout` не существует, вызов будет отправлен на расширение `s` контекста `default`.
|
||||
|
||||
Кроме того, для любых вызовов, где `comebacktoorigin = no` будет добавлено расширение `SIP_0004F2040808`, созданное в контексте `park-dial`. Это расширение будет настроено для `Dial()` на `SIP/0004F2040808`.[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406331512)
|
||||
|
||||
Если вы используете парковку, вам также понадобится способ объявить о припаркованных вызовах, чтобы пользователи знали как их получить. В то время как вы можете просто бегать по коридору, крича «Боб, тебе звонят по номеру 701!», Более профессиональный метод - использовать систему пейджинга (более формально известную как система громкой связи), которую мы сейчас обсудим.
|
||||
|
||||
### Пейджинг (aka Публичное обращение)
|
||||
|
||||
Во многих системах УАТС полезно подключить телефонную систему к какой-либо системе громкой связи. Это включает в себя набор кода функции или добавочного номера, который устанавливает соединение с каким-то общедоступным ресурсом, а затем делает объявление через телефонную трубку, которое транслируется на все устройства, связанные с этим ресурсом пейджинга (возможно, вы слышали продавца в каком-либо магазине запрашивающего проверку цены по телефону). Как правило это будет внешняя пейджинговая система, состоящая из усилителя, подключенного к потолочным динамикам; однако, пейджинг через колонки офисных телефонов также популярен (в основном по соображениям стоимости). Если у вас есть бюджет (или существующая система оповещения), система оповещения обычно лучше, но пейджинг на основе телефонных аппаратов также может хорошо работать во многих случаях. Также возможно иметь комбинацию пейджинга на основе аппаратов и потолочного, где, например, пейджинг на основе аппаратов будет использоваться для офисов, а система оповещения - для склада, коридора, парковки и зоны общего пользования (столовая, приемная и т.д.).
|
||||
|
||||
В Asterisk для пейджинга используется приложение `Page()`. Это приложение просто принимает список каналов в качестве аргумента, вызывает все перечисленные каналы одновременно и, когда они отвечают, помещает каждый в конференц-зал. Имея это в виду, становится очевидным, что одним из требований работы пейджинга является то, что _каждый канал назначения должен иметь возможность автоматически отвечать на входящее соединение_ и передавать вызов на какой-то динамик (другими словами, `Page()` не будет работать, если все телефоны будут просто звонить).
|
||||
|
||||
Таким образом, хотя само приложение `Page()` является безболезненным и простым в использовании, заставить все каналы назначения правильно обрабатывать входящий пейджинг будет немного сложнее. Мы вернемся к этому в ближайшее время.
|
||||
|
||||
Приложение `Page()` принимает три аргумента: 1) группа каналов, к которым должен быть подключен пейджинг, 2) параметры и 3) время ожидания (таймаут):
|
||||
```
|
||||
exten => *724,1,Noop(Page)
|
||||
same => n,Set(ChannelsToPage=${UserA_DeskPhone}&${UserA_SoftPhone}}&${UserB_DeskPhone})
|
||||
same => n,Page(${ChannelsToPage},i,120)
|
||||
```
|
||||
Параметры (описанные в Таблице 11-2) дают вам некоторую гибкость в отношении того, как работает `Page()`, но большая часть конфигурации будет зависеть от того, как целевые устройства обрабатывают входящее соединение. В следующем разделе мы рассмотрим различные способы настройки устройств для получения пейджинга.
|
||||
|
||||
_Таблица 11-2. Параметры Page()_
|
||||
|
||||
| Параметр | Описание | Объяснение |
|
||||
| :--- | :--- | :--- |
|
||||
| `d` | Включить полнодуплексный звук | Иногда его называют "пейджингом talkback", использование этого параметра подразумевает, что оборудование, принимающее пейджинг, имеет возможность передавать звук обратно одновременно с получением. Как правило, вы не станете использовать это, если у вас нет в нем потребности. | |
|
||||
| `i` | Игнорировать попытки перенаправления вызова | Как правило эту опцию включают, потому что переадресованный вызов может направиться куда угодно и это не то место, куда нужно направиться Вашему пейджингу. |
|
||||
| `q` | Не воспроизводить звуковой сигнал для вызывающего абонента (тихий режим) | Как правило не используется, так как для пейджинга следует подавать звуковой сигнал для предупреждения людей о том, что пейджинг вот-вот установится. Однако, если у вас есть внешний усилитель, который обеспечивает свой собственный сигнал, вы можете установить эту опцию. |
|
||||
| `r` | Записать пейджинг в файл | Если в будущем вы намеревались использовать один и тот же пейджинг несколько раз, то можете записать его, а затем использовать позже, вызывая с помощью `Originate()` или используя опцию `A(x)` для `Page()`. |
|
||||
| `s` | Набирать канал только в том случае, если состояние устройства `NOT_INUSE` | Эта опция, вероятно, полезна (и надежна) только для SIP-каналов, и даже в этом случае может не работать, если на одной линии одновременно разрешены несколько вызовов (довольно часто встречается на SIP-телефонах). Поэтому не полагайтесь на эту опцию во всех случаях. |
|
||||
| `A(x)` | Воспроизвести объявления `х` всем участникам | Вы можете использовать ранее записанный файл для воспроизведения через систему пейджинга. Если вы объедините это с `Originate()` и `Record()`, то могли бы реализовать систему отложенного пейджинга. |
|
||||
| `n` | Не воспроизводить объявление звонящему (подразумевается `A(x)`) | По умолчанию система будет воспроизводить звук пейджинга как для вызывающего, так и для вызываемого абонента. Если эта опция включена, звук пейджинга не будет транслироваться вызывающему абоненту (человеку, выполняющему пейджинг). |
|
||||
|
||||
---
|
||||
**Предупреждение**
|
||||
|
||||
Из-за того, как работает `Page()`, он очень ресурсоемкий. Мы не можем это не подчеркнуть. Внимательно читайте дальше, и мы расскажем, как обеспечить, чтобы пейджинг не вызывал проблем с производительностью в продакшене (что наверняка может случиться, если пейджинг не спроектирован правильно).
|
||||
|
||||
---
|
||||
### Места для отправки Вашего пейджинга
|
||||
|
||||
Как мы уже говорили, `Page()` само по себе очень простое. Хитрость в том, как собрать все это вместе. Пейджинги могут быть отправлены на различные виды каналов, и все они требуют различной конфигурации.
|
||||
|
||||
#### Внешний пейджинг
|
||||
|
||||
Если в здании установлена система громкой связи, общепринято подключать телефонную систему к внешнему усилителю и отправлять пейджинг через вызов на канал. Лучший способ сделать это - использовать какое-либо устройство FXS (такое как ATA), которое подключается через интерфейс пейджинга, такой как Bogen UTI1, [5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406290408), который затем подключается к усилителю пейджинга. [6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406289064)
|
||||
|
||||
Другой популярный способ подключения к пейджинговой системе - подключить выход звуковой карты вашего сервера Asterisk к усилителю пейджинга и отправлять вызовы на канал с именем `Console/DSP`. Нам не нравится этот метод, потому что, хоть он и может показаться недорогим и простым, на практике может занимать много времени. Предполагается, что звуковые драйверы на вашем сервере работают правильно, уровни звука на этом канале нормализуются правильно, на вашем сервере имеется достойная встроенная звуковая карта, заземление хорошее, и ... ну, на наш взгляд, это путь не рекомендуется. [7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406286520)
|
||||
|
||||
В вашем диалплане пейджинг на внешний усилитель будет выглядеть как простой `Dial()` для устройства, подключенного к пейджинговому оборудованию. Вам необходимо настроить ATA так же, как любой SIP-телефон (через `ps_endpoints`, `ps_auth` и т.д. в базе данных), с именем, похожим на `PagingATA`. Затем вы подключаете ATA к Bogen UTI1, и для пейджинга у вас будет этот код диалплана:
|
||||
```
|
||||
exten => *725,1,Verbose(2,Paging to external amplifier) ; '*' является частью того, что вы набираете
|
||||
same => n,Set(PageDevice=PJSIP/PagingATA) ; Это, вероятно, относится к [globals]
|
||||
same => n,Page(${PageDevice},i,120)
|
||||
```
|
||||
|
||||
Вы можете назвать это устройство как угодно (например, мы часто используем MAC-адрес в качестве имени SIP-устройства), но для всего, что не является телефоном пользователя, может быть полезно использовать имя, которое выделяет его из других устройств.
|
||||
|
||||
На рынке также есть много пейджинговых устройств на основе SIP (динамики пейджинга с поддержкой SIP популярны, но как нам кажется, довольно дороги для того, что вы получаете, особенно в большом развертывании).
|
||||
|
||||
#### Аппаратный пейджинг
|
||||
|
||||
Пейджинг на основе аппаратов впервые стал популярным в клавишных телефонных системах, где громкоговорители офисных телефонов используются в качестве системы оповещения бедняков. Большинство SIP-телефонов имеют возможность автоматического ответа на вызов по громкой связи, которая выполняет то, что требуется для каждого телефона. В дополнение к этому необходимо передавать звук более чем в одно устройство одновременно. Asterisk использует встроенный механизм конференц-связи для обработки деталей под капотом. Вы используете приложение `Page()`, чтобы это произошло.
|
||||
|
||||
Как и `Dial()`, приложение `Page()` может обрабатывать несколько каналов. Поскольку вы захотите чтобы `Page()` сигнализировало сразу на несколько устройств (возможно, даже на все устройства в вашей системе), вы можете получить длинные строки устройств, которые будут выглядеть примерно так:
|
||||
```
|
||||
Page(PJSIP/SET1&PJSIP/SET2&PJSIP/SET3&PJSIP/SET4&PJSIP/SET5&PJSIP/SET6&PJSIP/SET7&...
|
||||
```
|
||||
---
|
||||
**Предупреждение**
|
||||
|
||||
За пределами определенного размера система Asterisk не сможет создать несколько аппаратных пейджингов. Например, в офисе с 200 телефонами использование SIP для пейджинга каждого устройства будет невозможно; трафик и загрузка процессора на вашем сервере Asterisk были бы просто слишком велики. В таких случаях вы должны смотреть либо на многоадресный пейджинг, либо на внешний.
|
||||
|
||||
---
|
||||
|
||||
Возможно, самая сложная часть пейджинга для SIP-устройств заключается в том, что вам обычно приходится указывать каждому устройству, что оно должно отвечать на вызов автоматически, но разные производители SIP-телефонов используют разные SIP-сообщения для этой цели. Таким образом, в зависимости от используемой вами модели телефона команды, необходимые для выполнения пейджинговой связи на основе SIP, будут разными. Вот некоторые примеры:
|
||||
|
||||
* Для Mitel (ранее известны как Aastra):
|
||||
```
|
||||
exten => *726,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 => *727,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 => *728,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 => *729,1,Verbose(2,Paging to Cisco SPA sets, but not Cisco 79XX sets)
|
||||
same => n,SIPAddHeader(Call-Info:\;answer-after=0) ; Cisco SPA phones
|
||||
same => n,Set(PageDevice=SIP/0004F2000000)
|
||||
same => n,Page(${PageDevice},i)
|
||||
```
|
||||
Полагаем вы поняли, что произойдет, если у вас такое сочетание телефонов в рабочей среде? Как вы контролируете, какие заголовки отправлять на определенные телефоны? [8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406263240)
|
||||
|
||||
В любом случае, это некрасиво.
|
||||
|
||||
К счастью, многие из этих устройств поддерживают многоадресную IP-рассылку, что является гораздо лучшим способом отправки пейджинга нескольким устройствам (для подробностей читайте далее). Тем не менее, если в вашей системе всего несколько телефонов одного производителя, пейджинг на основе SIP может быть самым простым способом, поэтому мы не хотим вас напугать.
|
||||
|
||||
#### Многоадресный пейджинг через канал MulticastRTP
|
||||
|
||||
Если вы серьезно относитесь к пейджингу через аппараты в вашей системе, и у вас есть более чем горсть телефонов, вам нужно будет посмотреть на использование IP-многоадресной рассылки. Концепция IP multicast существует уже давно time,[9](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406256840) но он не получил широкого распространения. Тем не менее, он идеально подходит для пейджинга в пределах одного места.
|
||||
|
||||
Asterisk имеет канал (`chan_multicast_rtp`), предназначенный для создания многоадресной рассылки RTP. На этот поток затем подписываются различные телефоны, и в результате каждый раз, когда медиапоток появляется в многоадресном потоке, телефоны передают его на свои динамики.
|
||||
|
||||
Поскольку `MulticastRTP` является драйвером канала, он не имеет приложения, но вместо этого будет работать в любом месте диалплана, где вы могли бы использовать канал иначе. В нашем случае мы будем использовать приложение `Page()` для инициирования нашей многоадресной рассылки.
|
||||
|
||||
Чтобы использовать многоадресный канал, вы просто посылаете ему вызов так же, как и любому другому каналу. Синтаксис канала выглядит следующим образом:
|
||||
```
|
||||
MulticastRTP/type/ip address:port[/linksys address:port]
|
||||
```
|
||||
Тип может быть либо `basic`, либо `linksys`. Основной синтаксис канала `MulticastRTP` выглядит следующим образом:
|
||||
```
|
||||
exten => *730,1,Page(MulticastRTP/basic/239.0.0.1:1234)
|
||||
```
|
||||
Не все устройства поддерживают IP multicast, но мы протестировали его на Snom,[10](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html#idm46178406245224) 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 Key System: Yes`
|
||||
* `Multicast Address: 239.0.0.1:6061`
|
||||
|
||||
Обратите внимание, что адрес групповой адресации, назначенный телефону, является вторым в определении канала (в нашем примере используется порт 6061).
|
||||
|
||||
Обратите внимание, что вы можете написать команду `Page()` в этом формате в среде, где есть сочетание телефонов SPA (ранее Linksys, теперь Cisco) и других типов. Другие телефоны будут использовать первый адрес и будут работать так же, как если бы вы использовали `basic` вместо `linksys`.
|
||||
|
||||
---
|
||||
|
||||
#### SIP-адаптеры для пейджинга
|
||||
|
||||
На рынке существует множество пейджинговых динамиков на основе SIP. Эти устройства адресуются в диалплане точно так же, как SIP ATA, подключенный к UTI1 (другими словами для системы это просто телефонный аппарат), но физически они похожи на внешние пейджинговые динамики. Поскольку они отвечают автоматически, как правило нет необходимости передавать им какую-либо дополнительную информацию, как при использовании SIP-телефона.
|
||||
|
||||
Для небольших установок (где требуется не более полудюжины колонок), эти устройства могут быть экономически эффективными, поскольку не требуют никакого другого оборудования. Однако, для чего-либо большего (или для установки в сложной среде, такой как склад или автостоянка), вы получите лучшую производительность при гораздо меньших затратах с традиционной аналоговой системой оповещения, подключенной к телефонной системе через аналоговый (FXS) интерфейс.
|
||||
|
||||
У нас не было опыта работы с этими типами устройств, но есть надежда, что они будут поддерживать многоадресную передачу в качестве стандарта. Имейте это в виду, если планируете использовать большое их количество. Обычно лучше заказать одно устройство, протестировать его в прототипной конфигурации, и лишь когда вы убедитесь, что оно делает то, что вам нужно, расчитать количество.
|
||||
|
||||
#### Комбинации пейджинга
|
||||
|
||||
Во многих организациях может потребоваться как пейджинг на основе аппаратов, так и внешний пейджинг. Например, производственному объекту может потребоваться использовать аппаратный пейджинг для офиса, но потолочный для завода и склада. С точки зрения Asterisk, это довольно просто сделать. Когда вы вызываете приложение `Page()`, то просто указываете различные ресурсы, на которые хотите отправить пейджинг, разделенные символом `&` и все они будут включены в конференцию, которую создает приложение `Page()`.
|
||||
|
||||
#### Соберем все это вместе
|
||||
|
||||
На данный момент у вас должен быть список различных типов каналов, на которые вы хотите отправить пейджинг. Поскольку `Page()` почти всегда будет сигнализировать о более чем одном канале, мы рекомендуем установить глобальную переменную в разделе `[globals]` вашего файла _extensions.conf_, которая определяет список включаемых каналов, а затем вызвать приложение `Page()` с этой строкой:
|
||||
|
||||
```text
|
||||
[globals]
|
||||
MULTICAST=MulticastRTP/linksys/239.0.0.1:1234
|
||||
;MULTICAST=MulticastRTP/linksys/239.0.0.1:1234/239.0.0.1:6061 ; if you have SPA phones
|
||||
|
||||
BOGEN=PJSIP/ATAforPaging ; Assumes an ATA named [ATAforPaging]
|
||||
PAGELIST=${MULTICAST}&${BOGEN} ; Variable names are arbitrary.
|
||||
;...
|
||||
|
||||
[sets]
|
||||
; ...
|
||||
exten => *731,1,Page(${PAGELIST},i,120)
|
||||
```
|
||||
Этот пример предлагает несколько возможных конфигураций, в зависимости от оборудования. Хотя строго не требуется, чтобы была определена переменная `PAGELIST`, мы обнаружили, что это будет иметь тенденцию упрощать управление несколькими ресурсами пейджинга, особенно во время процесса настройки и тестирования.
|
||||
|
||||
### Зоны пейджинга
|
||||
|
||||
Зонирование пейджинга популярно в таких местах, как автомобильные дилерские центры, где отдел запчастей, отдел продаж и, возможно, отдел подержанных автомобилей требуют пейджинга, но не хотят (или не должны) слышать пейджинги друг друга.
|
||||
|
||||
В зонировании пейджинга пользователь, отправляющий пейджинг, должен выбрать, в какую зону будет помещен пейджинг. Контроллер зоны пейджинга, такой как Bogen PCM2000, обычно используется для обеспечения сигнализации различных зон: приложение `Page()` сигнализирует контроллеру зоны, контроллер зоны отвечает, а затем отправляется дополнительная цифра для выбора зоны, в которую должен быть отправлен пейджинг. Большинство контроллеров зон позволяют создавать пейджинги для всех зон, в дополнение к объединению зон (например, пейджинги для отделов продаж новых и подержанных автомобилей).
|
||||
|
||||
Вы также можете иметь отдельные расширения в диалплане, которые будут разделять ATAs (или группы телефонов), но это может оказаться более сложным и дорогостоящим, чем просто покупка контроллера пейджинга, предназначенного для обработки этого. Зонирование пейджинга не требует каких-либо существенно отличающихся технологий, но оно требует немного больше размышлений и планирования в отношении как диалплана, так и аппаратного обеспечения.
|
||||
|
||||
И это парковка и пейджинг. Это тонна информации, которую нужно переварить, но как только вы ее освоите, все покажется вполне логичным.
|
||||
|
||||
## Продвинутая конферец-связь
|
||||
|
||||
Приложение `ConfBridge()` - это продвинутое приложение для конференц-связи в Asterisk, которое обеспечивает передачу звука высокой четкости и базовых видеоконференций. Ранее мы ввели базовую рабочую настройку для `ConfBridge()`. Если вы создаете свой диалплан во время чтения, то найдете базовый мост конференции в файле _extensions.conf_, который выглядит примерно так:
|
||||
```
|
||||
exten => 221,1,NoOp()
|
||||
same => n,ConfBridge(${EXTEN})
|
||||
```
|
||||
В традиционной конфигурации Asterisk будет файл _confbridge.conf_, в котором мы можем настроить параметры для применения в различных сценариях. Это все еще возможно, но больше не имеет смысла делать это таким образом. Итак, мы собираемся пропустить сразу весь файл конфигурации, за исключением того, чтобы сказать, что файл примера (находится по адресу _~/src/asterisk-15.<TAB>/configs/samples/confbridge.conf.sample_) теперь становится отличным справочный документ, но не более того. Продолжайте читать и поймёте.
|
||||
|
||||
Прежде всего, нам нужно объяснить, что для конференции можно настроить три типа элементов, а именно `bridge`, `menu` и `user`.
|
||||
|
||||
Тип `bridge` определяет сами конференц-залы, тип `menu` определяет меню, к которому можно получить доступ из конференций, а тип `user` позволяет различным участникам конференции применять к ним определенную конфигурацию. Например, большая конференц-связь может иметь докладчика (который будет вести большую часть разговора), администратора (для помощи докладчику) и десятки участников (которым может быть запрещено выступать).
|
||||
|
||||
Давайте для начала создадим подпрограмму:
|
||||
```text
|
||||
[subConference]
|
||||
exten => _[0-9].,1,Noop(Creating conference room for ${EXTEN})
|
||||
same => n,Goto(${ARG1})
|
||||
same => n,Noop(INVALID ARGUMENT ARG1: ${ARG1})
|
||||
same => n(admin),Noop()
|
||||
same => n,Authenticate(${ARG2}) ; Можно также использовать ,Set(CONFBRIDGE(user,pin)=${ARG2})
|
||||
same => n,Set(ConfNum=$[${EXTEN} - 1]) ; Hack: вычтите 1, чтобы получить номер конференции
|
||||
same => n,Set(CONFBRIDGE(bridge,record_conference)=yes) ; Запись, когда прибыл админ
|
||||
same => n,Set(RecordingFileName=${ConfNum}-${STRFTIME(,,%Y-%m-%d %H:%m:%S)})
|
||||
same => n,Set(CONFBRIDGE(bridge,record_file)=${RecordingFileName}) ; уникальное имя
|
||||
same => n,Set(CONFBRIDGE(user,admin)=yes) ; Админ
|
||||
same => n,Set(CONFBRIDGE(user,marked)=yes) ; Маркировать этого пользователя
|
||||
same => n,Set(CONFBRIDGE(menu,7)=decrease_talking_volume) ; Уменьшить громкость
|
||||
same => n,Set(CONFBRIDGE(menu,9)=increase_talking_volume) ; Увеличить громкость
|
||||
same => n,Set(CONFBRIDGE(menu,4)=set_as_single_video_src) ; Блокировать видео на меня
|
||||
same => n,Set(CONFBRIDGE(menu,5)=release_as_single_video_src) ; Вернуться к докладчику
|
||||
same => n,Set(CONFBRIDGE(menu,6)=admin_toggle_mute_participants); Отключить звук у всех, кроме администраторов
|
||||
same => n,Set(CONFBRIDGE(menu,2)=participant_count) ; Сколько участников?
|
||||
same => n,ConfBridge(${ConfNum})
|
||||
same => n,Return()
|
||||
same => n(participant),Noop()
|
||||
same => n,Set(ConfNum=${EXTEN})
|
||||
same => n,Set(CONFBRIDGE(user,wait_marked)=yes) ; Ждите маркированного пользователя
|
||||
same => n,Set(CONFBRIDGE(user,announce_only_user)=no) ; Ждите маркированного пользователя
|
||||
same => n,Set(CONFBRIDGE(user,music_on_hold_when_empty)=yes) ; Ждите маркированного пользователя
|
||||
same => n,Set(CONFBRIDGE(menu,7)=decrease_talking_volume) ; Уменьшить громкость
|
||||
same => n,Set(CONFBRIDGE(menu,9)=increase_talking_volume) ; Увеличить громкость
|
||||
same => n,ConfBridge(${ConfNum})
|
||||
same => n,Return()
|
||||
```
|
||||
Мы можем установить параметры `bridge`, `user` и `menu` как в предыдущем примере. Все параметры, которые вы можете использовать, описаны в файле _~/src/asterisk-15.<TAB>/configs/samples/confbridge.conf.sample_.
|
||||
|
||||
Когда мы вызываем подпрограмму, то можем передать пользователя в качестве аргумента. Поместите следующий новый код в ваш контекст `[sets]` после `_55512XX` и до `*724`:
|
||||
```text
|
||||
exten => _55512XX,1,Answer()
|
||||
same => n,Playback(tt-monkeys)
|
||||
; ConfBridge
|
||||
exten => *600,1,GoSub(subConference,${EXTEN:1},1(participant)) ;
|
||||
exten => *601,1,GoSub(subConference,${EXTEN:1},1(admin,4242)) ;
|
||||
exten => *724,1,Noop(Page)
|
||||
same => n,Set(ChannelsToPage=${UserA_DeskPhone}&${UserA_SoftPhone}&${UserB_DeskPhone})
|
||||
same => n,Page(${ChannelsToPage},i,120)
|
||||
```
|
||||
Если вы наберете *600, то станете участником. Если наберете *601, вас попросят ввести PIN-код (4242) и вы присоединитесь как администратор. Мы использовали метки диалплана для управления потоком вызовов в подпрограмме. Его легко читать и легко администрировать.
|
||||
|
||||
В [Главе 15](glava-15.md) мы узнаем, как использовать внешнюю базу данных для хранения и получения этих параметров, а не жестко кодировать их в диалплане.
|
||||
|
||||
### Видео-конференцсвязь
|
||||
|
||||
Механизм конференций в Asterisk может обрабатывать видео, но это очень упрощенное предложение, и вы должны тщательно оценить его чтобы убедиться, что оно соответствует вашим потребностям. Некоторые из более серьезных ограничений включают в себя:
|
||||
|
||||
* Все участники видеоконференции должны использовать один и тот же видеокодек; в Asterisk нет возможности перекодирования видео.
|
||||
* В Asterisk отсутствует мультиплексирование видео; одновременно участнику может быть показан только один источник видео.
|
||||
|
||||
Чтобы пользователь мог использовать видео (будь то в конференции или просто для обычных вызовов), ему необходимо включить видеокодеки. Это можно сделать, изменив поле `allow` в таблице `asterisk.endpoints` и добавив `h264, vp8` в поле `allow`. Убедитесь, что вы не удаляете кодеки, которые уже есть (например, аудиокодек ulaw). Функциональная запись в этом поле может выглядеть следующим образом:
|
||||
```
|
||||
ulaw,h264,vp8
|
||||
```
|
||||
Прежде чем пытаться использовать видео с вашими конференциями, убедитесь, что ваши устройства могут использовать его с прямыми вызовами. Если вы можете использовать видеоконференции между вашими устройствами, вполне вероятно, что это также будет работать в ваших конференц-залах.
|
||||
|
||||
В [Главе 20](glava-20.md) мы погрузимся в WebRTC, где исследуем более мощные концепции в предоставлении мультимедийной коммуникации, включая конференц-связь.
|
||||
|
||||
## Вывод
|
||||
|
||||
В этой главе мы рассмотрели файл _features.conf_, который содержит функциональные возможности для включения трансфера через набор DTMF, записи звонков во время разговора и настройки парковок для одной или нескольких компаний. Мы также рассмотрели различные способы объявления вызовов и информации людям в офисе с использованием множества методов пейджинга, в том числе традиционных систем служебного оповещения и многоадресной пейджинговой связи на телефонные аппараты на рабочих столах сотрудников. После этого мы углубились в приложение `ConfBridge()`, которое чрезвычайно гибко в настройке и имеет множество доступных функций. Это исследование различных методов реализации традиционных функций парковки, пейджинга и конференций современным способом, надеюсь покажет вам гибкость, которую может предложить Asterisk.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406491144-marker) Да, мы понимаем, что SIP INFO сообщение на самом деле является сообщением SIP и технически не является частью аудиоканала, но дело в том, что вы не можете использовать кнопку «передача» или «парковка» на своем телефоне SIP для доступа к этим функциям во время разговора. Вам нужно будет отправить DTMF.
|
||||
|
||||
[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406451032-marker) В синтаксисе есть некоторая гибкость (подробности можно посмотреть в файле примера), но в нашем примере используется стиль, который мы рекомендуем, поскольку он наиболее соответствует типичному синтаксису диалплана.
|
||||
|
||||
[3](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406440184-marker) Мы рассмотрим AGI в [Главе 18](glava-18.md), но вкратце скрипты AGI - это внешние программы, которые вы можете запускать из диалплана. Удобно? Очень!
|
||||
|
||||
[4](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406331512-marker) Мы надеемся вы понимаете, что фактический добавочный номер будет связан с названием канала, который запарковал вызов, и не будет `SIP_0004F2040808` (если Лейф не продаст вам телефон Polycom из своей лаборатории).
|
||||
|
||||
[5](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406290408-marker) Bogen UTI1 полезен тем, что он может обрабатывать все входящие и исходящие соединения, что практически гарантирует безболезненность подключения вашей телефонной системы к любому виду внешнего пейджингового оборудования, независимо от его возраста или неясности. Стоимость устройства может быть компенсирована за счет экономии времени благодаря специальному, полнофункциональному интерфейсу, напоминающему швейцарский армейский нож, с существующей системой громкой связи (или, в этом отношении, как часть новой системы оповещения).
|
||||
|
||||
[6](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406289064-marker) В этой книге мы предполагаем, что внешнее пейджинговое оборудование уже установлено и работает со старой телефонной системой, но ничто не мешает вам установить совершенно новую систему оповещения и подключить ее к вашей системе Asterisk. Возможно, вы чувствуете, что мы подключаем Bogen здесь очень быстро, но это просто потому, что они очень долго занимались телефонной связью. Мы используем их в течение почти 30 лет, но они делают это дольше, поэтому, пока вам удобно собирать все части, вы можете выполнить работу правильно с первого раза.
|
||||
|
||||
[7](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406286520-marker) Если вам это интересно, мы хотим предложить попробовать это в своей лаборатории. Это может оказаться очень полезным может сэкономить некоторые расходы на оборудование. Мы только что обнаружили, что аппаратное обеспечение дешевле, чем трудозатраты, поэтому предпочли бы потерять пару сотен долларов на заведомо исправном оборудовании, а не на том, чтобы какой-то плохой техник копался на месте в течение восьми часов, а расстроенный клиент требовал знать, когда возникшая проблема с пейджингом будет решена.
|
||||
|
||||
[8](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406263240-marker) Подсказка: локальный канал здесь будет вашим другом.
|
||||
|
||||
[9](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406256840-marker) Он даже имеет свое собственное пространство зарезервированных IP-адресов класса D, от 224.0.0.0 до 239.255.255.255 (но прочитайте про IP-multicast прежде чем просто взять один из них и назначить его). Часть этого адресного пространства являются частным, часть - общедоступной и некоторые предназначены для целей, отличных от тех, для которых вы желаете их использовать. Информацию о многоадресной адресации можно найти на [странице Википедии](https://ru.wikipedia.org/wiki/Мультивещание).
|
||||
|
||||
[10](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch11.html%22%20/l%20%22idm46178406245224-marker) Очень громко, и нет возможности отрегулировать усиление.
|
||||
|
||||
[Глава 10. Погружение в диалплан](glava-10.md) | [Содержание](SUMMARY.md) | [Глава 12. Automatic Call Distribution Queues](glava-12.md)
|
|
@ -0,0 +1,197 @@
|
|||
# Глава 13. Состояния устройств
|
||||
|
||||
> Среди беспорядка найдите простоту.
|
||||
>
|
||||
> --_Albert Einstein_
|
||||
|
||||
Часто бывает полезно иметь возможность определить состояние устройств, подключенных к телефонной системе. Например, оператору в приемной может потребоваться видеть статусы всех сотрудников офиса, чтобы определить, может ли кто-то принять телефонный звонок. Сам Asterisk нуждается в такой же информации. В качестве другого примера, если вы создали очередь вызовов, как описано в [Главе 12](glava-15.md), Asterisk должен знать, когда агент становится доступен, чтобы можно было отправить другой вызов. В этой главе рассматриваются понятия состояний устройства в Asterisk, а также способы использования и доступа устройств и приложений к этой информации.
|
||||
|
||||
## Состояния устройств
|
||||
|
||||
Существует две категории устройств, для которых Asterisk предоставляет информацию о состоянии: канальные устройства (такие как конечные точки PJSIP) и виртуальные (являющиеся встроенными службами, которые можно отслеживать, например конференц-залы).
|
||||
|
||||
Чтобы ссылаться на состояние _канала_, Вы делаете это точно так же, как с `Dial()`, например `DEVICE_STATE(PJSIP/000f300B0B02)`, тогда как для ссылки на состояние _виртуального устройства_ используется формат `тип виртуального устройства:идентификатор`, например `DEVICE_STATE(ConfBridge:1234)`.
|
||||
|
||||
Виртуальные устройства включают вещи, которые находятся внутри Asterisk, но предоставляют полезную информацию о состоянии (см. [Таблицу 13-1](13.%20Device%20States%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22table-virtualDevices)\).
|
||||
|
||||
Таблица 13-1. Устройства, для которых Asterisk может предоставлять информацию о состоянии
|
||||
|
||||
| Устройство | Описание |
|
||||
| :--- | :--- |
|
||||
| `PJSIP/channel name` | Многие каналы позволяют контролировать их состояние, но канал PJSIP предлагает на сегодняшний день наибольшее количество полезных данных; таким образом, мониторинг SIP-устройств является наиболее распространенным использованием `DEVICE_STATE`. |
|
||||
| `ConfBridge:conference bridge` | Состояние конференц-моста MeetMe. Состояние будет отражать, имеются ли в настоящее время участники в конференц-зале. Более подробную информацию об использовании `MeetMe()` для конференц-связи можно найти в [Главе 11](glava-11.md). |
|
||||
| `Custom:custom name` | Пользовательские состояния устройств. Эти состояния имеют пользовательские имена и изменяются с помощью функции `DEVICE_STATE()`. Пример использования можно найти в разделе ["Использование пользовательских состояний устройств"](glava-13.md#Использование-пользовательских-состояний-устройств). |
|
||||
| `Park:exten@context` | Состояние слота парковки вызова. Информация о состоянии будет отражать, припаркован ли вызывающий абонент в данный момент на этом добавочном номере. Дополнительную информацию о парковке вызовов в Asterisk можно найти в ["Парковке вызовов"](glava-11.md#Парковка-вызовов). |
|
||||
| `Calendar:calendar name` | Состояние календаря. Asterisk будет использовать содержимое названного календаря, чтобы установить состояние `available` или `busy`. |
|
||||
|
||||
### Проверка состояний устройств
|
||||
|
||||
Функция диалплана `DEVICE_STATE()` считывает текущее состояние устройства.
|
||||
```
|
||||
exten => 7012,1,Answer()
|
||||
same => n,Set(DeviceIdent=PJSIP/000f300B0B02)
|
||||
same => n,Verbose(3,${DeviceIdent} is ${DEVICE_STATE($DeviceIdent})})
|
||||
same => n,Hangup()
|
||||
```
|
||||
Если мы вызываем расширение 7012 с того же устройства, на котором проверяем состояние, в консоли Asterisk появляется следующее подробное сообщение:
|
||||
```
|
||||
-- PJSIP/000f300B0B02 is INUSE
|
||||
```
|
||||
---
|
||||
#### Примечание
|
||||
|
||||
В [Главе 17](glava-17.md) обсуждается Asterisk Manager Interface (AMI). Действие диспетчера `GetVar` можно использовать для получения значения состояния устройства из внешней программы. Вы можете использовать его для получения значения обычной переменной или для возврата значения из функции диалплана, например `DEVICE_STATE()`.
|
||||
|
||||
---
|
||||
|
||||
Вот список значений, которые вернет функция `DEVICE_STATE()` (в зависимости, конечно, от того, что было найдено):
|
||||
|
||||
* `UNKNOWN`
|
||||
* `NOT_INUSE`
|
||||
* `INUSE`
|
||||
* `BUSY`
|
||||
* `INVALID`
|
||||
* `UNAVAILABLE`
|
||||
* `RINGING`
|
||||
* `RINGINUSE`
|
||||
* `ONHOLD`
|
||||
|
||||
Эта информация может затем использоваться в диалплане для принятия решений о потоке вызовов (например, локальный канал вызова агента может использовать эту информацию для определения того, что телефон агента находится на вызове по другой линии, и таким образом отклонить вызов, чтобы тот вернулся в очередь).
|
||||
|
||||
## Состояния расширения используя директиву hint
|
||||
|
||||
Состояние расширения - это механизм диалплана, который Asterisk использует, чтобы разрешить SIP-устройствам подписываться на информацию о присутствии. Например, телефон в приемной может иметь модуль Busy Lamp Field (BLF), содержащий кнопки, которые будут использоваться для отображения состояний различных телефонов в офисе. Телефон с BLF будет отправлять запросы на подписку, чтобы сообщить Asterisk, с каких устройств он хочет получать информацию о присутствии. В диалплане мы используем директиву hint для определения сопоставления между расширением и одним или несколькими устройствами.
|
||||
|
||||
### Хинты
|
||||
|
||||
Чтобы определить хинт в диалплане, вместо приоритета используется ключевое слово `hint`.
|
||||
```
|
||||
[hints]
|
||||
;exten = <extension>,hint,<device state id>[& <more dev state id],<presence state id>
|
||||
|
||||
exten => 100,hint,${UserA_DeskPhone}
|
||||
|
||||
exten => 221,hint,ConfBridge:221
|
||||
```
|
||||
Часто вы можете увидеть хинты, определенные в том же разделе диалплана, что и обычные расширения. Это может сделать диалплан немного визуально загроможденным, и это также предполагает, что хинт так или иначе связан с набираемым добавочным номером, что на самом деле не так.
|
||||
```
|
||||
[sets]
|
||||
|
||||
exten => 100,hint,${UserA_DeskPhone}
|
||||
exten => 100,1,Gosub(subDialUser,${EXTEN},1(${UserA_DeskPhone},${EXTEN},default,22))
|
||||
exten => 101,hint,${UserA_SoftPhone}
|
||||
exten => 101,1,Gosub(subDialUser,${EXTEN},1(${UserA_SoftPhone},${EXTEN},default,23))
|
||||
exten => 102,hint,${UserB_DeskPhone}
|
||||
exten => 102,1,Gosub(subDialUser,${EXTEN},1(${UserB_DeskPhone},${EXTEN},default,26))
|
||||
exten => 103,hint,${UserB_SoftPhone}
|
||||
exten => 103,1,Gosub(subDialUser,${EXTEN},1(${UserB_SoftPhone},${EXTEN},default,24))
|
||||
|
||||
exten => 110,1,Dial(${UserA_DeskPhone}&${UserA_SoftPhone}&${UserB_SoftPhone})
|
||||
```
|
||||
В нашем примере мы сделали прямую взаимосвязь между добавочным номером подсказки и набираемым добавочным номером, хотя этого не требуется.
|
||||
|
||||
### Проверка состояний внутреннего номера
|
||||
|
||||
Самый простой способ проверить текущее состояние хинтов расширений - через CLI Asterisk. Команда `core show hints` отобразит все настроенные в данный момент хинты:
|
||||
```
|
||||
*CLI> core show hints
|
||||
-= Registered Asterisk Dial Plan Hints =-
|
||||
100@hints : PJSIP/0000f30A0A01 State:Unavailable Presence:not_set Watchers 0
|
||||
101@hints : PJSIP/SOFTPHONE_A State:Unavailable Presence:not_set Watchers 0
|
||||
102@hints : PJSIP/0000f30B0B02 State:Unavailable Presence:not_set Watchers 0
|
||||
103@hints : PJSIP/SOFTPHONE_B State:Unavailable Presence:not_set Watchers 0
|
||||
110@hints : PJSIP/0000f30A0A01&P State:Unavailable Presence:not_set Watchers 0
|
||||
221@hints : ConfBridge:221 State:Unavailable Presence:not_set Watchers 0
|
||||
----------------
|
||||
- 6 hints registered
|
||||
```
|
||||
В дополнение к отображению состояния каждого хинта, вывод `core show hints` также выводит количество наблюдателей. _Наблюдатель_ - это объект, который подписался на получение обновлений о состоянии этого расширения. Если конечная точка SIP подписывается на состояние добавочного номера, количество наблюдателей будет увеличено.
|
||||
|
||||
Состояние расширения также может быть получено с помощью функции диалплана `EXTENSION_STATE()`. Эта функция работает так же, как `DEVICE_STATE()`, описанная в предыдущем разделе. Добавьте следующий пример в файл _/etc/asterisk/extensions.conf_ как новое расширение сразу после 235:
|
||||
|
||||
```
|
||||
exten => 234,1,NoOp()
|
||||
same => n,Set(FEATURE(parkingtime)=60)
|
||||
|
||||
exten => 235,1,Noop(The state of 100@hints is ${EXTENSION_STATE(100@hints)} )
|
||||
same => n,Hangup()
|
||||
|
||||
exten => 321,1,NoOp()
|
||||
```
|
||||
Когда это расширение вызывается из конечной точки с номером 100, в консоли Asterisk отобразится следующее сообщение:
|
||||
```
|
||||
-- The state of 100@hints is INUSE
|
||||
```
|
||||
В следующем списке перечислены возможные значения, которые могут быть возвращены функцией `EXTENSION_STATE()`:
|
||||
|
||||
* `UNKNOWN`
|
||||
* `NOT_INUSE`
|
||||
* `INUSE`
|
||||
* `BUSY`
|
||||
* `UNAVAILABLE`
|
||||
* `RINGING`
|
||||
* `RINGINUSE`
|
||||
* `HOLDINUSE`
|
||||
* `ONHOLD`
|
||||
|
||||
## SIP-присутствие
|
||||
|
||||
Asterisk дает устройствам возможность подписаться на состояние расширения с использованием протокола SIP. Эту функцию часто называют BLF (Busy Lamp Field); см. [Рисунок 13-1](13.%20Device%20States%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22fig1301).
|
||||
|
||||

|
||||
|
||||
_Рисунок 13-1. Busy Lamp Field или боковая панель_
|
||||
|
||||
Конфигурация модуля будет немного (или очень) отличаться для каждого производителя; однако информация о подписке, так или иначе, должна включать следующее:
|
||||
* Адрес сервера Asterisk (это может быть определено для каждой кнопки или может применяться ко всему телефону).
|
||||
* Контекст для подписки (в нашем примере диалплана он называется `[hints]`). Этот параметр определяется в поле `subscribe_context` таблицы `asterisk.ps_endpoints`.
|
||||
* Соответствующее расширение (100, 101, 102 и т.д.)[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html%22%20/l%20%22idm46178405538488)
|
||||
|
||||
Один из самых простых и недорогих способов тестирования присутствия - использование opensource софтфона для Windows, MicroSIP[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405536680). Сначала вам нужно скачать MicroSIP и зарегистрировать его в вашей системе Asterisk. Затем на вкладке контактов софтфона вы можете щелкнуть правой кнопкой мыши в открытой области, чтобы добавить контакт. В разделе «Имя» вы можете указать все что пожелаете, но в разделе «Номер» вы должны ввести `extension@hints context`, который в нашем случае будет одним из `100@hints`, `101@hints`, `102@hints` или `103@hints`. Если вы настроили все в Asterisk согласно предыдущим примерам, то должны увидеть, как состояние ваших подписок меняется в зависимости от того, что делает устройство. Вы также можете отслеживать это с точки зрения Asterisk с помощью такой команды:
|
||||
```
|
||||
$ watch -n 0.5 "sudo asterisk -rx 'core show hints'"
|
||||
```
|
||||
Конфигурация присутствия на физических настольных телефонах по существу одинакова, но может быть сложнее понять конкретный синтаксис, который требуется каждому производителю. Наш совет - заставить его работать с MicroSIP (который вы сможете запустить на WINE под Linux или macOS). Это простая установка, и оттуда у вас будет отличная конфигурация, которой вы можете доверять, когда выбираете аналогичную конфигурацию для одного из ваших настольных телефонов.
|
||||
|
||||
## Использование пользовательских состояний устройств
|
||||
|
||||
В дополнение к устройствам, которые Asterisk знает как внутренне контролировать (`PJSIP`, `ConfBridge`, `Park`, `Calendar`), Asterisk также предоставляет возможность создавать собственные состояния устройств, которые могут быть очень полезны при разработке некоторых интересных приложений.
|
||||
|
||||
Пользовательские состояния устройства определяются с помощью префикса `Custom:`. Текст, который идет после префикса, может быть чем угодно. Чтобы установить или прочитать значение пользовательского состояния устройства, используйте функцию диалплана `DEVICE_STATE()`. Поместите это в свой файл _extensions.conf_ сразу после расширения 235:
|
||||
```
|
||||
exten => 235,1,Noop(The state of 100@hints is ${EXTENSION_STATE(100@hints)} )
|
||||
same => n,Hangup()
|
||||
|
||||
exten => 236,1,Noop(Set a custom status)
|
||||
same => n(blink),Set(DEVICE_STATE(Custom:rudolph)=UNAVAILABLE)
|
||||
same => n,Set(DEVICE_STATE(Custom:santa)=NOT_INUSE)
|
||||
same => n,Wait(0.75)
|
||||
same => n,Set(DEVICE_STATE(Custom:rudolph)=NOT_INUSE)
|
||||
same => n,Set(DEVICE_STATE(Custom:santa)=UNAVAILABLE)
|
||||
same => n,Wait(0.75)
|
||||
same => n,Goto(blink)
|
||||
```
|
||||
Затем добавьте это себе в контекст `[hints]`:
|
||||
```
|
||||
exten => 221,hint,ConfBridge:221
|
||||
exten => santa,hint,Custom:santa
|
||||
exten => rudolph,hint,Custom:rudolph
|
||||
```
|
||||
Весело, да?
|
||||
|
||||
---
|
||||
#### Примечание
|
||||
|
||||
Вы заметите, что когда вы повесите трубку, одно из пользовательских состояний устройств останется "Unavailable". Это важный момент: в системе нет ничего, что обновляло бы ваши пользовательские состояния устройства, если вы сами не внедрили что-то для этого.
|
||||
|
||||
---
|
||||
|
||||
## Вывод
|
||||
|
||||
Функциональность состояний устройств в Asterisk может использоваться для отслеживания состояния различных ресурсов и доставки информации об этих состояниях различным подписчикам. Обычно (и традиционно) используется для BLF, пользовательское состояние устройства позволяет этому ресурсу быть гораздо более гибким, чем в традиционной УАТС.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405538488-marker) Элементы 2 и 3 могут быть сформированы в виде одной строки, похожей на 100@hints или что-то подобное.
|
||||
|
||||
[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405536680-marker) Который написан с использованием той же библиотеки PJSIP что использует Asterisk.
|
||||
|
||||
[Глава 12. Automatic Call Distribution Queues](glava-12.md) | [Содержание](SUMMARY.md) | [Глава 14. Автосекретарь](glava-14.md)
|
|
@ -0,0 +1,322 @@
|
|||
# Глава 14. Автосекретарь
|
||||
|
||||
> _Я не отвечаю на звонки. У меня всегда такое чувство, что на другом конце провода кто-то есть._
|
||||
>
|
||||
> -- Фред Коуплз
|
||||
|
||||
Во многих УАТС, как правило, есть система меню для автоматического ответа на входящие вызовы, которая позволяет абонентам направлять себя на различные расширения и ресурсы в системе с помощью выбора меню. Эта система известна в телекоммуникационной отрасли как _автосекретарь_ (АС). АС, как правило, предоставляет следующие возможности:
|
||||
|
||||
* Перевод на добавочный номер
|
||||
* Перевод на голосовую почту
|
||||
* Переход в очередь
|
||||
* Воспроизведение сообщения (например “наш адрес…”)
|
||||
* Подключение к подменю (например “для получения списка наших отделов...”)
|
||||
* Подключение к приемной
|
||||
* Повтор выбора
|
||||
|
||||
Для всего остального, особенно если требуется внешняя интеграция, например поиск по базе данных, обычно требуется интерактивное голосовое меню (сокращенно на английском - IVR).
|
||||
|
||||
## АС это не IVR
|
||||
|
||||
В open source телеком-сообществе вы часто услышите термин IVR, используемый для описания автосекретаря.<sup><a href="#sn1">1</a></sup> Однако в телекоммуникационной отрасли в течение многих десятилетий до появления VoIP или УАТС с открытым исходным кодом IVR отличался от AС. По этой причине, когда вы говорите с кем-то, имеющим многолетний опыт работы в области телекоммуникаций, о любом виде телекоммуникационного меню, вы должны убедиться, что говорите об одном и том же. Для специалиста по телекоммуникациям термин _IVR_ подразумевает относительно комплексную и сложную в разработке (и последующе затратную), в то время как AС - это простая и недорогая вещь, которая является общей для большинства АТС.
|
||||
|
||||
В этой главе мы поговорим о создании автосекретаря. IVR мы обсудим в [Главе 16](glava-16.md).<sup><a href="#sn2">2</a></sup>
|
||||
|
||||
## Проектирование вашего АС
|
||||
|
||||
Самая распространенная ошибка новичков при проектировании АС - излишняя сложность. В то время как может быть много радости и чувства выполненного долга в создании многоуровневого AС с десятками отличных вариантов и кучами действительно интересных подсказок, ваши абоненты имеют другую повестку дня. Люди звонят по телефону в первую очередь потому, что хотят с кем-то поговорить. В то время как люди привыкли к реальности автосекретарей (и в некоторых случаях они могут ускорить процесс), по большей части люди предпочитают говорить с кем-то живым. Это означает, что есть два основных правила, которых должен придерживаться каждый АС:
|
||||
|
||||
* Быть проще.
|
||||
* Убедитесь, что вы всегда делаете обработчик для людей, которые собираются нажимать 0, когда слышат меню. Если вы не хотите иметь опцию 0, имейте в виду, что многие люди будут оскорблены этим, они повесят трубку и не перезвонят. В бизнесе это вообще плохо.
|
||||
|
||||
Прежде чем вы начнете кодировать свой AС, разумно его спроектировать. Вам нужно будет определить поток вызовов и необходимо будет указать подсказки, которые будут воспроизводиться на каждом шаге. Программные инструменты для построения диаграмм могут быть полезны для этого, но нет необходимости фантазировать. Таблица 14-1 предоставляет хороший шаблон для базового AС, который будет делать то, что вам нужно.
|
||||
|
||||
_Таблица 14-1. Базовый автосекретарь_
|
||||
|
||||
| Шаг или выбор | Образец приглашения | Примечание | Имя файла<sup><a href="#sn1a">a</a></sup> |
|
||||
| :------------ | :------------------ | :--------- | :----------------------------------- |
|
||||
| Приветствие - рабочее время | Спасибо,что позвонили в компанию ABC. | Дневное приветствие. Воспроизводится сразу после того, как система отвечает на вызов. | _daygreeting.wav_ |
|
||||
| Приветствие - нерабочеее время | Спасибо,что позвонили в компанию ABC. Наш офис сейчас закрыт. | Ночное приветствие. Как и выше, но играет в нерабочее время. | _nightgreeting.wav_ |
|
||||
| Главное меню | Если вы знаете внутренний номер оператора, с которым хотите связаться, пожалуйста, введите его сейчас. Для свзи с отделом продаж, пожалуйста, нажмите 1; для отдела обслуживания, нажмите 2; для нашего каталога компании, нажмите #. Для получения информации о нашем адресе и факсе нажмите кнопку 3. Чтобы повторить это сообщение - нажмите 9, или оставайтесь на линии, или нажмите 0, чтобы связаться с оператором. | Подсказка главного меню. Играет сразу после приветствия. Для вызывающего абонента приветствие и главное меню звучат как единое приглашение; однако в системе полезно держать эти подсказки раздельно. | _mainmenu.wav_ |
|
||||
| 1 | Пожалуйста, подождите пока мы переключим ваш звонок. | Перевод на очередь sales. | _holdwhileweconnect.wav_ |
|
||||
| 2 | Пожалуйста, подождите пока мы переключим ваш звонок. | Перевод на очередь support. | _holdwhileweconnect.wav_ |
|
||||
| # | n/a | Запуск приложения `Directory()` | n/a |
|
||||
| 3 | Наш адрес [address]. Наш номер факса [fax number], и тд. | Воспроизведение записи, содержащей информацию об адресе и факсе. Возврат вызывающего абонента к подсказке меню после завершения. | _faxandaddress.wav_ |
|
||||
| 0 | Соединяем со специалистом. Пожалуйста, подождите. | Перевод на приемную/оператора. | _transfertoreception.wav_ |
|
||||
| 9 | n/a | Повтор. Воспроизведение подсказки меню (но не приветствия). | n/a |
|
||||
| t | n/a | Тайм-аут. Если абонент не сделал выбора - считайте, что он набрал 0 (или в некоторых случаях повторите подсказку). | n/a |
|
||||
| i | Вы сделали неверный выбор. Пожалуйста, попробуйте еще раз. | Абонент нажал неверную цифру: воспроизведение подсказки меню (но не приветствия). | _invalid.wav_ |
|
||||
| \_XXX<sup><a href="#sn1b">b</a></sup> | n/a | Перевод вызова на набранный номер. | _holdwhileweconnect.wav_ |
|
||||
|
||||
<p><sup><a name="sn1a">a</a></sup>Эти файлы пока нигде не существуют. Мы используем их в качестве примеров.</p>
|
||||
<p><sup><a name="sn1b">b</a></sup>Это совпадение шаблонов должно соответствовать вашему диапазону расширений.</p>
|
||||
|
||||
---
|
||||
|
||||
Давайте рассмотрим различные компоненты этого шаблона. Затем мы покажем вам код диалплана, необходимый для его реализации, а также как создавать подсказки.
|
||||
|
||||
### Приветствие
|
||||
|
||||
Первое, что слышит абонент - это на самом деле две подсказки.
|
||||
|
||||
Первая подсказка - это приветствие. Единственное, что приветствие должно сделать - это поприветствовать абонента. Примером приветствия может быть “Спасибо, что позвонили Брайанту, Ван Меггелену и партнерам”, “Добро пожаловать в школу мудрости и дизайна футболок Лейфа" или "Вы позвонили в офисы адвокатов Дьюи, Читама и Хоуи.” Вот именно - выбор для звонящего придет позже. Это позволяет записывать различные приветствия без необходимости записывать все новое меню. Например, в течение нескольких недель каждый год вы можете делать, чтобы ваше приветствие говорило "приветствие сезона" или что-то еще, но ваше меню не нужно будет менять. Кроме того, если вы хотите воспроизвести другую запись в нерабочее время (“Спасибо за звонок. Наш офис сейчас закрыт.”), то можете использовать разные приветствия, но сердце меню останется прежним. Наконец, если вы хотите иметь возможность вернуть абонентов в меню из другой части системы, то не захотите, чтобы они снова услышали приветствие.
|
||||
|
||||
### Главное меню
|
||||
|
||||
Приглашение главного меню - это место, где вы сообщаете своим абонентам о доступных им вариантах выбора. Вы должны проговаривать его как можно быстрее (без спешки или глупостей).<sup><a href="#sn3">3</a></sup> Когда вы записываете выбор, всегда сообщайте пользователям о действии, которое будет предпринято, прежде чем дать им возможность выполнить это действие с помощью набора цифр. Поэтому не говорите "нажмите 1 для продаж“, а скорее скажите: "для продаж нажмите 1". Причина этого заключается в том, что большинство людей не обратят должного внимания на подсказку, пока не услышат интересующий их выбор. Как только они услышат свой выбор, то будут в полном внимании и им можно будет сообщить какую кнопку нажать, чтобы направить их туда, куда требуется.
|
||||
|
||||
Еще один момент, который следует рассмотреть - это порядок, в котором следует разместить выбор. Типичный бизнес, например, захочет, чтобы продажи были первым пунктом меню и большинство абонентов также будут ожидать этого. Самое главное - думать о своих клиентах. Например, большинство людей не будут заинтересованы в адресной и факсимильной информации, поэтому не делайте их первыми пунктами.<sup><a href="#sn4">4</a></sup> Подумайте о том, чтобы как можно быстрее соединить абонентов с местом их назначения, когда вы проектируете свой выбор. Безжалостно режьте все, что не является абсолютно необходимым.
|
||||
|
||||
#### Выбор 1
|
||||
|
||||
Вариант 1 в нашем примере будет простым переводом. Обычно это ресурс, расположенный в другом контексте, и он, как правило, имеет внутренний добавочный номер, так что внутренние пользователи могут также передавать вызовы на него. В этом примере мы будем использовать эту опцию для отправки абонентов в очередь `sales`, созданную в [Главе 12](glava-12.md).
|
||||
|
||||
#### Выбор 2
|
||||
|
||||
Вариант 2 будет технически идентичен варианту 1. Только место назначения будет другим. Этот выбор переместит абонентов в очередь `support`.
|
||||
|
||||
#### Выбор `#`
|
||||
|
||||
Хорошо иметь возможность выбора справочника как можно ближе к началу записи. Многие люди будут использовать каталог, если знают что тот существует, но им не требуется прослушивать все меню, чтобы узнать о нем. Нетерпеливые люди будут нажимать 0, поэтому чем раньше вы расскажете им о справочнике, тем больше шансов, что они им воспользуются, и тем самым уменьшится нагрузка на вашего секретаря.
|
||||
|
||||
#### Выбор 3
|
||||
|
||||
Если у вас есть опция, которая ничего не делает, кроме воспроизведения записи абоненту (например, адрес и факс), вы можете оставить весь код для неё в том же контексте, что и меню, и просто вернуть абонента в главное меню в конце записи. В общем, такие варианты не очень полезны, как нам хотелось бы думать, поэтому в большинстве случаев вы, вероятно, захотите оставить её.
|
||||
|
||||
#### Выбор 9
|
||||
|
||||
Очень важно дать звонящему возможность услышать подсказку еще раз. Многие люди не будут обращать внимания на все меню, и если вы не дадите им возможность услышать меню снова, они, скорее всего, нажмут 0.
|
||||
|
||||
Обратите внимание, что вам не нужно воспроизводить приветствие снова, только подсказку главного меню.
|
||||
|
||||
#### Выбор 0
|
||||
|
||||
Как было сказано ранее, и нравится вам это или нет, это выбор, который предпочтут многие (возможно, большинство) ваши абоненты. Если вы действительно не хотите, чтобы кто-то отвечал на эти звонки, то можете отправлять вызовы в почтовый ящик, но мы не рекомендуем это делать. Если вы занимаетесь бизнесом, многие из ваших абонентов будут вашими клиентами. Вы же хотите, чтобы им было легко связаться с вами. Доверьтесь нам.
|
||||
|
||||
### Тайм-аут
|
||||
|
||||
Многие люди будут звонить по номеру и не обращать слишком много внимания на то, что происходит. Они знают, что если будут просто ждать на линии, то в конце концов их переведут на оператора. Или, возможно, они находятся в автомобиле, и на самом деле не могут нажимать кнопки своих телефонов. В любом случае, сделайте им одолжение. Если они не делают никакого выбора, не преследуйте их и не заставляйте их делать этого. Соедините их с оператором.
|
||||
|
||||
### Invalid (Неверно)
|
||||
|
||||
Люди совершают ошибки. Это нормально. Неверный обработчик сообщит им о том, что они выбрали, не является допустимым вариантом, и вернет их в приглашение меню, чтобы они могли повторить попытку выбора. Обратите внимание, что вы не должны воспроизводить приветствие снова, только приглашение главного меню.
|
||||
|
||||
### Вызов добавочного номера
|
||||
|
||||
Если кто-то звонит в вашу систему и знает добавочный номер, который хочет набрать, ваш автосекретарь должен иметь код для обработки этого.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Хотя Asterisk может обрабатывать перекрытие между вариантами меню и добавочными номерами (например, у вас может быть выбор меню `1` и расширения от 100 до 199), лучше избегать этого перекрытия. В противном случае диалплану всегда придется ожидать межразрядный тайм-аут всякий раз, когда кто-то нажимает `1`, потому что не будет знать, планируют ли набрать добавочный номер 123. Межразрядный тайм-аут - это задержка, которую система допускает между цифрами, прежде чем предполагает, что было введено все число. Этот таймер гарантирует, что абоненты имеют достаточно времени для набора многоразрядного расширения, но он также вызывает задержку в обработку одноразрядных вводов.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Создание вашего АС
|
||||
|
||||
После того, как вы разработали свой АС, есть три вещи, которые вам нужно сделать, чтобы заставить его работать должным образом:
|
||||
|
||||
* Запись подсказок.
|
||||
* Создание диалплана для меню.
|
||||
* Направление входящих каналов в контекст AС.
|
||||
|
||||
Начнем с того, что поговорим о записях.
|
||||
|
||||
### Запись подсказок
|
||||
|
||||
Запись подсказок для телефонной системы является критически важной задачей. Это то, что ваши абоненты будут слышать при взаимодействии с вашей системой, и качество и профессионализм этих записей отразится на вашей организации.
|
||||
|
||||
Asterisk очень гибок в этом отношении и может работать со многими различными аудиоформатами. Мы обнаружили, что в целом наиболее лучшим форматом для использования является WAV. Файлы, сохраненные в этом формате, могут быть самыми разными, но только один тип WAV-файла будет работать с Asterisk: файлы должны быть закодированы в 16-битном, 8000 Гц, моно-формате.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Рекомендуемый формат файла подсказки</b></p>
|
||||
<p>Формат WAV, который мы рекомендуем, удобен для системных подсказок, потому что он может быть легко преобразован в любой другой формат, который могут использовать ваши телефоны, без потери или искажения, и почти любой компьютер может воспроизводить его без специального программного обеспечения. Таким образом, Asterisk может не только легко обрабатывать файл, но и легко будет работать с ним на ПК (что может быть полезно). Asterisk может обрабатывать и другие форматы файлов, и в некоторых случаях они могут быть более подходящими для ваших нужд, но в целом мы считаем, что 16-битные 8 кГц WAV файлы являются самыми простыми в работе и, в большинстве случаев, наилучшего качества.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Есть два основных способа ввести подсказки в систему. Один из них заключается в записи звуковых файлов в студии или на ПК, а затем переместить эти файлы в систему. Второй способ заключается в записи подсказок непосредственно в системе с помощью телефонного аппарата. Мы предпочитаем второй способ.
|
||||
|
||||
Наш совет таков: Не зацикливайтесь на сложностях записи звука через ПК или в студии.<sup><a href="#sn5">5</a></sup> Это вообще не нужно. Телефон будет делать записи отличного качества, и причины этого просты: микрофон и электроника в телефоне тщательно проработаны для захвата человеческого голоса в формате, который идеально подходит для передачи по телефонным сетям, и поэтому телефон также идеально подходит для выполнения записи подсказок. Аппарат захватит звук в правильном формате, отфильтрует фоновый шум и нормализует уровень децибел.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Да, правильно подготовленная подсказка в студии будет лучше подсказки, записанной по телефону, но если у вас нет оборудования или опыта, воспользуйтесь нашим советом и используйте телефон для записи, потому что плохо подготовленная подсказка в студии будет намного хуже, чем подсказка, записанная по телефону.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#### Использование диалплана для создания записей
|
||||
|
||||
Самый простой способ записи подсказок-это использование приложения `Record()`.
|
||||
|
||||
Добавьте эту новую подпрограмму в нижнюю часть вашего файла _extensions.conf_:
|
||||
|
||||
```
|
||||
[subRecordPrompt]
|
||||
exten => 500,1,Playback(vm-intro)
|
||||
same => n,Record(daygreeting.wav)
|
||||
same => n,Wait(2)
|
||||
same => n,Playback(daygreeting)
|
||||
same => n,Hangup
|
||||
|
||||
exten => 501,1,Playback(vm-intro)
|
||||
same => n,Record(mainmenu.wav)
|
||||
same => ... etc ... (создайте код диалплана для каждой подсказки, которую необходимо записать)
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Чтобы использовать этот контекст, вам нужно будет включить его в контекст, в котором ваши устройства входят в диалплан. Поэтому в контекст <code>[LocalSets]</code> вы должны добавить строку <code>include=>UserServices</code>. В рабочей среде вам, вероятно, понадобится пароль, чтобы кто попало не записывали подсказки.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Эта подпрограмма воспроизводит запрос, издает звуковой сигнал, делает запись и воспроизводит эту запись.<sup><a href="#sn6">6</a></sup> Примечательно, что приложение `Record()` принимает в качестве аргумента все имя файла, в то время как приложение `Playback()` исключает расширение типа файла (_.wav_, _.gsm_ и др.). Это происходит потому, что приложение `Record()` должно знать, в каком формате должна быть сделана запись, а `Playback()` - нет. Вместо этого `Playback()` автоматически выбирает наилучший доступный аудиоформат, основываясь на кодеке, используемом вашим телефоном, и форматах, доступных в папке _sounds_ (например, если у вас есть _daygreeting.wav_ и _daygreeting.gsm_ в папке _sounds_, `Playback(daygreeting)` выберет тот, который требует наименьших усилий процессора для воспроизведения вызывающему абоненту).
|
||||
|
||||
Вам, вероятно, потребуется отдельное расширение для записи каждого из приглашений, возможно, скрытое от обычного набора расширений, чтобы предотвратить затирание любой из ваших текущих подсказок меню с помощью неправильно набранного расширения. Если количество подсказок у вас велико, повторение этого расширения с небольшими изменениями для каждого будет утомительным, но есть способы обойти это. Мы покажем вам, как сделать вашу быструю запись более разумной в [Главе 16](glava-16.md), но сейчас только что описанный метод будет служить нашим непосредственным потребностям.
|
||||
|
||||
Вот диалплан (выделен жирным шрифтом), который создаст все наши подсказки. Поместите его туда, куда вы хотите, в контекст `[sets]`:
|
||||
|
||||
<pre><code>
|
||||
exten => _4XX,1,Noop(User Dialed ${EXTEN})
|
||||
same => n,Answer()
|
||||
same => n,SayDigits(${EXTEN})
|
||||
same => n,Hangup()
|
||||
<br><b>
|
||||
exten => 500,1,GoSub(subRecordPrompt,${EXTEN},1(daygreeting)
|
||||
exten => 501,1,GoSub(subRecordPrompt,${EXTEN},1(nightgreeting)
|
||||
exten => 502,1,GoSub(subRecordPrompt,${EXTEN},1(mainmenu)
|
||||
exten => 503,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect)
|
||||
exten => 504,1,GoSub(subRecordPrompt,${EXTEN},1(faxandaddress)
|
||||
exten => 505,1,GoSub(subRecordPrompt,${EXTEN},1(transfertoreception)
|
||||
exten => 506,1,GoSub(subRecordPrompt,${EXTEN},1(invalid)
|
||||
exten => 507,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect)</b>
|
||||
<br>
|
||||
exten => _555XXXX,1,Answer()
|
||||
same => n,SayDigits(${EXTEN})
|
||||
exten => _55512XX,1,Answer()
|
||||
same => n,Playback(tt-monkeys)
|
||||
</code></pre>
|
||||
|
||||
Записи (они же подсказки) будут помещены в директорию _/var/lib/asterisk/sounds_. Вы можете поместить их в другое место, если вы укажете полный путь при записи и воспроизведении (и убедитесь, что каталог, в который вы их поместили, доступен пользователю `asterisk`). В производственной системе их следует размещать в другом месте, чтобы отделить пользовательские приглашения от общих. На данный момент мы не будем усложнять и поместим их в ту же директорию, что и системные подсказки.
|
||||
|
||||
### Диалплан
|
||||
|
||||
Вот код, необходимый для создания АС, который мы разработали ранее. Мы часто используем пустые строки перед метками внутри расширения, чтобы облегчить чтение диалплана, но обратите внимание, что только потому, что есть пустая строка, не означает, что есть другое расширение.
|
||||
|
||||
Вы можете поместить этот код в конце контекста `[TestMenu]`, прямо перед вашими подпрограммами:
|
||||
|
||||
```
|
||||
[MainMenu]
|
||||
|
||||
exten => s,1,Verbose(1, Caller ${CALLERID(all)} has entered the auto attendant)
|
||||
same => n,Answer()
|
||||
|
||||
; this sets the inter-digit timer
|
||||
same => n,Set(TIMEOUT(digit)=2)
|
||||
|
||||
; wait one second to establish audio
|
||||
same => n,Wait(1)
|
||||
|
||||
; Если с Пн-Пт с 9-17 переход на метку daygreeting
|
||||
same => n,GotoIfTime(9:00-17:00,mon-fri,*,*?daygreeting:afterhoursgreeting)
|
||||
|
||||
same => n(afterhoursgreeting),Background(nightgreeting) ; ПРИВЕТСТВИЕ НЕРАБОЧЕГО ВРЕМЕНИ
|
||||
same => n,Goto(menuprompt)
|
||||
|
||||
same => n(daygreeting),Background(daygreeting) ; ДНЕВНОЕ ПРИВЕТСТВИЕ
|
||||
same => n,Goto(menuprompt)
|
||||
|
||||
same => n(menuprompt),Background(mainmenu) ; ПОДСКАЗКА ГЛАВНОГО МЕНЮ
|
||||
same => n,WaitExten(4) ; более 4 секунд скорее всего
|
||||
; слишком много
|
||||
same => n,Goto(0,1) ; Считайте, что вызывающий нажал '0'
|
||||
|
||||
exten => 1,1,Verbose(1, Caller ${CALLERID(all)} has entered the sales queue)
|
||||
same => n,Goto(sets,610,1) ; Очередь sales - смотри Главу 12 для подробностей
|
||||
|
||||
exten => 2,1,Verbose(1, Caller ${CALLERID(all)} has entered the service queue)
|
||||
same => n,Goto(sets,611,1) ; Очередь support - смотри Главу 12 для подробностей
|
||||
|
||||
exten => 3,1,Verbose(1, Caller ${CALLERID(all)} has requested address and fax info)
|
||||
same => n,Background(faxandaddress) ; Информация об адресе и факсе
|
||||
same => n,Goto(s,menuprompt) ; Вернуть абонента к подсказке главного меню
|
||||
|
||||
exten => #,1,Verbose(1, Caller ${CALLERID(all)} is entering the directory)
|
||||
same => n,Directory(default) ; Отправить абонента в каталог.
|
||||
; Использовать InternalSets в качестве контекста набора
|
||||
|
||||
exten => 0,1,Verbose(1, Caller ${CALLERID(all)} is calling the operator)
|
||||
same => n,Goto(sets,611,1) ; Очередь support - смотри Главу 12 для подробностей
|
||||
|
||||
exten => i,1,Verbose(1, Caller ${CALLERID(all)} has entered an invalid selection)
|
||||
same => n,Playback(invalid)
|
||||
same => n,Goto(s,menuprompt)
|
||||
|
||||
exten => t,1,Verbose(1, Caller ${CALLERID(all)} has timed out)
|
||||
same => n,Goto(0,1)
|
||||
|
||||
; Вы должны иметь шаблон соответствия для внутренних номеров,
|
||||
; которые вы позволите набирать внешним абонентам
|
||||
; НО НЕ ПРОСТО ВКЛЮЧИТЬ КОНТЕКСТ LocalSets
|
||||
; ИНАЧЕ АБОНЕНТЫ СМОГУТ СОВЕРШАТЬ ЗВОНКИ ИЗ ВАШЕЙ СИСТЕМЫ.
|
||||
|
||||
; ЧТО БЫ ВЫ НИ ДЕЛАЛИ ЗДЕСЬ, ТЩАТЕЛЬНО ПРОВЕРЬТЕ, ЧТОБЫ УБЕДИТЬСЯ, ЧТО ВНЕШНИЕ АБОНЕНТЫ
|
||||
; НЕ СМОГУТ СДЕЛАТЬ НИЧЕГО, КРОМЕ НАБОРА ВНУТРЕННИХ НОМЕРОВ
|
||||
|
||||
exten => _1XX,1,Verbose(1,Call to an extension starting with '1')
|
||||
same => n,Goto(sets,${EXTEN},1)
|
||||
```
|
||||
|
||||
### Доставка входящих звонков в АС
|
||||
|
||||
Любой вызов, поступающий в систему, будет входить в диалплан в контексте, определенном для канала, на который поступает вызов. Во многих случаях это будет контекст с именем `[incoming]` или `[from-pstn]`, или что-то подобное. Вызовы будут поступать либо с добавочным номером (как в случае с DID), либо без него (как в случае с традиционной аналоговой линией).
|
||||
|
||||
Как бы ни назывался контекст и как бы ни назывался добавочный номер, вы будете отправлять каждый входящий вызов в меню.
|
||||
|
||||
```
|
||||
[incoming] ; DID, приходящие в канал с
|
||||
; context=incoming
|
||||
exten => 4169671111,1,Goto(MainMenu,s,1)
|
||||
```
|
||||
|
||||
В зависимости от того, как вы настраиваете входящие каналы, обычно будете использовать приложение `Goto()` для отправки вызова AС. Это гораздо аккуратнее, чем просто кодирование всего АС во входящем контексте.
|
||||
|
||||
Поскольку у нас в лаборатории<sup><a href="#sn7">7</a></sup> нет больше входящих линий, мы создадим простое расширение, которое доставит нас к нашему новому модному АС:
|
||||
|
||||
```
|
||||
exten => 613,1,Noop()
|
||||
same => n,Goto(MainMenu,s,1)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
И это все! Простой автосекретарь, которым легко управлять, и который справится с ожиданиями большинства абонентов.
|
||||
|
||||
### IVR
|
||||
|
||||
Мы рассмотрим интерактивное голосовое меню (IVR) более подробно в [Главе 16](glava-16.md), но прежде чем мы это сделаем поговорим о том, что важно для любого IVR. Интеграция баз данных является предметом следующей главы.
|
||||
|
||||
## Вывод
|
||||
|
||||
Автосекретарь может предоставить очень полезную услугу для абонентов. Однако, если он не разработан и хорошо реализован, то также может стать барьером для ваших абонентов, который может отпугнуть их. Потратьте время, чтобы тщательно спланировать свой АС и держать его простым.
|
||||
|
||||
<ol>
|
||||
<li id="sn1">Это, скорее всего, потому, что "IVR" гораздо легче сказать, чем "автосекретарь".</li>
|
||||
<li id="sn2">Следует отметить, что Asterisk - это отличный инструмент для создания IVR. Но также отлично подходит и для создания автосекретаря.</li>
|
||||
<li id="sn3">При необходимости вы можете использовать программу редактирования звука, такую как Audacity, чтобы удалить тишину и даже немного ускорить запись.</li>
|
||||
<li id="sn4">На самом деле, мы обычно не рекомендуем это в AС, потому что это добавляется к тому, что абонент должен слушать, и большинство людей все равно пойдет на сайт для получения такого рода информации.</li>
|
||||
<li id="sn5">Если вы не являетесь экспертом в этих областях, в таком случае пойдите на это!</li>
|
||||
<li id="sn6">Подсказка <i>vm-intro</i> не идеальна (она просит вас оставить сообщение), но она достаточно близка для наших целей. Инструкции по использованию по крайней мере верны: нажмите <b>#</b>, чтобы завершить запись. После того, как вы научились записывать подсказки можете вернуться назад, записать пользовательское приглашение и изменить приоритет 1, чтобы отразить более подходящие инструкции для записи собственных приглашений.</li>
|
||||
<li id="sn7">А если Вы это делаете, то и в Вашей; поздравляю и, пожалуйста, будьте осторожны, плавая с акулами.</li>
|
||||
</ol>
|
||||
|
||||
[Глава 13. Состояния устройств](glava-13.md) | [Содержание](SUMMARY.md) | [Глава 15. Интеграция реляционной базы данных](glava-15.md)
|
|
@ -0,0 +1,276 @@
|
|||
# Глава 16. Введение в интерактивное голосовое меню
|
||||
|
||||
> _Однажды Алиса подошла к развилке и увидела на дереве Чеширского кота. - По какой дороге мне пойти?- спросила она._
|
||||
> _“Куда ты хочешь пойти?- был его ответ._
|
||||
> _“Не знаю, - ответила Алиса._
|
||||
> _“Тогда, - сказал кот, - это не имеет значения.”_
|
||||
>
|
||||
> - Льюис Кэролл
|
||||
|
||||
Термин интерактивое голосовое меню (на самом деле ответ) (IVR) часто неправильно используется для обозначения автосекретаря, но это очень разные вещи. Цель системы IVR состоит в том, чтобы принять входные данные от абонента, выполнить действие, основанное на этих входных данных (обычно, поиск данных во внешней системе, такой как база данных), и сообщить результат абоненту. Назначение автосекретаря (о котором мы говорили в [Главе 14](glava-14.md)) - маршрутизация вызовов. Первоначально IVR даже не должен был быть телефонной системой. Все, что принимало информацию от человека и выдавало на запрос результат, падало вместе с областью IVR. Традиционно системы IVR были сложными, дорогими и раздражающими в реализации. Asterisk все это изменил.
|
||||
|
||||
## Компоненты IVR
|
||||
|
||||
Самые основные элементы IVR очень похожи на элементы автосекретаря, хотя цель и отличается. Нам нужно по крайней мере одно приветствие чтобы сообщить вызывающему, что ожидает IVR, метод получения входных данных от вызывающего, логику для проверки что ответ вызывающего является допустимым вводом, логику определения следующего шага IVR, и, наконец, механизм хранения ответов, если это применимо. Мы могли бы думать об IVR как о дереве решений, хотя оно не должно иметь никаких ветвей. Например, опрос может представлять точно такой же набор подсказок для каждого вызывающего абонента, независимо от того, какой выбор делают абоненты и единственная логика маршрутизации, включенная в опрос, заключается в том, являются ли полученные ответы допустимыми для вопросов.
|
||||
|
||||
С точки зрения вызывающего абонента, каждый IVR должен начинаться с подсказки. Этот первоначальный запрос будет сообщать абоненту что он попал на IVR и попросит собеседника ввести первые данные. Мы обсуждали подсказки в автосекретаре в Главе 14. Позже мы создадим диалплан, который позволит вам лучше управлять несколькими голосовыми подсказками.
|
||||
|
||||
Второй компонент IVR - это метод получения входных данных от вызывающего абонента. Напомним, что в Главе 14 мы обсуждали `Background()` и `WaitExten()` как метод получения нового расширения. Хотя вы можете создать IVR с помощью `Background()` и `WaitExten()` обычно проще и практичнее использовать приложение `Read()`, которое обрабатывает как приглашение, так и захват ответа. Приложение `Read()` было разработано специально для использования с системами IVR. Его синтаксис выглядит следующим образом:
|
||||
|
||||
```
|
||||
Read(variable[,filename[&filename2...]][,maxdigits][,option][,attempts][,timeout])
|
||||
```
|
||||
|
||||
Аргументы описаны в Таблице 16-1.
|
||||
|
||||
*Таблица 16-1. Приложение Read()*
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td><p align="left"><b>Аргумент</b></p></td>
|
||||
<td><p align="left"><b>Цель</b></p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>variable</code></td>
|
||||
<td>Переменная, в которой хранится ответ абонента. Рекомендуется присвоить каждой переменной в IVR имя, аналогичное приглашению, связанному с этой переменной. Это поможет позже, если по деловым соображениям или простоте использования вам потребуется изменить порядок шагов IVR. Присвоение имен переменным <code>var1</code>, <code>var2</code> и т.д. может показаться более простым в краткосрочной перспективе, но позже в вашем жизненном цикле это сделает исправление ошибок более трудным.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>prompt</code></td>
|
||||
<td>Файл (или список файлов, соединенных вместе с символом <code>&</code>) для воспроизведения вызывающему абоненту, запрашивающий ввод. Не забудьте опустить расширение в конце каждого имени файла.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>maxdigits</code></td>
|
||||
<td>Максимальное количество символов, которые можно использовать в качестве входных данных. В случае вопросов "Да/нет" и "множественный выбор" рекомендуется ограничить это значение <code>1</code>. В случае более длинных значений вызывающий абонент всегда может прервать ввод, нажав клавишу <code>#</code>.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>options</code></td>
|
||||
<td><p><code>s</code>(skip)</p>
|
||||
<p>Немедленно выйти, если канал не отвечает.</p>
|
||||
<p><code>i</code>(indication)</p>
|
||||
<p>Вместо того чтобы воспроизводить подсказку, воспроизведите какой-либо сигнал индикации (например, сигнал набора номера).</p>
|
||||
<p><code>n</code>(no answer)</p>
|
||||
<p>Считывание цифр от абонента, даже если на линию еще не ответили.</p>
|
||||
<p><code>attempts</code></p>
|
||||
<p>Количество раз для воспроизведения подсказки. Если вызывающий не вводит ничего, приложение <code>Read()</code> может автоматически запросить пользователя. По умолчанию используется одна попытка.</p>
|
||||
<p><code>timeout</code></p>
|
||||
<p>Количество секунд, в течение которых вызывающий должен совершить свой ввод. Значение по умолчанию в Asterisk равно 10 секундам, хотя его можно изменить для одного приглашения с помощью этой опции или для всего сеанса, назначив значение с помощью функции диалплана <code>TIMEOUT(response)</code>.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Как только входные данные получены, они должны быть проверены. Если вы не проверите входные данные, то с большей вероятностью обнаружите, что ваши абоненты жалуются на нестабильное приложение. Недостаточно обрабатывать ожидаемые входные данные; вам также нужно обрабатывать входные данные, которых вы не ожидаете. Например, абоненты могут быть разочарованы и набрать 0 в вашем IVR; если вы сделали хорошую работу, вы будете обращаться с этим деликатно и соедините их с кем-то, кто может помочь им или предоставить полезную альтернативу. Хорошо спроектированный IVR (как и любая программа) будет пытаться предвидеть все возможные входные данные и предоставлять механизмы для изящной их обработки.
|
||||
|
||||
После проверки входных данных вы можете отправить их на внешний ресурс для обработки. Это может быть сделано с помощью запроса в базу данных, отправки в URI, программы AGI или многих других вещей. Это внешнее приложение должно выдать результат, который вы сможете передать обратно абоненту. Это может быть подробный результат такой как "Баланс вашего счета..." или простое подтверждение такое как "ваш счет был обновлен". Мы не можем придумать ни одного реального случая, когда не будет требоваться какой-то результат, возвращаемый звонящему.
|
||||
|
||||
Иногда IVR может иметь несколько шагов, и поэтому результат может включать запрос дополнительной информации от вызывающего абонента для перехода к следующему шагу приложения IVR.
|
||||
|
||||
Можно проектировать очень сложные системы IVR с десятками или даже сотнями возможных путей. Мы уже говорили об этом раньше и повторим еще раз: люди не любят разговаривать с вашей телефонной системой независимо от того насколько она умна. Держите ваше IVR простым для ваших абонентов и они гораздо более вероятно получат некоторую выгоду от него.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Безупречно вкусное IVR</b></p>
|
||||
<p>Отличный пример IVR, который любят использовать люди - это тот, который используют многие компании по доставке пиццы: когда вы звоните, чтобы сделать заказ, IVR смотрит на Ваш CallerID и говорит: "Если вы хотите точно такой же заказ, как в прошлый раз, нажмите 1."</p>
|
||||
<p>Это все, что оно делает, и это прекрасно.</p>
|
||||
<p>Очевидно, что эти компании могли бы разработать массивно сложные IVR, которые позволили бы Вам выбрать каждую деталь вашего пирога ("для семизерновой корочки, нажмите 7"), но сколько нетрезвых, голодных клиентов могли бы успешно перемещаться по чему-то подобному в 3 часа ночи?</p>
|
||||
<p>Лучшее IVR - это те, которые требуют наименьшего количества входных данных от вызывающего абонента. Жми эту кнопку 1 и Ваша'ца уже в пути! Ура!</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Конструктивные соображения IVR
|
||||
|
||||
При разработке вашего собственного IVR, есть некоторые важные вещи, которые следует иметь в виду. Мы составили этот список вещей, которые нужно и не нужно делать в вашем IVR.
|
||||
|
||||
Делать
|
||||
* Держать его простым.
|
||||
* Должна быть возможность набрать 0, чтобы связаться с живым человеком.
|
||||
* Корректно обрабатывать ошибки.
|
||||
|
||||
Не делать
|
||||
|
||||
* Подумать что IVR может полностью заменить людей.
|
||||
* Использовать ваше IVR, чтобы показать людям насколько вы умны.
|
||||
* Попробовать воспроизвести ваш сайт с помощью IVR.
|
||||
* Постараться построить IVR когда не можете принять числовой или устный ввод. Никто не хочет писать свое имя на клавиатуре телефона.<sup><a href="#sn1">1</a></sup>
|
||||
* Заставлять своих абонентов слушать рекламу. Помните, что они могут повесить трубку в любой момент, когда пожелают.
|
||||
|
||||
## Модули Asterisk для создания IVR
|
||||
|
||||
"Фронтенд" IVR (части, которые взаимодействуют с абонентами) может обрабатываться в диалплане. Можно построить систему IVR, используя только диалплан (возможно, с использованием astdb для хранения и извлечения данных); однако, как правило, вам нужно будет взаимодействовать с чем-то внешним по отношению к Asterisk (“бэкенд” IVR).
|
||||
|
||||
### CURL()
|
||||
|
||||
Функция диалплана `CURL()` в Asterisk позволяет охватить все веб-приложения одной строкой кода диалплана. Мы будем использовать его в нашем примере IVR в этой главе позже.
|
||||
|
||||
Возможно вы найдете `CURL()` довольно простым в использовании, создание веб-приложения потребует опыта работы с веб-разработкой.
|
||||
|
||||
### func_odbc
|
||||
|
||||
Используя `func_odbc` можно разрабатывать чрезвычайно сложные приложения в Asterisk, используя только код диалплана и поиск по базе данных. Если вы не являетесь сильным программистом, но очень хорошо разбираетесь в диалпланах Asterisk и базах данных, вы полюбите `func_odbc` так же, как и мы. Проверьте это в [Главе 15](glava-15.md).
|
||||
|
||||
### AGI
|
||||
|
||||
Интерфейс Asterisk Gateway является настолько важной частью интеграции внешних приложений с Asterisk, что мы посвятили ему отдельную главу. Дополнительную информацию вы найдете в [Главе 18](glava-18.md).
|
||||
|
||||
### AMI
|
||||
|
||||
Интерфейс Asterisk Manager - это интерфейс сокета, который можно использовать для получения информации о конфигурации и состоянии, запроса выполняемых действий и уведомления о событиях происходящих с вызовами. Мы также написали целую главу об АМИ. Дополнительную информацию вы найдете в [Главе 17](glava-17.md).
|
||||
|
||||
### ARI
|
||||
|
||||
Интерфейс Asterisk REST основан на знаниях, полученных в течение многих лет о том, как интегрировать Asterisk с веб-приложениями текущего поколения. Это настолько важно, что да, еще раз, есть целая глава, посвященная ему. Если вы хотите построить сложное IVR с помощью Asterisk, более подробно рассмотрите ARI в [Главе 19](glava-19.md).
|
||||
|
||||
## Простое IVR с использованием CURL()
|
||||
|
||||
Прежде чем приступить к написанию внешней программы для обработки чего-либо, мы всегда тщательно обдумываем, есть ли способ выполнить работу в диалплане. Один из мощных способов, которым Asterisk может взаимодействовать с внешними данными - это URL-адрес, что очень хорошо делает программа GNU/Linux cURL. В Asterisk функция `CURL()` является функцией диалплана.
|
||||
|
||||
Мы собираемся использовать `CURL()` в качестве примера того, как может выглядеть чрезвычайно простое IVR. Мы запросим наш внешний IP-адрес у [https://ipinfo.io/ip](https://ipinfo.io/ip).<sup><a href="#sn2">2</a></sup>
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>На самом деле, большинство приложений IVR будут намного сложнее. Даже большинство применений <code>CURL()</code> будет сложным, так как URI может возвращать массивный и сильно изменяющийся объем данных, подавляющее большинство из которых будет непонятно Asterisk. Дело в том, что IVR - это не только диалплан; это также очень много о внешних приложениях, которые запускаются диалпланом, которые выполняют реальную работу IVR.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Модуль `CURL()` был установлен во время нашего процесса установки несколько глав назад.
|
||||
|
||||
### Диалплан
|
||||
|
||||
Диалплан для нашего примера IVR очень прост. Функция `CURL()` извлекает ваш IP-адрес из [https://ipinfo.io/ip](https://ipinfo.io/ip), а затем `SayAlpha()` озвучит результат вызывающему абоненту:
|
||||
|
||||
```
|
||||
exten => *764,1,Verbose(2, Run CURL to get IP address from whatismyip.org)
|
||||
same => n,Answer()
|
||||
same => n,Set(MyIPAddressIs=${CURL(https://ipinfo.io/ip)})
|
||||
same => n,SayAlpha(${MyIPAddressIs})
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Простота этого до невозможности крута. В традиционной системе IVR на программирование такого рода может уйти несколько дней, если предположить, что это вообще возможно.
|
||||
|
||||
## A Prompt-Recording IVR Function
|
||||
|
||||
В [Главе 14](glava-14.md) мы создали простой диалплан для записи подсказок. Он был довольно ограничен в том, что записывал только одно имя файла, и поэтому для каждого запроса требовалось отдельное расширение. Здесь мы расширим его чтобы создать полноценное меню для записи подсказок. Поскольку это сложная часть диалплана, а не подпрограмма или локальный канал, мы создадим новый раздел диалплана для различных функций и поместим туда такие вещи:
|
||||
|
||||
```
|
||||
;FEATURES
|
||||
[prompts]
|
||||
exten => s,1,Answer
|
||||
exten => s,n,Set(step1count=0) ; Инициализация счетчиков
|
||||
|
||||
; If we get no response after 3 times, we stop asking
|
||||
same => n(beginning),GotoIf($[${step1count} > 2]?end)
|
||||
same => n,Read(which,prompt-instructions,3)
|
||||
same => n,Set(step1count=$[${step1count} + 1])
|
||||
|
||||
; All prompts must be 3 digits in length
|
||||
same => n,GotoIf($[${LEN(${which})} != 3]?beginning)
|
||||
same => n,Set(step1count=0) ; Запрос успешен; сброс счетчиков
|
||||
same => n,Set(step2count=0)
|
||||
|
||||
same => n(step2),Set(step2count=$[${step2count} + 1])
|
||||
same => n,GotoIf($[${step2count} > 2]?beginning) ; Нет ответа после 3 попыток
|
||||
|
||||
; If the file doesn't exist, then don't ask whether to play it
|
||||
same => n,GotoIf($[${STAT(f,/var/lib/asterisk/sounds/${which}.wav)} = 0]?recordonly)
|
||||
same => n,Background(prompt-tolisten)
|
||||
|
||||
same => n(recordonly),Background(prompt-torecord)
|
||||
same => n,WaitExten(10) ; Ожидаем 10 секунд ответа
|
||||
same => n,Goto(step2)
|
||||
|
||||
same => n(end),Playback(goodbye)
|
||||
same => n,Hangup()
|
||||
|
||||
exten => 1,1,Set(step2count=0)
|
||||
same => n,Background(/var/lib/asterisk/sounds/${which})
|
||||
same => n,Goto(s,step2)
|
||||
|
||||
exten => 2,1,Set(step2count=0)
|
||||
same => n,Playback(prompt-waitforbeep)
|
||||
same => n,Record(${CHANNEL(uniqueid)}.wav)
|
||||
|
||||
same => n(listen),Playback(${CHANNEL(uniqueid)})
|
||||
same => n,Set(step3count=0)
|
||||
same => n,Read(saveornot,prompt-1tolisten-2tosave-3todiscard,1,,2,3)
|
||||
same => n,GotoIf($["${saveornot}" = "1"]?listen)
|
||||
same => n,GotoIf($["${saveornot}" = "2"]?saveit)
|
||||
same => n,GotoIf($["${saveornot}" = "3"]?tossit)
|
||||
same => n,Goto(listen)
|
||||
|
||||
same => n(tossit),System(rm -f /var/lib/asterisk/sounds/${CHANNEL(uniqueid)}.wav)
|
||||
same => n,Goto(s,beginning)
|
||||
|
||||
same => n(saveit),Noop('Set' app used to shorten example)
|
||||
same => n,Set(PromptToSave=/var/lib/asterisk/sounds/${CHANNEL(uniqueid)}.wav
|
||||
same => n,Set(WhereToSave=/var/lib/asterisk/sounds/${which}.wav
|
||||
same => n,System(mv -f ${PromptToSave} ${WhereToSave})
|
||||
same => n,Playback(prompt-saved)
|
||||
same => n,Goto(s,beginning)
|
||||
```
|
||||
|
||||
В этой системе имя запроса больше не является описательным; вместо этого оно является числом. Это означает, что вы можете записывать гораздо большее разнообразие приглашений, используя один и тот же механизм, но компромисс заключается в том, что ваши приглашения больше не будут иметь описательных имен.
|
||||
|
||||
Если вы хотите проверить его, вам нужно будет записать подсказки, которые использует эта функция IVR (это своего рода мета, но да, нашему создателю подсказок нужны подсказки).
|
||||
|
||||
Поместите это в свой диалплан:
|
||||
|
||||
```
|
||||
exten => 510,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-tolisten)) ; нажмите 1
|
||||
exten => 511,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-torecord)) ; нажмите 2
|
||||
exten => 512,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-instructions)) ;3-цифры (от 000 до 999)
|
||||
exten => 513,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-waitforbeep)) ; ждите сигнала
|
||||
exten => 514,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-1tolisten-2tosave-3todiscard))
|
||||
exten => 515,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-saved))
|
||||
```
|
||||
|
||||
Затем позвоните им по одному и запишите по мере необходимости.
|
||||
|
||||
После того, как вы записали подсказки, необходимые вашему создателю подсказок, вы должны быть в состоянии проверить их.
|
||||
|
||||
```
|
||||
exten => *742,1,Noop(Prompts)
|
||||
same => n,Goto(prompts,s,1)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
С этого момента вы можете записывать приглашения, используя только числовой идентификатор. Вам понадобится способ отслеживать что говорит подсказка, но с точки зрения записи вам не нужно больше писать диалплан каждый раз, когда нужна подсказка.
|
||||
|
||||
## Распознавание речи и преобразование текста-в-речь
|
||||
|
||||
Хотя традиционно и по-прежнему в большинстве случаев сегодня система IVR представляет предварительно записанные подсказки вызывающему абоненту и принимает ввод через панель набора номера, также возможно: а) искусственно генерировать подсказки, широко известные как преобразование текста-в-речь; и б) принимать устный ввод через механизм распознавания речи.
|
||||
|
||||
В то время как концепция возможности вести интеллектуальный разговор с машиной - это то, что авторы научной фантастики обещают нам в течение многих лет, реальная наука об этом остается сложной и подверженной ошибкам. Несмотря на свои удивительные возможности, компьютеры плохо приспособлены к задаче оценки тонких нюансов человеческой речи.
|
||||
|
||||
Тем не менее, следует отметить, что такие компании, как Google, достигли удивительных успехов как в преобразовании текста-в-речь так и в распознавании речи. Уже доступны API, которые могут проделать замечательную работу по осмыслению того, что им говорят. Google, конечно, выигрывает от наличия массивного бэкенда, который может выполнять почти чудесные трюки обработки; то, что ваш IVR не сможет полностью использовать.
|
||||
|
||||
### Преобразование текста-в-речь
|
||||
|
||||
Преобразование текста-в-речь (также известное как синтез речи) требует, чтобы система была способна искусственно создавать фразы из сохраненных данных. Хотя было бы неплохо, если бы мы могли просто назначить звук букве и заставить компьютер воспроизводить каждый звук, когда он читает буквы, письменный язык часто не фонетичен и редко отражает нюансы речи (английский, возможно, один из худших языков в этом отношении).
|
||||
|
||||
Существуют отличные API, доступные от Google (и других), которые сделают очень хорошую работу по чтению того, что было написано. На момент написания этой книги все еще очень очевидно, что речь идет о компьютере, но тем не менее можно генерировать системные подсказки на лету из текста, а не записывать их заранее. Полезность этого трудно оценить, так как люди все еще не заинтересованы в разговоре с вашими машинами; они позвонили потому что хотят поговорить с вами.
|
||||
|
||||
### Распознавание речи
|
||||
|
||||
Поскольку нам удалось убедить наши компьютеры говорить с нами, мы, естественно, хотим иметь возможность говорить и с ними.<sup><a href="#sn3">3</a></sup>
|
||||
|
||||
Распознавание речи раньше было сложным и дорогостоящим, но недавно Google выпустила API, который позволяет огромной мощности их возможностей распознавания речи быть доступной для внешних приложений.
|
||||
|
||||
## Вывод
|
||||
|
||||
Asterisk является отличной платформой IVR. Вся эта книга, во многом, учит вас навыкам, которые могут быть применены для развития IVR. В то время как основные СМИ действительно уделяют внимание Asterisk только как “свободной УАТС”, реальность такова, что Asterisk является наиболее мощной, когда используется в качестве IVR. В любой солидной организации очень вероятно, что системные администраторы Linux используют Asterisk для решения телекоммуникационных проблем, которые ранее были либо неразрешимыми, либо невероятно дорогими для решения. Это скрытая революция, но не менее значимая из-за своей относительной неизвестности.
|
||||
|
||||
Если вы занимаетесь IVR-бизнесом, вам обязательно нужно познакомиться с Asterisk.
|
||||
|
||||
---
|
||||
|
||||
<ol>
|
||||
<li id="sn1">Особенно если это что-то вроде Ван Меггелена.</li>
|
||||
<li id="sn2"> Эти бесплатные сайты поиска IP-адресов, похоже, все время покупаются и превращаются в рекламные шлюзы, поэтому то, что работало при написании этой книги, может больше не работать. Вам нужен сайт который вернет ваш IP-адрес и ничего больше. Сегодня, например <a href="https://ipinfo.io/ip">https://ipinfo.io/ip</a> К тому времени, когда вы прочтете это может быть что-то другое.</li>
|
||||
<li id="sn3">Вообще-то, большинство из нас разговаривает с компьютерами, но это редко бывает вежливо.</li>
|
||||
</ol>
|
||||
|
||||
[Глава 15. Интеграция реляционной базы данных](glava-15.md) | [Содержание](SUMMARY.md) | [Глава 17. AMI и файлы вызовов](glava-17.md)
|
|
@ -0,0 +1,627 @@
|
|||
# Глава 17. AMI и файлы вызовов
|
||||
|
||||
> Джон Малкович: я видел мир, который не должен видеть ни один человек!
|
||||
> Крейг Шварц: Правда? Потому что для большинства людей это довольно приятный опыт.
|
||||
> -- Быть Джоном Малковичем
|
||||
|
||||
Интерфейс Asterisk Manager (Asterisk Manager Interface - AMI) - это интерфейс мониторинга и управления системой, предоставляемый Asterisk. Он позволяет в реальном времени отслеживать события, происходящие в системе, а также позволяет запрашивать Asterisk выполнение некоторых действий. Доступные действия имеют широкий диапазон и включают такие вещи, как возврат информации о состоянии или инициирование новых вызовов. На Asterisk было разработано много интересных приложений, использующих AMI в качестве основного интерфейса для Asterisk.
|
||||
|
||||
Эта глава также включает документацию по использованию файлов вызовов. Файлы вызовов Asterisk - это простой способ инициировать несколько вызовов. Как только объем исходящих вызовов увеличивается или ваши потребности становятся более сложными, вы можете перейти к использованию AMI. На самом деле, мы находим файлы вызовов достаточно полезными, так что сначала поговорим о них.
|
||||
|
||||
## Файлы вызовов
|
||||
|
||||
Обычно для инициализации вызовов используется AMI, но во многих ситуациях проще использовать файлы вызовов. Файл вызова - это простой текстовый файл, описывающий вызов, который вы хотите совершить через Asterisk. Когда файл вызова помещается в каталог _/var/spool/asterisk/outgoing_, Asterisk немедленно обнаружит, что файл был помещен туда, и обработает вызов.
|
||||
|
||||
Asterisk поставляется с образцом файла вызова, который вы найдете в _~/src/asterisk-15.\<TAB\>/sample.call_ (или там, где находится корневой каталог исходников Asterisk).
|
||||
|
||||
### Ваш первый файл вызова
|
||||
|
||||
Для вашего первого файла вызова давайте создадим вызов между двумя вашими телефонами. Убедитесь, что хотя бы два ваших телефона зарегистрированы и работают. Для этого примера мы будем использовать `SOFTPHONE_A` и `SOFTPHONE_B`.
|
||||
|
||||
Создайте в домашнем каталоге следующий файл:
|
||||
|
||||
```
|
||||
$ vim ~/call-file
|
||||
|
||||
Channel: PJSIP/SOFTPHONE_A
|
||||
Extension: 103
|
||||
Context: sets
|
||||
```
|
||||
|
||||
Сделайте копию этого файла (так что вам не придется заново создавать его каждый раз, когда захотите запустить его):
|
||||
|
||||
```
|
||||
$ cp ~/call-file docall
|
||||
```
|
||||
|
||||
Измените владельца файла docall на `asterisk`:
|
||||
|
||||
```
|
||||
$ chown asterisk:asterisk docall
|
||||
```
|
||||
|
||||
Переместите файл _docall_ в каталог _outgoing_ Asterisk.
|
||||
|
||||
```
|
||||
$ sudo mv docall /var/spool/asterisk/outgoing
|
||||
```
|
||||
|
||||
Иногда самый простой способ - лучший способ.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p>Вы, вероятно, обнаружите, что делаете несколько правок в исходном файле вызова. Вы можете просто переместить созданный файл, а не делать его копию, но тогда вам придется заново создавать его каждый раз, когда вы его редактируете, и это раздражает. Весь этот набор можно сохранить как однострочный и запустить следующим образом:</p>
|
||||
<p><pre><code>$ cp ~/call-file docall \
|
||||
sudo chown asterisk:asterisk docall \
|
||||
sudo mv docall /var/spool/asterisk/outgoing/</code></pre></p>
|
||||
<p>Попробуйте, и вы увидите, насколько это проще, чем каждый раз создавать и перемещать новый файл вызова.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Предупреждение</b></p>
|
||||
<p>Использование <code>mv</code> вместо <code>cp</code> здесь важно. Asterisk следит за тем, чтобы содержимое отображалось в каталоге <i>spool</i>. Если вы используете копирование - Asterisk может попытаться прочитать новый файл до того, как содержимое будет скопировано в него. Создание файла, а затем его перемещение позволяет избежать этой проблемы.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Освойтесь с использованием файлов вызовов и вы обнаружите что они решают проблемы, которые в противном случае вам пришлось бы решать гораздо большим объемом работ.
|
||||
|
||||
### Заметки о файлах вызова
|
||||
|
||||
Компонент `Channel` файла вызова является обязательным. Обычно вызов, поступающий в Asterisk, инициируется конечной точкой (например, вы делаете вызов со своего телефона). В файле вызова это соединение должно происходить наоборот - Asterisk обращается к конечной точке, и только когда она отвечает, вызов может начаться. Планируйте соответственно.
|
||||
|
||||
Вы также должны указать `Context`, в котором вызов начнется, как только первоначальный канал ответит. Это может быть полезно, так как это означает, что вы можете подключить вызов через контекст, который обычно недоступен для этого канала, но на практике мы бы предложили вам просто использовать тот же контекст, через который канал вошел бы в диалплан, если бы он инициировал вызов как обычно.
|
||||
|
||||
Расширение, конечно, также должно быть указано. Обычно это номер телефона, по которому нужно позвонить, но, конечно, это может быть любой допустимый добавочный номер в `Context`.
|
||||
|
||||
Остальные параметры файла вызова являются необязательными и подробно описаны в файле _~/src/asterisk-15.\<TAB\>/sample.call_ и на веб-сайте Asterisk wiki.
|
||||
|
||||
## AMI Быстрый старт
|
||||
|
||||
Этот раздел предназначен для того, чтобы как можно быстрее испачкать руки с помощью AMI. Во-первых, поместите следующую конфигурацию в _/etc/asterisk/manager.conf_:
|
||||
|
||||
```
|
||||
; Включить AMI и указать ему принимать соединения только от localhost.
|
||||
[general]
|
||||
enabled = yes
|
||||
webenabled = yes
|
||||
bindaddr = 127.0.0.1
|
||||
|
||||
; Создайть аккаунт с именем "hello" и паролем "world"
|
||||
[hello]
|
||||
secret=world
|
||||
read=all ; Получать все типы событий
|
||||
write=all ; Разрешить этому пользователю выполнять все действия
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Этот пример конфигурации настроен так, чтобы разрешить только локальные подключения к AMI. Если вы собираетесь сделать этот интерфейс доступным по сети, настоятельно рекомендуется использовать только протокол TLS. Использование TLS более подробно рассматривается далее в этой главе.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Как только конфигурация AMI готова, включите встроенный HTTP-сервер, поместив следующее содержимое в _/etc/asterisk/http.conf_:
|
||||
|
||||
```
|
||||
; Включить встроенный HTTP-сервер и слушайть только соединения на localhost.
|
||||
[general]
|
||||
enabled = yes
|
||||
bindaddr = 127.0.0.1
|
||||
```
|
||||
|
||||
Перезагрузите диспетчер и http-серверы из Asterisk CLI:
|
||||
|
||||
```
|
||||
*CLI> manager reload
|
||||
|
||||
*CLI> module reload http
|
||||
```
|
||||
|
||||
### AMI через TCP
|
||||
|
||||
Существует несколько способов подключения к AMI, но наиболее распространенным является TCP-сокет. Мы будем использовать `telnet` для демонстрации подключения AMI. Для этого нам нужно будет установить `telnet`:
|
||||
|
||||
```
|
||||
$ sudo yum -y install telnet
|
||||
```
|
||||
|
||||
В этом примере показаны следующие шаги:
|
||||
* Подключение к AMI через TCP-сокет на порту 5038.
|
||||
* Вход в систему, используя действие `Login`.
|
||||
* Выполнение действия `Ping`.
|
||||
* Выход из системы с помощью действия `Logoff`.
|
||||
|
||||
Вот как это сделать с помощью `telnet`:
|
||||
|
||||
```
|
||||
$ telnet localhost 5038
|
||||
|
||||
Trying 127.0.0.1...
|
||||
Connected to localhost.
|
||||
Escape character is '^]'.
|
||||
Asterisk Call Manager/4.0.3
|
||||
```
|
||||
|
||||
Вы подключились, но он будет висеть на вас, если вы не подтвердите свою подлинность. Вставьте в окно `telnet` следующее:
|
||||
|
||||
```
|
||||
Action: Login
|
||||
Username: hello
|
||||
Secret: world
|
||||
```
|
||||
|
||||
Обратите внимание, что после команд должна быть пустая строка (нажмите Enter после вставки всего, если ничего не происходит).
|
||||
|
||||
```
|
||||
Response: Success
|
||||
Message: Authentication accepted
|
||||
```
|
||||
|
||||
Ладно, мы ему нравимся. Давайте выполним простую команду, чтобы убедиться, что он действительно говорит с нами:
|
||||
|
||||
```
|
||||
Action: Ping
|
||||
```
|
||||
|
||||
```
|
||||
Response: Success
|
||||
Ping: Pong
|
||||
```
|
||||
|
||||
Все идет нормально. Мы просто уберемся и выйдем сейчас.
|
||||
|
||||
```
|
||||
Action: Logoff
|
||||
```
|
||||
|
||||
```
|
||||
Response: Goodbye
|
||||
Message: Thanks for all the fish.
|
||||
Connection closed by foreign host.
|
||||
```
|
||||
|
||||
Вы убедились что AMI принимает соединения через TCP-соединение.
|
||||
|
||||
### AMI через HTTP
|
||||
|
||||
Также можно использовать AMI через HTTP. Мы будем выполнять те же действия что и раньше, но через HTTP вместо собственного TCP-интерфейса к AMI. АMI через HTTP подробно описаны в [“AMI через HTTP”](#AMI-HTTP).
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Примечание</b></p>
|
||||
<p>Учетные записи, используемые для подключения к AMI через HTTP, являются теми же учетными записями, настроенными в файле <i>/etc/asterisk/manager.conf</i>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
В этом примере показано, как получить доступ к AMI по протоколу HTTP, войти в систему, выполнить действие `Ping` и выйти из системы:
|
||||
|
||||
```
|
||||
$ curl "http://localhost:8088/rawman?action=login&username=hello&secret=world" \
|
||||
-c /tmp/tempcookie
|
||||
|
||||
Response: Success
|
||||
Message: Authentication accepted
|
||||
```
|
||||
|
||||
```
|
||||
$ curl "http://localhost:8088/rawman?action=ping" -b /tmp/tempcookie
|
||||
|
||||
Response: Success
|
||||
Ping: Pong
|
||||
Timestamp: 1538871944.474131
|
||||
```
|
||||
|
||||
```
|
||||
$ curl "http://localhost:8088/rawman?action=logoff" -b /tmp/tempcookie
|
||||
|
||||
Response: Goodbye
|
||||
Message: Thanks for all the fish.
|
||||
```
|
||||
|
||||
Интерфейс HTTP для AMI позволяет интегрировать управление вызовами Asterisk в веб-службу.
|
||||
|
||||
## Конфигурация
|
||||
|
||||
Раздел ["AMI быстрый старт"](glava-17.md#ami-быстрый-старт) показал очень простой набор конфигурационных файлов для начала работы. Существует много способов тонкой настройки конфигурации AMI.
|
||||
|
||||
### manager.conf
|
||||
|
||||
Основной конфигурационный файл для AMI - это _/etc/asterisk/manager.conf_. Раздел `[general]` содержит параметры, управляющие общей работой AMI. Любые другие разделы в _manager.conf_ определяют учетные записи для входа в систему и использования AMI. Пример файла содержит подробные объяснения различных параметров и может быть найден в _~/src/asterisk-15\<TAB\>/configs/samples/manager.conf.sample_.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Предупреждение</b></p>
|
||||
<p>Если вы собираетесь выставить свой AMI за пределы машины, на которой он работает, вам потребуется настроить подключение TLS.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Конфигурационный файл _manager.conf_ также содержит конфигурацию учетных записей пользователей AMI. Вы создаете учетную запись, добавляя раздел с именем пользователя в квадратных скобках. В каждом разделе `[username]` есть параметры, которые могут быть установлены, которые будут применяться только к этой учетной записи. Файл _~/src/asterisk-15\<TAB\>/configs/samples/manager.conf.sample_ также содержит подробные объяснения каждого из этих параметров. Наш пользователь по имени `[hello]`, имеет простейшую конфигурацию, которая позволяет все операции чтения и записи. Обычно следует создавать пользователей AMI, которые ограничены только действиями, необходимыми для их функционирования.
|
||||
|
||||
В разделе `[username]` параметры `read` и `write` определяют к каким действиям и событиям диспетчера имеет доступ конкретный пользователь. На данный момент есть 20 из них: `all`, `system`, `call`, `log`, `verbose`, `agent`, `user`, `config`, `command`, `dtmf`, `reporting`, `cdr`, `dialplan`, `originate`, `agi`, `cc`, `aoc`, `test`, `security` и `message`. Вы увидите что файл _manager.conf.sample_ содержит ссылку на каждый из них, относящийся к вашему выпуску (и, если какие-либо из них добавлены, которые не были перечислены здесь, они будут в файле примера).
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Предупреждение</b></p>
|
||||
<p>Обратите особое внимание на разрешения <code>system</code>, <code>command</code> и <code>originate</code>. Эти разрешения предоставляют значительные полномочия всем приложениям, которые имеют право их использовать. Предоставляйте эти разрешения только приложениям, над которыми у вас есть полный контроль (и в идеале они работают в одном окне).</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### http.conf
|
||||
|
||||
Как мы уже видели, интерфейс Asterisk Manager может быть доступен как по протоколу HTTP, так и по протоколу TCP. Для этого в Asterisk встроен очень простой HTTP-сервер. Все параметры, относящиеся к AMI, находятся в разделе [general] файла _/etc/asterisk/http.conf_.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Примечание</b></p>
|
||||
<p>Включение доступа к AMI по протоколу HTTP требует наличия <i>/etc/asterisk/manager.conf</i> и <i>/etc/asterisk/http.conf</i>. AMI должен быть включен в <i>manager.conf</i> с параметром <code>enabled</code>, установленным в <code>yes</code> и <code>webenabled</code> должен быть установлен в значение <code>yes</code> чтобы разрешить доступ по протоколу HTTP. Наконец, опция <code>enabled</code> в <i>http.conf</i> должна быть установлена в <code>yes</code> чтобы включить сам HTTP-сервер.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Доступные опции будут найдены в вашем файле _~/src/asterisk-15\<TAB\>/configs/samples/http.conf.sample_.
|
||||
|
||||
## Обзор протокола
|
||||
|
||||
В AMI есть два основных типа сообщений: события диспетчера и действия диспетчера.
|
||||
|
||||
_События диспетчера_ - это односторонние сообщения, посылаемые Asterisk клиентам AMI для сообщения о том, что произошло в системе (Рисунок 17-1).
|
||||
|
||||

|
||||
|
||||
_Рисунок 17-1. События диспетчера_
|
||||
|
||||
_Действия диспетчера_ - это запросы от клиента к Asterisk для выполнения некоторого действия и возврата результата (Рисунок 17-2). Например, действие AMI инициирует запросы, чтобы Asterisk создал новый вызов, и, естественно, клиентскому приложению потребуются ответы от Asterisk, чтобы указать ход выполнения этого действия.
|
||||
|
||||

|
||||
|
||||
_Рисунок 17-2. Действия диспетчера_
|
||||
|
||||
Другие действия менеджера - это запросы данных. Например, есть действие - получить список всех активных каналов в системе: сведения о каждом канале доставляются как событие. Когда список результатов будет завершен, будет отправлено окончательное сообщение о том, что цель достигнута. См. Рисунок 17-3 для графического представления клиента, отправляющего этот тип управляющего действия и получающего список ответов.
|
||||
|
||||

|
||||
|
||||
_Рисунок 17-3. Действия диспетчера возвращающие список данных_
|
||||
|
||||
### Кодировка сообщений
|
||||
|
||||
Все сообщения AMI, включая события, действия и ответы на действия, кодируются одинаково. Сообщения являются текстовыми, со строками, заканчивающимися возвратом каретки и символом перевода строки. Сообщение завершается пустой строкой:
|
||||
|
||||
```
|
||||
Header1: This is the first header<CR><LF>
|
||||
Header2: This is the second header<CR><LF>
|
||||
Header3: This is the last header of this message<CR><LF>
|
||||
<CR><LF>
|
||||
```
|
||||
Если вы запускаете тесты из telnet-клиента - это означает, что после последней строки инструкций вам нужно будет дважды нажать клавишу Enter.
|
||||
|
||||
|
||||
#### События
|
||||
|
||||
События всегда имеют заголовок `Event` и заголовок `Privilege`. В заголовке `Event` указывается имя события, а в заголовке `Privilege` - уровни разрешений, связанные с данным событием. Любые другие заголовки, включенные в событие, являются специфичными для данного типа события. Вот вам пример:
|
||||
|
||||
```
|
||||
Event: Hangup
|
||||
Privilege: call,all
|
||||
Channel: SIP/0004F2060EB4-00000000
|
||||
Uniqueid: 1283174108.0
|
||||
CallerIDNum: 2565551212
|
||||
CallerIDName: Russell Bryant
|
||||
Cause: 16
|
||||
Cause-txt: Normal Clearing
|
||||
```
|
||||
|
||||
CLI Asterisk включает в себя `manager show events` и `manager show event <event>`. Выполните эти команды в CLI Asterisk, чтобы получить список событий или узнать подробности конкретного события.
|
||||
|
||||
Не забывайте, что отличным справочником для всех вещей Asterisk, включая AMI, является официальная [Asterisk wiki](https://wiki.asterisk.org/).
|
||||
|
||||
#### Действия
|
||||
|
||||
При выполнении действия _необходимо_ включить заголовок `Action`. Заголовок `Action` определяет, какое действие выполняется. Остальные заголовки являются аргументами для действия и могут потребоваться или не потребоваться в зависимости от действия.
|
||||
|
||||
Чтобы получить список заголовков, связанных с определенным действием, введите в CLI Asterisk команду `manager show command <Action>`. Чтобы получить полный список действий, поддерживаемых используемой версией Asterisk, введите `manager show commands`.
|
||||
|
||||
Окончательный ответ на действие обычно представляет собой сообщение, содержащее заголовок `Response`. Значение заголовка `Response` будет `Success`, если действие было выполнено успешно. Если действие не было успешно выполнено, то значение заголовка ответа будет `Error`. Например:
|
||||
|
||||
```
|
||||
Action: Login
|
||||
Username: hello
|
||||
Secret: world
|
||||
|
||||
Response: Success
|
||||
Message: Authentication accepted
|
||||
```
|
||||
|
||||
### AMI через HTTP <a name="AMI-HTTP"></a>
|
||||
|
||||
Помимо собственного TCP-интерфейса, можно также получить доступ к AMI по протоколу HTTP. Программисты с имеющимся опытом написания приложений, использующие веб-API, скорее всего предпочтут его по сравнению с подключением TCP. В то время как интерфейс TCP предлагает только один тип структуры сообщений, AMI через HTTP предлагает несколько вариантов кодирования. Вы можете получать ответы в том же формате что и в TCP, в формате XML или в виде базовой HTML-страницы. Тип кодировки выбирается на основе поля в URL запросе. Варианты кодирования рассматриваются более подробно далее в этом разделе.
|
||||
|
||||
#### Аутентификация и обработка сессии
|
||||
|
||||
Существует два метода выполнения аутентификации против AMI через HTTP. Первый - это использование действия `Login`, аналогичного аутентификации с помощью собственного интерфейса TCP. Это метод, который использовался в Примере быстрого запуска, как показано в [AMI через HTTP](glava17.md#ami-через-http).
|
||||
|
||||
После успешной аутентификации Asterisk предоставит файл cookie, который идентифицирует аутентифицированный сеанс. Вот пример ответа на действие `Login`, которое включает в себя файл cookie сеанса от Asterisk:
|
||||
|
||||
```
|
||||
$ curl -v "http://localhost:8088/rawman?action=login&username=hello&secret=world"
|
||||
```
|
||||
|
||||
Второй вариант аутентификации - это HTTP-дайджест аутентификации. В этом примере запрошенный тип кодировки, основанный на URL-запросе, является `rawman`. Чтобы указать, что следует использовать дайджест аутентификацию HTTP, префикс типа кодировки в URL-адресе запроса должен содержать `a`:
|
||||
|
||||
```
|
||||
$ curl -v --digest -u hello:world http://127.0.0.1:8088/arawman?action=ping
|
||||
```
|
||||
|
||||
#### Кодирование /rawman (/arawman)
|
||||
|
||||
Тип кодирования `rawman` - это то, что до сих пор использовалось во всех примерах AMI через HTTP в этой главе. Ответы, полученные от запросов, использующих `rawman`, форматируются точно так же, как они были бы, если бы запросы были отправлены по прямому TCP-соединению к AMI.
|
||||
|
||||
```
|
||||
curl -v "http://localhost:8088/rawman?action=login&username=hello&secret=world"
|
||||
|
||||
curl -v --digest -u hello:world http://127.0.0.1:8088/arawman?action=ping
|
||||
```
|
||||
|
||||
#### Кодирование /manager (/amanager)
|
||||
|
||||
Тип кодировки `manager` предоставляет ответ в простой HTML-форме. Этот интерфейс в первую очередь полезен для экспериментов с AMI:
|
||||
|
||||
```
|
||||
$ curl -v "http://localhost:8088/manager?action=login&username=hello&secret=world"
|
||||
|
||||
$ curl -v --digest -u hello:world http://localhost:8088/amanager?action=ping
|
||||
```
|
||||
|
||||
#### Кодирование /mxml (/amxml)
|
||||
|
||||
Тип кодировки `mxml` предоставляет ответы на действия закодированные в XML:
|
||||
|
||||
```
|
||||
$ curl -v "http://localhost:8088/mxml?action=login&username=hello&secret=world"
|
||||
|
||||
$ curl -v --digest -u hello:world http://localhost:8088/amxml?action=ping
|
||||
```
|
||||
|
||||
#### События диспетчера
|
||||
|
||||
При подключении к собственному интерфейсу TCP для AMI события доставляются асинхронно. При использовании AMI через HTTP необходимо получить события путем опроса для них. Вы получаете события по протоколу HTTP, выполняя действие `WaitEvent`. В следующем примере показано, как события могут быть извлечены с помощью действия `WaitEvent`. Шаги такие:
|
||||
|
||||
1. Запустите сеанс HTTP AMI с помощью действия `Login`.
|
||||
2. Зарегистрируйте SIP-телефон на Asterisk, чтобы создать событие.
|
||||
3. Извлеките событие с помощью действия `WaitEvent`.
|
||||
|
||||
Взаимодействие выглядит следующим образом:
|
||||
|
||||
```
|
||||
$ wget --save-cookies cookies.txt \
|
||||
> "http://localhost:8088/mxml?action=login&username=hello&secret=world" -O -
|
||||
|
||||
<ajax-response>
|
||||
<response type='object' id='unknown'>
|
||||
<generic response='Success' message='Authentication accepted' />
|
||||
</response>
|
||||
</ajax-response>
|
||||
|
||||
|
||||
$ wget --load-cookies cookies.txt \
|
||||
< "http://localhost:8088/mxml?action=waitevent" -O -
|
||||
|
||||
<ajax-response>
|
||||
<response type='object' id='unknown'>
|
||||
<generic response='Success' message='Waiting for Event completed.' />
|
||||
</response>
|
||||
<response type='object' id='unknown'>
|
||||
<generic event='PeerStatus' privilege='system,all'
|
||||
channeltype='SIP' peer='SIP/0000FFFF0004'
|
||||
peerstatus='Registered' address='172.16.0.160:5060' />
|
||||
</response>
|
||||
<response type='object' id='unknown'>
|
||||
<generic event='WaitEventComplete' />
|
||||
</response>
|
||||
</ajax-response>
|
||||
```
|
||||
|
||||
Вам потребуется разработать механизмы в вашем приложении чтобы гарантировать что буферизованные события часто опрашиваются.
|
||||
|
||||
## Пример использования
|
||||
|
||||
Большая часть этой главы до сих пор обсуждала концепции и конфигурацию, связанные с AMI. В этом разделе приведены некоторые примеры использования.
|
||||
|
||||
### Инициирование вызова
|
||||
|
||||
AMI имеет действие `Originate`, которое можно использовать для инициирования вызова. Многие из принятых заголовков совпадают с параметрами, размещенными в файлах вызовов. В Таблице 17-1 перечислены заголовки, принятые действием `Originate`.
|
||||
|
||||
_Таблица 17-1. Заголовки для действия Originate_
|
||||
|
||||
| Параметр | Пример значения | Описание |
|
||||
| :--- | :--- | :--- |
|
||||
| `ActionID` | `a3a58876-f7c9-4c28-aa97-50d8166f658d` | Этот заголовок принимается большинством действий AMI. Он используется для предоставления уникального идентификатора, который также будет включен во все ответы на действие. Это дает вам возможность определить с каким запросом связан ответ. Он важен, так как все действия, их ответы и события передаются по одному и тому же соединению (если только не используется AMI через HTTP). |
|
||||
| `Channel` | `SIP/myphone` | Этот заголовок является критическим и обязательно должен быть указан. Он описывает исходящий вызов, который будет инициирован. Значение имеет тот же синтаксис, что и аргумент канала для приложения `Dial()` в диалплане. |
|
||||
| `Context` | `default` | Этот заголовок используется для указания положения в диалплане, которое будет запущено после ответа на исходящий вызов. Заголовки `Context`, `Exten` и `Priority` должны быть использованы вместе. При использовании этих заголовков не следует использовать заголовки `Application` и `Data`. |
|
||||
| `Exten` | `s` | Смотри документацию по заголовку `Context`. |
|
||||
| `Priority` | `1` | Смотри документацию по заголовку `Context`. |
|
||||
| `Application` | `ConfBridge` | Заголовки `Application` и `Data` можно использовать вместо заголовков `Context`, `Exten` и `Priority`. В этом случае исходящий вызов напрямую соединяется с одним приложением после ответа на вызов. |
|
||||
| `Data` | `500` | Смотри документацию по заголовку `Application`. |
|
||||
| `Timeout` | `30000` | Этот заголовок определяет, как долго (в миллисекундах) ждать ответа, прежде чем отказаться от исходящего вызова. Значение по умолчанию - 30000 миллисекунд (30 секунд). |
|
||||
| `CallerID` | `Matthew Jordan <(555) 867-5309>` | Этот заголовок можно использовать для указания идентификатора вызывающего абонента, используемого для исходящего вызова. |
|
||||
| `Account` | `someaccount` | Этот заголовок задает код учетной записи CDR для исходящего вызова. |
|
||||
| `Variable` | `VARIABLE=VALUE` или `FUNCTION(arguments)=VALUE` | Заголовок `Variable` может использоваться для задания как переменных канала, так и функций канала на исходящем канале. Его можно задать несколько раз. |
|
||||
| `Codecs` | `ulaw,alaw` | Этот параметр можно использовать для ограничения количества кодеков, разрешенных для исходящего вызова. Если этот параметр не указан, то набор кодеков, настроенных в файле конфигурации драйвера канала, будет по-прежнему учитываться. |
|
||||
| `EarlyMedia` | `true` | Если этот заголовок указан и установлен в `true`, исходящий вызов будет подключен к указанному добавочному номеру или приложению, как только появится какой-либо медиапоток. |
|
||||
| `Async` | `true` | Если этот заголовок задан и имеет значение `true`, то этот вызов будет инициирован асинхронно. Это позволит вам продолжить выполнение других действий на AMI-соединении во время обработки вызова. |
|
||||
|
||||
Самый простой пример использования действия `Originate` через `telnet`:
|
||||
|
||||
```
|
||||
$ telnet localhost 5038
|
||||
|
||||
Trying 127.0.0.1...
|
||||
Connected to localhost.
|
||||
Escape character is '^]'.
|
||||
Asterisk Call Manager/4.0.3
|
||||
```
|
||||
|
||||
Как только соединение установлено Вам необходимо войти в систему.
|
||||
|
||||
```
|
||||
Action: Login
|
||||
Username: hello
|
||||
Secret: world
|
||||
```
|
||||
|
||||
```
|
||||
Response: Success
|
||||
Message: Authentication accepted
|
||||
```
|
||||
|
||||
Теперь вы готовы инициировать свой звонок. Мы делаем практически то же самое что и с файлом вызова, только на этот раз с помощью AMI:
|
||||
|
||||
```
|
||||
Action: Originate
|
||||
Channel: PJSIP/SOFTPHONE_A
|
||||
Context: sets
|
||||
Exten: 103
|
||||
Priority: 1
|
||||
```
|
||||
|
||||
Вы должны услышать звонок `SOFTPHONE_A`. Как только вы ответите на него, вызов будет сделан на `SOFTPHONE_B`.
|
||||
|
||||
AMI больше не участвует в том что происходит. Вы можете отключиться, и вызов будет продолжен (оставьте его в данный момент, так как мы собираемся работать с текущим вызовом далее).
|
||||
|
||||
```
|
||||
Action: Logoff
|
||||
```
|
||||
|
||||
```
|
||||
Response: Goodbye
|
||||
Message: Thanks for all the fish.
|
||||
Connection closed by foreign host.
|
||||
```
|
||||
|
||||
Если вы уже повесили трубку - это не проблема. Вам просто нужно будет восстановить вызов, что, конечно же, вы можете сделать, просто позвонив по одному номеру с другого (101-103 или как пожелаете).
|
||||
|
||||
### Перенаправление вызова
|
||||
|
||||
Перенаправление (или transferring - передача) вызова из AMI - еще одна функция, заслуживающая упоминания. Действие AMI `Redirect` можно использовать для отправки одного или двух каналов на любой другой модуль в диалплане Asterisk. Если вам нужно перенаправить два канала, которые соединены вместе, сделайте это с обоими одновременно. В противном случае, как только один канал будет перенаправлен, другой будет отключен.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p>Важно понимать, что каналы Asterisk не существуют до тех пор, пока не будет выполнен вызов. Имя, которое мы все считаем именем канала (например, <code>SOFTPHONE_A</code>), на самом деле не является именем канала, а просто ссылкой на данные, которые используются для создания канала. Присвоение имени каналу происходит при возникновении вызова (то есть, когда канал фактически создан). Все это означает, что вы должны определить полное название канала, прежде чем сможете действовать на нем.</p>
|
||||
|
||||
<p>Инициируйте вызов, а затем просмотрите <code>Event: Newchannel</code>, и вы увидите имя канала под заголовком <code>Channel:</code>.</p>
|
||||
|
||||
<p><code><pre>
|
||||
Action: Originate
|
||||
Channel: PJSIP/SOFTPHONE_A
|
||||
Context: sets
|
||||
Exten: 103
|
||||
Priority: 1
|
||||
Response: Success
|
||||
Message: Originate successfully queued
|
||||
Event: Newchannel
|
||||
Privilege: call,all
|
||||
Channel: PJSIP/SOFTPHONE_A-00000013
|
||||
ChannelState: 0
|
||||
ChannelStateDesc: Down
|
||||
CallerIDNum: <unknown>
|
||||
CallerIDName: <unknown>
|
||||
ConnectedLineNum: <unknown>
|
||||
ConnectedLineName: <unknown>
|
||||
Language: en
|
||||
AccountCode:
|
||||
Context: sets
|
||||
Exten: s
|
||||
Priority: 1
|
||||
Uniqueid: 1538939479.29
|
||||
Linkedid: 1538939479.29
|
||||
</pre></code></p>
|
||||
|
||||
<p>Событие <code>Newchannel</code> предоставит имя созданного канала, которое в данном примере является <code>PJSIP/SOFTPHONE_A-00000013</code>.</p>
|
||||
<p>Вам нужно будет отслеживать эти имена каналов, если хотите правильно выполнять действия по текущим вызовам. Как только вызов заканчивается, канал уничтожается. Новому вызову, использующему ту же конечную точку, будет присвоено другое имя канала. Одно определение канала может поддерживать несколько вызовов (например, возможны несколько вызовов на телефон), и именно поэтому имя канала отличается от определения канала.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Вы можете перенаправить один канал (другой будет отключен):
|
||||
|
||||
```
|
||||
Action: Redirect
|
||||
Channel: PJSIP/SOFTPHONE_A-00000013
|
||||
Exten: 209
|
||||
Context: sets
|
||||
Priority: 1
|
||||
```
|
||||
|
||||
Или можете перенаправить два канала:
|
||||
|
||||
```
|
||||
Action: Redirect
|
||||
Channel: PJSIP/SOFTPHONE_A-00000015
|
||||
Context: sets
|
||||
Exten: 209
|
||||
Priority: 1
|
||||
ExtraChannel: PJSIP/SOFTPHONE_B-00000016
|
||||
ExtraContext: sets
|
||||
ExtraExten: 209
|
||||
ExtraPriority: 1
|
||||
```
|
||||
|
||||
Функция перенаправления позволяет создавать мощные внешние приложения, которые могут управлять текущими вызовами.
|
||||
|
||||
## Разработка фреймворков
|
||||
|
||||
Многие разработчики приложений пишут код, который напрямую взаимодействует с AMI. Однако существует ряд фреймворков, которые были созданы с целью облегчить разработку приложений AMI. Если вы ищете фреймворки Asterisk на популярном языке программирования по вашему выбору, вы, скорее всего, найдете один. На вас лежит ответственность за определение пригодности структуры, в которой вы заинтересованы. Некоторые вещи, которые вы должны искать в рамках включают в себя:
|
||||
|
||||
**Зрелость**
|
||||
|
||||
Этот проект существует уже несколько лет? Зрелый проект гораздо менее вероятно будет иметь серьезные ошибки в нем.
|
||||
|
||||
**Поддержка**
|
||||
|
||||
Проверьте возраст последнего обновления. Если проект не обновлялся в течение пяти лет - есть большая вероятность, что он был заброшен. Возможно, он еще пригодится, но вы будете предоставлены сами себе. Аналогично, как выглядит баг-трекер? Есть ли много важных ошибок, которые игнорируются? (Будьте проницательны здесь, так как часто реалии поддержки свободного проекта требуют дисциплинированной сортировки - не все функции будут добавлены.)
|
||||
|
||||
**Качество кода**
|
||||
|
||||
Это хорошо написанная структура? Если он не был хорошо спроектирован, вы должны знать об этом, когда решаете, стоит ли доверять ему свой проект.
|
||||
|
||||
**Сообщество**
|
||||
|
||||
Есть ли активное сообщество разработчиков, использующих этот проект? Вероятно, вам понадобится помощь; будет ли она доступна, когда вы в ней будете нуждаться?
|
||||
|
||||
**Документация**
|
||||
|
||||
Код должен быть хорошо прокомментирован, но в идеале необходима вики или другая официальная документация для поддержки библиотеки.
|
||||
|
||||
В Таблице 17-2 перечислены некоторые структуры, которые, как мы обнаружили, на момент написания данной статьи соответствовали предыдущим критериям. Там могут быть и другие.
|
||||
|
||||
_Таблица 17-2. Разработка фреймворков AMI_
|
||||
|
||||
| Фреймворк | Язык |
|
||||
| :--- | :--- |
|
||||
| Adhearsion | Ruby |
|
||||
| StarPy | Python |
|
||||
| Asterisk-Java | Java |
|
||||
| AsterNET | .NET |
|
||||
| ami-io | Node.js |
|
||||
| panoramisk | Python |
|
||||
|
||||
## Вывод
|
||||
|
||||
AMI предоставляет API для мониторинга событий из системы Asterisk, а также запрашивает Asterisk выполнять широкий спектр действий. Был предоставлен интерфейс HTTP, и был разработан ряд фреймворков, которые облегчают разработку приложений.
|
||||
|
||||
[Глава 16. Введение в интерактивное голосовое меню](glava-16.md) | [Содержание](SUMMARY.md) | [Глава 18. AGI](glava-18.md)
|
|
@ -0,0 +1,553 @@
|
|||
# Глава 18. AGI
|
||||
|
||||
> _Кофеин. Шлюз к наркотикам._
|
||||
>
|
||||
> -- Эдди Веддер
|
||||
|
||||
Диалплан Asterisk превратился в простой, но мощный программный интерфейс для обработки вызовов. Однако многие люди, особенно с опытом программирования, предпочитают реализовывать обработку вызовов на традиционном языке программирования. Asterisk Gateway Interface (AGI) позволяет разрабатывать управление вызовами от первого лица на выбранном вами языке программирования.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
В этом разделе приведен краткий пример использования AGI.
|
||||
|
||||
Во-первых, давайте создадим скрипт, который мы собираемся запустить. Скрипты AGI как правило помещаются в _/var/lib/asterisk/agi-bin_.
|
||||
|
||||
```text
|
||||
$ cd /var/lib/asterisk/agi-bin
|
||||
$ vim hello-world.sh
|
||||
#!/bin/bash
|
||||
# Consume all variables sent by Asterisk
|
||||
while read VAR && [ -n ${VAR} ] ; do : ; done
|
||||
# Answer the call.
|
||||
echo "ANSWER"
|
||||
read RESPONSE
|
||||
# Say the letters of "Hello World"
|
||||
echo 'SAY ALPHA "Hello World" ""'
|
||||
read RESPONSE
|
||||
exit 0
|
||||
$ chown asterisk:asterisk hello-world.sh
|
||||
$ chmod 700 hello-world.sh
|
||||
```
|
||||
|
||||
Теперь добавьте следующую строку в _/etc/asterisk/extensions.conf_ в контекст `[sets]`:
|
||||
|
||||
```text
|
||||
exten => 237,1,AGI(hello-world.sh)
|
||||
```
|
||||
|
||||
Сохраните и перезагрузите свой диалплан и теперь, когда вы звоните на номер 237, то должны услышать, как Эллисон произносит “Hello World.”
|
||||
|
||||
## Варианты AGI
|
||||
|
||||
Существует несколько вариантов AGI, которые отличаются в первую очередь методом, используемым для связи с Asterisk. Полезно быть в курсе всех вариантов для совершения лучшего выбора, основанного на потребностях вашего приложения.
|
||||
|
||||
### Process-Based AGI
|
||||
|
||||
Process-based AGI (AGI на основе процесса) является простейшим вариантом AGI. Пример быстрого запуска в начале этой главы является примером сценария Process-based AGI. Скрипт вызывается с помощью приложения `AGI()` из диалплана Asterisk. Запускаемое приложение указывается в качестве первого аргумента функции `AGI()`. Если не указан полный путь - приложение должно находиться в каталоге _/var/lib/asterisk/agi-bin_. Аргументы, передаваемые приложению AGI, могут быть указаны в качестве дополнительных аргументов приложения `AGI()` в диалплане Asterisk. Синтаксис такой:
|
||||
|
||||
```text
|
||||
AGI(command[,arg1[,arg2[,...]]])
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Убедитесь, что приложение имеет соответствующие разрешения на исполнение пользователем Asterisk. В противном случае функция <code>AGI()</code> завершится ошибкой.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
|
||||
Как только Asterisk выполнит ваше приложение AGI - связь между Asterisk и вашим приложением будет осуществляться через `stdin` и `stdout`. Более подробно об этом сообщении будет рассказано в разделе [“Обзор коммуникаций AGI”](glava-18.md#обзор-коммуникаций-agi). Для получения более подробной информации о вызове `AGI()` из диалплана проверьте документацию, встроенную в Asterisk:
|
||||
|
||||
```
|
||||
*CLI> core show application AGI
|
||||
```
|
||||
|
||||
**Плюсы Process-Based AGI (на основе процессов)**
|
||||
|
||||
Это самая простая форма реализации аги.
|
||||
|
||||
**Минусы Process-Based AGI**
|
||||
|
||||
Это наименее эффективная форма AGI с точки зрения потребления ресурсов. Вместо этого системы с высокой нагрузкой должны рассматривать FastAGI, описанный в разделе ["FastAGI - AGI через TCP"](glava-18.md#fastagi-agi-через-tcp).
|
||||
|
||||
#### EAGI
|
||||
|
||||
EAGI (Enhanced AGI - расширенный AGI) является легким вариантом `AGI()`. Он вызывается в диалплане Asterisk как `EAGI()`. Разница в том, что в дополнение к связи через `stdin` и `stdout` - Asterisk также обеспечивает однонаправленный аудиопоток, поступающий из канала на файловый дескриптор 3. Для получения более подробной информации о том, как вызвать `EAGI()` из диалплана Asterisk, проверьте документацию, встроенную в Asterisk:
|
||||
|
||||
```
|
||||
*CLI> core show application EAGI
|
||||
```
|
||||
|
||||
**Плюсы расширенного AGI**
|
||||
|
||||
Он проще Process-based AGI, включая канал аудиопотока только для чтения. Это единственный вариант, предлагающий эту функцию.
|
||||
|
||||
**Минусы расширенного AGI**
|
||||
|
||||
Поскольку для запуска приложения для каждого вызова необходимо создать новый процессь - он имеет те же проблемы эффективности, что и обычный, Process-Based AGI.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Для альтернативного способа получения доступа к аудио вне Asterisk - рассмотрите возможность использования <a href="https://jackaudio.org">JACK</a>. Asterisk имеет модуль для интеграции JACK, называемый <code>app_jack</code>. Он предоставляет приложение <code>Jack()</code> и функцию диалплана <code>JACK_HOOK()</code>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### FastAGI—AGI через TCP
|
||||
|
||||
_FastAGI_ - это термин, используемый для управления вызовами AGI через TCP-соединение. При использовании AGI на основе процессов экземпляр приложения AGI выполняется в системе для каждого вызова и связь с этим приложением осуществляется через `stdin` и `stdout`. С помощью FastAGI осуществляется TCP-соединение с сервером FastAGI. Управление вызовами осуществляется с использованием того же протокола AGI, но связь осуществляется через TCP-соединение и не требует запуска нового процесса для каждого вызова. Протокол AGI более подробно рассматривается в разделе ["Обзор коммуникаций AGI"](обзор-коммуникаций-agi). Использование FastAGI гораздо более масштабируемо, чем Process-Based AGI, хотя и более сложно в реализации.
|
||||
|
||||
Чтобы использовать FastAGI, вы вызываете приложение `AGI()` в диалплане Asterisk, но вместо имени приложения, которое нужно выполнить, вы предоставляете URL-адрес `agi://`. Например:
|
||||
|
||||
```
|
||||
exten => 238,1,AGI(agi://127.0.0.1)
|
||||
```
|
||||
|
||||
Номер порта по умолчанию для соединения FastAGI - `4573`. После двоеточия к URL-адресу можно добавить другой номер порта. Например:
|
||||
|
||||
```
|
||||
exten => 238,1,AGI(agi://127.0.0.1:4574)
|
||||
```
|
||||
|
||||
Так же, как и в случае AGI на основе процессов, в приложение FastAGI могут передаваться аргументы. Для этого добавьте их в качестве дополнительных аргументов в приложение `AGI()`, разделенных запятыми:
|
||||
|
||||
```
|
||||
exten => 238,1,AGI(agi://192.168.1.199,arg1,arg2,arg3)
|
||||
```
|
||||
|
||||
FastAGI также поддерживает использование записей DNS SRV, если вы предоставляете URL в виде `hagi://`. Используя записи SRV, DNS-серверы могут возвращать несколько узлов, к которым Asterisk может попытаться подключиться. Это может быть использовано для обеспечения высокой доступности и балансировки нагрузки. В следующем примере, для нахождения доступного для подключения сервера FastAGI, Asterisk выполнит поиск DNS для `_agi._tcp.shifteight.org`:
|
||||
|
||||
```
|
||||
exten => 238,1,AGI(hagi://shifteight.org)
|
||||
```
|
||||
|
||||
В этом примере DNS-сервера для домена `shifteight.org` потребуется хотя бы одна SRV-запись, настроенная для `_agi._tcp.shifteight.org`.
|
||||
|
||||
**Плюсы FastAGI**
|
||||
|
||||
Более эффективен чем process-based AGI. Вместо того, чтобы порождать новый процесс на вызов, можно построить сервер FastAGI для обработки нескольких вызовов.
|
||||
|
||||
DNS может использоваться для достижения высокой доступности и балансировки нагрузки между серверами FastAGI для дальнейшего повышения масштабируемости.
|
||||
|
||||
**Минусы FastAGI**
|
||||
|
||||
Он является более сложным при реализации сервера FastAGI, чем реализация приложения AGI на основе процессов.
|
||||
|
||||
### Async AGI - АМИ-контролируемый AGI
|
||||
|
||||
Async AGI позволяет приложению, использующему интерфейс AMI, асинхронно ставить команды AGI в очередь для выполнения на канале. Это может быть особенно полезно, если вы уже широко используете AMI и хотите улучшить свое приложение для обработки управления вызовами, а не писать подробный диалплан Asterisk или разрабатывать отдельный сервер FastAGI.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Дополнительную информацию об Asterisk Manager Interface можно найти в <a href="glava-17.html#глава-17-ami-и-файлы-вызовов">Главе 17</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Async AGI вызывается приложением `AGI()` в диалплане Asterisk. Аргумент для `AGI()` должен быть `agi:async`, как показано в следующем примере:
|
||||
|
||||
```
|
||||
exten => 239,AGI(agi:async)
|
||||
```
|
||||
|
||||
Дополнительную информацию о том, как использовать Async AGI через AMI, можно найти в следующем разделе.
|
||||
|
||||
**Плюсы Async AGI**
|
||||
|
||||
Существующее приложение AMI можно использовать для управления вызовами с помощью команд AGI.
|
||||
|
||||
**Минусы Async аги**
|
||||
|
||||
Это самый сложный способ реализации AGI.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Настройка /etc/asterisk/manager.conf для Async AGI</b></p>
|
||||
<p>Чтобы использовать Async AGI, учетная запись AMI должна иметь разрешение <code>agi</code> как на <code>read</code>, так и на <code>write</code>. Например, следующий пользователь определенный в <i>manager.conf</i> будет иметь возможность как а) выполнять действия менеджера AGI, так и б) получать события AGI:</p>
|
||||
<p><pre><code>
|
||||
; Определите пользователя с именем "hello" и паролем "world".
|
||||
; Предоставьте этому пользователю разрешения на чтение/запись для AGI.
|
||||
;
|
||||
[hello]
|
||||
secret = world
|
||||
read = agi
|
||||
write = agi
|
||||
</code></pre></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Обзор коммуникаций AGI
|
||||
|
||||
В предыдущем разделе были рассмотрены возможные варианты использования AGI. Этот раздел содержит более подробные сведения о том, как ваше пользовательское приложение AGI взаимодействует с Asterisk после вызова функции `AGI()`.
|
||||
|
||||
### Настройка сеанса AGI
|
||||
|
||||
После вызова `AGI()` или `EAGI()` из диалплана Asterisk, в приложение AGI передается некоторая информация для настройки сеанса. В этом разделе рассматривается, какие шаги предпринимаются в начале сеанса AGI для различных вариантов.
|
||||
|
||||
#### AGI на основе процессов/FastAGI
|
||||
|
||||
Для приложения AGI на основе процессов или подключения к серверу FastAGI переменные, перечисленные в Таблице 18-1, будут первыми фрагментами информации, отправленными из Asterisk в ваше приложение. Каждая переменная будет находиться на своей собственной строке, в виде:
|
||||
|
||||
```
|
||||
переменная_agi: значение
|
||||
```
|
||||
|
||||
_Таблица 18-1. Переменные среды AGI_
|
||||
|
||||
| Переменная | Значение/пример | Описание |
|
||||
| :------------ | :--------------- | :------- |
|
||||
| `agi_request` | `hello-world.sh` | Первый аргумент, который был передан в приложение `AGI()` или `EAGI()`. Для process-based AGI - это имя выполненного приложения AGI. Для FastAGI это будет URL-адрес, использованный для подключения к серверу FastAGI. |
|
||||
| `agi_channel` | `SIP/0004F2060EB4-00000009` | Имя канала, выполнившего команду приложения `AGI()` или `EAGI()`. |
|
||||
| `agi_language` | `en` | Язык, установленный на `agi_channel`. |
|
||||
| `agi_type` | `SIP` | Тип канала для `agi_channel`. |
|
||||
| `agi_uniqueid`| `1284382003.9` | uniqueid для agi_channel. |
|
||||
| `agi_version` | `1.8.0-beta4` | Используемая версия Asterisk. |
|
||||
| `agi_callerid`| `12565551212` | Полная строка callerID, установленная на `agi_channel`. |
|
||||
| `agi_calleridname` | `Russell Bryant` | Имя caller ID, установленное на `agi_channel`. |
|
||||
| `agi_callingpres` | `0` | Представление вызывающего абонента, связанное с caller ID, установленное на `agi_channel`. Дополнительные сведения см. в выводе `core show function CALLERPRES` в CLI Asterisk. |
|
||||
| `agi_callingani2` | `0` | ANI2 абонента, связанный с `agi_channel`. |
|
||||
| `agi_callington` | `0` | ТН (тип номера) ID абонента, связанный с `agi_channel`. |
|
||||
| `agi_callingtns` | `0` | Набранный номер TNS (выбор транзитной сети), связанный с `agi_channel`. |
|
||||
| `agi_dnid` | `7010` | Набранный номер, связанный с `agi_channel`. |
|
||||
| `agi_rdnis` | `unknown` | Номер перенаправления, связанный с agi_channel. |
|
||||
| `agi_context` | `phones` | Контекст диалплана, в котором находился `agi_channel` при выполнении приложения `AGI()` или `EAGI()`. |
|
||||
| `agi_extension` | `500` | Расширение в диалплане, которое выполнялось `agi_channel` при запуске приложения `AGI()`` или `EAGI()``. |
|
||||
| `agi_priority`| `1` | Приоритет `agi_extension` в `agi_context`, в котором выполнилось `AGI()` или `EAGI()`. |
|
||||
| `agi_enhanced`| `0.0` | Указание на то, был ли использован `AGI()` или `EAGI()` из диалплана. `0.0` указывает на то, что был использован `AGI()`. `1.0` указывает на то, что был использован `EAGI()`. |
|
||||
| `agi_accountcode` | `myaccount` | Код учетной записи, связанный с `agi_channel`. |
|
||||
| `agi_threadid`| `140071216785168`| `threadid` потока в Asterisk, на котором выполняется приложение `AGI()` или `EAGI()`. Это может быть полезно для связывания журналов, созданных приложением AGI, с журналами, созданными Asterisk, поскольку журналы Asterisk содержат идентификаторы потоков. |
|
||||
| `agi_arg_<argument number>` | `my argument` | Эти переменные предоставляют содержимое дополнительных аргументов, предоставленных приложению `AGI()` или `EAGI()`. |
|
||||
|
||||
Пример переменных, которые могут быть отправлены в приложение AGI, см. в разделе выходные данные отладки связи AGI в разделе [Быстрый старт](glava-18.md#быстрый-старт). Конец списка переменных будет обозначен пустой строкой. Код обрабатывает эти переменные путем считывания строк ввода в цикле, пока не будет получена пустая строка. В этот момент приложение продолжается и начинает выполнять команды AGI.
|
||||
|
||||
#### Async AGI
|
||||
|
||||
При использовании Async AGI, Asterisk будет отправлять событие диспетчера называемое `AsyncAGI` чтобы инициировать сеанс Async AGI. Это событие позволит приложениям, прослушивающим события диспетчера, взять на себя управление вызовом с помощью события менеджера AGI. Вот пример события менеджера, отправленного Asterisk:
|
||||
|
||||
```
|
||||
Event: AsyncAGI
|
||||
Privilege: agi,all
|
||||
SubEvent: Start
|
||||
Channel: SIP/0000FFFF0001-00000000
|
||||
Env: agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F0000FFFF0001-00000000%0A \
|
||||
agi_language%3A%20en%0Aagi_type%3A%20SIP%0A \
|
||||
agi_uniqueid%3A%201285219743.0%0A \
|
||||
agi_version%3A%201.8.0-beta5%0Aagi_callerid%3A%2012565551111%0A \
|
||||
agi_calleridname%3A%20Julie%20Bryant%0Aagi_callingpres%3A%200%0A \
|
||||
agi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0A \
|
||||
agi_dnid%3A%20111%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20LocalSets%0A \
|
||||
agi_extension%3A%20111%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0A \
|
||||
agi_accountcode%3A%20%0Aagi_threadid%3A%20-1339524208%0A%0A
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Значение самого заголовка <code>Env</code> в этом событии менеджера AsyncAGI находится все на одной линии. Длинное значение заголовка <code>Env</code> было закодировано URL-адресом.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Команды и ответы
|
||||
|
||||
После настройки сеанса AGI Asterisk начинает выполнять обработку вызовов в ответ на команды, отправленные из приложения AGI. Как только команда AGI будет выдана Asterisk - никакие другие команды не будут обработаны на этом канале, пока текущая не будет завершена. Когда он закончит обработку команды, Asterisk ответит с результатом.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">AGI обрабатывает команды последовательно. После выполнения команды никакие другие команды не могут быть выполнены до тех пор, пока Asterisk не вернет ответ. Некоторые команды могут выполняться очень долго. Например, в команде <code>EXEC</code> AGI выполняет приложение Asterisk. Если есть команда <code>EXEC Dial</code> - cвязь с AGI блокируется до тех пор, пока вызов не будет выполнен. Если на данном этапе вашему приложению AGI необходимо продолжить взаимодействие с Asterisk - оно может сделать это с помощью AMI, который рассматривается в <a href="glava-17.md">Главе 17</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Вы можете получить полный список доступных команд AGI из консоли Asterisk, выполнив команду `agi show commands`. Эти команды описаны в Таблице 18-2. Для получения более подробной информации о конкретной команде AGI, включая сведения о синтаксисе для всех ожидаемых аргументов, используйте `agi show commands topic COMMAND`. Например, чтобы просмотреть встроенную документацию для команды AGI `ANSWER` - вы бы использовали `agi show commands topic ANSWER`.
|
||||
|
||||
*Таблица 18-2. Команды AGI*
|
||||
|
||||
| Команда AGI | Описание |
|
||||
| :------------------ | :------------------------------------------------------------------------ |
|
||||
| `ANSWER` | Ответ на входящий вызов. |
|
||||
| `ASYNCAGI BREAK` | Завершение сеанса Async AGI и возврат канала в диалплан Asterisk. |
|
||||
| `CHANNEL STATUS` | Получение статуса канала. Используется для получения текущего состояния канала, такого как up (ответ), down (трубка положена) или вызов. |
|
||||
| `DATABASE DEL` | Удаляет пару ключ/значение из встроенной базы данных AstDB. |
|
||||
| `DATABASE DELTREE` | Удаляет дерево пар ключ/значение из встроенной базы данных AstDB. |
|
||||
| `DATABASE GET` | Извлекает значение для ключа в базе данных AstDB. |
|
||||
| `DATABASE PUT` | Устанавливает значение для ключа в базе данных AstDB. |
|
||||
| `EXEC` | Выполняет приложение диалплана Asterisk на канале. Эта команда очень полезна в том, что между `EXEC` и `GET FULL VARIABLE`, вы можете сделать все что угодно с вызовом, который можете сделать из диалплана Asterisk. |
|
||||
| `GET DATA` | Считывание цифр от вызывающего абонента. |
|
||||
| `GET FULL VARIABLE` | Оценвает выражение диалплана Asterisk. Вы можете отправить строку, содержащую переменные и/или функции диалплана и Asterisk вернет результат после выполнения соответствующих подстановок. Эта команда очень полезна в том, что между `EXEC` и `FET FULL VARIABLE`, вы можете сделать все, что угодно с вызовом, который вы можете сделать из диалплана Asterisk. |
|
||||
| `GET OPTION` | Потоковая передача звукового файла во время ожидания цифры от вызывающего абонента. Это похоже на приложение диалплана `Background()`. |
|
||||
| `GET VARIABLE` | Извлечение значения переменной канала. |
|
||||
| `HANGUP` | Заершение вызова. <sup><a href="#snat18">a</a></sup> |
|
||||
| `NOOP` | Ничего не делать. Вы получите результата запроса от этой команды, как и любой другой. Он может быть использован в качестве простого теста пути связи с Asterisk. |
|
||||
| `RECEIVE CHAR` | Получить один символ. Это работает только для типов каналов, которые его поддерживают, таких как iax2 использующий фреймы `TEXT` или SIP использующий метод `MESSAGE`. |
|
||||
| `RECEIVE TEXT` | Получение текстового сообщения. Это работает только в тех же случаях, что и `RECEIVE CHAR`. |
|
||||
| `RECORD FILE` | Запись аудиопотока от вызывающего абонента в файл. Это блокирующая операция, аналогичная приложению диалплана `Record()`. Чтобы записать вызов в фоновом режиме во время выполнения других операций, используйте `EXEC Monitor` или `EXEC MixMonitor`. |
|
||||
| `SAY ALFA` | Озвучить строку символов. Вы можете найти пример этого в разделе "[Быстрый старт](glava-18#быстрый-старт)". Чтобы получить локализованную обработку этого и другой команды `SAY`, устанавливающие язык канала либо в файле конфигурации устройств (например, _sip.conf_ ) или в диалплане установкой функцией диалплана `CHANNEL(language)`. |
|
||||
| `SAY DIGIT` | Озвучить строку цифр. Например, 100 будет озвучено "один ноль ноль", если язык канала установлен на русский. |
|
||||
| `SAY NUMBER` | Озвучить номер телефона. Например, 100 будет сказано как "сто", если язык канала установлен на русский. |
|
||||
| `SAY PHONETIC` | Произнесите строку символов, но используя общее слово для каждой буквы (Альфа, Браво, Чарли...). |
|
||||
| `SAY DATE` | Произнести заданную дату |
|
||||
| `SAY TIME` | Произнести заданное ВРЕМЯ |
|
||||
| `SAY DATETIME` | Произнести заданную дату и время, используя указанный формат. |
|
||||
| `SEND IMAGE` | Отправить изображение на канал. IAX2 поддерживает это, но нет никаких активно разработанных клиентов IAX2, о которых мы знаем, которые поддерживают это. |
|
||||
| `SEND TEXT` | Отправить текст на канал, который его поддерживает. Это может быть использовано по крайней мере с каналами SIP и IAX2. |
|
||||
| `SET AUTOHANGUP` | Запланировать отключение канала в указанный момент времени в будущем. |
|
||||
| `SET CALLERID` | Установить имя и номер идентификатора вызывающего абонента на канале. |
|
||||
| `SET CONTEXT` | Установите текущий контекст диалплана на канале. |
|
||||
| `SET EXTENSION` | Установите текущее расширение диалплана на канале. |
|
||||
| `SET MUSIC` | Запуск или остановка музыки на удержание на канале. |
|
||||
| `SET PRIORITY` | Установите текущий приоритет диалплана на канале. |
|
||||
| `SET VARIABLE` | Задать для переменной канала указанное значение. |
|
||||
| `STREAM FILE` | Потоковая передача содержимого файла в канал. |
|
||||
| `CONTROL STREAM FILE` | Передать содержимое файла в канал, но также позволить каналу управлять потоком. Например, канал может приостановить, перемотать поток назад или вперед. |
|
||||
| `TDD MODE` | Переключить режим TDD (Telecommunications Device for the Deaf - телекоммуникационное устройство для глухих) на канале. |
|
||||
| `VERBOSE` | Отправить на канал сообщение verbose logger. Подробные сообщения отображаются в консоли Asterisk, если значение параметра verbose достаточно высокое. Подробные сообщения также будут отправляться в любой файл журнала, настроенный для `verbose` канала регистратора в _/etc/asterisk/logger.conf_. |
|
||||
| `WAIT FOR DIGIT` | Дождитесь, пока вызывающий абонент нажмет цифру. |
|
||||
| `SPEECH CREATE` | Инициализировать распознавание речи. Это необходимо сделать перед использованием других речевых команд AGI. <sup><a href="#snbt18">b</a></sup> |
|
||||
| `SPEECH SET` | Установить настройку речевого движка. Доступные настройки относятся только к используемому механизму распознавания речи. |
|
||||
| `SPEECH DESTROY` | Уничтожить ресурсы, выделенные для выполнения распознавания речи. Эта команда должна быть последней выполненной речевой командой. |
|
||||
| `SPEECH LOAD GRAMMAR` | Загрузить грамматику |
|
||||
| `SPEECH UNLOAD GRAMMAR` | Выгрузить грамматику |
|
||||
| `SPEECH ACTIVATE GRAMMAR` | Активировать грамматику, которая была загружена. |
|
||||
| `SPEECH DEACTIVATE GRAMMAR` | Деактивировать грамматику |
|
||||
| `SPEECH RECOGNIZE` | Воспроизвести запрос и выполнить распознавание речи, а также ждать ввода цифр. |
|
||||
| `GOSUB` | Выполнить функцию диалплана. Она будет выполняться так же, как и приложение диалплана `GoSub()`. |
|
||||
|
||||
---
|
||||
|
||||
<sup><a name="snat18">a</a></sup>Когда используется команда AGI `HANGUP` канал отключается не сразу. Вместо этого канал помечается как нуждающийся в отключении. Ваше приложение AGI должно завершиться раьше, чем Asterisk продолжит и выполнит фактический процесс отключения.
|
||||
|
||||
<sup><a name="snbt18">b</a></sup>Хотя Asterisk включает в себя основной API для обработки распознавания речи, он не поставляется с модулем, обеспечивающим механизм распознавания речи. В настоящее время Digium предоставляет два коммерческих варианта распознавания речи: [Lumenvox](https://www.lumenvox.com/) и [Vestec](http://www.digium.com/en/products/software/vestec.php).
|
||||
|
||||
#### Process-based AGI/FastAGI
|
||||
|
||||
Команды AGI отправляются в Asterisk в одну строку. Строка должна заканчиваться символом новой строки. После отправки команды в Asterisk дальнейшие команды не будут обрабатываться до тех пор, пока последняя не будет завершена и ответ не будет отправлен обратно в приложение AGI. Вот пример ответа на команду AGI:
|
||||
|
||||
```
|
||||
200 result=0
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Консоль Asterisk позволяет отлаживать взаимодействие с приложением AGI. Чтобы включить отладку связи AGI, выполните команду <code>agi set debug on</code>. Чтобы отключить отладку, используйте <code>agi set debug off</code>. Пока этот режим отладки включен - вся связь с приложением AGI и из него будет выводиться в консоли Asterisk. Пример такого вывода можно найти в разделе <a href="glava-18.md#быстрый-старт">Быстрый старт</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#### Async AGI
|
||||
|
||||
При использовании Async AGI можно выполнять команды с помощью действия менеджера AGI. Чтобы просмотреть встроенную документацию для действия менеджера AGI - выполните `manager show command AGI` в CLI Asterisk. Демонстрация поможет выяснить, как выполняются команды AGI с помощью метода Async AGI. Во-первых, расширение создается в диалплане, который выполняет сеанс Async AGI в канале:
|
||||
|
||||
```
|
||||
exten = > 240,AGI(agi:async)
|
||||
```
|
||||
|
||||
При выполнении приложения AGI вызываемое событие менеджера `AsyncAGI` будет отправлено вместе со всеми переменными среды AGI. Подробная информация об этом событии находится в разделе "Async AGI” . После этого, действия менеджера AGI могут начать выполняться через AMI.
|
||||
|
||||
Ниже приведен пример выполнения действия диспетчера и его события, генерируемые во время обработки Async AGI. После первоначального выполнения действия менеджера AGI немедленно появляется ответ, указывающий на то, что команда была поставлена в очередь на выполнение. Позже появляется событие менеджера, указывающее что команда в очереди была выполнена. Заголовок идентификатора команды можно использовать для связывания начального запроса с событием, указывающим на то, что команда была выполнена:
|
||||
|
||||
```
|
||||
Action: AGI
|
||||
Channel: SIP/0004F2060EB4-00000013
|
||||
ActionID: my-action-id
|
||||
CommandID: my-command-id
|
||||
Command: VERBOSE "Puppies like cotton candy." 1
|
||||
|
||||
Response: Success
|
||||
ActionID: my-action-id
|
||||
Message: Added AGI command to queue
|
||||
|
||||
Event: AsyncAGI
|
||||
Privilege: agi,all
|
||||
SubEvent: Exec
|
||||
Channel: SIP/0004F2060EB4-00000013
|
||||
CommandID: my-command-id
|
||||
Result: 200%20result%3D1%0A
|
||||
```
|
||||
|
||||
Следующие выходные данные - это то, что было замечено в консоли Asterisk во время этого сеансе Async AGI:
|
||||
|
||||
```
|
||||
-- Executing [7011@phones:1] AGI("SIP/0004F2060EB4-00000013",
|
||||
"agi:async") in new stack
|
||||
agi:async: Puppies like cotton candy.
|
||||
== Spawn extension (phones, 7011, 1)
|
||||
exited non-zero on 'SIP/0004F2060EB4-00000013'
|
||||
```
|
||||
|
||||
### Завершение сеанса AGI
|
||||
|
||||
Сеанс AGI завершается когда приложение AGI готово к его завершению. Подробности того как это происходит, зависят от того, использует ли ваше приложение process-based AGI, FastAGI или async AGI.
|
||||
|
||||
#### Process-based AGI/FastAGI
|
||||
|
||||
Ваше приложение AGI может выйти или закрыть свое соединение в любое время. Если канал не был отключен до завершения работы приложения - выполнение диалплана будет продолжено.
|
||||
|
||||
Если отключение канала происходит пока сеанс AGI все еще активен - Asterisk предоставит уведомление о том, что это произошло, чтобы ваше приложение могло соответствующим образом настроить свою работу.
|
||||
|
||||
Если канал завершается пока приложение AGI все еще выполняется - произойдет несколько вещей. Если команда AGI находится в середине выполнения - вы можете получить код результата `-1`. Однако вы не должны зависеть от этого, поскольку не все команды AGI требуют взаимодействия с каналом. Если выполняемая команда не требует взаимодействия с каналом, результат не будет отражать завершение.
|
||||
|
||||
Следующее что происходит после того, как канал завершается - это отправка уведомления о завершении в ваше приложение. Для process-based AGI, сигнал `SIGHUP` будет отправлен в процесс для уведомления о его завершении. Для быстрого подключения Asterisk отправит строку, содержащую слово `HANGUP`.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td><p>Если вы хотите отключить функцию отправки Asterisk сигнала <code>SIGHUP</code> для вашего приложения process-based AGI или строки <code>HANGUP</code> для вашего сервера FastAGI - вы можете сделать это, установив переменную канала <code>AGISIGHUP</code> как показано в этом коротком примере:</p>
|
||||
<p><pre><code>
|
||||
; нет SIGHUP (AGI) или HANGUP (FastAGI)
|
||||
exten => 237,1,Set(AGISIGHUP=no)
|
||||
same => n,AGI(hello-world.sh)
|
||||
</code></pre></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
После того, как завершение канала произошло - единственные команды AGI, которые могут использоваться, являются теми, которые не требуют взаимодействия с каналом. Документация для команд AGI, встроенных в Asterisk, включает указание на то, можно ли использовать каждую команду после того, как канал был отключен.
|
||||
|
||||
#### Async AGI
|
||||
|
||||
При использовании Async AGI интерфейс менеджера предоставляет механизмы для уведомления о завершении канала. Если вы хотите завершить сеанс Async AGI для канала - необходимо выполнить команду `ASYNCAGI BREAK`. Когда сеанс Async AGI закончится - Asterisk отправит событие менеджера `AsyncAGI` с `SubEvent` об `End`. Ниже приведен пример завершения сеанса Async AGI:
|
||||
|
||||
```
|
||||
Action: AGI
|
||||
Channel: SIP/0004F2060EB4-0000001b
|
||||
ActionID: my-action-id
|
||||
CommandID: my-command-id
|
||||
Command: ASYNCAGI BREAK
|
||||
|
||||
Response: Success
|
||||
ActionID: my-action-id
|
||||
Message: Added AGI command to queue
|
||||
|
||||
Event: AsyncAGI
|
||||
Privilege: agi,all
|
||||
SubEvent: End
|
||||
Channel: SIP/0004F2060EB4-0000001b
|
||||
```
|
||||
|
||||
На этом этапе канал возвращается к следующему шагу в диалплане Asterisk (если он еще не был отключен).
|
||||
|
||||
## Пример: Доступ к базе данных учетной записи
|
||||
|
||||
Пример 18-1 - это пример сценария AGI. Чтобы запустить этот скрипт - сначала поместите его в каталог _/var/lib/asterisk/agi-bin_. Тогда вы бы выполнили его из диалплана Asterisk вот так:
|
||||
|
||||
```
|
||||
exten = > 241,1, AGI(account-lookup.py)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Этот пример написан на Python и очень скудно документирован для краткости. Он демонстрирует, как сценарий AGI взаимодействует с Asterisk с помощью `stdin` и `stdout`.
|
||||
|
||||
Сценарий предлагает пользователю ввести номер учетной записи, а затем воспроизводит значение, связанное с этим номером. В интересах краткости, мы жестко закодировали несколько поддельных учетных записей в скрипт — это, очевидно, будет что-то нормально обрабатываемое подключением к базе данных.
|
||||
|
||||
Сценарий намеренно лаконичен, так как мы заинтересованы в кратком показе некоторых функций AGI, не заполняя эту книгу страницами кода.
|
||||
|
||||
_Пример 18-1. account-lookup.py_
|
||||
|
||||
```
|
||||
#!/usr/bin/env python
|
||||
# Пример для AGI (Asterisk Gateway Interface).
|
||||
|
||||
import sys
|
||||
|
||||
def agi_command(cmd):
|
||||
'''Вписать команду и вернуть ответ'''
|
||||
print cmd
|
||||
sys.stdout.flush() #очистка буфера
|
||||
return sys.stdin.readline().strip() # строка пробелов
|
||||
|
||||
asterisk_env = {} # чтерие переменной среды AGI из Asterisk
|
||||
while True:
|
||||
line = sys.stdin.readline().strip()
|
||||
if not len(line):
|
||||
break
|
||||
var_name, var_value = line.split(':', 1)
|
||||
asterisk_env[var_name] = var_value
|
||||
|
||||
# Поддельные "базы данных" учетных записей.
|
||||
ACCOUNTS = {
|
||||
'12345678': {'balance': '50'},
|
||||
'11223344': {'balance': '10'},
|
||||
'87654321': {'balance': '100'},
|
||||
}
|
||||
|
||||
response = agi_command('ANSWER')
|
||||
|
||||
# три аргумента: приглашение, тайм-аут, максимальная длина
|
||||
response = agi_command('GET DATA enter_account 3000 8')
|
||||
|
||||
if 'timeout' in response:
|
||||
response = agi_command('STREAM FILE goodbye ""')
|
||||
sys.exit(0)
|
||||
|
||||
# Ответ будет выглядеть как: 200 result=<digits>
|
||||
# С разделителем '=' мы получаем индекс 1
|
||||
account = response.split('=', 1)[1]
|
||||
|
||||
if account == '-1': # ответ при ошибке
|
||||
response = agi_command('STREAM FILE astcc-account-number-invalid ""')
|
||||
response = agi_command('HANGUP')
|
||||
sys.exit(0)
|
||||
|
||||
if account not in ACCOUNTS: # неверный
|
||||
response = agi_command('STREAM FILE astcc-account-number-invalid ""')
|
||||
sys.exit(0)
|
||||
|
||||
balance = ACCOUNTS[account]['balance']
|
||||
|
||||
response = agi_command('STREAM FILE account-balance-is ""')
|
||||
response = agi_command('SAY NUMBER %s ""' % (balance))
|
||||
sys.exit(0)
|
||||
```
|
||||
|
||||
## Разрабатываемые фреймворки
|
||||
|
||||
Был предпринят ряд усилий по созданию фреймворков или библиотек, облегчающих программирование AGI. Вы заметите, что некоторые из них уже упоминались в [Главе 17](glava-17.md). Так же, как и в случае с AMI, при оценке фреймворка мы рекомендуем вам найти тот, который соответствует следующим критериям:
|
||||
|
||||
_Зрелость_
|
||||
|
||||
Этот проект существует уже несколько лет? Зрелый проект гораздо менее вероятно будет иметь серьезные ошибки в нем.
|
||||
|
||||
_Поддержка_
|
||||
|
||||
Проверьте дату последнего обновления. Если проект не обновлялся в течении нескольких лет - есть большая вероятность, что он был заброшен. Он все еще может быть полезен, но вы будете представлены сами себе. Аналогично, как выглядит трекер ошибок? Много ли важных ошибок, которые игнорируются? (Будьте проницательны здесь, так как часто реалии поддержки свободного проекта требуют тщательного отбора — не все функции будут добавлены.)
|
||||
|
||||
_Качество кода_
|
||||
|
||||
Это хорошо написанная структура? Если он не был спроектирован хорошо - вы должны знать об этом, решая стоит ли доверять ему свой проект.
|
||||
|
||||
_Сообщество_
|
||||
|
||||
Есть ли активное сообщество разработчиков, поддерживающих этот проект? В случае если вам понадобится помощь - будет ли она доступна?
|
||||
|
||||
_Документация_
|
||||
|
||||
Код должен быть хорошо прокомментирован, но в идеале, вики или другая официальная документация для поддержки библиотеки имеет важное значение.
|
||||
|
||||
На момент подготовки настоящего документа фреймворки, перечисленные в Таблице 18-3, удовлетворяли всем или большинству из приведенных выше критериев. Если вы не видите здесь библиотеку для вашего предпочтительного языка программирования, она может быть где-то там, но просто не вошедшей в наш список.
|
||||
|
||||
_Таблица 18-3. Разрабатываемые фреймворки AGI_
|
||||
|
||||
| Фреймворк | Язык |
|
||||
| :---------------- | :--- |
|
||||
| Adhearsion | Ruby |
|
||||
| **Asterisk-Java** | Java |
|
||||
| **AsterNET** | .NET |
|
||||
| **ding-dong** | Node.js |
|
||||
| **PAGI** | PHP |
|
||||
| **Panoramisk** | Python |
|
||||
| StarPy | Python + Twisted |
|
||||
|
||||
## Вывод
|
||||
|
||||
AGI предоставляет мощный интерфейс для Asterisk, который позволяет реализовать управление вызовами от первого лица на выбранном вами языке программирования. Вы можете использовать несколько подходов к реализации приложения AGI. Некоторые подходы могут обеспечить лучшую производительность, но ценой большей сложности. AGI предоставляет среду программирования, которая может облегчить интеграцию Asterisk с другими системами или просто обеспечить более удобную среду программирования управления вызовами для опытного программиста. Во многих случаях наилучшим подходом будет использование предварительно созданной структуры, особенно при оценке или прототипировании сложного проекта. Для максимальной производительности мы по-прежнему рекомендуем вам рассмотреть возможность написания как можно большего объема вашего приложения с помощью диалплана Asterisk.
|
||||
|
||||
[Глава 17. AMI и файлы вызовов](glava-17.md) | [Содержание](SUMMARY.md) | [Глава 19. Asterisk REST Interface](glava-19.md)
|
|
@ -0,0 +1,345 @@
|
|||
# Глава 19. Asterisk REST Interface
|
||||
|
||||
> Люди, которые думаю, будто все знают, раздражают нас, людей, которые действительно все знают.
|
||||
>
|
||||
> -- Айзек Азимов
|
||||
|
||||
Интерфейс Asterisk REST (ARI) был создан для устранения ограничений, присущих разработке внешних или расширенных функций вне Asterisk. В то время как AGI позволяет запускать внешние приложения, а AMI позволяет осуществлять наблюдение и контроль выполняемых вызовов, любая попытка интегрировать их в полное внешнее приложение быстро становится сложной и запутанной. ARI позволяет разработчикам создавать автономное и полное приложение, используя Asterisk в качестве базового движка.
|
||||
|
||||
На момент написания этой статьи ARI требует очень простого диалплана для запуска приложения `Stasis()`, которое затем передает канал ARI. К тому времени, когда вы читаете это, очень вероятно, что это требование изменилось, поскольку сообщество разработчиков Asterisk активно работает над тем, чтобы позволить ARI появляться без какого-либо диалплана в середине.
|
||||
|
||||
Использование внешнего интерфейса, такого как ARI, для управления Asterisk, не обязательно облегчит вашу жизнь. Навыки, необходимые для реализации и устранения неполадок приложений этого типа, требуют комплексного набора навыков не только на выбранном языке, но и в области системного администрирования Linux, администрирования Asterisk, устранения неполадок в сети и основных концепций телефонии. Для опытного разработчика ARI может дать необходимую мощь в приложениях, но для тех, кто учится, мы рекомендуем изучить диалплан прежде чем погружаться во внешние среды разработки. Диалплан является своеобразным, но он также полностью интегрирован, высокопроизводителен и относительно прост в освоении.
|
||||
|
||||
Сказав это, давайте разберемся с ARI.
|
||||
|
||||
## ARI быстрый старт
|
||||
|
||||
В этом разделе приведен простой рабочий пример ARI. Позже в этой главе мы рассмотрим все более подробно.<sup><a href="#sn1">1</a></sup>
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="left"><b>Предупреждение</b></p>
|
||||
<p>В этом разделе быстрого старта мы будем использовать очень простой уровень доступа HTTP. Вы должны быть очень осторожны при вводе такого рода конфигурации в продакшен. Если, например, вы собираетесь запустить приложение на отдельном компьютере и подключить его к Asterisk через сокет, то потребуется более безопасное соединение. То, что мы делаем в этом разделе, сродни парусному клубу, использующему шлюпки для обучения; полезно в качестве начинания, но глупо и опасно выходить в море на таком судне.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Базовая конфигурация Asterisk
|
||||
|
||||
У вас уже должен быть запущен веб-сервер Asterisk, поэтому вам просто нужно проверить, что ваш файл _/etc/asterisk/http.conf_ выглядит следующим образом:
|
||||
|
||||
```text
|
||||
[general]
|
||||
enabled = yes
|
||||
bindaddr = 127.0.0.1
|
||||
```
|
||||
|
||||
Далее нужен простой файл _/etc/asterisk/ari.conf_:
|
||||
|
||||
```text
|
||||
[general]
|
||||
enabled = yes
|
||||
pretty = yes
|
||||
[asterisk]
|
||||
type = user
|
||||
read_only = no
|
||||
password = чтобывыниделалинеиспользуйтеэтотпароль
|
||||
```
|
||||
|
||||
Хорошо, давайте загрузим модуль `ari` сейчас:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rx 'module load res_ari.so'
|
||||
Loaded res_ari.so => (Asterisk RESTful Interface)
|
||||
```
|
||||
|
||||
Затем в файл _/etc/asterisk/extensions.conf_ необходимо добавить расширение для запуска приложения диалплана `Stasis()`:<sup><a href="#sn2">2</a></sup>
|
||||
|
||||
```text
|
||||
exten => 242,1,Noop()
|
||||
same => n,Stasis(zarniwoop)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Перезагрузите ваш диалплан с помощью:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rx 'dialplan reload'
|
||||
Dialplan reloaded.
|
||||
```
|
||||
|
||||
На этом этапе может быть стоит просто перезагрузить Asterisk:
|
||||
|
||||
```text
|
||||
$ sudo service asterisk restart
|
||||
```
|
||||
|
||||
Осталось всего несколько шагов, и вы готовы протестировать свою среду ARI.
|
||||
|
||||
### Тестирование вашей среды ARI
|
||||
|
||||
Поскольку ARI зависит от WebSockets, нам понадобится инструмент, позволяющий тестировать из командной строки. Node.JS package manager (npm) позволит нам найти и установить инструмент сканирования, который мы будем использовать для наших тестов.
|
||||
|
||||
```text
|
||||
$ sudo yum -y install npm
|
||||
$ sudo npm install -g wscat
|
||||
/usr/bin/wscat -> /usr/lib/node_modules/wscat/bin/wscat
|
||||
/usr/lib
|
||||
+-- wscat@2.2.1
|
||||
+-- commander@2.15.1
|
||||
+-- read@1.0.7
|
||||
¦ +-- mute-stream@0.0.8
|
||||
+-- ws@5.2.2
|
||||
+-- async-limiter@1.0.0
|
||||
```
|
||||
|
||||
Теперь давайте зажжем его и посмотрим, что получим!
|
||||
|
||||
```text
|
||||
$ wscat -c "ws://localhost:8088/ari/events?api_key= \
|
||||
asterisk:чтобывыниделалинеиспользуйтеэтотпароль&app=zarniwoop"
|
||||
|
||||
connected (press CTRL+C to quit)
|
||||
>
|
||||
```
|
||||
|
||||
Пока все идет хорошо. Давайте сделаем звонок в наше приложение `Stasis()` и посмотрим что произойдет.
|
||||
|
||||
Откройте новое окно SSH (оставьте предыдущее как есть, чтобы видеть что происходит в сеансе `wscat`). Подключитесь к CLI Asterisk в этом новом сеансе оболочки:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rvvvv
|
||||
```
|
||||
|
||||
Используя один из ваших лабораторных телефонов, позвоните на номер 242.
|
||||
|
||||
В Asterisk CLI, вы должны увидеть это:
|
||||
|
||||
```text
|
||||
*CLI>
|
||||
== Setting global variable 'SIPDOMAIN' to '172.29.1.57'
|
||||
-- Executing [242@sets:1] NoOp("PJSIP/SOFTPHONE_A-00000001", "") in new stack
|
||||
-- Executing [242@sets:2] Stasis("PJSIP/SOFTPHONE_A-00000001", "zarniwoop") in new stack
|
||||
```
|
||||
|
||||
И в сеансе `wscat` вы должны увидеть это:
|
||||
|
||||
```text
|
||||
>
|
||||
< {
|
||||
"type": "StasisStart",
|
||||
"timestamp": "2019-01-27T21:43:43.720-0500",
|
||||
"args": [],
|
||||
"channel": {
|
||||
"id": "1548643423.2",
|
||||
"name": "PJSIP/SOFTPHONE_A-00000002",
|
||||
"state": "Ring",
|
||||
"caller": {
|
||||
"name": "101",
|
||||
"number": "SOFTPHONE_A"
|
||||
},
|
||||
"connected": {
|
||||
"name": "",
|
||||
"number": ""
|
||||
},
|
||||
"accountcode": "",
|
||||
"dialplan": {
|
||||
"context": "sets",
|
||||
"exten": "242",
|
||||
"priority": 2
|
||||
},
|
||||
"creationtime": "2019-01-27T21:43:43.709-0500",
|
||||
"language": "en"
|
||||
},
|
||||
"asterisk_id": "08:00:27:27:bf:0e",
|
||||
"application": "zarniwoop"
|
||||
}
|
||||
>
|
||||
```
|
||||
|
||||
Хорошо, теперь мы откроем еще один сеанс оболочки<sup><a href="#sn3">3</a></sup>, чтобы взаимодействовать с этим соединением, которое мы создали. Из этой новой оболочки выполните следующую команду:
|
||||
|
||||
```text
|
||||
$ curl -v -u asterisk:чтобывыниделалинеиспользуйтеэтотпароль -X POST \
|
||||
"http://localhost:8088/ari/channels/1548643423.2/play?media=sound:believe-its-free" sd
|
||||
```
|
||||
|
||||
Обратите внимание, что "`id` "из JSON, возвращаемый в сеансе `wscat`, должен использоваться после части `'channels/'` команды `curl`. Другими словами, вы должны сопоставить идентификатор канала в вашей команде с идентификатором канала, связанным с вашим вызовом. Таким образом, вы можете одновременно обрабатывать множество звонков.
|
||||
|
||||
### Работа с вашей средой ARI с использованием Swagger
|
||||
|
||||
Asterisk's ARI был разработан, чтобы быть совместимым со спецификацией Open API (aka Swagger) и это означает, что многие инструменты, совместимые с этой спецификацией, будут работать с ARI. Например, вы можете взаимодействовать с установкой AIR с помощью Swagger-UI, который будет полезен как для отладки, так и в качестве источника документации.
|
||||
|
||||
Во-первых, нам нужно будет открыть наш HTTP-сервер Asterisk в локальной сети (в настоящее время он разрешает только соединения с 127.0.0.1). В вашем файле _/etc/asterisk/http.conf_ мы привяжем HTTP-сервер к локальному IP-адресу машины "Asterisk":
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/http.conf
|
||||
; Включите встроенный HTTP-сервер и прослушивайте только соединения на локальном хосте.
|
||||
[general]
|
||||
enabled = yes
|
||||
;bindaddr = 127.0.0.1 ; закомментируйте это
|
||||
bindaddr = 172.29.1.57 ; LAN IP ВАШЕГО СЕРВЕРА ASTERISK
|
||||
```
|
||||
|
||||
Далее нам нужно добавить строку в ваш файл _/etc/asterisk/ari.conf_:
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/ari.conf
|
||||
[general]
|
||||
enabled = yes
|
||||
pretty = yes
|
||||
allowed_origins=http://ari.asterisk.org
|
||||
...
|
||||
```
|
||||
|
||||
Сохраните и перезагрузите модули `http` and `ari` в Asterisk:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rx 'module reload http' ; sudo asterisk -rx 'module reload ari'
|
||||
```
|
||||
|
||||
Теперь на рабочем столе разработчика откройте браузер и перейдите в раздел [http://ari.asterisk.org](http://ari.asterisk.org/).
|
||||
|
||||
Вы увидите страницу, похожую на Рисунок 19-1.
|
||||
|
||||

|
||||
|
||||
_Рисунок 19-1. Swagger UI для ARI_
|
||||
|
||||
Замените `localhost` на LAN IP-адрес вашего сервера Asterisk, а в поле api\_key введите Ваш ARI _`user:password`_ из _/etc/asterisk/ari.conf_ (например, `asterisk:чтобывыниделалинеиспользуйтеэтотпароль`). Если у вас есть все настройки верны, то вы будете вознаграждены с результатами как на Рисунке 19-2.
|
||||
|
||||

|
||||
|
||||
_Рисунок 19-2. ARI Swagger_
|
||||
|
||||
Вы видите полную документацию для вашего модуля ARI, и можете на самом деле так же передавать к нему запросы. Это очень полезно при отладке, и хвала людям Digium за это.
|
||||
|
||||
В качестве примера того, для чего это нужно, выберите пункт `endpoints:Endpoint resources`, нажмите кнопку `GET` рядом с `/endpoints`, и вы увидите экран, показанный на Рисунке 19-3.
|
||||
|
||||

|
||||
|
||||
_Рисунок 19-3. Получение конечных точек_
|
||||
|
||||
Ну, давай - жми на кнопку "Try it out!".
|
||||
|
||||
Обратите внимание на "`id`" канала в сеансе `wscat`, который вы хотите скопировать для использования в Swagger UI (вы увидите несколько строк вывода JSON, связанных с вызовом).
|
||||
|
||||
Выполните следующие действия по каналу через интерфейс Swagger UI: `POST: Answer` (ответ на канал), `POST: hold` (поставить вызов на удержание), `DELETE: hold` (принять вызов из режима ожидания). Обратите внимание на то, что происходит с каналом в каждом случае.
|
||||
|
||||
Использование этого Swagger UI также документировано в [Asterisk wiki](https://wiki.asterisk.org/wiki/display/AST/Using+Swagger+to+Drive+ARI).
|
||||
|
||||
Это значительно упростит процесс разработки и тестирования.
|
||||
|
||||
Хорошо, это быстрый старт. Давайте нырнем поглубже в ARI.
|
||||
|
||||
## Строительные блоки ARI
|
||||
|
||||
Есть три компонента, которые работают вместе для обеспечения ARI:
|
||||
|
||||
* RESTful интерфейс, через который внешнее приложение взаимодействует с Asterisk.
|
||||
* WebSocket, который передает информацию обратно во внешнее приложение из Asterisk (в формате JSON).
|
||||
* Приложение диалплана `Stasis()`, которое соединяет управление каналом с внешним приложением.
|
||||
|
||||
### REST
|
||||
|
||||
Термин _RESTful_ происходит от Representational State Transfer (REST), который является архитектурной моделью для веб-служб (в отличие, скажем, от протокола\). Термин RESTful обычно относится к любому API, который обеспечивает взаимодействие через URL-адреса с данными, представленными в формате JSON.<sup><a href="#sn4">4</a></sup> Итак, все, что является "RESTfull", должно соответствовать ограничениям REST, но на практике может быть реализовано как более свободная интерпретация (которая, если выполнит свою работу, действительно может быть достаточно хорошей).
|
||||
|
||||
### WebSocket
|
||||
|
||||
Соединение WebSocket - это механизм, который осуществляет связь между внутренними компонентами Asterisk и интерфейсом RESTful. В Asterisk могут происходить события, которые клиент не инициировал, и WebSocket позволяет Asterisk сигнализировать об этих изменениях клиенту.
|
||||
|
||||
Встроенный HTTP-сервер Asterisk потенциально предоставляет другие сервисы через веб-интерфейс. Например, WebRTC также подключается через веб-сервер. Если вы вносите изменения или добавляете новые службы, убедитесь, что проверили не только элемент, над которым работаете, но и другие службы, работающие через тот же сервер, чтобы убедиться, что случайно не расстроили что-то другое.
|
||||
|
||||
### Stasis
|
||||
|
||||
Шина сообщений Stasis позволяет ядру Asterisk связывать события с другими модулями и компонентами. Она как правило является внутренней для Asterisk; тем не менее, в случае ARI приложение диалплана с именем `Stasis()` позволяет диалплану передать управление вызовами внешнему приложению ARI.
|
||||
|
||||
Само приложение `Stasis()` требуется для того, чтобы сигнализировать диалплану, что управление вызовами должно быть передано внешней программе через ARI.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p>Начиная с Asterisk 16, больше нет необходимости писать код диалплана для определения соединения от входящего канала к клиентскому приложению ARI. Многие разработчики в сообществе Asterisk пишут всю свою логику управления вызовами во внешних приложениях, и необходимость писать несколько строк диалплана только для передачи каналов в свое приложение считалась сложной и запутанной. Они запросили (и разработали) механизм, с помощью которого Asterisk автоматически создает диалплан для обработки этой функции.</p>
|
||||
<p>При создании экземпляра API, ссылка на приложение в URL-адресе — например, наше приложение <code>zarniwoop</code> - инициирует автоматическое создание контекста диалплана, названного в соответствии с именем приложения (в данном случае <code>[stasis-zarniwoop]</code>), включая расширение, шаблон которого соответствует всему. Затем это расширение будет передавать все вызовы, поступающие в этот контекст в <code>Stasis(zarniwoop)</code>. Вам нужно будет связать ваши каналы с правильным контекстом (<code>context=stasis-zarniwoop</code>) в ваших таблицах конфигурации PJSIP (или другого канала), и в момент вызова этих каналов они будут автоматически подключены через <code>Stasis()</code> к клиентскому приложению.</p>
|
||||
<p>Если все это кажется запутанным, нет причин, по которым вам нужно прекратить использовать фактический диалплан для обработки этого, как мы делали ранее в нашем примере быстрого запуска.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Понимание работы `Stasis()` обычно не требуется, если вы не собираетесь разрабатывать сам продукт Asterisk (т.е. присоединиться к команде разработчиков Asterisk и создавать новые возможности в Asterisk).
|
||||
|
||||
Как правило, после первых экспериментов с ARI вы захотите реализовать фреймворк для облегчения работ по разработке внешнего приложения.
|
||||
|
||||
## Фреймворки
|
||||
|
||||
Производственное приложение, использующее ARI, выиграет от внедрения платформы для упрощения разработки, добавления уровня безопасности и обеспечения среды управления.
|
||||
|
||||
Существует несколько таких библиотек. Какую из них вы выберете отчасти будет продиктовано тем, какой язык вы предпочитаете использовать, а также должны учитывать, имеет ли структура, в которой вы заинтересованы, активное сообщество и наличие активной поддержки.
|
||||
|
||||
Те, которые описаны ниже, перечислены в Asterisk wiki. Мы рассмотрели репозиторий кода для каждого, и хотя некоторые проекты все еще активно поддерживаются, другие не обновлялись в течение довольно продолжительного времени. Если вы планируете реализовать один из этих фреймворков, вам нужно будет сделать собственную экспертизу, чтобы убедиться, что вы можете получить поддержку для него. Во многих случаях, возможно, стоит обратиться к разработчикам и определить их ставки за консультации, чтобы вы могли обеспечить приоритетный доступ к их времени, если вам это нужно.
|
||||
|
||||
### ari-py (и aioari) для Python
|
||||
|
||||
Фреймворк [ari-py](https://github.com/asterisk/ari-py) была написана Digium в 2013-2014 годах и с тех пор она не обновлялась. Эта структура основана на клиенте Asterisk Swagger.py.
|
||||
|
||||
Вскоре после выпуска ari-py он был разветвлен в [проект aioari](https://pypi.org/project/aioari/), который предоставляет асинхронную версию ari-py. С тех пор этот код постоянно обновляется (хотя на момент написания этой статьи он не обновлялся с начала 2018 года). Эта структура должна быть включена в вашу оценку структуры Python для ARI.
|
||||
|
||||
Если вы хотите разрабатывать приложения ARI на Python, одна из этих двух платформ может быть тем, что вы ищете. Если хотите создать большое приложение ARI - вам необходимо убедиться, что вы тщательно проверили влияние производительности использования Python на то, что делаете.
|
||||
|
||||
Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
|
||||
|
||||
### node-ari-client
|
||||
|
||||
Для любителей JavaScript есть основанный на Node.js ARI-фреймворк, который был впервые выпущен в начале 2014 года, и на момент написания этой статьи все еще обновляется. Он основан на автоматически генерируемом API, который приходит из swagger-js.
|
||||
|
||||
Для разработчиков JavaScript/Node, вы можете начать: [_https://github.com/asterisk/node-ari-client_](https://github.com/asterisk/node-ari-client).
|
||||
|
||||
Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
|
||||
|
||||
### AsterNET.ARI
|
||||
|
||||
Сторонники Windows так же не остались в стороне. Проект AsterNET.ARI предоставляет платформу для .NET, которая дополняет проект Masternet \(который также включает интеграцию с интерфейсами Asterisk FastAGI и AMI\).
|
||||
|
||||
Вы можете найти репозиторий для AsterNET.ARI здесь: [_https://github.com/skrusty/AsterNET.ARI_](https://github.com/skrusty/AsterNET.ARI).
|
||||
|
||||
Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
|
||||
|
||||
### ari4java
|
||||
|
||||
Проект ari4java является одним из наиболее активно разрабатываемых фреймворков ARI, которые мы нашли. Он разрабатывался с 2013 года, и репозиторий получал коммиты одновременно с этой записью.
|
||||
|
||||
Если Java - ваш язык, вы точно захотите проверить репозиторий ari4java по адресу [_https://github.com/l3nz/ari4java_](https://github.com/l3nz/ari4java).
|
||||
|
||||
### phpari
|
||||
|
||||
Проект phpari предоставляет платформу ARI для сообщества PHP. Он разрабатывался с 2014 года, и на момент написания этой статьи репозиторий все еще обновлялся.
|
||||
|
||||
Для поклонников PHP вы найдете репозиторий по адресу [_https://github.com/greenfieldtech-nirs/phpari_](https://github.com/greenfieldtech-nirs/phpari).
|
||||
|
||||
### aricpp
|
||||
|
||||
Если вы привыкли писать на C++, есть даже проект ARI для вас. Платформа aricpp состоит только из файлов заголовков, так что вы можете встроить свои функции прямо в то, что разрабатываете. Эта библиотека также была протестирована на производительность с помощью SIPp, и хотя у нас нет цифр по этому поводу, нам кажется, что скомпилированная среда, которая была протестирована на производительность, очень стоит того, чтобы её попробовать, если у вас есть соответствующие навыки.
|
||||
|
||||
Один из самых новых фреймворков ARI, этот проект получает регулярные обновления. Проверьте его [_https://github.com/daniele77/aricpp_](https://github.com/daniele77/aricpp).
|
||||
|
||||
### asterisk-ari-client
|
||||
|
||||
Да, Ruby тоже имеет фреймворк ARI.
|
||||
|
||||
Вы можете найти его по адресу [_https://github.com/svoboda-jan/asterisk-ari_](https://github.com/svoboda-jan/asterisk-ari).
|
||||
|
||||
## Вывод
|
||||
|
||||
ARI предоставляет RESTful API текущего поколения, который может использоваться для разработки коммуникационных приложений с использованием популярных языков разработки. С его помощью опытный разработчик может использовать мощь самой успешной платформы АТС в истории. Это позволяет коммуникационным приложениям следующего поколения взаимодействовать с устаревшими телекоммуникационными протоколами и приложениями, что может оказаться очень полезным, поскольку мы все чаще призваны преодолевать разрыв между прошлым, настоящим и будущим коммуникационных технологий.
|
||||
|
||||
---
|
||||
|
||||
<ol>
|
||||
<li id="sn1">Хотя, честно говоря, в конфигурации нет особой сложности, если вы решите внедрить одну из платформ, что настоятельно рекомендуется для продакшена, и которую мы рассмотрим позже.</li>
|
||||
<li id="sn2">Мы назвали приложение "zarniwoop", потому что “hello-world” использовалось в Digium wiki для ARI, и нам показалось, что лучше избегать перекрытия. Вы, конечно, можете назвать его как угодно.</li>
|
||||
<li id="sn3">Если ваш компьютер имеет только один экран, то, вероятно, это то место, где вы задумаетесь, что неплохо было бы иметь их больше.</li>
|
||||
<li id="sn4">Строго говоря, REST - это гораздо больше, но на практике в наши дни не редкость предположить, что REST API будет основан на URL и JSON просто потому, что много сервисов представлены именно в этих форматах.</li>
|
||||
</ol>
|
||||
|
||||
[Глава 18. AGI](glava-18.md) | [Содержание](SUMMARY.md) | [Глава 20. WebRTC](glava-20.md)
|
|
@ -0,0 +1,264 @@
|
|||
# Глава 20. WebRTC
|
||||
|
||||
> _Web, каким я его себе представлял, мы еще не видели. В будущем все еще намного больше, чем прошлом._
|
||||
>
|
||||
> -- Тим Бернерс-Ли
|
||||
|
||||
## **Браузер как телефон**
|
||||
|
||||
В интернет-коммуникации назревает новая революция и, хотя она вряд ли наделает столько шума как революция телекоммуникаций с открытым исходным кодом, она определенно имеет потенциал чтобы тихо заменить сердце каждого текущего коммуникационного приложения.
|
||||
|
||||
Сегодня интернет предлагает множество приложений для конференций с закрытым исходным кодом. Все они делают примерно одно и то же, и все же большинство из них требуют установки проприетарного программного обеспечения прежде, чем вы сможете их использовать \(что, конечно, поможет сохранить загрузку в памяти вашего компьютера\). Каждое из них не отличается от последнего приложения конференц-связи, которое вы были вынуждены установить \(для некоторых других встреч, на которых вы присутствовали\). Каждая из этих компаний надеется, что она станет выше других чтобы доминировать в пространстве. Между тем, WebRTC спокойно создает стандарт, который принудительно устраняет все концепции проприетарных мультимеа-коммуникаций, которые, как мы надеемся, устранят некоторые из этих узколобых, огороженных стеной мышления и откроют коммуникации для некоторых фактических инноваций.
|
||||
|
||||
С тех самых пор, как существуют веб-браузеры, предпринимались попытки интегрировать мультимедиа в интернет. Это оказалось сложнее, чем ожидалось, так что сегодня телефон по-прежнему является отдельным приложением \(или, конечно, отдельным устройством в целом\).
|
||||
|
||||
WebRTC обещает изменить все это.
|
||||
|
||||
В этой главе мы познакомим вас с интерпретацией WebRTC, предложенной Asterisk. Ни в коем случае не следует считать это всеобъемлющим введением; все, на что у нас будет время — это провести вас через создание стандартного приложения для видеоконференций, которое, по сути, является приложением “Hello World”, которое все используют для начала работы с WebRTC. Это отличный способ пнуть шины, но важно понимать, что WebRTC будет намного больше.
|
||||
|
||||
## **Предварительное знание**
|
||||
|
||||
Прежде чем погрузиться в WebRTC, есть некоторые базовые технологии, которые должны объединиться.
|
||||
|
||||
Прежде всего: если вы серьезно относитесь к WebRTC — вам понадобится доступ к веб-разработчику, а в идеале к кому-то, кто имеет глубокие знания различных языков, протоколов и технологий, которые делают интернет работающим. WebRTC — это веб-разработка и это технология bleeding-edge, и вы столкнетесь с несовместимостью, проблемами браузера, нераскрытыми ошибками, неполной документацией и другими проблемами, присущими новой технологии. Если вы не являетесь разработчиком полного стека с твердыми сетевыми и Linux навыками, у вас будет очень крутая кривая обучения с WebRTC!
|
||||
|
||||
> Вероятно, Цахи Левент-Леви сказал по этому поводу лучше всего:
|
||||
>
|
||||
> _WebRTC - это технология, которая является частью VoIP и частью Web. ... Для того, чтобы действительно быть профессиональным разработчиком WebRTC, вы должны быть в состоянии понять две очень разные технические области:_
|
||||
>
|
||||
> 1. _Вы должны знать, как работает VoIP. Как движется медиапоток по сети в режиме реального времени \(такие вещи, как RTP, RTCP, Jitter Buffer и множество других сокращений\)._
|
||||
> 2. _Вам нужно знать и понимать, как разрабатывать для web — frontend и backend \(любой разработчик полного стека?\). JavaScript - это данность. Бонусные очки за node.js._
|
||||
|
||||
Итак, да, вы должны быть разработчиком полного стека, плюс гуру VoIP, если хотите комфортно погрузиться в WebRTC. Мы говорим это не для того, чтобы отпугнуть вас, а чтобы заверить, что если вы находите это сложным, то это не связано с каким-либо недостатком с вашей стороны, а просто потому, что это сложный, многослойный материал.
|
||||
|
||||
Сказав все это, можно получить вкус WebRTC без всего этого и в этой главе мы собираемся настроить Asterisk для поддержки WebRTC и запустить предварительно построенное веб-приложение, которое продемонстрирует основные аудио/видео возможности реализации Asterisk WebRTC. У вас все еще будет эта крутая кривая обучения, но, надеюсь, мы создали фундамент, на котором можно строить.
|
||||
|
||||
## **Конфигурирование Asterisk для WebRTC**
|
||||
|
||||
Для передачи вызовов через Asterisk с помощью WebRTC необходимо использовать драйвер канала PJSIP. Конфигурация будет аналогична конфигурации стандартных SIP-телефонов, но не идентична.
|
||||
|
||||
Для этого нам понадобится тип транспорта, который мы добавим в файл _/etc/asterisk/pjsip.conf_:
|
||||
|
||||
```text
|
||||
[transport-udp]
|
||||
type=transport
|
||||
protocol=udp
|
||||
bind=0.0.0.0
|
||||
[transport-tls]
|
||||
type=transport
|
||||
protocol=tls
|
||||
bind=0.0.0.0
|
||||
cert_file=/home/asterisk/certs/self-signed.crt
|
||||
priv_key_file=/home/asterisk/certs/self-signed.key
|
||||
```
|
||||
|
||||
Это все для редактирования конфигурационного файла. Для остальных изменений PJSIP мы будем использовать базу данных.[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch20.html#idm46178396562296)
|
||||
|
||||
Мы создадим двух новых подписчиков с именами `WS_PHONE_A` и `WS_PHONE_B`. Клиент WebRTC будет использовать учетные данные для этих конечных точек для связи с драйвером канала PJSIP в Asterisk \(т.е. для совершения телефонных звонков\).
|
||||
|
||||
В таблицу ps\_aors необходимо добавить две записи:
|
||||
|
||||
```text
|
||||
INSERT into asterisk.ps_aors
|
||||
(id, max_contacts)
|
||||
values ('WS_PHONE_A', 5),
|
||||
('WS_PHONE_B', 5)
|
||||
;
|
||||
```
|
||||
|
||||
Необходимы соответствующие записи ps_auth:
|
||||
|
||||
```text
|
||||
INSERT into asterisk.ps_auths
|
||||
(id, auth_type, password, username)
|
||||
values ('WS_PHONE_A','userpass','spiderwrench','WS_PHONE_A'),
|
||||
('WS_PHONE_B','userpass','arachnoratchet','WS_PHONE_B')
|
||||
;
|
||||
```
|
||||
|
||||
Затем мы создадим сами конечные точки:
|
||||
|
||||
```text
|
||||
INSERT INTO asterisk.ps_endpoints
|
||||
(id,aors,auth,context,
|
||||
transport,dtls_auto_generate_cert,webrtc,disallow,allow)
|
||||
VALUES
|
||||
('WS_PHONE_A','WS_PHONE_A','WS_PHONE_A','sets',
|
||||
'transporttls','yes','yes','all','vp8,opus,ulaw'),
|
||||
('WS_PHONE_B','WS_PHONE_B','WS_PHONE_B','sets',
|
||||
'transport-tls','yes','yes','all','vp8,opus,ulaw');
|
||||
```
|
||||
|
||||
В [Главе 4](glava-04.md) мы уже создали наши сертификаты, поэтому должны иметь возможность использовать их здесь.
|
||||
|
||||
```text
|
||||
$ ls -l /home/asterisk/certs/
|
||||
```
|
||||
|
||||
Мы должны позаботиться о конфигурации канала для нашего примера WebRTC.
|
||||
|
||||
Теперь нам нужно настроить веб-сервер Asterisk для обработки HTTPS.
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/http.conf
|
||||
[general]
|
||||
enabled=yes
|
||||
bindaddr=0.0.0.0
|
||||
bindport=8088
|
||||
tlsenable=yes
|
||||
tlsbindaddr=0.0.0.0:8089
|
||||
tlscertfile=/home/asterisk/certs/self-signed.crt
|
||||
tlsprivatekey=/home/asterisk/certs/self-signed.key
|
||||
```
|
||||
|
||||
Сохранимся и перезапустим Asterisk.
|
||||
|
||||
```text
|
||||
$ sudo service asterisk restart
|
||||
```
|
||||
|
||||
Убедитесь, что Asterisk теперь работает не только на HTTP-сервере, но и на HTTPS:
|
||||
|
||||
```text
|
||||
*CLI> http show status
|
||||
HTTP Server Status:
|
||||
Server Enabled and Bound to 0.0.0.0:8088
|
||||
HTTPS Server Enabled and Bound to 0.0.0.0:8089
|
||||
Enabled URI's:
|
||||
/ws => Asterisk HTTP WebSocket
|
||||
```
|
||||
|
||||
Ищите в выходных данных `HTTPS`, чтобы проверить работоспособность сертификатов и также должны увидеть /ws, поскольку это указывает на загрузку компонентов WebSockets.
|
||||
|
||||
---
|
||||
|
||||
Подсказка: если он не работает, всегда проверяйте _/var/log/messages_ для любых сообщений SELinux.
|
||||
|
||||
```text
|
||||
$ sudo grep sealert /var/log/messages
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Брандмауэр в настоящее время не настроен для этих портов, поэтому нам нужно добавить несколько правил для обработки:
|
||||
|
||||
```text
|
||||
$ sudo firewall-cmd --zone=public --add-port=8088/tcp
|
||||
$ sudo firewall-cmd --zone=public --add-port=8088/tcp --permanent
|
||||
$ sudo firewall-cmd --zone=public --add-port=8089/tcp
|
||||
$ sudo firewall-cmd --zone=public --add-port=8089/tcp --permanent
|
||||
$ sudo firewall-cmd --zone=public --add-port=5061/udp
|
||||
$ sudo firewall-cmd --zone=public --add-port=5061/udp --permanent
|
||||
```
|
||||
|
||||
На этом этапе вам нужно запустить веб-браузер и установить соединение. Ваш браузер будет жаловаться на соединение, если вы используете самоподписанный сертификат, но он позволит вам осуществить соединение. Это критический шаг, так как вы должны указать вашему браузеру хранить сертификат постоянно, так что WebRTC может использовать соединение WebSocket. Следующий URL-адрес соединит вас:
|
||||
|
||||
```text
|
||||
https://ip-of-asterisk-server:8089/ws
|
||||
```
|
||||
|
||||
Если вы получите сообщение `Upgrade Required` \(о необходимости обновления\), _это хорошо_. Это означает, что соединение хорошее и это просто протокол, говорящий вам, что для этого недостаточно технологии, чтобы это было фактическое соединение WebSocket. Мы там, где должны быть.
|
||||
|
||||
Конечно, следующая вещь - фактически испытать сеанс WebRTC через ту среду, которую мы настроили; и для того, чтобы проверить все это, вам нужно будет запустить браузер и загрузить в нем какой-нибудь клиент WebRTC. Следующий раздел будет делать именно это.
|
||||
|
||||
## **Cyber Mega Phone**
|
||||
|
||||
Для того, чтобы увидеть WebRTC в действии на вашей системе Asterisk вам нужно что-то, что работает в вашем браузере. Самый простой способ увидеть это в действии — взять _Cyber Mega Phone_ от Digium. Это позволит вам быстро настроить рабочий сеанс WebRTC с помощью Asterisk.
|
||||
|
||||
Во-первых, так как WebRTC требует использования TLS \(что не является обязательным, как в случае с SIP\), мы собираемся заставить вас еще раз проверить установку ваших сертификатов. Если вы еще не сделали этого, сейчас самое время поработать над [Главой 4](glava-04.md), или есть скрипт, предоставляемый как часть исходного кода Asterisk, генерирующий ключи и сертификаты \(вы найдете его в исходниках Asterisk в каталоге _/home/astmin/src/asterisk-16.<TAB >/contrib/scripts/_. Скрипт называется _as_tls_cert_, и он задокументирован в wiki Asterisk.
|
||||
|
||||
Хорошо, теперь нам нужен диалаплан для приема наших звонков WebRTC:
|
||||
|
||||
```text
|
||||
$ vim /etc/asterisk/extensions.conf
|
||||
exten => 246,1,Noop()
|
||||
same => n,Answer()
|
||||
same => n,Wait(0.5)
|
||||
same => n,StreamEcho(4)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Сам Cyber Mega Phone находится на GitHub под [аккаунтом Asterisk](https://github.com/asterisk/cyber_mega_phone_2k).
|
||||
|
||||
Вы можете загрузить код и запустить его с локального компьютера или же можете загрузить его на веб-сервер и пользоваться им оттуда.
|
||||
|
||||
Давайте воспользуемся им с нашего сервера Asterisk:
|
||||
|
||||
```text
|
||||
$ cd /var/lib/asterisk/static-http
|
||||
$ sudo git clone https://github.com/asterisk/cyber_mega_phone_2k.git
|
||||
$ sudo chown -R asterisk:asterisk cyber_mega_phone_2k ; sudo chmod 755 cyber_mega_phone_2k
|
||||
```
|
||||
|
||||
Нам понадобится небольшое изменение в конфигурации HTTP-сервера Asterisk, чтобы он мог обслуживать статический контент.
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/http.conf
|
||||
[general]
|
||||
enabled=yes
|
||||
bindaddr=0.0.0.0
|
||||
bindport=8088
|
||||
tlsenable=yes
|
||||
tlsbindaddr=0.0.0.0:8089
|
||||
tlscertfile=/home/asterisk/certs/asterisk.crt
|
||||
tlsprivatekey=/home/asterisk/certs/asterisk.key
|
||||
enablestatic=yes
|
||||
redirect=/cmp2k /static/cyber_mega_phone_2k/index.html
|
||||
```
|
||||
|
||||
Сохраните и перезагрузите http-модуль из консоли Asterisk:
|
||||
|
||||
```text
|
||||
*CLI> module reload http
|
||||
```
|
||||
|
||||
Теперь с помощью браузера можно перейти к новому клиентскому приложению WebRTC:
|
||||
|
||||
https://your_asterisk_server:8089/cmp2k
|
||||
|
||||
Если все пойдет по плану, вы увидите что-то вроде Рисунка 20-1.
|
||||
|
||||

|
||||
|
||||
_Рисунок 20-1. Cyber Mega Phone 2K_
|
||||
|
||||
Нажмите кнопку Account и введите учетные данные пользователя WebRTC (см. Рисунок 20-2).
|
||||
|
||||

|
||||
|
||||
_Рисунок 20-2. Данные учетной записи WebRTC_
|
||||
|
||||
После ввода сведений, относящихся к системе, нажмите X для сохранения и закрытия.
|
||||
|
||||
Теперь вы можете нажать кнопку Connect и, если все прошло хорошо, ваш клиент WebRTC должен зарегистрироваться в Asterisk \(это хорошее время для мониторинга консоли Asterisk, чтобы увидеть, что происходит и есть ли какие-либо ошибки\).
|
||||
|
||||
Если вы нажмете кнопку Call сейчас, то должны подключиться через WebRTC и увидеть два окна \([Рисунок 20-3](https://docs.google.com/document/d/13JVG7cvL-x3zXSA95VlHj4nEjCsZiGpuPRZkbjs75cQ/edit#bookmark=id.1fob9te)\). Одно из них — ваше локальное видео, а другое — отображает дальний конец \(т.е. он имитирует другого пользователя, повторяя то, что отправили Вы\). Если Ваше аудио также работает, то вы даже можете получить некоторый шум обратной связи!
|
||||
|
||||

|
||||
|
||||
_Рисунок 20-3. Приложение Echo с видео_
|
||||
|
||||
Вы видите, что есть окно удаленного видео рядом с окном локального видео. Возможно, мы не достигли многого, чтобы хвастаться, но ваша система Asterisk обрабатывает WebRTC, поэтому улыбнитесь и сделайте перерыв. Вы это заслужили.
|
||||
|
||||
## **Подробнее об WebRTC**
|
||||
|
||||
Экосистема WebRTC быстро развивается и то, что верно на момент написания этой статьи, может быть неверным в ближайшем будущем. Мы нашли следующие ресурсы, которые могут быть очень полезными:
|
||||
|
||||
* Цахи Левант-Леви участвует во многих различных инициативах WebRTC, и он щедро делится знаниями о том, как познать WebRTC. Проверьте его сайт bloggeek.me. Подпишитесь на него.
|
||||
* Группа людей под руководством Kranky Geek выпустила несколько конференций об WebRTC и поделилась многими полезными видео на YouTube. На YouTube-канале [Kranky Geek](http://bit.ly/31DAGVx) вы найдете их.
|
||||
* Ознакомьтесь с различными протоколами сигнализации, которые популярны в WebRTC: SIP, VIRTO \(из проекта FreeSwitch\), XMPP и даже JSON.
|
||||
* Посмотрите различные библиотеки сигнализации WebRTC. В настоящее время к популярным относятся: sipML5 \(возможно, самая первая библиотека WebRTC\) и JsSIP \(плюс форк JsSIP с именем _SIP.js_\).
|
||||
* webrtc.org является официальным домом WebRTC и, безусловно, заслуживает некоторого внимания. Проверьте [домашнюю страницу](https://webrtc.org/start/) перед началом работы.
|
||||
* Онлайн-платформа обучения о'Рейли имеет несколько видео, которые стоит посмотреть. Для любых книг и видео следите за датой публикации, так как все, что старше года или двух, скорее всего, устарело — WebRTC все еще находится в стадии быстрого развития.
|
||||
|
||||
Нам еще так много предстоит узнать, но у нас закончились страницы.
|
||||
|
||||
## **Вывод**
|
||||
|
||||
WebRTC является захватывающим и важным и, вполне вероятно, что разработчики и интеграторы VoIP должны быть знакомы с этой технологией если хотят сохранить свои навыки актуальными. На момент написания этой статьи WebRTC все еще находится в стадии разработки. Как и в любом исследовании новых границ, те, кто прокладывает путь, должны быть творческими, настойчивыми, оптимистичными и жесткими.
|
||||
|
||||
Asterisk может быть полезным компонентом в будущей VoIP-среде, служа, по крайней мере, мостом между продуктами WebRTC следующего поколения и телекоммуникациями старой школы.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch20.html#idm46178396562296-marker) Обратите внимание, что вы можете настроить драйвер канала PJSIP полностью с помощью файла конфигурации, но в этой книге мы делаем это только там, где это необходимо и, в противном случае, используем базу данных для конфигурации канала PJSIP
|
||||
|
||||
[Глава 19. Asterisk REST Interface](glava-19.md) | [Содержание](SUMMARY.md) | [Глава 21. Системный мониторинг и журналирование](glava-21.md)
|
|
@ -0,0 +1,591 @@
|
|||
# Глава 21. Системный мониторинг и журналирование
|
||||
|
||||
> Хаос присущ всем сложным вещам. Стремитесь дальше с усердием.
|
||||
>
|
||||
> -- Будда
|
||||
|
||||
Asterisk поставляется с несколькими подсистемами, которые позволяют получить подробную информацию о работе вашей системы. Как для устранения неполадок, так и для использования в целях выставления счетов или задач персонала, различные модули мониторинга Asterisk могут помочь вам следить за внутренней работой вашей системы.
|
||||
|
||||
## logger.conf
|
||||
|
||||
При устранении неполадок в системе Asterisk вам будет очень полезно обратиться к некоторым историческим записям того, что происходило в системе в то время, когда произошла указанная проблема. Параметры для хранения этой информации определены в файле _/etc/asterisk/logger.conf_.
|
||||
|
||||
В идеале, вы можете захотеть, чтобы система хранила запись каждой вещи что она делает. Однако у этого есть свои издержки. На занятой системе с включенным полным журналированием отладки будет создаваться большой объем данных. Хотя сегодня хранение данных намного дешевле, чем было в молодости Asterisk, возможно, все еще необходимо достичь баланса между детализацией и требованиями к хранению.
|
||||
|
||||
Файл _/etc/asterisk/logger.conf_ позволяет определить все виды различных уровней ведения журнала, а также несколько файлов журналов если это необходимо. Эта гибкость превосходна, но она также может сбивать с толку.
|
||||
|
||||
Формат записи в файле _logger.conf_ выглядит следующим образом:
|
||||
|
||||
```
|
||||
filename => type[,type[,type[,...]]]
|
||||
```
|
||||
|
||||
Мы уже работали с _logger.conf_, так что у вас уже будут записи в нем, похожие на следующие:
|
||||
|
||||
```
|
||||
[general]
|
||||
exec_after_rotate=gzip -9 ${filename}.2;
|
||||
|
||||
[logfiles]
|
||||
;debug => debug
|
||||
;console => notice,warning,error,verbose
|
||||
console => notice,warning,error,debug
|
||||
messages => notice,warning,error
|
||||
full => notice,warning,error,debug,verbose,dtmf,fax
|
||||
;full-json => [json]debug,verbose,notice,warning,error,dtmf,fax
|
||||
;syslog keyword : This special keyword logs to syslog facility
|
||||
;syslog.local0 => notice,warning,error
|
||||
```
|
||||
|
||||
Если вы внесете какие-либо изменения в этот файл, вам нужно будет перезагрузить регистратор, выполнив следующую команду из командной консоли:
|
||||
|
||||
```
|
||||
$ sudo touch full messages
|
||||
$ chown asterisk:asterisk /var/log/asterisk/*
|
||||
$ asterisk -rx 'logger reload'
|
||||
```
|
||||
|
||||
или из интерфейса командной строки Asterisk:
|
||||
|
||||
```
|
||||
*CLI> logger reload
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p align="center"><b>Детальность журналирования: полезно, но опасно</b></p>
|
||||
<p>Мы боролись с тем, чтобы рекомендовать добавление следующей строки в ваш файл <i>logger.conf</i>:</p>
|
||||
<p><code>verbose => notice,warning,error,verbose</code></p>
|
||||
<p>Это, вполне возможно, один из самых полезных инструментов отладки, которые вы имеете при настройке и устранении неисправностей диалплана, и поэтому настоятельно рекомендуется. Опасность заключается в том, что если вы забудете отключить его когда закончите отладку - вы оставите бомбу замедленного действия в своей системе, которая медленно заполнит жесткий диск и однажды убьет вашу систему - через несколько месяцев или лет, когда вы меньше всего этого ожидаете.</p>
|
||||
<p>Используйте его. Это просто фантастика. Просто помните, что вам нужно будет управлять своим хранилищем, чтобы гарантировать, что ваши файлы журналов не заполнят весь диск!</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Вы можете указать любое имя файла, которое захотите, но специальное имя файла _console_ фактически выведет выходные данные в интерфейс командной строки Asterisk, а не в любой файл на жестком диске. Все остальные имена файлов будут сохранены в файловой системе в каталоге _/var/log/asterisk_. Типы _logger.conf_ описаны в Таблице 21-1.
|
||||
|
||||
|
||||
_Таблица 21-1. Типы logger.conf_
|
||||
|
||||
| Тип | Описание |
|
||||
| :-------- | :------- |
|
||||
| `notice` | Вы увидите много таких во время перезагрузки, но они также будут появляться во время обычного потока вызовов. Уведомление - это просто любое событие, о котором Asterisk хочет Вам сообщить. |
|
||||
| `warning` | Предупреждение представляет проблему, которая может быть достаточно серьезной чтобы повлиять на вызов (включая обрыв вызова, поскольку поток вызовов не может продолжаться). Предупреждения должны быть устранены. |
|
||||
| `error` | Ошибки представляют собой значительные проблемы в системе, которые должны быть решены немедленно. |
|
||||
| `debug` | Отладка полезна только в том случае, если вы устраняете неполадки с самим кодом Asterisk. Вы не должны использовать отладку для устранения неполадок вашего диалплана, но можете использовать её, если разработчики Asterisk попросят вас предоставить журналы для проблемы, о которой вы сообщали. Не используйте отладку в продакшене, так как количество предоставляемых деталей, может заполнить жесткий диск в течение нескольких дней.<sup><a href="#snt1-a">a</a></sup> |
|
||||
| `verbose` | Это один из самых полезных типов ведения журнала, но он также является одним из наиболее рискованных, чтобы оставлять его без присмотра, из-за возможности заполнения выводом вашего жесткого диска.<sup><a href="#snt1-b">b</a></sup> |
|
||||
| `dtmf` | Регистрация DTMF может быть полезна если вы получаете жалобы на то, что вызовы не маршрутизируются от автосекретаря правильно. |
|
||||
| `fax` | Этот тип ведения журнала вызывает сообщения, связанные с факсом, из серверной части технологии факса (`res_fax_spandsp` или `res_fax_digium`) для регистрации в системе факсов. |
|
||||
| `*` | Будет регистрировать все (и мы имеем в виду все). Не используйте его, если не понимаете последствий хранения такого количества данных. Это не закончится хорошо. |
|
||||
|
||||
<sup><a name="snt1-a">a</a></sup>Это не теория. Это случилось и с нами и было это совсем невесело.
|
||||
|
||||
<sup><a name="snt1-b">b</a></sup>Это не так рискованно, как `debug`, так как займет месяцы, чтобы заполнить жесткий диск, но опасность заключается в том, что это произойдет, скажем, через год, когда вы находитесь на летних каникулах, и сразу не будет очевидно, в чем проблема. Совсем не весело.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">В системе ведения журнала Asterisk существует особенность, которая вызовет у вас некоторое замешательство, если вы о ней не знаете. Уровень ведения журнала для типов <code>verbose</code> и <code>debug</code> привязаны к детализации, заданной в консоли. Это означает, что если вы ведете журнал типа <code>verbose</code> или <code>debug</code> и кто-то входит в CLI и выдает команду <code>core set verbose 0</code>, или <code>core set debug 0</code> - регистрация этих данных в вашем лог-файле будет остановлена.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
### Просмотр журналов Asterisk
|
||||
|
||||
Поиск по журнальным файлам может быть проблемой. Хитрость заключается в том, чтобы иметь возможность фильтровать вывод, чтобы выводилась только та информация, которая имеет отношение к тому, что вы ищете.
|
||||
|
||||
Для начала вам нужно иметь приблизительное представление о том, когда произошла неприятность, которую вы ищете. Как только вы сориентируетесь на приблизительное время - вам нужно будет найти подсказки, которые помогут идентифицировать данный звонок. Очевидно, что чем больше информации у вас есть о вызове - тем быстрее вы сможете его зафиксировать.
|
||||
|
||||
В Asterisk 11 появилась функция ведения журнала, которая помогает отлаживать определенный вызов. Записи журнала, связанные с вызовом, теперь включают идентификатор вызова. Этот идентификатор вызова можно использовать с командой `grep` чтобы найти все записи журнала, связанные с этим вызовом. В следующем примере записи журнала идентификатором вызова является `C-00000004`:
|
||||
|
||||
```
|
||||
[Dec 4 08:22:32] WARNING[14199][C-00000004]: app_voicemail.c:6286
|
||||
leave_voicemail: No entry in voicemail config file for '234123452'
|
||||
```
|
||||
|
||||
В более ранних версиях Asterisk есть еще один трюк, который вы можете использовать. Если, например, вы выполняете подробное логирование - следует отметить, что каждый отдельный вызов имеет идентификатор потока, который при использовании с командой `grep`, часто может помочь вам отфильтровать все, что не относится к вызову, который вы пытаетесь отладить. Например, в следующем подробном журнале у нас есть несколько вызовов и поскольку вызовы происходят одновременно, это может оказаться очень запутанным для отслеживания одного вызова:
|
||||
|
||||
```
|
||||
$ tail -1000 verbose
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: -- IAX2/shifteight-4 answered Zap/1-1
|
||||
[Mar 11 …] VERBOSE[2973] logger.c: -- Starting simple switch on 'Zap/1-1'
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: == Spawn extension (shifteight, s, 1)
|
||||
exited non-zero on 'Zap/1-1'
|
||||
[Mar 11 …] VERBOSE[2973] logger.c: -- Hungup 'Zap/1-1'
|
||||
[Mar 11 …] VERBOSE[3680] logger.c: -- Starting simple switch on 'Zap/1-1'
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: -- Hungup 'Zap/1-1'
|
||||
```
|
||||
|
||||
Чтобы отфильтровать один конкретный вызов - мы могли бы использовать команду grep на ID потока. Например:
|
||||
|
||||
```
|
||||
$ grep 31362 verbose
|
||||
```
|
||||
|
||||
дало бы нам:
|
||||
|
||||
```
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: -- IAX2/shifteight-4 answered Zap/1-1
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: == Spawn extension (shifteight, s, 1)
|
||||
exited non-zero on 'Zap/1-1'
|
||||
[Mar 11 …] VERBOSE[31362] logger.c: -- Hungup 'Zap/1-1'
|
||||
```
|
||||
|
||||
Этот метод не гарантирует, что вы увидите все относящееся к одному вызову, так как вызов может породить дополнительные потоки, но для основной отладки диалплана мы находим этот подход весьма полезным, когда ID вызовов из Asterisk 11 недоступны.
|
||||
|
||||
### Журналирование с помощью демона syslog
|
||||
|
||||
Linux содержит очень мощный механизм ведения журнала, которым Asterisk может воспользоваться. Хотя обсуждение всех разновидностей syslog и всех возможных способов ведения журнала Asterisk выходит за рамки этой книги - достаточно сказать, что если вы хотите, чтобы Asterisk отправлял журналы демону syslog - вам просто нужно указать следующее в вашем файле _/etc/asterisk/logger.conf_:
|
||||
|
||||
```
|
||||
syslog.local0 => notice,warning,error ; или любой тип(ы), который вы хотите логировать
|
||||
```
|
||||
|
||||
Вам понадобится обозначение в вашем файле конфигурации<sup><a href="#sn21-1">1</a></sup> _syslog_ с именем `local0`, которое должно выглядеть примерно так:
|
||||
|
||||
```
|
||||
local0.* /var/log/asterisk/syslog
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Вы можете использовать <code>local0</code> через <code>local7</code> для этого, но проверьте свой файл <i>syslog.conf</i> чтобы убедиться, что ничто другое не использует один из этих каналов <code>syslog</code>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Использование `syslog`<sup><a href="#sn21-2">2</a></sup> позволяет гораздо более мощное ведение журнала, но также требует больше знаний, чем простое логирование Asterisk в файлы. Это в основном будет полезно, если вы уже собираете другие журналы в системе на какой-то централизованный сервер `syslog`.
|
||||
|
||||
### Проверка ведения журнала
|
||||
|
||||
Вы можете просмотреть состояние всех ваших параметров _logger.conf_ через CLI Asterisk, выполнив команду:
|
||||
|
||||
```
|
||||
*CLI> logger show channels
|
||||
```
|
||||
|
||||
Вы должны увидеть выходные данные, аналогичные:
|
||||
|
||||
```
|
||||
Channel Type Status Configuration
|
||||
------- ---- ------ -------------
|
||||
syslog.local0 Syslog Enabled - NOTICE WARNING ERROR VERBOSE
|
||||
/var/log/asterisk/verbose File Enabled - NOTICE WARNING ERROR VERBOSE
|
||||
/var/log/asterisk/messages File Enabled - NOTICE WARNING ERROR
|
||||
Console Enabled - NOTICE WARNING ERROR DTMF=
|
||||
```
|
||||
|
||||
### Ротация лога
|
||||
|
||||
Существует некоторая поддержка ротации журналов, встроенная в Asterisk. Ротация логов будет производиться в следующих случаях:
|
||||
|
||||
* Если вы запустите команду `logger rotate` в CLI Asterisk:
|
||||
|
||||
```
|
||||
*CLI> logger route
|
||||
```
|
||||
|
||||
* Во время перезагрузки конфигурации, если размер любого существующего файла журнала превышает 1 ГБ
|
||||
* Если Asterisk получает сигнал `SIGXFSZ`, указывающий на то, что файл, в который он записывался, слишком велик
|
||||
|
||||
## Call Detail Records - Записи деталей вызовов
|
||||
|
||||
Система CDR в Asterisk используется для регистрации истории вызовов в системе. В некоторых развертываниях эти записи используются для выставления счетов. В других случаях записи вызовов используются для анализа объемов вызовов с течением времени. Они также могут использоваться в качестве средства отладки администраторами Asterisk.
|
||||
|
||||
### Содержание CDR
|
||||
|
||||
CDR имеет ряд полей, которые включены по умолчанию. _Таблица 21-2_ перечисляет их.
|
||||
|
||||
_Таблица 21-2. Поля CDR по умолчанию_
|
||||
|
||||
| Вариант | Значение/пример | Примечание |
|
||||
| :------------ | :----------------- | :--------------------------- |
|
||||
| `accountcode` | `12345` | Идентификатор учетной записи. Это поле определяется пользователем и по умолчанию является пустым. |
|
||||
| `src` | `12565551212` | Идентификационный номер вызывающего абонента. Он устанавливается автоматически и доступен только для чтения. |
|
||||
| `dst` | `102` | Целевой добавочный номер для вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `dcontext` | `PublicExtensions` | Контекст назначения для вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `clid` | `"Big Bird"` | Полный идентификатор вызывающего абонента, включая имя вызывающей стороны. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `channel` | `SIP/0004F2040808-a1bc23ef` | Канал вызывающей стороны. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `dstchannel` | `SIP/0004F2046969-9786b0b0` | Канал вызываемой стороны. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `lastapp` | `Dial` | Последнее выполненное приложение диалплана. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `lastdata` | `SIP/0004F2046969,30,tT` | Аргументы, переданные на рассмотрение `lastapp`. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `start` | `2010-10-26 12:00:00` | Время начала вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `answer` | `2010-10-26 12:00:15` | Время ответа на вызов. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `end` | `2010-10-26 12:03:15` | Время окончания вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `duration` | `195` | Количество секунд, прошедших между началом и концом вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `billsec` | `180` | Количество секунд между ответом и концом вызова. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
| `disposition` | `ANSWER` | Указание на то, что случилось с вызовом. Это может быть так `NO ANSWER`, `FAILED`, `BUSY`, `ANSWER` или `UNKNOWN`. |
|
||||
| `amaflags` | `DOCUMENTATION` | Флаг автоматического учета сообщений (AMA), связанный с этим вызовом. Может быть одно из следующих действий: `OMIT`, `BILLING`, `DOCUMENTATION` или `Unknown`. |
|
||||
| `userfield` | `PerMinuteCharge:0.02` | Поле пользователя общего назначения. Это поле пусто по умолчанию и может быть установлено в пользовательскую строку.<sup><a href="#snt21-2a">a</a></sup> |
|
||||
| `uniqueid` | `1288112400.1` | Уникальный идентификатор для объекта канала `src`. Это поле устанавливается автоматически и доступно только для чтения. |
|
||||
|
||||
<sup><a name="snt21-2a">10</a></sup>Поле `userfield` сейчас это не так актуально, как раньше. Пользовательские переменные CDR - более гибкий способ получения пользовательских данных в CDRs.
|
||||
|
||||
Вы можете получить доступ ко всем полям записей CDR в диалплане Asterisk с помощью функции `CDR()`. Функция `CDR()` также используется для установки полей CDR, которые определены пользователем:
|
||||
|
||||
```
|
||||
exten => 115,1,Verbose(Call start time: ${CDR(start)})
|
||||
same => n,Set(CDR(userfield)=zombie pancakes)
|
||||
```
|
||||
|
||||
В дополнение к полям, которые всегда включены в CDR, можно добавить пользовательские поля. Это можно сделать в диалплане используя прилоежние `Set()` совместно с функцией `CDR()`:
|
||||
|
||||
```
|
||||
exten => 115,1,NoOp()
|
||||
same => n,Set(CDR(mycustomfield)=coffee)
|
||||
same => n,Verbose(I need some more ${CDR(mycustomfield)})
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Если вы решите использовать пользовательские переменные CDR - убедитесь, что выбранный сервер CDR способен регистрировать их.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Чтобы Просмотреть встроенную документацию для функции `CDR()` - выполните следующую команду в консоли Asterisk:
|
||||
|
||||
```
|
||||
*CLI> core show function CDR
|
||||
```
|
||||
|
||||
В дополнение к функции `CDR()` некоторые приложения диалплана могут использоваться для влияния на записи CDR. Мы еще рассмотрим их.
|
||||
|
||||
### Приложения диалплана
|
||||
|
||||
Несколько приложений диалплана можно использовать для влияния на CDR текущего вызова. Чтобы получить список приложений CDR, загруженных в текущей версии Asterisk, можно использовать следующую команду CLI:
|
||||
|
||||
```
|
||||
*CLI> core show applications like CDR
|
||||
-= Matching Asterisk Applications =-
|
||||
ForkCDR: Forks the Call Data Record.
|
||||
NoCDR: Tell Asterisk to not maintain a CDR for the current call
|
||||
ResetCDR: Resets the Call Data Record.
|
||||
-= 3 Applications Matching =-
|
||||
```
|
||||
|
||||
Каждое приложение имеет документацию, встроенную в Asterisk, которую можно просмотреть с помощью следующей команды:
|
||||
|
||||
```
|
||||
*CLI> core show application <application name>
|
||||
```
|
||||
|
||||
### cdr.conf
|
||||
|
||||
Файл _cdr.conf_ имеет a раздел `[general]`, содержащий параметры, применяемые ко всей системе CDR. Дополнительные необязательные разделы могут существовать в этом файле - они применяются к определенным модулям бэкэнда логирования CDR. Таблица 21-3 перечисляет параметры, доступные в разделе `[general]`.
|
||||
|
||||
_Таблица 21-3. cdr.conf раздел [general]_
|
||||
|
||||
| Параметр | Значение/пример | Примечание |
|
||||
| :----------- | :-------------- | :----------- |
|
||||
| `enable` | `yes` | Включение ведения журнала CDR. Значение по умолчанию: `yes`. |
|
||||
| `unanswered` | `no` | Регистрировать неотвеченные звонки. Обычно, только отвеченные вызовы пишутся в CDR. Регистрация всех попыток вызова может привести к большому количеству дополнительных записей вызовов, о которых большинство людей не заботятся. Значение по умолчанию: `no`. |
|
||||
| `end before hexten` | `no` | Закройте CDR перед запуском расширения `h` в диалплане Asterisk. Обычно CDR не закрывают до тех пор, пока диалплан не будет полностью завершен. Значение по умолчанию: `no`. |
|
||||
| `initiated seconds` | `no` | При расчете поля `billsec` всегда округляется. Например, если разница между временем ответа на вызов и временем его окончания составляет 1 секунду и 1 микросекунду, то `billsec` будет установлен равным 2 секундам. Это помогает гарантировать, что CDR Asterisk совпадает с поведением, используемым телекоммуникационными компаниями. Значение по умолчанию - `no`. |
|
||||
| `batch` | `no` | Очередь записей CDR будет регистрироваться пакетами, а не синхронно в конце каждого вызова. Это предотвращает ведение журнала CDR от блокирования в конце вызова. Использование пакетного режима может быть невероятно полезно при работе с базой данных, которая может медленно обрабатывать запросы. Значение по умолчанию - `no, но мы рекомендуем включить его. <sup><a href="#snt21-3a">a</a></sup> |
|
||||
| `size` | `100` | Количество записей CDR в очереди до их регистрации в пакетном режиме. Значение по умолчанию: `100`. |
|
||||
| `time` | `300` | Установите максимальное количество секунд, в течение которых CDR будет ожидать очереди пакетной обработки перед регистрацией. Процесс пакетного ведения журнала CDR будет запущен в конце этого периода времени, даже если `size` ещё не накопился. Значение по умолчанию: `300` секунд. |
|
||||
| `sheduler only` | `no` | Установите, должна ли пакетная обработка CDR выполняться путем порождения нового потока или в контексте планировщика пакетной обработки CDR. Значение по умолчанию: `no`, и мы рекомендуем не менять его. |
|
||||
| `safe shutdown` | `yes` | Заблокируйте выключение Asterisk, чтобы убедиться, что все записи CDR из очереди зарегистрированы. Значение по умолчанию: `yes`, и мы рекомендуем оставить его таким, так как этот параметр предотвращает важную потерю данных. |
|
||||
|
||||
<sup><a name="snt21-3a">a</a></sup>Недостатком включения этой опции является то, что если Asterisk по какой-либо причине упадет или умрет - записи CDR будут потеряны, так как они хранятся только в памяти существуещего процесса Asterisk. Смотрите `safeshutdown` для дополнительной информации.
|
||||
|
||||
### Бэкэнды
|
||||
|
||||
Серверные модули Asterisk CDR предоставляют способ регистрации CDR. Большинство бэкендов CDR требуют определенной конфигурации, чтобы заставить их работать.
|
||||
|
||||
#### cdr_adaptive_odbc
|
||||
|
||||
Как следует из названия, модуль `cdr_adaptive_odbc` позволяет хранить CDR в базе данных через ODBC. "Адаптивная" часть названия относится к тому, что она работает для адаптации к структуре таблицы: нет статической структуры таблицы, которая должна использоваться с этим модулем. Когда модуль загружен (или перезагружен) - он считывает структуру таблицы. При регистрации CDR он ищет переменную CDR, которая соответствует имени каждого столбца. Это относится как ко встроенным переменным CDR, так и к пользовательским. Если вы хотите писать встроенную переменную `channel` - просто создайте столбец с именем `channel`.
|
||||
|
||||
Добавление пользовательского содержимого CDR так же просто, как и его настройка в диалплане. Например, если мы хотим записывать `User-Agent`, предоставляемый SIP-устройством - мы могли бы добавить его в качестве пользовательской переменной CDR:
|
||||
|
||||
```
|
||||
exten => 105,n,Set(CDR(useragent)=${CHANNEL(useragent)})
|
||||
```
|
||||
|
||||
Чтобы эта пользовательская переменная CDR была вставлена в базу данных с помощью `cdr_adaptive_odbc`, все, что нам нужно сделать - это создать столбец под названием `useragent`.
|
||||
|
||||
Несколько таблиц могут быть указаны в конфигурационном файле `cdr_adaptive_odbc`. Каждая должна быть в своем собственном разделе конфигурации. Название раздела может быть любым - модуль не использует его. Вот пример простой конфигурации таблицы:
|
||||
|
||||
```
|
||||
[mytable]
|
||||
|
||||
connection = asterisk
|
||||
table = asterisk_cdr
|
||||
```
|
||||
|
||||
Более подробный пример настройки базы данных для ведения журнала CDR можно найти в разделе "Хранение записей деталей вызовов”.
|
||||
|
||||
Таблица 21-4 перечисляет параметры, которые могут быть указаны в разделе конфигурации таблицы в файле _cdr_adaptive_odbc.conf_.
|
||||
|
||||
_Таблица 21-4. cdr_adaptive_odbc.параметры конфигурации таблицы conf_
|
||||
|
||||
| Параметр | Значение/пример | Примечание |
|
||||
| :----------- | :-------------- | :--------- |
|
||||
| `connection` | `pgsql1` | Подключение к используемой базе данных. Это ссылка на настроенное соединение в _res_odbc.conf_. Это поле является обязательным. |
|
||||
| `table` | `asterisk_cdr` | Имя таблицы. Это поле является обязательным. |
|
||||
| `usegmtime` | `no` | Указывает, следует ли регистрировать метки времени с помощью GMT вместо местного времени. Значением по умолчанию для этого параметра является `no`. |
|
||||
|
||||
В дополнение к полям пар ключ/значение, которые показаны в предыдущей таблице - _cdr_adaptive_odbc.conf_ позволяет использовать несколько других элементов конфигурации. Первый - это псевдоним (альяс) столбца. Обычно переменные CDR регистрируются в столбцах с тем же именем. `alias` позволяет сопоставить имя переменной со столбцом с другим именем. Синтаксис таков:
|
||||
|
||||
```
|
||||
alias CDR variable => column name
|
||||
```
|
||||
|
||||
Вот пример сопоставления столбцов с помощью параметра `alias`:
|
||||
|
||||
```
|
||||
alias src => source
|
||||
```
|
||||
|
||||
Также можно задать фильтр содержимого. Это позволяет задать критерии, которые должны совпадать, для записей, вставляемых в таблицу. Синтаксис таков:
|
||||
|
||||
```
|
||||
filter CDR variable => content
|
||||
```
|
||||
|
||||
Вот пример фильтра содержимого:
|
||||
|
||||
```
|
||||
filter accountcode => 123
|
||||
```
|
||||
|
||||
Наконец, _cdr_adaptive_odbc.conf_ позволяет определять статическое содержимое для столбца. Это может быть полезно в сочетании с набором `filters`. Это статическое содержимое может помочь дифференцировать записи, вставленные в одну и ту же таблицу, по различным разделам конфигурации. Синтаксис для статического содержимого является:
|
||||
|
||||
```
|
||||
static "Static Content Goes Here" => column name
|
||||
```
|
||||
|
||||
Ниже приведен пример указания статического содержимого, вставляемого с помощью CDR:
|
||||
|
||||
```
|
||||
static "My Content" => my_identifier
|
||||
```
|
||||
|
||||
#### cdr_csv
|
||||
|
||||
Модуль `cdr_csv` - это очень простой сервер CDR, записывающий CDR в файл CSV (значения разделенные запятыми). Этот файл называется _/var/log/asterisk/cdr-csv/Master.csv_. Пока ведение журнала CDR включено в _cdr.conf_ и этот модуль загружен - CDR будут зарегистрированы в файле _Master.csv_. Мы рекомендуем, чтобы независимо от любого другого бэкенда CDR, выбранного Вами для настройки, Вы также оставили настроенным и его, поскольку он будет служить отличной резервной копией, если вы потеряете другие данные CDR из-за сети или связанных с ней проблем.
|
||||
|
||||
Хотя для обеспечения работы этого модуля никакие параметры не требуются - есть некоторые параметры, настраивающие его поведение. Эти параметры перечислены в разделе Таблица 21-5 и помещаюися в раздел `[csv]` _cdr.conf_.
|
||||
|
||||
|
||||
_Таблица 21-5. cdr.conf параметры раздела [csv]_
|
||||
|
||||
| Параметр | Значение/пример | Примечание |
|
||||
| :------- | :-------------- | :---------- |
|
||||
| `usegmtime` | `no` | Регистрация меток времени, используя GMT вместо местного времени. Значение по умолчанию: `no`. |
|
||||
| `loguniqueid` | `no` | Запись переменной CDR `uniqueid`. Значение по умолчанию: `no`. |
|
||||
| `loguserfield` | `no` | Запись переменной CDR `userfield`. Значение по умолчанию: `no`. |
|
||||
| `accountlogs` | `yes` | Создание отдельного CSV-файла для каждого отдельного значения параметра переменной CDR `accountcode`. Значение по умолчанию: `yes`. |
|
||||
|
||||
Порядок переменных CDR в CSV файлах, созданных с помощью модуля `cdr_csv`:
|
||||
|
||||
```
|
||||
<accountcode>,<src>,<dst>,<dcontext>,<clid>,<channel>,<dstchannel>,<lastapp>, \
|
||||
<lastadata>,<start>,<answer>,<end>,<duration>,<billsec>,<disposition>, \
|
||||
<amaflags>[,<uniqueid>][,<userfield>]
|
||||
```
|
||||
|
||||
Поместите следующие строки в файл _/etc/asterisk/cdr.conf_:
|
||||
|
||||
```
|
||||
[general]
|
||||
enable=yes
|
||||
|
||||
[csv]
|
||||
usegmtime=yes ; писать время в формате GMT. По умолчанию 'no'
|
||||
loguniqueid=yes ; писать uniqueid. По умолчанию 'no'
|
||||
loguserfield=yes ; писать пользовательское поле. По умолчанию 'no'
|
||||
accountlogs=yes ; создавать отдельный файл журнала для каждой учетной записи. По умолчанию 'yes'
|
||||
;newcdrcolumns=yes ; включить ведение жунрала в формате столбцов CDR после-1.8 (peeraccount,linkedid,sequence)
|
||||
; По умолчанию 'no'.
|
||||
```
|
||||
|
||||
Сохраните его, смените владельца и перезагрузите модуль CDR.
|
||||
|
||||
```
|
||||
$ chown asterisk: asterisk /etc/asterisk/cdr.conf
|
||||
$ sudo asterisk-rx 'module reload cdr'
|
||||
```
|
||||
|
||||
#### cdr_custom
|
||||
|
||||
Этот сервер CDR позволяет выполнять пользовательское форматирование записей CDR в файле журнала. Этот модуль наиболее обыкновенно использован для подгоняемого выхода CSV. Файл конфигурации, используемый для этого модуля - это _/etc/asterisk/cdr_custom.conf_. Единственный необходимый раздел `[mappings]` должен существовать в этом файле. Раздел `[mappings]` содержит сопоставления между именем файла и пользовательским шаблоном для CDR. Шаблон задается с помощью функций диалплана Asterisk.
|
||||
|
||||
В следующем примере показан пример конфигурации для `cdr_custom` позволяющий использовать один CDR-файл журнала - _Master.csv_. Этот файл будет создан как _/var/log/asterisk/cdr-custom/Master.csv_. Шаблон, который был определен, использует обе функции диалплана `CDR()` и `CSV_QUOTE()`. `CDR()` извлекает значения из регистрируемого CDR-файла. `CSV_QUOTE()` гарантирует что значения правильно экранированы для формата CSV:
|
||||
|
||||
```
|
||||
[mappings]
|
||||
Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},
|
||||
${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},
|
||||
${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},
|
||||
${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},
|
||||
${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},
|
||||
${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},
|
||||
${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},
|
||||
${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},
|
||||
${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})}
|
||||
```
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">В файле фактической конфигурации, значения для сопоставления в <i>Master.csv</i> должны быть на одной строке.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
#### cdr_manager
|
||||
|
||||
Бэкэнд `cdr_manager` выдает CDR в виде событий на Asterisk Manager Interface (AMI), который мы подробно обсудили в разделе [Глава 17](glava-17.md). Этот модуль сконфигурирован в файле _/etc/asterisk/cdr_manager.conf_. Первый раздел в этом файле - это `[general]` раздел, который содержит один параметр для включения этого модуля (значение по-умолчанию - `no`):
|
||||
|
||||
```
|
||||
[general]
|
||||
|
||||
enabled = yes
|
||||
```
|
||||
|
||||
Другой раздел в _cdr_manager.conf_ - это `[mappings]`. Он позволяет добавлять пользовательские переменные CDR в события менеджера. Синтаксис таков:
|
||||
|
||||
```
|
||||
CDR variable => Header name
|
||||
```
|
||||
|
||||
Вот пример добавления двух пользовательских переменных CDR:
|
||||
|
||||
```
|
||||
[mappings]
|
||||
|
||||
rate => Rate
|
||||
carrier => Carrier
|
||||
```
|
||||
|
||||
С этой конфигурацией на месте, записи CDR появятся как события на интерфейсе менеджера. Чтобы создать пример события менеджера - мы будем использовать следующий пример диалплана:
|
||||
|
||||
```
|
||||
exten => 110,1,Answer()
|
||||
same => n,Set(CDR(rate)=0.02)
|
||||
same => n,Set(CDR(carrier)=BS&S)
|
||||
same => n,Hangup()
|
||||
```
|
||||
|
||||
Эта команда используется для выполнения данного расширения и создания примера события диспетчера:
|
||||
|
||||
```
|
||||
*CLI> console dial 110@testing
|
||||
```
|
||||
|
||||
Наконец, вот пример события менеджера, созданного в результате этого тестового вызова:
|
||||
|
||||
```
|
||||
Event: Cdr
|
||||
Privilege: cdr,all
|
||||
AccountCode:
|
||||
Source:
|
||||
Destination: 110
|
||||
DestinationContext: testing
|
||||
CallerID:
|
||||
Channel: Console/dsp
|
||||
DestinationChannel:
|
||||
LastApplication: Hangup
|
||||
LastData:
|
||||
StartTime: 2010-08-23 08:27:21
|
||||
AnswerTime: 2010-08-23 08:27:21
|
||||
EndTime: 2010-08-23 08:27:21
|
||||
Duration: 0
|
||||
BillableSeconds: 0
|
||||
Disposition: ANSWERED
|
||||
AMAFlags: DOCUMENTATION
|
||||
UniqueID: 1282570041.3
|
||||
UserField:
|
||||
Rate: 0.02
|
||||
Carrier: BS&S
|
||||
```
|
||||
|
||||
#### cdr_odbc
|
||||
|
||||
Этот модуль включает устаревший интерфейс ODBC для ведения журнала CDR. Новые установки должны использовать `cdr_adaptive_odbc` вместо него.
|
||||
|
||||
#### cdr_sqlite
|
||||
|
||||
Этот модуль позволяет отправлять CDR в базу данных SQLite с помощью SQLite версии 2. Если у вас нет особой необходимости в SQLite версии 2 в отличие от версии 3, мы рекомендуем использовать для новых установок `cdr_sqlite3_custom`.
|
||||
|
||||
Этот модуль не требует никакой конфигурации для работы. Если модуль был скомпилирован и загружен в Asterisk - он вставит CDR в таблицу под названием `cdr` в базе данных, расположенной по адресу _/var/log/asterisk/cdr.db_.
|
||||
|
||||
#### cdr_sqlite3_custom
|
||||
|
||||
Этот сервер CDR вставляет CDR в базу данных SQLite с помощью SQLite версии 3. База данных, созданная этим модулем, находится в каталоге _/var/log/asterisk/master.db_. Для этого модуля требуется файл конфигурации _/etc/asterisk/cdr_sqlite3_custom.conf_. Файл конфигурации определяет имя таблицы, а также настраивает, какие переменные CDR будут вставлены в базу данных.
|
||||
|
||||
#### cdr_syslog
|
||||
|
||||
Этот модуль позволяет вести журнал CDR используя `syslog`. Чтобы включить эту функцию, сначала добавьте запись в файл конфигурации _syslog_ - _/etc/syslog.conf_. Например:
|
||||
|
||||
```
|
||||
local4.* /var/log/asterisk/asterisk-cdr.log
|
||||
```
|
||||
|
||||
Модуль Asterisk также имеет файл конфигурации. Добавьте следующий раздел в файл _/etc/asterisk/cdr_syslog.conf_:
|
||||
|
||||
```
|
||||
[cdr]
|
||||
|
||||
facility = local4
|
||||
priority = info
|
||||
template = "We received a call from ${CDR(src)}"
|
||||
```
|
||||
|
||||
Вот пример записи системного журнала, использующего эту конфигурацию:
|
||||
|
||||
```
|
||||
$ cat /var/log/asterisk/asterisk-cdr.log
|
||||
|
||||
Aug 12 19:17:36 pbx cdr: "We received a call from 2565551212"
|
||||
```
|
||||
|
||||
### Пример записей деталей вызова
|
||||
|
||||
Мы будем использовать модуль `cdr_custom` для иллюстрации некоторых примеров записей CDR для различных сценариев вызовов. Конфигурация, используемая для файла _/etc/asterisk/cdr_custom.conf_ представлена в "[cdr_custom](glava-21.md#cdr_custom)”.
|
||||
|
||||
#### Односторонний вызов
|
||||
|
||||
В этом примере мы покажем, как выглядит CDR для простого одностороннего вызова:
|
||||
|
||||
```
|
||||
exten => 227,1,VoiceMailMain(@${GLOBAL(VOICEMAIL_CONTEXT)})
|
||||
```
|
||||
|
||||
Вот запись CDR из _/var/log/asterisk/cdr-custom/Master.csv_, которая была создана в результате вызова этого расширения:
|
||||
|
||||
```
|
||||
"","SOFTPHONE_A","227","sets","""101"" <SOFTPHONE_A>","PJSIP/SOFTPHONE_A-00000002",
|
||||
"","Playback","hear-odd-noise",
|
||||
"2019-03-04 02:31:39","2019-03-04 02:31:39","2019-03-04 02:31:42",
|
||||
3,3,"ANSWERED","DOCUMENTATION","1551666699.4",""
|
||||
```
|
||||
|
||||
Откройте его в электронной таблице, и он будет аккуратно выстроен.
|
||||
|
||||
### Предостережения
|
||||
|
||||
Система CDR в Asterisk очень хорошо работает для довольно простых сценариев вызовов. Однако, поскольку сценарии вызовов становятся более сложными - включая звонки нескольким сторонам, трансферы, парковку и другие подобные функции — система CDR начинает отставать. Многие пользователи сообщают, что записи не отображают всю информацию, которую они ожидают. Многие исправления ошибок были сделаны для решения некоторых проблем, но стоимость регрессий или изменений в поведении при внесении изменений в этой области очень высока, так как эти записи используются для биллинга.
|
||||
|
||||
В результате команда разработчиков Asterisk становится все более устойчивой к внесению дополнительных изменений в систему CDR. Вместо этого была разработана новая система, Channel event logging (CEL), которая предназначена для решения проблемы ведения журнала более сложных сценариев вызовов. Имейте в виду, что записи деталей вызовов являются более простыми и легкими в использовании - именно поэтому мы все еще рекомендуем использовать CDR, если они удовлетворяют вашим потребностям.
|
||||
|
||||
## Регистрация событий канала
|
||||
|
||||
Регистрация событий канала (CEL) предоставляет более гибкие средства регистрации деталей сложных сценариев вызова. Вместо сворачивания вызова до одной записи журнала регистрируется ряд событий для вызова. Это дает более точную картину того, что произошло с вызовом, за счет более сложного лога.
|
||||
|
||||
Для получения более подробной информации о CEL, ознакомьтесь с [wiki Asterisk](https://wiki.asterisk.org).
|
||||
|
||||
## Вывод
|
||||
|
||||
Asterisk очень хорошо позволяет отслеживать множество различных аспектов его работы - от простых записей детализации вызовов до полной отладки выполняемого кода. Загляните в каталоги исходного кода, и вы найдете гораздо больше компонентов, чем у нас было места для освещения здесь. Эти различные механизмы помогут вам в усилиях по управлению вашей АТС Asterisk и они представляют собой один из способов, которым Asterisk значительно превосходит большинство (если не все) традиционных АТС.
|
||||
|
||||
<ol>
|
||||
<li id="sn21-1">Который обычно находится в <i>/etc/syslog.conf</i>.</li>
|
||||
<li id="sn21-2">И <code>rsyslog</code>, <code>syslog-ng</code> и всего-остального тоже.</li>
|
||||
</ol>
|
|
@ -0,0 +1,374 @@
|
|||
# Глава 22. Безопасность
|
||||
|
||||
> _Мы тратим время на поиски безопасности и ненавидим, когда получаем ее._
|
||||
>
|
||||
> -- Джон Стейнбек
|
||||
|
||||
Безопасность вашей системы Asterisk имеет решающее значение, особенно если система подключена к Интернету. Злоумышленники могут заработать много денег, используя системы для бесплатных телефонных звонков. В этой главе даются советы о том, как обеспечить более надежную защиту для вашего развертывания VoIP.
|
||||
|
||||
## Сканирование действительных учетных записей
|
||||
|
||||
Если вы выставляете свою систему Asterisk в общедоступный Интернет, одна из вещей, которую вы почти наверняка увидите - это сканирование действительных учетных записей. Пример 22-1 содержит записи лога с одной из производственных систем Asterisk авторов.[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396108536) Это сканирование началось с проверки различных общих имен пользователей, а затем перешло к сканированию числовых аккаунтов. Обычно пользователи называют учетные записи SIP так же, как и внутренние номера на АТС. Это сканирование использует этот факт.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Используйте нечисловые имена пользователей для своих учетных записей VoIP, чтобы их было сложнее угадать. Например, в этой книге мы используем MAC-адрес SIP-телефона в качестве имени учетной записи в Asterisk.
|
||||
|
||||
---
|
||||
|
||||
#### Пример 22-1. Отрывок лога сканирования учетной записи
|
||||
|
||||
```text
|
||||
[Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
|
||||
'"123"<sip:123@127.0.0.1>' failed for '203.86.167.220:5061' - No matching peer
|
||||
found
|
||||
[Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
|
||||
'"1234"<sip:1234@127.0.0.1>' failed for '203.86.167.220:5061' - No matching peer
|
||||
found
|
||||
[Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
|
||||
'"12345"<sip:12345@127.0.0.1>' failed for '203.86.167.220:5061' - No matching peer
|
||||
found
|
||||
...
|
||||
[Aug 22 15:17:17] NOTICE[25690] chan_sip.c: Registration from
|
||||
'"100"<sip:100@127.0.0.1>' failed for '203.86.167.220:5061' - No matching peer found
|
||||
[Aug 22 15:17:17] NOTICE[25690] chan_sip.c: Registration from
|
||||
'"101"<sip:101@127.0.0.1>' failed for '203.86.167.220:5061' - No matching peer found
|
||||
```
|
||||
|
||||
В любой системе логи будут полны попыток вторжения. Это просто характер подключения систем к интернету. В этой главе мы обсудим некоторые способы настройки вашей системы таким образом, чтобы она имела надежные механизмы для решения этих проблем.
|
||||
|
||||
## Уязвимости аутентификации
|
||||
|
||||
В первом разделе этой главы обсуждалось сканирование имен пользователей. Даже если у вас есть имена пользователей, которые трудно угадать, очень важно, чтобы у вас были надежные пароли. Если злоумышленник может получить действительное имя пользователя, он, скорее всего, попытается подобрать пароль. Надежные пароли делают это намного сложнее.
|
||||
|
||||
Схема аутентификации по умолчанию SIP-протокола является слабой. Аутентификация выполняется с помощью механизма вызова и ответа MD5. Если злоумышленник может перехватить любой трафик, например SIP-вызов, выполненный с ноутбука в открытой беспроводной сети, ему будет намного проще работать с брутфорсом паролей, поскольку это не потребует запросов аутентификации у сервера.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Используйте надежные пароли. В Интернете доступно множество ресурсов, которые помогают определить, что представляет собой надежный пароль. Есть также много надежных генераторов паролей. Используй их!
|
||||
|
||||
---
|
||||
|
||||
## Fail2ban
|
||||
|
||||
В предыдущих двух разделах рассматривались атаки, связанные со сканированием действительных имен пользователей и подбором паролей брутфорсом. [Fail2ban](http://www.fail2ban.org/wiki/index.php/Main_Page) - это приложение, которое может просматривать журналы Asterisk и обновлять правила брандмауэра, чтобы блокировать источник атаки в ответ на слишком большое количество неудачных попыток аутентификации.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Используйте Fail2ban при предоставлении услуг Voice over IP в ненадежных сетях. Оно автоматически обновит правила брандмауэра, чтобы заблокировать источники атак.
|
||||
|
||||
---
|
||||
|
||||
### Установка
|
||||
|
||||
Fail2ban доступен в виде пакета во многих дистрибутивах. Кроме того, вы можете установить его из исходников, загрузив с веб-сайта Fail2ban. Чтобы установить Fail2ban на RHEL, необходимо включить репозиторий EPEL (который был рассмотрен в [Главе 3](glava-03.md)). Вы можете установить Fail2ban, выполнив следующую команду:
|
||||
|
||||
```text
|
||||
$ sudo yum install fail2ban
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Примечание**
|
||||
|
||||
Установка Fail2ban из пакета будет включать скрипт запуска, чтобы гарантировать запуск при загрузке компьютера. Если вы устанавливаете из исходных кодов, убедитесь, что вы предпринимаете необходимые шаги для гарантированной постоянной работы Fail2ban.
|
||||
|
||||
---
|
||||
|
||||
### Конфигурация
|
||||
|
||||
Во-первых, мы хотим настроить журнал безопасности в Asterisk, который Fail2ban может использовать.
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/asterisk/logger.conf
|
||||
```
|
||||
|
||||
Раскомментировать (или добавить) строку, которая разрешает чтение `security => security` и измените `dateformat` даты для понимания её в журнале fail2ban.
|
||||
|
||||
```text
|
||||
[general]
|
||||
exec_after_rotate=gzip -9 ${filename}.2;
|
||||
dateformat = %F %T
|
||||
[logfiles]
|
||||
;debug => debug
|
||||
security => security
|
||||
;console => notice,warning,error,verbose
|
||||
console => notice,warning,error,debug
|
||||
messages => notice,warning,error
|
||||
full => notice,warning,error,debug,verbose,dtmf,fax
|
||||
```
|
||||
|
||||
Затем перезагрузите logger Asterisk:
|
||||
|
||||
```text
|
||||
$ sudo asterisk -rx 'logger reload'
|
||||
```
|
||||
|
||||
Поскольку текущие версии Fail2ban уже поставляются с определением изолятора Asterisk, все, что нам нужно сделать, это включить его:
|
||||
|
||||
Для этого рекомендуется создать файл _/etc/fail2ban/jail.local_ (технически вы можете поместить его в _/etc/fail2ban/jail.conf_, но он скорее всего будет перезаписан):
|
||||
|
||||
```text
|
||||
$ sudo vim /etc/fail2ban/jail.local
|
||||
|
||||
[asterisk]
|
||||
enabled = true
|
||||
filter = asterisk
|
||||
action = iptables-allports[name=ASTERISK, protocol=all]
|
||||
sendmail[name=ASTERISK, dest=me@shifteight.org, sender=fail2ban@shifteight.org]
|
||||
logpath = /var/log/asterisk/messages
|
||||
/var/log/asterisk/security
|
||||
maxretry = 5
|
||||
findtime = 21600
|
||||
bantime = 86400
|
||||
```
|
||||
|
||||
Мы установили запрет на 24 часа, но вы можете сделать время больше или меньше, как пожелаете (время запрета определяется в секундах, так что его необходимо рассчитать). Поскольку большинство атакующих хостов меняются через несколько часов, нет никакого вреда в разблокировании IP-адреса через 24 часа. Если хост атакует снова, он снова будет заблокирован.
|
||||
|
||||
О, вы также можете указать ему игнорировать ваш IP (или любые другие IP-адреса, с которых можно получать попытки подключения). Если вы случайно заблокировали себя, когда делали какую-то лабораторную работу и неправильно регистрировались, не волнуйтесь, вы в конечном итоге сделаете это с собой (если, конечно, не создадите список игнорирования для соответствующих IP-адресов).
|
||||
|
||||
```text
|
||||
[DEFAULT]
|
||||
ignoreip = <ip-адрес(а), разделенные запятыми>
|
||||
|
||||
[asterisk]
|
||||
enabled = true
|
||||
filter = asterisk
|
||||
action = iptables-allports[name=ASTERISK, protocol=all]
|
||||
sendmail[name=ASTERISK, dest=me@shifteight.org, sender=fail2ban@shifteight.org]
|
||||
logpath = /var/log/asterisk/messages
|
||||
/var/log/asterisk/security
|
||||
maxretry = 5
|
||||
findtime = 21600
|
||||
bantime = 86400
|
||||
```
|
||||
|
||||
Перезапустите Fail2ban и все будет хорошо.
|
||||
|
||||
```text
|
||||
$ sudo systemctl reload fail2ban
|
||||
```
|
||||
|
||||
Проверьте это, если можете, с IP-адреса, который вы не против заблокировать (например, дополнительный компьютер в вашей лаборатории, который может стать объектом тестирования в данном случае). Попытайтесь зарегистрироваться с использованием неверных учетных данных, и после пяти попыток (или любого другого значения, для которого вы установили `maxretry`) этот IP-адрес должен быть заблокирован.
|
||||
|
||||
Вы можете увидеть, какие адреса блокирует Asterisk jail, с помощью команды:
|
||||
|
||||
```text
|
||||
$ sudo fail2ban-client status asterisk
|
||||
```
|
||||
|
||||
И если вы хотите разблокировать IP,[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html#idm46178396052456) следующая команда должна сделать это.
|
||||
|
||||
```text
|
||||
$ sudo fail2ban-client set asterisk unbanip <ip для разбанивания>
|
||||
```
|
||||
|
||||
Дополнительную информацию о Fail2ban можно найти на странице [Fail2ban wiki](http://www.fail2ban.org/wiki/index.php/Main_Page).
|
||||
|
||||
## Шифрование медиапотока
|
||||
|
||||
В то время как мы приводили в этой книге примеры, которые использовали шифрование, имейте в виду, что вы можете настроить SIP так, что медиапоток будет отправляться в незашифрованном виде. В этом случае любой, кто перехватит RTP-трафик между двумя SIP-узлами, сможет использовать довольно простые инструменты для извлечения звука из этих вызовов.
|
||||
|
||||
## Уязвимости диалплана
|
||||
|
||||
Диалплан Asterisk - это еще одна область, где важна безопасность. Диалплан можно разбить на несколько контекстов для обеспечения управления доступом к расширениям. Например, вы можете разрешить своим офисным телефонам совершать звонки через провайдера. Тем не менее, вы не захотите, чтобы анонимные абоненты, которые попадают в ваше главное меню компании, могли затем набрать номер через вашего провайдера. Используйте контексты, чтобы гарантировать доступ к услугам, которые стоят вам денег, только доверенным абонентам.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Создавайте контексты диалплана с большой осторожностью. Кроме того, избегайте размещения любых расширений, которые могут стоить вам денег в контексте `[default]`.
|
||||
|
||||
---
|
||||
|
||||
Одна из последних уязвимостей диалплана Asterisk, обнаруженных и опубликованных - это идея инъекций диалплана. Уязвимость инъекций диалплана начинается с расширения, имеющего шаблон, который заканчивается символом соответствия всему - точкой. Возьмите это расширение в качестве примера:
|
||||
|
||||
```text
|
||||
exten => _X.,1,Dial(PJSIP/otherserver/${EXTEN},30)
|
||||
```
|
||||
|
||||
Шаблон для этого расширения соответствует всем расширениями (любой длины), которые начинаются с цифры. Такие шаблоны довольно распространены и удобны. Затем расширение отправляет этот вызов на другой сервер, используя протокол IAX2, с таймаутом набора 30 секунд. Обратите внимание на использование здесь переменной `${EXTEN}`. Вот где кроется уязвимость.
|
||||
|
||||
В мире Voice over IP нет причин, по которым набираемый номер должен быть числовым. На самом деле, это довольно распространенное использование SIP, чтобы иметь возможность набрать кого-то по имени. Поскольку нечисловые символы могут быть частью набранного добавочного номера, что произойдет, если кто-то отправит вызов на такой добавочный номер?
|
||||
|
||||
```text
|
||||
1234&DAHDI/g1/12565551212
|
||||
```
|
||||
|
||||
Подобный вызов является попыткой использования уязвимости инъекции диалплана. В предыдущем определении расширения, как только `${EXTEN}` был вычислен, фактический оператор `Dial()`, который будет исполняться, будет иметь вид:
|
||||
|
||||
```text
|
||||
exten => _X.,1,Dial(PJSIP/otherserver/1234&DAHDI/g1/12565551212,30)
|
||||
```
|
||||
|
||||
Если в системе настроена PRI, этот вызов совершит вызов через PRI на номер, выбранный злоумышленником, даже если вы явно не предоставили доступ к PRI этому абоненту. Эта проблема может стоить вам больших затрат.
|
||||
|
||||
Существует несколько подходов к решению этой проблемы. Первый и самый простой подход - всегда использовать строгое сопоставление шаблонов. Если вы знаете длину ожидаемых расширений и ожидаете только числовые расширения, используйте строгое соответствие числовому шаблону. Например, такой шаблон будет работать, если вы ожидаете только четырехзначные числовые номера:
|
||||
|
||||
```text
|
||||
exten => _XXXX,1,Dial(PJSIP/otherserver/${EXTEN},30)
|
||||
```
|
||||
|
||||
|
||||
|
||||
Другой подход к смягчению уязвимостей инъекций диалплана заключается в использовании функции диалплана `FILTER()` . Возможно, вы хотели бы разрешить числовые расширения любой длины. `FILTER()` позволяет сделать это легко и безопасно:
|
||||
|
||||
```text
|
||||
exten => _X.,1,Set(SAFE_EXTEN=${FILTER(0-9A-F,${EXTEN})})
|
||||
same => n,Dial(PJSIP/otherserver/${SAFE_EXTEN},30)
|
||||
```
|
||||
|
||||
Дополнительные сведения о синтаксисе функции диалплана `FILTER()` см. в выводе данных команды _core show function FILTER_ в Asterisk CLI.
|
||||
|
||||
Более комплексный (но и сложный) подход может заключаться в проверке всех набранных цифр функциями, не входящими в диалплан (например, запросы к базе данных, которые проверяют набранную строку на соответствие разрешениям пользователя, шаблонам маршрутизации, таблицам ограничений и т.д.). Это мощная концепция, но она выходит за рамки данной книги.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Будьте осторожны с уязвимостями инъекциями диалплана. Используйте строгое сопоставление шаблонов или используйте функцию диалплана `FILTER()` во избежание подобных проблем.
|
||||
|
||||
---
|
||||
|
||||
## Безопасность сетевых API Asterisk
|
||||
|
||||
Чтобы защитить AGI, AMI и ARI, вам нужно будет тщательно рассмотреть следующие рекомендуемые методы:
|
||||
|
||||
* Разрешить подключения непосредственно к API только из `localhost/127.0.0.1`.
|
||||
* Используйте соответствующую платформу между API Asterisk и вашим клиентским приложением,а также обрабатывайте безопасность соединения через фреймворк.
|
||||
* Контролируйте доступ к фреймворку и системе с помощью строгих правил брандмауэра.
|
||||
|
||||
Кроме того, применяются те же правила безопасности и рекомендации, что и в любом критически важном веб-приложении.
|
||||
|
||||
## Другие меры по снижению риска
|
||||
|
||||
В Asterisk есть и другие полезные функции, которые можно использовать для снижения риска атак. Первый заключается в использовании параметров `permit` и `deny` для создания списков управления доступом (ACL) для привилегированных учетных записей. Рассмотрим АТС, которая имеет SIP-телефоны в локальной сети, но также принимает SIP-вызовы через интернет. Такие вызовы получают доступ только к главному меню компании, в то время как локальные SIP-телефоны имеют возможность совершать исходящие вызовы, которые уже стоят денег. В этом случае рекомендуется настроить списки управления доступом, чтобы только устройства в локальной сети могли использовать учетные записи для телефонов.
|
||||
|
||||
В таблице `ps_endpoints` параметры `permit` и `deny` позволяют указать IP-адреса, но также можно указать метку в файле `/etc/asterisk/acl.conf`. Фактически ACL принимаются почти везде, где настроены подключения к IP-службам. Например, еще одно полезное место для ACL находится в файле _/etc/asterisk/manager.conf_, для ограничения учетных записей AMI до одного хоста, который может использовать интерфейс менеджера.
|
||||
|
||||
ACL можно определить в _/etc/asterisk/acl.conf_.
|
||||
|
||||
```text
|
||||
[named_acl_1]
|
||||
deny=0.0.0.0/0.0.0.0
|
||||
permit=10.1.1.50
|
||||
permit=10.1.1.55
|
||||
|
||||
[named_acl_2] ; Именованные ACLs также поддерживают IPv6.
|
||||
deny=::
|
||||
permit=::1/128
|
||||
|
||||
[local_phones]
|
||||
deny=0.0.0.0/0.0.0.0
|
||||
permit=192.168.0.0/255.255.0.0
|
||||
```
|
||||
|
||||
Когда именованные ACL были определены в _acl.conf_, попросите Asterisk загрузить их с помощью команды `reload acl`. После загрузки они должны быть доступны через интерфейс командной строки Asterisk:
|
||||
|
||||
```text
|
||||
*CLI> module reload acl
|
||||
|
||||
*CLI> acl show
|
||||
|
||||
acl
|
||||
---
|
||||
named_acl_1
|
||||
named_acl_2
|
||||
local_phones
|
||||
|
||||
*CLI> acl show named_acl_1
|
||||
|
||||
ACL: named_acl_1
|
||||
---------------------------------------------
|
||||
0: deny - 0.0.0.0/0.0.0.0
|
||||
1: allow - 10.1.1.50/255.255.255.255
|
||||
2: allow - 10.1.1.55/255.255.255.255
|
||||
```
|
||||
|
||||
Теперь, вместо того, чтобы потенциально повторять одни и те же записи `permit` и `deny` в нескольких местах, вы можете применить ACL по его имени. Вы найдете поле `acl` в таблице `ps_endpoints`, которое можно использовать для указания на именованный ACL в файле _acl.conf_.
|
||||
|
||||
```text
|
||||
mysql> select id,transport,aors,context,disallow,allow,acl from ps_endpoints;
|
||||
|
||||
|id |transport |aors |context|disallow|allow |acl |
|
||||
|0000f30A0A01|transport-udp|0000f30A0A01|sets |all |ulaw |NULL|
|
||||
|0000f30B0B02|transport-udp|0000f30B0B02|sets |all |ulaw |NULL|
|
||||
|SOFTPHONE_A |transport-udp|SOFTPHONE_A |sets |all |ulaw,h264,vp8|NULL|
|
||||
|SOFTPHONE_B |transport-udp|SOFTPHONE_B |sets |all |ulaw,h264,vp8|NULL|
|
||||
|
||||
mysql> update ps_endpoints
|
||||
set acl='local_phones'
|
||||
where id in ('0000f30A0A01','0000f30B0B02','SOFTPHONE_A','SOFTPHONE_B')
|
||||
;
|
||||
|
||||
mysql> select id,transport,aors,context,disallow,allow,acl from ps_endpoints;
|
||||
|
||||
|id |transport |aors |context|disallow|allow |acl |
|
||||
|0000f30A0A01|transport-udp|0000f30A0A01|sets |all |ulaw |local_phones|
|
||||
|0000f30B0B02|transport-udp|0000f30B0B02|sets |all |ulaw |local_phones|
|
||||
|SOFTPHONE_A |transport-udp|SOFTPHONE_A |sets |all |ulaw,h264,vp8|local_phones|
|
||||
|SOFTPHONE_B |transport-udp|SOFTPHONE_B |sets |all |ulaw,h264,vp8|local_phones|
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Используйте ACL, когда это возможно, на всех привилегированных аккаунтах для сетевых служб.
|
||||
|
||||
---
|
||||
|
||||
Ещё одним способом снижения риска безопасности является настройка лимитов вызовов. Рекомендуемый метод реализации ограничений вызовов - использование функций диалплана `GROUP()` и `GROUP_COUNT()`. Вот пример, который ограничивает количество вызовов от каждого узла SIP не более чем двумя одновременно:
|
||||
|
||||
```text
|
||||
exten => _X.,1,Set(GROUP(users)=${CHANNEL(endpoint)})
|
||||
same => n,NoOp(${CHANNEL(endpoint)} : ${GROUP_COUNT(${CHANNEL(endpoint)})} calls)
|
||||
same => n,GotoIf($[${GROUP_COUNT(${CHANNEL(endpoint)})} > 2]?denied:continue)
|
||||
same => n(denied),NoOp(There are too many calls up already. Hang up.)
|
||||
same => n,HangUp()
|
||||
same => n(continue),NoOp(continue processing call as normal here ...)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Используйте ограничения вызовов, для гарантии что если учетная запись скомпрометирована, ее нельзя использовать для совершения сотен телефонных звонков одновременно.
|
||||
|
||||
---
|
||||
|
||||
## Ресурсы
|
||||
|
||||
Для устранения некоторых уязвимостей системы безопасности необходимо внести изменения в исходный код Asterisk. Когда эти проблемы обнаруживаются, команда разработчиков Asterisk выпускает новые релизы, содержащие только исправления для проблем безопасности, чтобы обеспечить быстрое и легкое обновление. В этом случае команда разработчиков Asterisk также публикует рекомендательный документ по безопасности, в котором обсуждаются сведения об уязвимости. Мы рекомендуем Вам подписаться на [список рассылки _asterisk-announce_](http://lists.digium.com/mailman/listinfo/asterisk-announce), чтобы убедиться, что вы узнаете об этих проблемах, когда они возникают.
|
||||
|
||||
---
|
||||
|
||||
**Подсказка**
|
||||
|
||||
Подпишитесь на список asterisk-announce, чтобы быть в курсе уязвимостей системы безопасности Asterisk.
|
||||
|
||||
---
|
||||
|
||||
Одним из самых популярных инструментов для сканирования учетных записей SIP и взлома паролей является [SIPVicious](http://sipvicious.org/). Мы настоятельно рекомендуем вам взглянуть на него и использовать для аудита ваших собственных систем. Если ваша система доступна из интернета, другие, скорее всего, запустят SIPVicious против неё, поэтому убедитесь, что вы сделали это в первую очередь.
|
||||
|
||||
## Вывод—Лучший идиот
|
||||
|
||||
В технологической индустрии есть принцип, который гласит: "Как только что-то станет идиотским, природа изобретет лучшего идиота." Суть этого заявления заключается в том, что никакие усилия в области развития не могут считаться завершенными. Всегда есть место для улучшения.
|
||||
|
||||
Когда дело доходит до безопасности, вы всегда должны иметь в виду, что люди, которые хотят воспользоваться вашей системой, очень мотивированы. Независимо от того, насколько безопасна ваша система, кто-то всегда будет искать пути для её взлома.
|
||||
|
||||
Мы не защищаем паранойю, но предполагаем, что то, что мы описали здесь, ни в коем случае не является последним словом о безопасности VoIP. Несмотря на то, что в этой книге мы постарались быть максимально всеобъемлющими, вы должны взять на себя ответственность за безопасность своей системы.
|
||||
|
||||
Преступники упорно работают, чтобы найти слабые места и использовать их.
|
||||
|
||||
[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396108536-marker) Реальный IP-адрес был заменен на 127.0.0.1 в записях лога.
|
||||
|
||||
[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396052456-marker) Например, себя, потому что вы забыли определить `ignoreip`...
|
||||
|
||||
[Глава 21. Системный мониторинг и журналирование](glava-21.md) | [Содержание](SUMMARY.md) | [Глава 23. Asterisk: Будущее телефонии](glava-23.md)
|
|
@ -0,0 +1,71 @@
|
|||
# Глава 23. Asterisk: Будущее телефонии
|
||||
|
||||
> _Эй, я только что познакомился с тобой,_
|
||||
>
|
||||
> _И это безумие!_
|
||||
>
|
||||
> _Но вот мой номер телефона,_
|
||||
>
|
||||
> _Так что позвони мне, может быть?_
|
||||
>
|
||||
> --Carly Rae Jepsen
|
||||
|
||||
Мы подошли к последней главе этой книги. Мы рассмотрели много (и эта книга была значительно доработана за эти годы), но надеемся что мы ясно дали понять, что лишь просто поцарапали поверхность Asterisk. Чтобы завершить работу, мы хотим потратить некоторое время на изучение того, что могли бы увидеть от Asterisk и open source телефонии в ближайшем будущем.
|
||||
|
||||
Когда ещё писали первое издание _Asterisk: Будущее телефонии_ мы уверенно утверждали, что коммуникационные механизмы с открытым кодом, такие как Asterisk, вызовут сдвиг в мышлении, который трансформирует телекоммуникационную отрасль. Во многих отношениях наша вера была оказалась правильной; однако некоторые могут утверждать, что это была пустая победа, потому что то, что также произошло за это время - это сдвиг от телекоммуникаций как основного средства связи в реальном времени. Более молодые поколения почти не пользуются телефонными звонками и считают их разрушительными, раздражающими, а в некоторых случаях даже грубыми.
|
||||
|
||||
Таким образом, несмотря на то, что Asterisk открыл новый век для телекоммуникационной индустрии, теперь он стал эталоном для технологий, которые, по мнению многих, так же хороши, как и мертвы.
|
||||
|
||||
Хотя не может быть никаких сомнений в том, что телефон больше не является основной коммуникационной технологией в мире (далеко не случайно!), когда мы перегоняем коммуникации до их сути, мы обнаруживаем, что у этого материала еще может быть будущее.
|
||||
|
||||
## Телефон мертв (за исключением тех случаев, когда это не так)
|
||||
|
||||
Хотя очевидно, что молодые поколения уже не так часто пользуются телефоном, верно также и то, что старшие поколения очень недовольны и разочарованы современными коммуникационными технологиями. Для них телефон представляет собой надежный, предсказуемый и простой в понимании способ связи, и они, вероятно, будут продолжать использовать его до конца своей жизни. Поскольку в этом мире ужасно много пожилых людей, и многие из них являются высшими руководителями, лицами, принимающими решения, и акционерами — не говоря уже о состоятельных клиентах, похоже, что сегодня хорошей стратегией для бизнеса является продолжение обеспечения того, с помощью чего их клиенты могли связаться с ними по телефону.
|
||||
|
||||
Когда человек попробует все другие способы коммуникации, такие как электронная почта, веб-формы и, возможно, даже текстовые сообщения, он, наконец, возьмет телефон и позвонит. Похоже, что во многих случаях проблема, которая не могла быть решена никаким другим способом, наконец-то решится по телефону.
|
||||
|
||||
Было бы также правильно сказать, что все более бедные рабочие компании, занимающиеся обработкой коммуникаций со своими клиентами, являются источником большого разочарования и путаницы. Однако, как всегда, там, где есть проблема, есть и возможность. Компании, которые сохраняют приверженность к превосходной телекоммуникационной инфраструктуре, могут оказаться с явным конкурентным преимуществом, не используя ничего более сложного, чем хорошее старомодное обслуживание клиентов. Если вы хотите обслуживать клиентов старше 50 лет, вы должны сделать все возможное, чтобы ваша телефонная система работала хорошо.
|
||||
|
||||
Еще один интересный компонент традиционных телекоммуникационных сетей заключается в том, что, хотя мы никогда не можем быть уверены в том, что используем одно и то же программное обеспечение для конференц-связи (никогда в истории не было так много почти идентичных приложений, которые должны были быть установлены только для того, чтобы люди могли говорить друг с другом), мы можем быть разумно уверены, что если один из нас возьмет телефон и наберет номер телефона другого, успешный разговор будет возможен без каких-либо неисправностей или установки программного обеспечения. В эпоху, когда кажется, что никакая конференция не может начаться без того, чтобы кому-то не пришлось устранять неполадки в своем приложении, этот вид универсальной согласованности и надежности, вероятно, все еще имеет некоторое значение. Сегодняшнее горячее новое программное обеспечение для совместной работы в офисе - это завтрашняя забытая игрушка (куда ты, Skype?). Храбрые старые телефонные солдаты включились.
|
||||
|
||||
Мы пока не уверены, что телефон мертв.
|
||||
|
||||
## Перегрузка связи
|
||||
|
||||
Во многих отношениях способность к общению определяет наш вид. Да, другие существа способны сигнализировать друг другу базовыми способами, но наше увлечение созданием постоянно меняющихся и инновационных способов коммуникаций друг с другом - это не то, с чем бы сталкивалось любое другое существо.
|
||||
|
||||
От почтового голубя до телеграфа, телефона и телевидения, каждая новая технология служила одной и той же цели: улучшению нашей способности общаться. Сегодня мы достигли самой замечательной вещи: теперь разумно ожидать мгновенного общения практически с любым человеком на планете.
|
||||
|
||||
Проблема, которую мы никогда не предсказывали, заключается в том, что слишком много хорошего начало подавлять нас. Будет интересно посмотреть, как это происходит в культурном плане.
|
||||
|
||||
## Проблемы с разработкой открытого исходного кода
|
||||
|
||||
Хотя Александр Грэм Белл больше всего известен как отец телефона<sup><a href="#sn1">1</a></sup>, реальность такова, что во второй половине 1800-х годов десятки умов работали над достижением цели передачи голоса по телеграфным линиям. Эти люди были в основном деловыми людьми, стремящимися создать продукт, с помощью которого они могли бы сделать свои состояния.
|
||||
|
||||
Мы привыкли думать о традиционных телефонных компаниях как о монополиях, но это было не так в их первые дни. Ранняя история телефонных услуг проходила в очень конкурентной среде, с появлением новых компаний по всему миру, часто почти без уважения к патентам, которые они могли бы нарушить. Многие известные монополии получили свое начало через ведение (и победу) патентных войн.
|
||||
|
||||
Интересно сравнить историю телефона с историей GNU Linux и Интернета. В то время как телефон был создан как коммерческое мероприятие, а телекоммуникационная индустрия была создана с помощью судебных процессов и корпоративных поглощений, Linux и Интернет возникли из академического сообщества, которое имело тенденцию ценить обмен знаниями над прибылью.
|
||||
|
||||
К сожалению, в очередной раз слишком много хорошего стало захлестывать. То, что мы видели в последнее время - это потеря видения для разработки с открытым исходным кодом. Слишком мало разработчиков устали от требований слишком большого количества пользователей, не желающих вносить свой вклад. Большинство проектов с открытым исходным кодом должны были по необходимости оградить команду разработчиков от эгоистичных требований тех, кто намерен только брать и никогда не давать. Это злоупотребление разработчиками, к сожалению, даже распространилось на компании, которые построили высокодоходные бизнесы на проектах с открытым исходным кодом, в которые они никогда не вносили ни копейки. Многомиллиардный бизнес, получающий прибыль от усилий команды, едва способной оплачивать свои счета, не является моделью устойчивого развития. Остается посмотреть, как эта история будет развиваться, но программное обеспечение с открытым исходным кодом уже не то, что было 10 лет назад.
|
||||
|
||||
Asterisk повезло в том, что он финансируется усилиями Sangoma/Digium - родителей проекта. Их задачей было и всегда будет выяснить, как воспитать продукт таким образом, чтобы требования бизнеса были совместимы с потребностями проекта. Это была непростая задача. Мы будем болеть за них. До этих пор они проделали замечательную работу.
|
||||
|
||||
## Будущее Asterisk
|
||||
|
||||
Итак, есть ли у Asterisk будущее? Мы не видим, почему его не должно быть. Он продолжает делать то, что он всегда делал и также упорно работает, чтобы быть совместимым с подходящими технологиями, выходящими на поверхность. По крайней мере, Asterisk будет продолжать очень хорошо интегрироваться с телефонными технологиями и мы пока не готовы назвать эту историю полностью рассказанной.
|
||||
|
||||
### WebRTC
|
||||
|
||||
Следите за WebRTC. Мы подозреваем, что если у open source и open-standards коммуникаций есть какое-то будущее, WebRTC выступает в качестве наиболее перспективного кандидата для достижения этого.
|
||||
|
||||
Asterisk вряд ли будет в центре этой революции, но он будет играть определенную роль.
|
||||
|
||||
### Будущее телефонии
|
||||
|
||||
Телефония может выглядеть мертвой, но мы все еще видим движение в хвосте, и это действительно длинный хвост.
|
||||
|
||||
---
|
||||
|
||||
<a name="sn1">1</a> Вы когда-нибудь слышали об Элише Грее или Антонио Меуччи?
|
||||
|
||||
[Глава 22. Безопасность](glava-22.md) | [Содержание](SUMMARY.md) | [Об авторах](about-the-authors.md)
|
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 9.2 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 314 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,130 @@
|
|||
# Предисловие
|
||||
|
||||
Это книга для всех, кто использует Asterisk.
|
||||
|
||||
Asterisk - это платформа конвергентной телефонии с открытым исходным кодом, которая предназначена в первую очередь для работы на Linux. Asterisk объединяет более чем 100-летние знания в области телефонии в надежный набор тесно интегрированных телекоммуникационных приложений. Сила Asterisk заключается в его настраиваемой природе, дополненной непревзойденным соответствием стандартам. Ни одна другая управленческая автоматизированная телефонная станция \(УАТС\) не может быть развернута таким множеством творческих способов.
|
||||
|
||||
Такие приложения, как голосовая почта, конференции, очереди вызовов и агенты, музыка на удержании и парковка вызовов - все это стандартные функции, встроенные прямо в программное обеспечение. Кроме того, Asterisk может интегрироваться с другими бизнес-технологиями таким образом, о котором закрытые, проприетарные УАТС вряд ли могут мечтать.
|
||||
|
||||
Asterisk может показаться довольно пугающим и сложным для нового пользователя, поэтому документация так важна для его роста. Документация снижает барьер для входа и помогает людям созерцать возможности.
|
||||
|
||||
Выпущенный при щедрой поддержке O'Reilly Media, [Asterisk: Окончательное руководство](http://shop.oreilly.com/product/0636920025894.do) - это пятое издание того, что ранее называлось [Asterisk: Будущее телефонии](http://shop.oreilly.com/product/9780596510480.do).
|
||||
|
||||
Эта книга была написана для участников сообщества Asterisk.
|
||||
|
||||
## Аудитория
|
||||
|
||||
Эта книга предназначена для того, чтобы быть нежной к тем, кто новичок в Asterisk, но мы предполагаем, что вы знакомы с базовым администрированием Linux, сетью и другими ИТ-дисциплинами. Если нет, мы рекомендуем вам изучить обширную и замечательную библиотеку книг, которые O'Reilly публикует по этим темам. Мы также предполагаем, что вы пока новичок в телекоммуникациях \(как традиционная коммутируемая Телефония, так и новый мир Voice over IP\).
|
||||
|
||||
Однако эта книга будет полезна и более опытному администратору Asterisk. Мы сами используем книгу в качестве ссылки на функции, которые мы не использовали в течение некоторого времени.
|
||||
|
||||
## Программное обеспечение
|
||||
|
||||
Эта книга сосредоточена на документировании версии 16 Asterisk; однако многие соглашения и большая часть информации в этой книге являются агностическими версиями. Linux - это операционная система, в которой мы запускали и тестировали Asterisk, и мы задокументировали инструкции по установке для CentOS \(Red Hat Enterprise Linux или RHEL\).
|
||||
|
||||
## Условные обозначения используемые в книге
|
||||
|
||||
В этой книге используются следующие типографские условные обозначения:
|
||||
|
||||
_Курсив_
|
||||
|
||||
Обозначает новые термины, URL-адреса, адреса электронной почты, имена файлов, расширения файлов, пути, каталоги и имена пакетов, а также утилиты Unix, команды, модули, параметры и аргументы.
|
||||
|
||||
`Моноширинный`
|
||||
|
||||
Используется для отображения примеров кода, содержимого файлов, взаимодействий командной строки, команд базы данных, имен библиотек и параметров.
|
||||
|
||||
**`Моноширинный полужирный`**
|
||||
|
||||
Обозначает команды или другой текст, который должен быть набран буквально пользователем. Также используется для акцентирования в коде.
|
||||
|
||||
_`Моноширинный курсив`_
|
||||
|
||||
Показывает текст, который должен быть заменен пользовательскими значениями.
|
||||
|
||||
_`[ Keywords and other stuff ]`_
|
||||
|
||||
Указывает необязательные ключевые слова и аргументы.
|
||||
|
||||
_`{ вариант-1 | вариант-2 }`_
|
||||
|
||||
Означает _`вариант-1`_ или _`вариант-2`_.
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/tip.png" height="100" align="left">Этот элемент означает подсказку или предложение.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/note.png" height="100" align="left">Этот элемент обозначает общую заметку.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/warning.png" height="100" align="left">Этот элемент указывает на предупреждение или предостережение.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Онлайн обучение O’Reilly
|
||||
|
||||
<table border="1" width="100%" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
<p><img src="pics/oreilly.png" height="100" align="left">На протяжении почти 40 лет [O'Reilly Media](http://oreilly.com/) предоставляет технологии и бизнес-тренинги, знания и понимание, чтобы помочь компаниям добиться успеха.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Наша уникальная сеть экспертов и новаторов делится своими знаниями и опытом с помощью книг, статей, конференций и нашей онлайн-обучающей платформы. Платформа онлайн-обучения o'Reilly предоставляет вам по запросу доступ к живым учебным курсам, углубленным учебным путям, интерактивным средам кодирования и обширной коллекции текста и видео от O'Reilly и более чем 200 других издателей. Для получения дополнительной информации, пожалуйста, посетите [_http://oreilly.com_](http://www.oreilly.com/).
|
||||
|
||||
## Как с нами связаться
|
||||
|
||||
Пожалуйста, направляйте комментарии и вопросы, касающиеся этой книги, издателю:
|
||||
|
||||
* O'Reilly Media, Inc.
|
||||
* 1005 Gravenstein Highway North
|
||||
* Sebastopol, CA 95472
|
||||
* 800-998-9938 (в США или Канаде)
|
||||
* 707-829-0515 (международный или местный)
|
||||
* 707-829-0104 (факс)
|
||||
|
||||
У нас есть веб-страница для этой книги, где мы перечисляем ошибки, примеры и любую дополнительную информацию. Вы можете получить доступ к этой странице по адресу [_https://oreil.ly/asterisk_tdg_5E_](https://oreil.ly/asterisk_tdg_5E).
|
||||
|
||||
Чтобы прокомментировать или задать технические вопросы об этой книге, отправьте электронное письмо по адресу [_bookquestions@oreilly.com_](mailto:bookquestions@oreilly.com).
|
||||
|
||||
Для получения дополнительной информации о наших книгах, курсах, конференциях и новостях смотрите наш веб-сайт по адресу [_http://www. oreilly.com_](http://www.oreilly.com/).
|
||||
|
||||
Facebook: [_http://facebook.com/oreilly_](http://facebook.com/oreilly)
|
||||
|
||||
Следуйте за нами в Twitter: [_http://twitter.com/oreillymedia_](http://twitter.com/oreillymedia)
|
||||
|
||||
Смотрите нас на YouTube: [_http://www.youtube.com/oreillymedia_](http://www.youtube.com/oreillymedia)
|
||||
|
||||
## Благодарности от Джима Ван Меггелена
|
||||
|
||||
Дэвиду Даффетту спасибо за главу об интернационализации, в которой он правильно рассматривает эту технологию с более глобальной точки зрения.
|
||||
|
||||
Спасибо Лейфу Мэдсену, Джареду Смиту и Расселу Брайанту за Ваш вклад в предыдущие издания этой книги. Это было весело летать в одиночку, но я не могу отрицать, что скучал по вам, ребята!
|
||||
|
||||
Особая благодарность Мэтту Фредриксону и Мэтту Джордану из Digium, которые щедро делились со мной своим временем и знаниями, и без которых я был бы потерян. Спасибо, ребята!
|
||||
|
||||
Спасибо моему редактору Джеффу Блейлу за то, что он держит меня в курсе событий и помогает принимать важные решения о содержании и темпе работы над книгой.
|
||||
|
||||
А также благодаря остальным невоспетым героям из производственного отдела О'Рейли. Это те люди, которые берут книгу и делают ее книгой О'Рейли.
|
||||
|
||||
Особенно я благодарен Джойс Уилмот и Дэну Дженкинсу, моей команде технического рецензирования за то, что они нашли время для работы над книгой и предоставили необходимую обратную связь.
|
||||
|
||||
Томас Камерон из RedHat щедро поделился со мной своими знаниями о Selinux и помог демистифицировать компонент Linux, который слишком часто остается отключенным.
|
||||
|
||||
Все участники сообщества Asterisk также должны поблагодарить покойного Джима Диксона за создание первых аппаратных интерфейсов телефонии с открытым исходным кодом, начало революции и предоставление его творений сообществу в целом.
|
||||
|
||||
Наконец, и это самое главное, спасибо Марку Спенсеру, оригинальному автору Asterisk и основателю Digium, за Asterisk, за [Pidgin](http://www.pidgin.im/), а также за вклад его творений в сообщество с открытым исходным кодом. Asterisk - это ваше наследие!
|
|
@ -0,0 +1,16 @@
|
|||
# Аннотация
|
||||
|
||||
Разрабатывайте систему передачи голоса по IP \(VoIP\) или традиционную систему АТС с Asterisk, даже если у вас только базовые знания в области телекоммуникаций. Это руководство - путеводитель, который проведет вас от установки до настройки этого open source программное обеспечение, независимо от того, обновляете ли вы существующую телефонную систему или создаете с нуля.
|
||||
|
||||
Это обновленное пятое издание, идеально подходящее для администраторов Linux, разработчиков и опытных пользователей, показывает, как настроить АТС на основе VoIP на предприятии. Вы познакомитесь с функциями в Asterisk 16 - актуальный, на данный момент, релиз с долгосрочной поддержкой от Digium. Эта книга также включает в себя новые главы по [WebRTC](glava-20.md) и [Asterisk Real-time Interface \(ARI\)](glava-19.md).
|
||||
|
||||
* Узнайте как WebRTC предоставляет новое направление для Asterisk
|
||||
* Получите знания для постройки простой, но полноценной телефонной системы
|
||||
* Создайте интерактивный диалплан, используя лучшие практики для расширенных возможностей Asterisk
|
||||
* Узнайте как ARI стал предпочтительным API для взаимодействия языков веб-разработки с Asterisk
|
||||
|
||||

|
||||
|
||||
[Содержание книги](SUMMARY.md)
|
||||
|
||||
[](https://github.com/translaster/Definitive-Guide-5th-Edition/network) [](https://github.com/translaster/Definitive-Guide-5th-Edition/stargazers)
|
|
@ -0,0 +1,79 @@
|
|||
# Содержание
|
||||
|
||||
* [Аннотация](README.md)
|
||||
* [Вступление](foreword.md)
|
||||
* [Предисловие](preface.md)
|
||||
* [Глава 1. Революция в телефонии](chapter-01.md)
|
||||
- [Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией](chapter-01.md#asterisk-и-voip-преодоление-разрыва-между-традиционной-и-сетевой-телефонией)
|
||||
- [Массовые изменения требуют гибкости технологий](chapter-01.md#массовые-изменения-требуют-гибкости-технологий)
|
||||
* [Глава 2. Архитектура Asterisk](glava-02.md)
|
||||
* [Глава 3. Установка Asterisk](glava-03.md)
|
||||
* [Глава 4. Сертификаты для безопасности конечных точек](glava-04.md)
|
||||
* [Глава 5. Конфигурация пользовательских устройств](chapter-05.md)
|
||||
- [Концепции именования телефонов](chapter-05.md#концепции-именования-телефонов)
|
||||
- [Телефоны, софтфоны и телефонные адаптеры](chapter-05.md#телефоны-софтфоны-и-телефонные-адаптеры)
|
||||
* [Глава 6. Основы диалплана](chapter-06.md)
|
||||
- [Синтаксис диалплана](chapter-06.md#синтаксис-диалплана)
|
||||
- [Контексты](chapter-06.md#контексты)
|
||||
- [Extensions (Расширения)](chapter-06.md#extensions-расширения)
|
||||
- [Приоритеты](chapter-06.md#приоритеты)
|
||||
- [Приложения](chapter-06.md#приложения)
|
||||
- [Приложения Answer(), Playback() и Hangup()](chapter-06.md#приложения-answer-playback-и-hangup)
|
||||
- [Базовый прототип диалплана](chapter-06.md#базовый-прототип-диалплана)
|
||||
- [Простой диалплан](chapter-06.md#простой-диалплан)
|
||||
- [Hello World](chapter-06.md#hello-world)
|
||||
- [Создание интерактивного диалплана](chapter-06.md#создание-интерактивного-диалплана)
|
||||
- [Приложения Goto(), Background() и WaitExten()](chapter-06.md#приложения-goto-background-и-waitexten)
|
||||
- [Обработка неверных значений и тайм-аутов](chapter-06.md#обработка-неверных-значений-и-тайм-аутов)
|
||||
- [Использование приложения Dial](chapter-06.md#использование-приложения-dial)
|
||||
- [Использование переменных](chapter-06.md#использование-переменных)
|
||||
- [Совпадения по шаблонам](chapter-06.md#совпадения-по-шаблонам)
|
||||
- [Включения (Includes)](chapter-06.md#включения-includes)
|
||||
* [Глава 7. Внешние подключения](glava-07.md)
|
||||
* [Глава 8. Голосовая почта](glava-08.md)
|
||||
* [Глава 9. Интернационализация](glava-09.md)
|
||||
* [Глава 10. Погружение в диалплан](chapter-10.md)
|
||||
- [Выражения и манипуляции с переменными](chapter-10.md#выражения-и-манипуляции-с-переменными)
|
||||
- [Базовые выражения](chapter-10.md#базовые-выражения)
|
||||
- [Операторы](chapter-10.md#операторы)
|
||||
- [Функции диалплана](chapter-10.md#функции-диалплана)
|
||||
- [Синтаксис](chapter-10.md#синтаксис)
|
||||
- [Примеры функций диалплана](chapter-10.md#примеры-функций-диалплана)
|
||||
- [Условное ветвление](chapter-10.md#условное-ветвление)
|
||||
- [Приложение GotoIf](chapter-10.md#приложение-gotoif)
|
||||
- [Условное ветвление по времени с GotoIfTime](chapter-10.md#условное-ветвление-по-времени-с-gotoiftime)
|
||||
- [GoSub](chapter-10.md#gosub)
|
||||
- [Определение подпрограмм](chapter-10.md#определение-подпрограмм)
|
||||
- [Возврат из подпрограммы](chapter-10.md#возврат-из-подпрограммы)
|
||||
- [Локальные (Local) каналы](chapter-10.md#локальные-local-каналы)
|
||||
- [Использование базы данных Asterisk](chapter-10.md#использование-базы-данных-asterisk)
|
||||
- [Хранение данных в AstDB](chapter-10.md#хранение-данных-в-astdb)
|
||||
- [Получение данных из AstDB](chapter-10.md#получение-данных-из-astdb)
|
||||
- [Удаление данных из AstDB](chapter-10.md#удаление-данных-из-astdb)
|
||||
- [Использование AstDB в диалплане](chapter-10.md#использование-astdb-диалплане)
|
||||
- [Полезные функции Asterisk](chapter-10.md#полезные-функции-asterisk)
|
||||
- [Концеренц-связь с ConfBridge()](chapter-10.md#конференц-связь-с-confbridge)
|
||||
- [Полезные функции диалплана](chapter-10.md#полезные-функции-диалплана)
|
||||
- [CALLERID](chapter-10.md#callerid)
|
||||
- [CHANNEL](chapter-10.md#channel)
|
||||
- [CURL](chapter-10.md#curl)
|
||||
- [CUT](chapter-10.md#cut)
|
||||
- [IF и STRFTIME](chapter-10.md#if-и-strftime)
|
||||
- [LEN](chapter-10.md#len)
|
||||
- [REGEX](chapter-10.md#regex)
|
||||
- [STRFTIME](chapter-10.md#strftime)
|
||||
* [Глава 11. Функции АТС, включая парковку, пейджинг и конференц-связь](glava-11.md)
|
||||
* [Глава 12. Automatic Call Distribution Queues](glava-12.md)
|
||||
* [Глава 13. Состояния устройств](glava-13.md)
|
||||
* [Глава 14. Автосекретарь](glava-14.md)
|
||||
* [Глава 15. Интеграция реляционной базы данных](glava-15.md)
|
||||
* [Глава 16. Введение в интерактивное голосовое меню](glava-16.md)
|
||||
* [Глава 17. AMI и файлы вызовов](glava-17.md)
|
||||
* [Глава 18. AGI](glava-18.md)
|
||||
* [Глава 19. Asterisk REST Interface](glava-19.md)
|
||||
* [Глава 20. WebRTC](glava-20.md)
|
||||
* [Глава 21. Системный мониторинг и журналирование](glava-21.md)
|
||||
* [Глава 22. Безопасность](glava-22.md)
|
||||
* [Глава 23. Asterisk: Будущее телефонии](glava-23.md)
|
||||
* [Об авторах](about-the-authors.md)
|
||||
* [Послесловие](colophon.md)
|