36 видео на IT - тематику на нашем YouTube канале

ћерион Ќетворкс

21 минута чтени€

Ќа просторах »нтернет можно найти много инструкций по настройке Asterisk с использованием графического интерфейса FreePBX. » они помогают настраивать и управл€ть ј“— в большинстве случаев. Ќо гораздо больше возможностей дает настройка Ђчистогої Asterisk.

¬ статье мы сделаем базовую настройку Asterisk через конфигурационные файлы. ѕредполагаетс€, что у нас уже установлена и первоначально настроена ќ—, скачены и установлены модули dahdi, libpri, iax2, необходимые голосовые файлы и кодеки и проинсталлирован Asterisk.

≈сли вы еще не ничего не установили, то посмотрите в нашей статье как установить Asterisk на CentOS 7

ј еще вам понадобитс€ установить sngrep дл€ трассировки и отладки SIP-сообщений. ѕогнали?


“еори€

»так, приступаем к внедрению Asterisk. —труктура используемых јстериском директорий следующа€:

  • /usr/lib64/asterisk/modules Ц тут наход€тс€ загружаемые модули;
  • /var/log/asterisk Ц тут наход€тс€ лог-файлы, в том числе и лог звонков (если не настроено другое);
  • /var/spool/asterisk Ц тут наход€тс€ подпапки, в которых наход€тс€ бэкапы, записи разговоров, голосова€ почта, факсы и так далее;
  • /var/lib/asterisk Ц тут наход€тс€ подпапки, в которых наход€тс€ звуковые файлы дл€ музыки на удержании, звуковые файлы дл€ выбранных €зыков (например дл€ проигрывани€ голосовых сообщений в IVR), записанные голосовые сообщени€ дл€ приветстви€ и так далее.

 онфигурационные файлы наход€тс€ в папке /etc/asterisk. ƒл€ работы каждого модул€ Asterisk необходим конфигурационный файл. Ёти файлы (с расширением .conf), содержат определени€ каналов, описывают различные внутренние сервисы, определ€ют местоположени€ других модулей, устанавливают св€зь с диалпланом. Ќеоб€зательно настраивать все файлы. “ребуют настройки только те, которые необходимы дл€ вашей конфигурации.

ќсновные конфигурационные файлы:

  • asterisk.conf Ц определ€ет глобальные параметры, директории и опции дл€ запуска Asterisk;
  • cdr.conf Ц определ€ет настройки дл€ записи параметров вызовов в файл или базу данных;
  • sip.conf Ц определ€ет настройки дл€ использовани€ SIP-протокола (как общие, так и параметры дл€ регистрации провайдеров, внутренних пользователей и так далее);
  • rtp.conf Ц определ€ет порты дл€ голоса (RTP);
  • iax.conf Ц определ€ет настройки дл€ использовани€ IAX-протокола (как общие, так и параметры дл€ регистрации провайдеров, внутренних пользователей и так далее);
  • extensions.conf Ц основной файл, в котором описываетс€ весь диалплан, то есть правила обработки всех вызовов;
  • features.conf Ц описывает дополнительные функции (переадресации, парковка вызова, включение записи по запросу и так далее);
  • logger.conf Ц определ€ет тип и детальность сообщений, записываемых в файлы журналов;
  • modules.conf Ц определ€ет какие модули будут или наоборот не будут загружатьс€ при запуске Asterisk;
  • musiconhold.conf Ц используетс€ дл€ конфигурации разных классов музыки, используемых в приложени€х музыки во врем€ ожидани€, и их местоположений;

Ќапомним, что это только часть конфигурационных файлов. Ќеобходимые файлы можно добавл€ть в любой момент по мере необходимости. ѕримеры и содержание таких файлов можно найти в архиве по кнопке ниже:

—качать архив

—разу после установки asterisk, если не была выбрана установка базовой конфигурации, в ней нет ни одного файла.

ѕуста€ директори€ дл€ Asterisk

ƒл€ подключени€ к asterisk в режиме командной строки необходимо ввести

asterisk Цrvvvvv
  • r Ц подключение к уже запущенному процессу;
  • vvvvv Ц уровень логировани€, то есть вывода информации (от слова verbose - v). „ем больше v выставл€ем, тем более детальна€ информаци€ будет выдаватьс€ в командную строку;
Asterisk - настройка с нул€

—оздаем и редактируем необходимые файлы

Ќачнем с файла asterisk.conf:

Ќастройка файла asterisk.conf
  • [directories](!) Ц указываем расположение необходимых директорий. «наком (!) указываетс€ признак шаблона. ¬ шаблоне указываютс€ общие настройки, на которые можно ссылатьс€ дальше.
  • [options] Ц указываем необходимые опции, одна из необходимых maxcalls указывает на количество одновременных вызовов, разрешенных на Asterisk;
    • transmit_silence_during_record = yes - передавать тишину SLINEAR во врем€ записи канала;
    • languageprefix = yes | no - ƒолжен ли код €зыка быть последним или первым компонентом имени звукового файла? ≈сли выключен, поиск звуковых файлов ведетс€ в формате <путь>/<€зык>/<файл> ≈сли включен, поиск ведетс€ в формате <€зык>/<путь>/<файл>;
    • execincludes = yes | no - –азрешить записи #exec в конфигурационных файлах;
    • hideconnect = yes | no - ѕоказывать сообщение о подключении удаленных консолей;
    • dontwarn = yes | no - ќтключить предупреждени€ (warning messages);
    • debug = no - ќтладка: No или значение (1-4);
    • maxcalls = 10 - ћаксимальное число одновременных вызовов;

ѕриступаем к файлу cdr.conf.  омментарии к опци€м в конфиге:

[general]

enable=yes			; включаем саму возможность логировани€ звонков
unanswered=no		; неотвеченные звонки не логируем
safeshutdown=yes		; при выключении сервера будем ждать, пока не допишутс€ ¬—≈ логи

[csv]

usegmtime=yes  ;лог date/time в формате GMT. ѕо умолчанию NO
loguniqueid=yes
loguserfield=yes

«акончили. “еперь файл features.conf:

[general]

[featuremap]			; тут описываем используемые функции и их параметры

blindxfer => ##			; безусловный перевод
atxfer => *2			; условный перевод
automon => *1
disconnect => **			
parkext => 700			; парковка
parkpos => 710-780		; диапазон портов дл€ парковки
context => parkedcalls	; контекст дл€ обработки запаркованных звонков
parkingtime => 180		; врем€ парковки
comebacktoorigin => no	; возвращать звонок на инициатора, когда закончилось врем€ 	парковки вызова
parkedplay => both		; кому играть courtesytone когда вызов снимаетс€ с парковки. ќпции: callee, caller, both или no(по умолчанию)

parkedcalltransfers => caller	;  то может сделать трансфер припаркованного вызова с помощью DTMF. ќпции: callee, caller, both или no(по умолчанию)
parkedcallrepark => caller	;  то может перепарковать, припаркованный вызов с помощью DTMF. ќпции: callee, caller, both или no(по умолчанию)
parkedcallhangup => no		;  то может закончить, припаркованный вызов с помощью DTMF ќпции: callee, caller, both или no(по умолчанию)
parkedcallrecording => no	;  то может инициировать запись, с помощью DTMF. ќпции: callee, caller, both или no(по умолчанию)..
parkedmusicclass => default	;  ласс музыки ожидани€ дл€ припаркованного, 
adsipark => no	; ѕередавать или нет ADSI инфо о припаркованном вызове тому кто припарковал
findslot => first
pickupexten => *8	; перехват звонка

[applicationmap]	; тут описываем используемые приложени€

sendsms => *99,peer/both,Macro,sendsms
pitch => *00,self/both,Macro,pitch

“еперь конфигурируем RTP в файле rtp.conf

[general]
rtpstart=36600
rtpend=39999

ћузыка на ожидании в здании. ќткрываем файл musiconhold.conf

[default]
mode=files
directory=/var/lib/asterisk/moh/

—ледом открываем файл logger.conf:

[general]
[logfiles]
console => notice,warning,error,dtmf,verbose(5)		; уровень детализации сообщений, выводимых в консоль
full => debug,notice,warning,error,verbose(9),dtmf,fax,security		; уровень детализации сообщений, выводимых в лог-файл

ƒл€ удобства работы рекомендуетс€ ограничивать уровень детализации сообщений, выводимых в консоль, но дл€ вывода в файл выставить максимальный уровень детализации.

» напоследок - файл modules.conf. ≈сть 2 варианта: либо читаем все модули и указываем те, которые не надо читать:

[modules]
autoload=yes
noload => codec_g723-ast110-gcc4-glibc-x86_64-core2-sse4.so

Ћибо указываем конкретные модули, которые необходимо прочитать и запрещаем чтение всех. ¬ этом случае дл€ удобства лучше поделить модули на секции. Ќиже приведена часть такого варианта:

[modules]
autoload = no

; Applications

load = app_bridgewait.so
load = app_dial.so
load = app_playback.so

; Bridging

load = bridge_builtin_features.so
load = bridge_builtin_interval_features.so
load = bridge_holding.so

; Call Detail Records

load = cdr_custom.so

; Channel Drivers

load = chan_bridge_media.so
load = chan_sip.so

; Codecs

load = codec_gsm.so
load = codec_ulaw.so
load = codec_alaw.so
load = codec_g722.so

; Formats

load = format_gsm.so
load = format_pcm.so
load = format_wav_gsm.so
load = format_wav.so

; Functions

load = func_callerid.so
load = func_cdr.so
load = func_pjsip_endpoint.so

; Core/PBX

load = pbx_config.so

; Resources

load = res_musiconhold.so
load = res_pjproject.so
load = res_pjsip_acl.so

¬ данной статье мы используем первый вариант. Ќа этом с настройкой основных файлов закончим. ¬ дальнейшем по мере необходимости в них можно вносить изменени€. ¬се последующие настройки мы будем вносить в файлы sip.conf и extensions.conf. ѕогнали к созданию и регистрации внутренних абонентов.


—оздание и регистраци€ внутренних абонентов

¬ sip.conf указываем сначала общие параметры SIP дл€ Asterisk:

[general]
bindaddr=0.0.0.0		; указываем IP-адрес и порт, на котором будет приниматьс€ bindport=5060		; SIP-трафик
language=ru		; используемый €зык дл€ голосовых сообщений 
alwaysauthreject=yes
allowguest=no		; запрещаем принимать Ђгостевыеї звонки, то есть вызовы от незарегистрированных пользователей

“ак же в этой секции можно указать поддерживаетс€ ли видео, врем€ регистрации, перечислить локальные сети, указываем внешний IP-адрес в случае использовани€ NAT и так далее.

¬ случае, когда у нас есть разные группы абонентов (например, есть несколько отделов, подразделений либо другие какие-то признаки группировки абонентов или абонентов большое количество), рекомендуетс€ использовать шаблоны, в которые можно выносить обобщенные настройки.

»м€ шаблона беретс€ в скобки [ ] и следом указываетс€ (!). ¬ шаблоне можно указать контекст дл€ этих абонентов, используемые кодеки, разрешенные/запрещенные сети дл€ регистрации этих абонентов, использование NAT и так далее. ѕример шаблона приведен ниже:

[office](!)

type=friend
deny=0.0.0.0/0.0.0.0
permit=192.168.10.0/255.255.255.0
host=dynamic
context=from-internal
nat=no
qualify=yes
directmedia=no
disallow=all
allow=alaw
allow=ulaw
dtmfmode=info

» таких шаблонов можно может быть несколько. “еперь дл€ создани€ записи дл€ регистрации абонентов нам достаточно указать только отличительные параметры, такие как внутренний номер, им€ абонента, пароль дл€ регистрации и так далее.

[Ќќћ≈–](ЎјЅЋќЌ)
callerid=»ћя <Ќќћ≈–>
secret=ѕј–ќЋ№
callgroup=5			; номер группы вызова
pickupgroup=1,2,3,4,5		; номера групп перехвата вызовов

ѕример настройки:

—оздание шаблона настройки Asterisk »спользование шаблонов при конфигурации Asterisk

¬ результате, по команде sip show peers мы видим зарегистрированных пользователей

sip show peers Asterisk

јбоненты зарегистрировались, но позвонить даже между собой они пока не могут. ƒл€ того, чтобы они могли совершать и принимать звонки необходимо настроить маршрутизацию (или диалплан). ƒелать это мы будем в файле extensions.conf, там тоже есть сво€ структура. » тут мы снова немного погружаемс€ в теорию:

ƒиалплан состоит из следующих основных элементов:

  • контексты;
  • добавочные номера;
  • приоритеты;
  • приложени€;

 онтекст Ц часть (раздел) диалплана, описывающа€ алгоритм обработки вызова и изолированна€ от остального диалплана. —одержит дополнительные номера (extension). ƒополнительные номера, определенные в одном контексте, полностью изолированы от добавочных номеров в другом контексте, если это не разрешено специально. “ак же с помощью контекстов можно ограничивать доступ к различным функци€м (например к междугородним или международным звонкам). »м€ контекста заключаетс€ в квадратные скобки []. –екомендуетс€ создавать разные контексты дл€ внутренних абонентов и дл€ транков.

¬ начале диалплана наход€тс€ два специальных контекста, [general] и [globals]

  • [general] Ц содержит список общих настроек диалплана;
  • [globals] Ц содержит глобальные переменные;

Ёти два контекста €вл€ютс€ специальными.  онтекст €вл€етс€ одним из об€зательных параметров как дл€ абонента, так и дл€ транка.

Asterisk определ€ет контекст дл€ обработки по тому принципу откуда пришел вызов, а не куда он пришел, то есть если пришел вызов на мобильный номер от абонента, то примен€тьс€ будет тот контекст, который прописан у конкретного абонента, а не указанный в транке.

ƒобавочные номера Ц это широкое пон€тие, которое определ€ет уникальные последовательности шагов (каждый шаг включает приложение), которые Asterisk будет примен€ть к вызову по этой линии. ¬ каждом контексте может быть задано столько добавочных номеров, сколько требуетс€. ѕри вызове конкретного добавочного номера (вход€щим или внутренним звонком) Asterisk будет выполн€ть шаги, определенные дл€ этого добавочного номера. ѕоэтому именно добавочные номера определ€ют, что происходит со звонками при их обработке соответственно диалплану.

ѕолный добавочный номер состоит из трех компонентов:

  • »мени (или номера). ¬ качестве имени может быть использованы любые комбинации цифр и букв;
  • ѕриоритета (каждый добавочный номер может включать множество шагов; пор€дковый номер шага называетс€ его приоритетом);
  • ѕриложени€ (или команды), которое выполн€ет некоторое действие над вызовом;

Ёти три компонента раздел€ютс€ зап€тыми:

exten => им€,приоритет,приложение()

≈сть ещЄ зарезервированные добавочные номера:

  • s - когда в контекст поступают вызовы, дл€ которых не указан конкретный добавочный номер, они передаютс€ на добавочный номер s. (s - сокращение от start (начало), поскольку именно здесь начнетс€ обработка вызова, если не передана информаци€ о добавочном номере.;
  • i - когда абонент нажимает не ту кнопку (не существующий добавочный номер), вызов направл€етс€ на добавочный номер i;
  • t - если абонент слишком долго не нажимает кнопку после запуска приложени€ WaitExten(), вызовы направл€ютс€ на добавочный номер t (врем€ ожидани€ по умолчанию - 10 с);
  • h - экстеншен обрабатываемый при завершении вызова. ѕосле того как медиаканал закрылс€;

»ногда можно встретить использование same вместо exten. Ёто примен€ют в основном с автоматическим выставлением приоритета, то есть same => n и означает Ђтоже самое, продолжение предыдущегої

ѕриоритеты Ц последовательность выполнени€ приложений.  аждый приоритет пронумерован последовательно, начина€ с 1, и выполн€ет одно определенное приложение. ¬ Asterisk есть еще приоритет n, что означает Ђследующийї.  аждый раз, когда Asterisk встречает приоритет n, она берет номер предыдущего приоритета и добавл€ет 1. Ёто упрощает внесение изменений в диалплан, поскольку теперь не надо измен€ть номера всех шагов.

ѕриложени€ Ц выполн€ет определенное действие в конкретном дополнительном номере (например воспроизведение звука, прием тонального ввода, вызов канала, разрыв соединени€ и так далее).

ƒл€ выполнени€ некоторых приложений, таких как Answer() и Hangup(), не требуетс€ никаких дополнительных инструкций. Ќекоторым приложени€м необходима дополнительна€ информаци€. Ёти данные, называемые аргументами, могут передаватьс€ в приложени€, чтобы оказывать вли€ние на то, как они выполн€ют свои действи€. „тобы передать аргументы в приложение их указывают через зап€тую в круглых скобках, следующих за именем приложени€.

ƒл€ внесени€ комментариев в файл extensions.conf используют ; - вы уже могли об этом догадатьс€, суд€ по нашим комментари€м пр€мо в конфигах :)

“аким образом можно как делать пометки дл€ себ€, так и делать невыполнимыми строки конфигурации (например, во врем€ отладки)

“еперь давайте вернемс€ к нашим созданным абонентам. —оздадим контекст, который указан у абонентов (context=from-internal)

—оздание диалплана в Asterisk

¬ нем мы прописали что при наборе номера (»ћя), с приоритетом 1 выполнить приложение Dial c параметрами ѕ–ќ“ќ ќЋ/Ќќћ≈–.  огда номеров немного, то можно конечно и так описывать. Ќо более правильно и красиво сделать тоже самое, но с использованием Ђмаскиї:

»спользование масок в диалплане в Asterisk

“о есть при наборе любого номера из диапазона 10хх (шаблон показан нижним подчеркиванием) выполнить вызов с приоритетом 1 через приложение Dial с параметрами ѕ–ќ“ќ ќЋ/ЌјЅ–јЌЌџ…_Ќќћ≈–, врем€ вызова 60 секунд и можно использовать перевод звонка (transfer).

Ўаблон номера - это уникальный набор цифр, который определ€ет использование этого номера. ≈сли набранный номер соответствует этому шаблону, то последующие номера не рассматриваютс€. ‘ормат заполнени€ шаблона:

  • X - совпадение любой цифры от 0 - 9;
  • Z - люба€ цифра от 1 до 9;
  • N - совпадение любой цифры от 2 - 9;
  • [1237-9] - соответствует любым цифрам или буквам и скобках (в этом примере,1,2,3,7,8,9);

ѕеречитываем диалплан в консоли Asterisk командой dialplan reload и видим выполнение вызова.

ѕроверка диалплана в консоли Asterisk

“аким образом мы можем придумать и реализовать практически любой диалплан. Ќапример дл€ запрета вызовов на международную св€зь достаточно прописать 3 строчки:

ѕример диалплана в консоли Asterisk

“о есть при наборе 810 будет проиграно сообщение destination-closed (если оно было загружено в Asterisk) и будет отправлен сигнал отбо€.


—оздание и регистраци€ транков

Ќу, начнем с того, что IP-транки, используемые в Asterisk, бывают 2-х видов Ц SIP и IAX.

SIP-транки в основном используютс€ дл€ подключени€ провайдеров, а IAX-транки дл€ подключени€ других Asterisk. “ранки могут быть с регистрацией (то есть когда провайдер выдает логин, пароль и адрес или домен дл€ регистрации у него) и без регистрации (то есть когда подключение идет по IP-адресу без логина и парол€). ¬ случае с регистрацией в файле sip.conf необходимо сразу после секции [general] указать строку регистрации в формате:

register => Ћќ√»Ќ:ѕј–ќЋ№@SIP-ѕ–ќ¬ј…ƒ≈–/Ќќћ≈–

“ут:

  • SIP-ѕ–ќ¬ј…ƒ≈– - указываетс€ или IP-адрес провайдера или его домен;
  • Ћќ√»Ќ:ѕј–ќЋ№ - выдаютс€ провайдером дл€ подключени€;
  • Ќќћ≈– - указываетс€ городской номер, выданный провайдером дл€ совершени€ звонков;

–ассмотрим создание SIP-транка с регистрацией. ќп€ть же если у нас несколько (до 3-5) таких транков, то можно их описать каждый отдельно. ј если из больше или в дальнейшем планируетс€ увеличить их количество, то можно использовать шаблон дл€ подключени€ к оператору.

[voip-provider](!)		; им€ шаблона

type=peer			; тип подключени€
context=from-trunk		; используемый контекст дл€ обработки вызовов
disallow=all			; выключаем все кодеки
allow=alaw			; указываем используемые кодеки
allow=ulaw
insecure=invite,port		; не запрашивать авторизацию на вход€щие звонки
qualify=yes			; проверка доступности
directmedia=no		; запрещаем установление пр€мых соединений дл€ передач 					 голоса
dtmfmode=rfc2833		; указываем используемый тип DTMF
дальше достаточно описать конкретные настройки дл€ конкретного оператора и указать какой шаблон использовать

[ќѕ≈–ј“ќ–-1](voip-provider)
defaultuser=Ћќ√»Ќ-1
fromuser=Ћќ√»Ќ-1
secret=ѕј–ќЋ№-1
host=ƒќћ≈Ќ1- »Ћ» IP-јƒ–≈— ƒЋя ѕќƒ Ћё„≈Ќ»я
fromdomain= ƒќћ≈Ќ-1 »Ћ» IP-јƒ–≈— ƒЋя ѕќƒ Ћё„≈Ќ»я

[ќѕ≈–ј“ќ–-2](voip-provider)
defaultuser=Ћќ√»Ќ-2
fromuser=Ћќ√»Ќ-2
secret=ѕј–ќЋ№-2
host=ƒќћ≈Ќ-2 »Ћ» IP-јƒ–≈— ƒЋя ѕќƒ Ћё„≈Ќ»я
fromdomain= ƒќћ≈Ќ »Ћ» IP-јƒ–≈— ƒЋя ѕќƒ Ћё„≈Ќ»я

ƒальше указываем строки дл€ регистрации у данных операторов:

register => Ћќ√»Ќ-1:ѕј–ќЋ№-1@ƒќћ≈Ќ-1/Ќќћ≈–-1
register => Ћќ√»Ќ-2:ѕј–ќЋ№-2@ƒќћ≈Ќ-2/Ќќћ≈–-2

ѕеречитываем файл sip.conf и провер€ем регистрации:

sip show peers в консоли Asterisk

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

[AST10SIP](voip-provider)
type=friend			; дл€ транка без регистрации указываем friend (то есть мы довер€ем этому подключению)
port=5060		; указываем порт дл€ подключени€
insecure=port,invite
host=IP-јƒ–≈—_ѕ–ќ¬ј…ƒ≈–ј
context=from-trunk-sip-AST10SIP	; если обработки вызовов через этот транк используетс€ другой контекст, то указываем его тут.

ѕеречитываем файл sip.conf и провер€ем регистрации:

SIP - транк без регистрации в Asterisk

“еперь рассмотрим создание IAX-транка. ƒл€ настройки IAX-транков используетс€ файл iax.conf, который содержит всю информацию, необходимую Asterisk дл€ создани€ и управлени€ каналами, работающими по протоколу IAX. —труктура его примерно така€ же, как и у sip.conf:

[general]		; указываем глобальные параметры дл€ протокола IAX

bindaddr=0.0.0.0
bindport=4569		; по-умолчанию IAX-протокол использует порт 4569 можно оставить его, а можно и переопределить 
language=ru

; указываем строки дл€ регистрации транков
register => msk-spb:SuperPASS@10.10.10.10	

[msk-spb]

username = msk-spb		; логин дл€ регистрации на удаленной стороне
type = friend
trunk = yes
secret = SuperPASS		; пароль дл€ регистрации
qualify = yes
host = 10.10.10.10		; IP-адрес удаленной стороны
disallow= all
context = from-iax		; контекст дл€ обработки вызовов, поступающих через этот транк
allow = alaw
allow = ulaw

—охран€ем файл iax.conf, перечитываем и провер€ем регистрацию командой iax2 show peers:

IAX - транк статус в Asterisk

≈сли есть абоненты, работающие по протоколу IAX, то их регистрацию описываем тоже в этом же файле аналогично SIP-регистрации.

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

exten => 500,1,Playback(it-otdel)		; проигрываетс€ сообщение it-otdel
exten => 500,1,Dial(SIP/1001,5),Tt		; 5 секунд вызов идет на номер 1001
exten => 500,n,Dial(SIP/1002&SIP/1003)	; потом вызов идет одновременно на 1002 и 1003

ћожем настраивать различные функции, запускать различные команды (в том числе и дл€ выполнени€ через ќ—), настраивать запись и прослушивание разговоров и так далее:

; ответить, подождать 2 секунды и положить трубку
exten => 060,1,Answer()
same => n,Wait(2)
same => n,Hangup()
; ответить, проиграть сообщение hello-world и положить трубку
exten => 061,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
; записать сообщение в файл somefile.gsm и потом его проиграть 
exten => 067,1,Record(/tmp/somefile.gsm,3,30)
same => n,Playback(/tmp/somefile)

ƒл€ совершени€ звонков через созданные и зарегистрированные транки SIP и IAX: ƒопустим через транк IAX у нас подключен другой Asterisk с внутренней нумерацией, начинающейс€ с 1, 2, 3. » дл€ вызова этих абонентов мы будем использовать префикс (код выхода на маршрут) 2. “огда строки настройки будут следующие:

exten => _2[1-3].,1,Dial(IAX2/msk-spb/${EXTEN:1},30,r)
exten => _2.,2,Hangup()

“о есть при наборе, начинающемс€ с 21-23, будет осуществлен вызов через транк msk-spb по протоколу IAX набранного номера, предварительно Ђотрезавї 1 (первую) набранную цифру. ≈сли в течение 30 секунд не будет получен ответ, то вызов будет прекращен.

ƒл€ выхода в город мы используем транк с оператором-1 и префикс выхода будем использовать 9

exten => _9849[589]XXXXXXX,1,Dial(SIP/ќѕ≈–ј“ќ–-1/${EXTEN:1})	;то есть при наборе, начинающемс€ с 9, будет осуществлен вызов через транк ќѕ≈–ј“ќ–-1 по протоколу SIP набранного номера, предварительно Ђотрезавї 1 (первую) набранную цифру

“ут важно понимать, что все, что мы реализовываем дл€ внутренних абонентов, должно быть описано в соответствующем контексте.

“еперь перейдем к транкам и вход€щим звонкам. —оответственно дл€ того, чтобы принимать вход€щие вызовы, необходимо прописать маршрутизацию уже в контексте транка (context=from-trunk или context = from-iax)

ƒл€ возможности через транк осуществл€ть вызов нашего внутреннего абонента (например через транк со встречной ј“—) необходимо в контекст транка вставить exten => _10XX,1,Dial(SIP/${EXTEN},60,tTm)

ƒавайте рассмотрим реализацию обработки вход€щего вызова от оператора (вызов на городской номер) через создание меню IVR и реализуем ещЄ определение рабочего и нерабочего времени. —хема обработки вход€щего вызова следующа€:

–абочее врем€ у нас определено с 9:00 до 19:00 и с понедельника по п€тницу. ѕри поступлении звонка в нерабочее врем€ после сообщени€ с приветствием (01-hello) проигрываетс€ сообщение с указанием рабочего времени (07-working-hours). ѕри поступлении звонка в рабочее врем€ (проверка осуществл€етс€ в строке GoToIfTime(09:00-19:00,mon-fri)) после приветстви€ осуществл€етс€ переход в другой контекст ([working-time]), где предлагаетс€ выбрать необходимый пункт меню (0 Ц вызов секретар€, 1 Ц вызов на группу тех. поддержки, 2 Ц переход в другое меню выбора (GoTo(ivr-2,s,1)), в котором по такому же принципу осуществл€етс€ выбор. ¬ каждом меню реализован донабор внутренних номеров (exten => _1xхx,1,NoOp), обработка неправильного набора номера (exten => i,1,NoOp), обработка в случае, что если ничего не выбрали (exten => t,1,NoOp), вызов переводитс€ на секретар€.

≈стественно необходимо загрузить все используемые голосовые файлы в /var/lib/asterisk/sound/ru в случае использовани€ русского €зыка. “ут давайте немного по-подробнее.

 ак мы уже указывали выше в системе мы определили какой основной €зык у нас будет использоватьс€ дл€ голосовых файлов (в файле sip.conf параметр language = ru). Ёто значит, что Asterisk будет искать имена файлов, которые мы указываем, например, в меню ivr в папке /var/lib/asterisk/sound/ru (смотрим обозначени€ директорий при запуске asterisk в начале статьи). ≈сли бы мы использовали в качестве основного €зыка английский, то папка была бы /var/lib/asterisk/sound/en. ¬ каждой из этих папок наход€тс€ голосовые файлы выбранных €зыков и в выбранных форматах, указанных при компилировании asterisk. ≈сли мы хотим записать свои сообщени€ (персональные приветстви€, необходимые объ€влени€, произносимые в создаваемых меню ivr и так далее), нам необходимо положить эти файлы в папку с соответствующим €зыком. —ами файлы при этом можно записать любой звукозаписывающей программой (хоть программой «вукозапись, вход€щей в стандартный дистрибутив любой версии Windows) и сохранить в формате wav (несжатый голос, 8к√ц, 16 Ѕит, ћоно)

“ут главное не перепутать имена файлов, наход€щихс€ в папке с голосовыми сообщени€ми, с именами, указанными в ivr меню. при этом в ivr меню имена указываютс€ без расширени€. —ам листинг приведен ниже.

[from-trunk]

exten => _X.,1,NoOp(ѕроверка времени: ≈сли попали в диапазон - переходим в контекст working-time, если нет - продолжаем выполнение)
same => n,Answer()
same => n,Playback(01-hello)
same => n,GoToIfTime(09:00-19:00,mon-fri,*,*?working-time,s,1)
same => n,Playback(07-working-hours)
same => n,Hangup()

[working-time]

exten => s,1,Answer()
same => n,Background(01-ivr1)
same => n,StartMusicOnHold()
same => n,WaitExten(5)
;
exten => 0,1,NoOp(≈сли нажали "0" - звоним секретарю)
same => n,Playbacr(ostavaites-na-linii)
same => n,Dial(SIP/1005,30,mtT)
same => n,Hangup()
;
exten => 1,1,NoOp(≈сли нажали "1" - звоним на группу вызова: 1001+1002)
same => n,Playback(it-otdel)
same => n,Dial(SIP/1001&SIP/1002,30,mtT)
same => n,Hangup()
;
exten => 2,1,NoOp(≈сли нажали "2" - перенаправл€ем на ivr-2)
same => n,GoTo(ivr-2,s,1)
;
exten => _1xхx,1,NoOp(ѕр€мой набор внутренних номеров)
same => n,Playback(ostavaites-na-linii)
same => n,Dial(SIP/${EXTEN}15,mtT)
same => n,Hangup()
;
exten => i,1,NoOp(ќбработка ошибочного набора:i=illegal)
same => n,Playback(oshibka)
same => n,Dial(SIP/1005,30,r)
;
exten => t,1,NoOp(¬ случае, если не дождались нажати€)
same => n,Playback(ostavaites-na-linii)
same => n,Dial(SIP/1005,30,m)
;

[ivr-2]

exten => s,1,Background(02-ivr2)
same => n,StartMusicOnHold()
same => n,WaitExten(5)
;
exten => 1,1,NoOp(≈сли нажали "1" - звоним на 1001)
same => n,Dial(SIP/1001,30,mtT)
same => n,Hangup()
;
exten => 2,1,NoOp(≈сли нажали "2" - звоним на 1002)
same => n,Dial(SIP/1002,30,mtT)
same => n,Hangup()
;
exten => _1xхx,1,NoOp(ѕр€мой набор внутренних номеров)
same => n,Dial(SIP/${EXTEN}15,mtT)
same => n,Hangup()
;
exten => i,1,NoOp(ќбработка ошибочного набора:i=illegal)
same => n,Playback(oshibka)
same => n,Dial(SIP/1005,30,r)
;

ѕосле сохранени€ файла extensions.conf перечитываем диалплан в консоли (dialplan reload) и провер€ем. Ќа этом закончим с примерами.

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


ѕолезна ли ¬ам эта стать€?


Ёти статьи могут быть вам интересны: