LXF120:Asterisk

Материал из Linuxformat.

Перейти к: навигация, поиск
Hardcore Linux Проверьте себя на крутом проекте для продвинутых пользователей

Содержание

Asterisk: Телефон под контролем

Нырните с Максом Бруксом в мир телефонии с открытым кодом, Asterisk и стаю орущих мартышек.

Кто из нас не желал бы послать в ответ на рекламный обзвон визг стаи мартышек, или эхом повторить то, что вам сказали? Симпатична ли вам идея, чтобы каждый член вашей семьи имел личный добавочный номер и голосовую почту? А может, вы предпочитаете создать белый список людей, чьи звонки вас осчастливят даже после 10 вечера?

Asterisk метко назвали звездой Open Source в быстро расширяющейся вселенной VoIP-коммуникаций. До мелочей настраиваемая и порой соответственно сложная, это также идеальная система для экспериментов, и она умеет делать все вышеперечисленное. Этот учебник безболезненно проведет вас через создание собственной домашней PBX VoIP [мини-АТС, — прим. пер.] с Asterisk. Начав с простой базовой системы, вы получите выбор, какие функции нужно будет добавить.

Приступим

Для запуска Asterisk прежде всего необходим компьютер – к счастью, очень скромный насчет ресурсов: сойдет любое старье с чердака (или, как в моем случае, из-под кровати); а не то установите его на ваш медиасервер Linux, притаившийся в прихожей. Правда, для подключения вашей мини-АТС к имеющейся телефонной линии при установке на медиа-сервер может потребоваться полноразмерная PCI-карта, но это единственная неприятность. Если вы не собираетесь этого делать, медиа-центр – идеальный выбор.

Вариантов установки Asterisk несколько; вы можете развернуть специально созданный дистрибутив, типа Asterisk@Home, или просто установить пакет для вашей ОС. Я буду исходить из того, что вы добавляете пакеты на свой медиа--сервер и не хотите переустановливать Linux, так как только недавно заставили все красиво работать. В Fedora 10 (который я использую здесь), этот трюк проделает простое

sudo yum install asterisk

Заклинание для Ubuntu –

sudo apt-get install asterisk asterisk-sounds-main asterisk-sounds-extra

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

Базовая система

На первый взгляд — жуть, но если присмотреться поближе, то все проясняется.

Итак, куда мы двинемся? Сперва создадим простую конфигурацию Asterisk, пригодную в качестве основы для последующего обвешивания нужными вам функциями. Эта базовая схема включает всего один SIP-телефон, аппаратный либо программный, и вы сможете звонить по нему через Интернет при помощи VoIP-провайдера.

Провайдеров VoIP на свете хватает – и хороших, и плохих, и совсем никудышных. Хорошие дадут вам возможность использовать IAX, родной VoIP-протокол Asterisk, который лучше работает в NAT-окружении – с ним вы можете столкнуться, если занимаетесь этим дома. Через прокси, протокол IAX также поддерживает другие решения с открытым исходным кодом. Поддержка буфера колебаний задержки в IAX2 также более зрелая, чем в SIP-версии. Если ваш VoIP-провайдер не позволяет использовать IAX, или если качество линии плохое, я бы порекомендовал связаться с ближайшим LUG, чтобы разузнать про что-нибудь приличное поблизости. Чем меньше будут хаять, тем лучше.

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

Система настройки Asterisk довольно проста; файлы конфигурации сохраняются в /etc/asterisk, и для каждого протокола и схемы набора (dialplan) есть отдельный конфигурационный файл. Самые важные из них – extensions.conf и extensions.ael. В них вы определяете схему набора – иными словами, помещаете туда то, что должно происходить, когда звонок идет в систему или из нее. Различаются эти файлы синтаксисом. Расширение .ael – сокращение от Asterisk Extension Language, этот язык допускает более глубокую настройку и легче читается, чем сложный файл .conf. Оба файла при необходимости могут быть использованы вместе. Asterisk устанавливается вместе с настройками по умолчанию и множеством полезных комментариев в файлах конфигурации, и это первый пункт, где стоит искать подсказку, если вы застряли.

Пляшем с телефоном

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

Чтобы сообщить Asterisk о вашем SIP-телефоне, добавьте запись в /etc/asterisk/sip.conf. Вы должны сделать это от имени root, так как по молчанию файлы Asterisk принадлежат суперпользователю. Предлагаю воспользоваться простым редактором командной строки, типа Nano, но, конечно, если вы исповедуете религию Vi или Emacs, изменять им незачем.

$ su -
$ nano /etc/asterisk/sip.conf

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

[general]

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

context=default ; Контекст по умолчанию для входящих звонков
bindport=5060 ; UDP-порт для связи (стандартный порт SIP для незашифрованных сессий UDP 
; и TCP это 5060)
; bindport это локальный UDP порт, который Asterisk будет слушать

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

Скорая помощь

В исходящем контексте имя – это регулярное выражение (это обозначено префиксом _).

[myhouse]
type=friend ; Может быть “friend” (peer+user), “peer” или “user”
context=incoming
host=dynamic ; Вы можете задать здесь IP-адрес
username=username ; Имя пользователя на устройстве SIP
secret=blah ; пароль на устройстве SIP
nat=no ; Нет NAT между телефоном и Asterisk
canreinvite=yes ; разрешить передачу трафика RTP, минуя Asterisk

Можно скопировать и вставить данный пример в конец (но не в начало – при создании конфигурации в Asterisk это имеет значение) файла sip.conf, просто изменив переменные username и secret на действительные, и этого должно быть достаточно.

Приведенный пример должен быть понятен сам по себе или по крайней мере с комментариями: по существу, вы задали SIP-устройство с параметрами его конфигурации. При желании вы могли бы изменить переменную context в [general] на

context=incoming

а затем удалить эту строку из вышеуказанной конфигурации. Запишите ваши изменения в файл и закройте его.

Надеемся, вы нашли себе VoIP-провайдера, поддерживающего протокол IAX; если нет, следуйте инструкциям, но редактируйте файл sip.conf, добавляя в него сведения о SIP-услугах. Пример записи в iax.conf выглядит так:

[provider] ; Контекст с именем provider
type=peer
username=userid
secret=blah
host=iax.provider-example.net ; имя хоста вашего поставщика услуг

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

Совершаем звонок

Возможно, вы заметили, что мы фактически не сказали Asterisk, что делать, получив вызов, или как установить соединение через свеженастроенного VoIP-провайдера. Как я уже намекнул, это волшебство происходит в файле /etc/extensions.conf за счет использования так называемых приложений схемы набора. Мы сейчас рассмотрим очень простой пример, и позднее вы сможете добавить некоторые интересные функции. Нам нужны два основных контекста в extensions.conf:

[outgoing]
exten => _0[1-9].,1,Dial(IAX2/userid@
provider/44${EXTEN:1})
exten => _00.,1,Dial(IAX2/userid@provider/${EXTEN:2})
[incoming]
exten => s,1,Answer()
exten => s,n,Dial(SIP/myhouse)
exten => s,n,Hangup()

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

exten => name,priority,application()

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

Неплохо будет добавить в вашу схему набора отладочный номер, чтобы проверить, работает ли она хотя бы частично. Звуковой файл ss-weasels находится в пакете asterisk-sound-extra в вашей соответствующей установке.

exten => 8888,1,Answer()
exten => 8888,n,Playback(ss-weasels)
exten => 8888,n,Hangup()

Подключение к линии

Подключение вашего компьютера с новехоньким Asterisk к имеющейся телефонной линии, возможно, единственная сложная операция с устройством Asterisk. У нас недостаточно места, чтобы описать все детали, но мы включили ссылки на дополнительную информацию в конце этого учебника. Для подключения существующей телефонной линии к вашему компьютеру с Asterisk вам необходимы конкретные аппаратные средства. Такую аппаратуру делает целый ряд компаний, и наиболее широко известна из них Digium, которая финансирует развитие Asterisk, так что работа их карт с Asterisk гарантируется. Но стоят они дорого, и такая цена может показаться вам неоправданно высокой, потому что существуют решения типа Atcom AX-100P, который раз в двадцать дешевле.

Это противно интуиции, но устройство FXO использует связь FXS, и наоборот.

Основная сложность этой задачи зависит от видов используемой связи. На вашей карте PSTN можно найти два типа аппаратных портов или устройств: FXO и FXS. Устройство FXS подключается к порту FXO на существующем аналоговом телефоне и использует связь FXO. И наоборот, устройство FXO подключается к устройствам FXS или розеткам, а использует связь FXS.

Вплоть до версии Asterisk 1.6 драйвер ядра для устройств Digium назывался Zaptel, а затем по соображениям авторских прав его переименовали на Dahdi. Так как Dahdi – всего лишь название, то при возникновении трудностей заодно поищите в Google насчет проблем, связанных с Zaptel.

Чтобы использовать и установить Dahdi, надо будет установить драйвер (модуль ядра) для вашей карты. Правильный модуль ядра для карты Digium найдется в списке на http://docs.tzafrir.org.il/dahdi-linux. Затем понадобится настроить использование правильных способов связи, как описано выше. Полезную информацию для этого можно найти в /proc/dahdi и использовать ее для редактирования файлов конфигурации в /etc/dahdi. Используйте инструмент dahdi_test для проверки вашей конфигурации.

Добавляем голосовую почту

Добавление голосовой почты – штука несложная; нужно изменить три конфигурационных файла. С двумя первыми все просто до изумления, а третий чуть сложнее. Файл конфигурации голосовой почты находится в стандартном /etc/asterisk/, и предсказуемо называется voicemail.conf. Прежде всего, укажите номер почтового ящика в sip.conf:

mailbox=1234@default ; ящик 1234 В контексте голосовой почты “default”

Затем нужно задать почтовый ящик в voicemail.conf, поэтому запустите следующую команду в терминале Bash от root:

echo “200 => 1234,Your Name,email@address” >> /etc/asterisk/voicemail.conf

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

exten => 777,1,VoicemailMain()
exten => 777,n,Hangup
; Набор 777 позволит вам прослушать свои голосовые сообщения
[macro-voicemail]
exten => s,2,Goto(s-$DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(u${MACRO_EXTEN})
exten => s-NOANSWER,2,Hangup()
exten => s-BUSY,1,Voicemail(b${MACRO_EXTEN})
exten => s-BUSY,2,Hangup()
exten => _s-.,1,Goto(s-NOANSWER,1)

Мартышки против обзвонов

А сейчас – повеселимся: создадим «черный» список, запретив кое-кому доставать вас звонками. На словах не особенно впечатляюще, но это полезная вещь. Лица из черного списка будут перенаправляться на звуки, издаваемые стаей обезьян, а телефон при этом звонить не будет. Признаюсь, идею про орущих обезьян я придумал не сам: этот звуковой файл поставляется с Asterisk в дополнительном звуковом пакете. Соответствующие строки были добавлены в текст ниже:

[incoming]
exten => s,1,LookupBlacklist(j)
exten => s,n,Dial(SIP/myhouse)
exten => s,n,Hangup()
exten => s,102,Goto(blacklisted,s,1)
[blacklisted]
exten => s,1,Answer()
exten => s,n,Playback(tt-monkeys)
exten => s,n,Hangup()

В Asterisk нет встроенного приложения для «белых» списков, в отличие от «черных». Это более расплывчатая концепция. Мы используем «белый» список людей, которые могут звонить вам в определенное время, например, только с мобильных телефонов детей после 10 вечера. Предположим, номеру 01225 888888 разрешается звонить в любое время:

[incoming]
exten => s,1,GotoIfTime(9:00-22:00|mon-fri|*|*?whitelist,s,1)
exten => s,2,Answer()
exten => s,n,Dial(SIP/myhouse)
exten => s,n,Hangup()
[whitelist]
exten => s,1,GotoIf($[“${CALLERID(num)}” = “01225888888”]?incoming,s,2)

Советы, секреты и починка

Я покамест не охватил параметры командной строки Asterisk. Для запуска командной строки Asterisk выполните

asterisk -c

для возобновления связи –

asterisk -r

Остановка Asterisk отличается от выхода из оболочки, поэтому здесь необходима команда возобновления. Ввод

asterisk > stop now

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

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

asterisk > module reload

Поздравляем, теперь у вас полная власть над своим телефоном.

Что дальше?

Asterisk – чрезвычайно сложная и настраиваемая система. У нас просто не хватит здесь места, чтобы рассказать вам об Asterisk все: на это потребуется целая книга, и на самом деле такая уже написана. Она называется Asterisk: the Future of Telephony [Asterisk: будущее телефонии], издана O’Reilly и имеет версию в PDF-формате, доступную на http://www.asteriskdocs.org.

Еще одна важная ссылка (я нашел ее при разработке системы Asterisk) – это вики на http://www.voip-info.org/wiki-Asterisk

LXF

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию