Инсталляция и настройка сервера IP-телефонии Asterisk 1.6.1

Author: Вадимовъ
Revision: 1.1
Date: 16.03.2009

Contents

1   Аннотация

Данный документ является частью документации, поставляемой в рамках проекта "ПТК ЦОИ", и описывает процесс инсталляции и конфигурирования сервера IP-телефонии Asterisk версии 1.6.1 в предположении, что планируется создание VoIP сети, состоящей из 18 автоматизированных рабочих мест (АРМ) с возможностью поддержки конференции и записи переговоров.

Привлечение дополнительного аппаратного обеспечения фирмы Digium для поддержки аналоговой и цифровой телефонии не предполагается.

2   Установка необходимого программного обеспечения

Перед началом установки необходимо установить следующие пакеты:

2.1   Краткая инструкция

Все релизы Asterisk ветки 1.4 с версией выше 1.4.21 и все релизы ветки 1.6 автоматически используют канал DAHDi вместо Zaptel, даже если Zaptel все еще установлен и присутствует в системе.

Для установки модуля канала DAHDi необходимо предварительно установить в системе исходные коды ядра ОС!

Установите пакет DAHDi согласно прилагающимся к нему инструкциям по установке, затем переконфигурируйте и пересоберите сам Asterisk.

2.2   Детальное описание процесса установки

Предполагается, что пользователь, проводящий процесс установки и настройки, имеет достаточные знания в области работы с командной оболочкой shell ОС Linux(Unix) и предварительно ознакомился с содержанием главы 3 [1].

Инсталляция производится от имени пользователя: asterisk
Домашний каталог: /home/asterisk
Имя сервера: asterisk
IP адрес: 10.10.10.206
Операционная система: openSUSE 11.1 (i586) Релиз: Linux 2.6.27.7-9-pae #1 SMP 2008-12-04 18:10:04 +0100 i686 i686 i386  GNU/Linux

2.2.1   Модуль канала DAHDI

Модуль канала DAHDI (Digium Asterisk Hardware Device Interface) обеспечивает интерфейсный уровень между сервером Asterisk с одной стороны, и драйвером интерфейса Dahdi плюс программные эхоподавителели с другой. Этот модуль канала пришел на смену Zaptel и наследует все его основные возможности. Кроме того, были расширены возможности по работе с программными эхоподавителями и добавлены новые параметры в файл конфигурации.

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

  • dahdi-linux: модули драйверов ядра системы.
  • dahdi-tools: пользовательские утилиты.

Получение исходного кода и установка:

$ cd ~
$ mkdir src3
$ cd src3
$ wget http://downloads.digium.com/pub/telephony/dahdi-linux/dahdi-linux-current.tar.gz
$ tar zxvf dahdi-linux-current.tar.gz
$ cd /home/rtbr/src3/dahdi-linux-2.1.0.4
$ make
# make install

В результате в системе появится специальное псевдоустройство dahdi и драйвер dahdi_dummy в виде одноименного модуля ядра, необходимые как источник цифрового сигнала для поддержки возможности организации конференции. Устройство dahdi_dummy не предоставляет каналов и используется только как источник DAHDI сигналов таймера. Подробности см. на стр.77,90 [1].

Поддержка таймера может быть также необходима для "Music on Hold".

Подробности см. http://voip.rus.net/tiki-index.php?page=Asterisk+DAHDI+channels

Проверка наличия модуля ядра:

$ cd /lib/modules/2.6.27.7-9-pae/dahdi
$ ls -l dahdi_dummy.ko
-rw-r--r-- 1 root root 6366 2009-02-25 17:35 dahdi_dummy.ko

В результате процесса инсталляции в каталоге /dev появится псевдоустройство /dev/dahdi.

$ ls -l /dev/dahdi
total 0
crw-rw---- 1 root root 196, 254 2009-02-26 14:50 channel
crw-rw---- 1 root root 196,   0 2009-02-26 14:50 ctl
crw-rw---- 1 root root 196, 255 2009-02-26 14:50 pseudo
crw-rw---- 1 root root 196, 253 2009-02-26 14:50 timer

Загрузка модулей ядра (без стартового сценария) при необходимости осуществляется командой modprobe:

# modprobe dahdi
# modprobe dahdi_dummy

Если все прошло нормально, то на экран ничего не выводится.

Выполнение этих двух команд предусмотрено в стартовом сценарии, который появляется в системе после установки пакета dahdi-tools (см.ниже).

Проверка наличия загруженных модулей:

$ lsmod | grep dahdi
dahdi_dummy             3176  0
dahdi                 185896  1 dahdi_dummy
crc_ccitt               1884  1 dahdi

Чтобы выгрузить драйвер из памяти:

# rmmod dahdi

2.2.2   Пользовательские утилиты dahdi-tools

Установка данного пакета не является обязательной.

Процесс установки предусматривает выполнение следующей последовательности команд:

$ wget http://downloads.digium.com/pub/telephony/dahdi-tools/dahdi-tools-current.tar.gz
$ tar zxvf dahdi-tools-current.tar.gz
$ cd /home/rtbr/src3/dahdi-tools-2.1.0.2
$ ./configure
# make menuselect
# make
# make install
# make config
install -D dahdi.init /etc/init.d/dahdi
/sbin/chkconfig --add dahdi
insserv: warning: script 'S01zaptel' missing LSB tags and overrides
insserv: warning: script 'zaptel' missing LSB tags and overrides
dahdi                     0:off  1:off  2:on   3:on   4:on   5:on   6:off
DAHDI has been configured.

If you have any DAHDI hardware it is now recommended you
edit /etc/dahdi/modules in order to load support for only
the DAHDI hardware installed in this system.  By default
support for all DAHDI hardware is loaded at DAHDI start.

I think that the DAHDI hardware you have on your system is:

При старте ОС загрузка модулей dahdi будет произведена стандартным скриптом /etc/init.d/dahdi

При необходимости ручной запуск:

asterisk:/etc/init.d # ./dahdi start
Loading DAHDI hardware modules:

No hardware timing source found in /proc/dahdi, loading dahdi_dummy

Примечание: для того, чтобы стартовый сценарий в ОС SuSe Linux не прерывал свою работу из-за ошибки, следует внести изменения в файл /etc/init.d/dahdi, добавив после:

#
# Determine which kind of configuration we're using
#
system=redhat  # assume redhat
if [ -f /etc/debian_version ]; then
system=debian
fi

следующий фрагмент кода:

if [ -f /etc/SuSE-release ]; then
system=suse
fi

2.2.3   Asterisk-1.6.1

Предполагается запустить Asterisk под учетной записью пользователя asterisk , поэтому необходимо сначала создать этого пользователя в системе.

# useradd -c "Asterisk PBX" asterisk
# passwd asterisk

переключимся на этого пользователя:

# su asterisk

Теперь от имени пользователя asterisk, под учетной записью которого будут выполняться последующие команды, следует загрузить копию Asterisk через SVN

$ svn co http://svn.digium.com/svn/asterisk/branches/1.6.1 asterisk-1.6.1

На эране появится примерно следующее:

...
Checked out revision 482.
Checked out revision 180334.

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

$ svn co http://svn.digium.com/svn/asterisk/tags/1.6 asterisk-1.6

На экран будет выдано:

svn: URL 'http://svn.digium.com/svn/asterisk/tags/1.6' doesn't exist

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

imgdoc/pic1.png

Возможно также получение исходного кода посредством:

$ wget http://downloads.digium.com/pub/asterisk-1.6-current.tar.gz

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

$ tar zxvf asterisk-current.tar.gz

Итак, после загрузки исходного кода, перейдем в каталог:

$ cd asterisk-1.6.1

и выполним команду конфигурирования:

$ ./configure --prefix=$HOME/asterisk-bin --sysconfdir=$HOME/asterisk-bin --localstatedir=$HOME/asterisk-bin

Выполняя сценарий ./configure с флагом --prefix, системе указывается установить двоичные компонентыв подпапку asterisk-bin папки $HOME. Флаг --sysconfdir указывает системе, куда поместить конфигурационные файлы, а флаг --localstatedir - куда установить дополнительные файлы, например, звуковые. Главное здесь то, что, поскольку загрузка, компиляция и установка выполняются от лица пользователя asterisk, все, что создается, будет закреплено за этим пользователем и будет иметь права, предоставленные этому пользователю [1].

В результате выполнения команды configure на экране появится:

              .$$$$$$$$$$$$$$$=..
            .$7$7..          .7$$7:.
          .$$:.                 ,$7.7
        .$7.     7$$$$           .$$77
     ..$$.       $$$$$            .$$$7
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7
$$$       .7$$$$$$$$$$$$$$$$      :$$$.
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.
$$$        $$$   7$$$7  .$$$    .$$$.
$$$$             $$$$7         .$$$.
7$$$7            7$$$$        7$$$
 $$$$$                        $$$
  $$$$7.                       $$  (TM)
   $$$$$$$.           .7$$$$$$  $$
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$
       $$$$$$$$$$$$$$$$.

configure: Package configured for:
configure: OS type  : linux-gnu
configure: Host CPU : i686
configure: build-cpu:vendor:os: i686 : pc : linux-gnu :
configure: host-cpu:vendor:os: i686 : pc : linux-gnu :

На следующем шаге следует выбрать необходимые для установки модули и звуковые файлы.

$ make menuselect
imgdoc/pic2.png

Выбрать app_meetme из раздела Application! (Без предустановленного DAHDi недоступно.)

imgdoc/pic3.png

Далее следует

imgdoc/pic4.png

Затем

imgdoc/pic5.png

После окончания нажать "х".

На экране появится сообщение:

Generating input for menuselect ...
menuselect changes saved!
make: *** [menuselect] Interrupt

Далее следует провести установку от имени суперпользователя:

# make install

На экране должно появиться:

...
+---- Asterisk Installation Complete -------+
+                                           +
+    YOU MUST READ THE SECURITY DOCUMENT    +
+                                           +
+ Asterisk has successfully been installed. +
+ If you would like to install the sample   +
+ configuration files (overwriting any      +
+ existing config files), run:              +
+                                           +
+                make samples               +
+                                           +
+-----------------  or ---------------------+
+                                           +
+ You can go ahead and install the asterisk +
+ program documentation now or later run:   +
+                                           +
+               make progdocs               +
+                                           +
+ **Note** This requires that you have      +
+ doxygen installed on your local system    +
+-------------------------------------------+

Теперь можно установить файлы примеров:

$ make samples

Файлы примеров будут установлены в папку $HOME/asterisk-bin/asterisk

Выполним тестовый запуск:

$ ./asterisk-bin/sbin/asterisk -cvvv

На экране получим:

imgdoc/pic6.png

Произведем установку и конфигурирование стартового сценария.

$ su
# cd /home/asterisk/asterisk-1.6.1
# make config

На экране получим примерно следующее:

insserv: warning: script 'S01zaptel' missing LSB tags and overrides
insserv: warning: script 'zaptel' missing LSB tags and overrides
asterisk                  0:off  1:off  2:off  3:on   4:off  5:on   6:off

Настроим ссылки:

# ln -s /home/asterisk/asterisk-bin/sbin/asterisk /usr/sbin/asterisk
# ln -s /home/asterisk/asterisk-bin/sbin/safe_asterisk /usr/sbin/safe_asterisk
# ln -s /home/asterisk/asterisk-bin/asterisk /etc/asterisk

Внесем изменения в файл asterisk-bin/sbin/safe_asterisk, изменив строку:

ASTARGS=""

на

ASTARGS="-U asterisk"
imgdoc/pic7.png

Сохранить изменения.

Запуск asterisk:

asterisk:/etc/rc.d # ./asterisk start
Starting asterisk:

Убедиться, что asterisk запущен:

$ ps aux | grep asterisk
root     20864  0.0  0.0   2936   688 pts/2    S    11:12   0:00 /bin/sh /usr/sbin/safe_asterisk
asterisk 20868  2.5  0.2  23092  9308 pts/2    Sl   11:12   0:00 /home/asterisk/asterisk-bin/sbin/asterisk -f -U asterisk -vvvg -c

3   Конфигурирование и запуск

Команда make samples (последний шаг установки) создает множество конфигурационных файлов в etc/asterisk. В минимальной конфигурации необходимы только sip.conf, extensions.conf, voicemail.conf, meetme.conf. Для того, чтобы Asterisk не сообщал о том, что какие-то из конфигурационных файлов отсутствуют, можно оставить также и:

asterisk:/home/asterisk/asterisk-bin/asterisk # ls -l
total 176
-rw-r--r-- 1 asterisk users   767 2009-03-05 10:50 amd.conf
-rw-r--r-- 1 asterisk users  2555 2009-03-05 10:50 asterisk.conf
-rw-r--r-- 1 asterisk users  7324 2009-03-05 10:50 cdr.conf
-rw-r--r-- 1 asterisk users  8759 2009-03-05 10:50 dundi.conf
-rw-r--r-- 1 asterisk users  4123 2009-03-02 17:37 extensions.conf
-rw-r--r-- 1 asterisk users  8214 2009-03-05 10:50 features.conf
-rw-r--r-- 1 asterisk users   929 2009-03-05 10:50 festival.conf
-rw-r--r-- 1 asterisk users  3755 2009-03-05 10:50 followme.conf
-rw-r--r-- 1 asterisk users 17571 2009-03-05 10:50 iax.conf
-rw-r--r-- 1 asterisk users  3881 2009-03-05 10:50 manager.conf
-rw-r--r-- 1 asterisk users  1532 2009-02-25 12:37 meetme.conf
-rw-r--r-- 1 asterisk users  4413 2009-03-05 10:50 mgcp.conf
-rw-r--r-- 1 asterisk users  1272 2009-03-05 10:50 modules.conf
-rw-r--r-- 1 asterisk users  6856 2009-03-05 10:50 oss.conf
-rw-r--r-- 1 asterisk users  1579 2009-03-05 10:50 phone.conf
-rw-r--r-- 1 asterisk users  3108 2009-03-05 10:50 phoneprov.conf
-rw-r--r-- 1 asterisk users  1451 2009-03-05 10:50 queuerules.conf
-rw-r--r-- 1 asterisk users 20190 2009-03-05 10:50 queues.conf
-rw-r--r-- 1 asterisk users  2893 2009-02-28 12:22 sip.conf
-rw-r--r-- 1 asterisk users  5928 2009-03-05 10:50 skinny.conf
-rw-r--r-- 1 asterisk users  2664 2009-03-05 10:50 smdi.conf
-rw-r--r-- 1 asterisk users  4909 2009-03-05 10:50 unistim.conf
-rw-r--r-- 1 asterisk users 16046 2009-03-05 11:28 voicemail.conf

Перед настройкой сервера следует в каталоге /home/rtbr/src3/etc/asterisk выполнить:

$ mv extensions.conf extensions.conf.sample
$ touch extensions.conf
$ mv sip.conf sip.conf.sample
$ touch sip.conf
$ mv extensions.ael extensions.ael.sample

3.1   Конфигурирование каналов в Asterisk: файл sip.conf

SIP телефоны работают через SIP каналы. Они конфигурируются в файле sip.conf:

Минимальная конфигурация для первичной проверки работоспособности системы:

[general]
context=default

[1000]
type=friend
context=phones
host=dynamic
callerid=User 1
mailbox=1000
canreinvite=no

Примечание: директива canreinvite=no заставляет весь голосовой RTP трафик проходить через Asterisk.

[1000] - это имя, ассоциируемое с SIP клиентом, или это может быть произвольным именем SIP устройства, на которое можно ссылаться из других конфигурационных фалов. Обычно, если SIP телефон имеет номер екстеншена 1000, тогда, соответствующие ему настройки в этом файле начинается со строки [1000]. Обратите внимание, что для того, чтобы можно было позвонить на этот экстеншен 1000 следует описать его в плане набора. Тип SIP клиента может быть: "user", "peer" или "friend".

Для получения возможности записи разговора в файл, убедитесь, что аудиопоток проходит через сервер Asterisk, т.е. необходимо установить параметр canreinvite=no в файле конфигурации sip.conf, если это канал SIP, или использовать параметры t или T в команде Dial, или использовать трансляцию между звуковыми кодеками (абоненты используют различные кодеки для связи).

Полный текст файла sip.conf для всех требуемых АРМ-ов приведен в Приложении A.

3.2   Конфигурирование плана набора в Asterisk: файл extensions.conf

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

context=incoming

В контексте определены разные, для каждого вызываемого пользователями наборы команд для исполнения (экстеншен). Например, в контексте может быть определен один набор команд, если пользователь набрал "1000", и другой набор команд, если пользователь набирает "9".

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

Каналы в asterisk - это внешние или внутренние соединения, по которым производиться доставка вызовов в АТС Asterisk. Каналом может быть соединение с обычным телефонным аппаратом или с обычной телефонной линией, или он может быть виртуальным (логическим) каналом для совершения вызовов (как, например, совершение телефонных вызовов через Интернет). В данном случае речь идет о типе канала - SIP: Протокол Инициирования Сеанса (Session Initiation Protocol), один из частоиспользуемых VOIP протоколов. SIP телефоны работают через SIP каналы. Они конфигурируются в файле sip.conf.

После того, как определены все требуемые SIP аккаунты для всех клиентов (АРМ-ов) в файле sip.conf, то у этих клиентов появляется возможность зарегистрироваться на сервере asterisk и совершать исходящие вызовы. Для того, чтоб они могли принимать вызовы, необходимо описать екстеншены для них в файле плане набора extensions.conf.

Пример:

exten => 1010,1, Dial(SIP/commander_in_chief,10,t)

Если кто-нибудь совершит вызов на номер 1010, тогда будут совершена попытка вызвать SIP клиента, зарегистрированного как commander_in_chief.

Если команда Dial() содержит параметр t или T, Asterisk не производит процедуру re-invite.

В рассматриваемой конфигурации диалплана сервера Asterisk, предусмотрена запись телефонных переговоров в файл. Запись продолжается пока связь по текущему каналу не будет закончена. Если не определен полный путь для файла, то они будут сохраняться в поддиректории по умолчанию: /var/spool/asterisk/monitor. В нашем конкретном случае используется каталог /tmp и формат звуковых файлов - wav.

Запись разговора звонящего и вызываемого абонента сохраняются в раздельные звуковые файлы. Именование указанных файлов производится по шаблону:

<SIP-звонящего абонента>-<SIP-вызываемого абонента>-<UNIX-время>.wav-[in|out].wav

Например, звонок абонента 241 абоненту 1000 будет записан в следующие два файла:

241-1000-1236086037.wav-in.wav
241-1000-1236086037.wav-out.wav

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

Полный текст файла extensions.conf для всех требуемых АРМ-ов приведен в Приложении Б. Для поддержки аудиоконференц-связи по номеру 600, следует использовать файл meetme.conf (Приложение Г). Подробности см. стр.208 [1]

4   Настройка X-lite

Исходный код может быть получен из:

http://www.counterpath.net/X-Lite-Download.html

http://tinyurl.com/xlite-windows2

Предполагается, что IP хоста Asterisk 10.10.10.206

Поля 'User name' и 'Authorization user name' должны совпадать с уникальным ID SIP устройства ([1000]) из sip.conf !

imgdoc/pic8.png

В результате в окне терминала, с которого был запущен Asterisk появится сообщение о регистрации SIP-клиента:

*CLI>     -- Registered SIP '1000' at 10.10.10.14 port 19458

Примечание: Обратите внимание, что Xlite сам посылает NAT пакеты keep-alive, следовательно, надобности в Asterisk SIP параметре qualify=yes (периодическая проверка доступности клиента) нет.

При запуске сконфигурированного телефона (см.выше) происходит его регистрция в Asterisk:

*CLI> -- Registered SIP '1000' at 10.10.10.14 port 42477

*CLI> -- Registered SIP '241' at 10.10.10.249 port 5060
      > Saved useragent "Linksys/SPA922-5.1.15(a)" for peer 241
      -- Registered SIP '1000' at 10.10.10.14 port 38407
      > Saved useragent "X-Lite release 1100l stamp 47546" for peer 1000

5   Диагностика

Звонок на номер 1000 (сам себе).

В результате в окне терминала, с которого был запущен Asterisk появится сообщение.

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

*CLI>   == Using SIP RTP CoS mark 5
    -- Executing [1000@phones:1] Macro("SIP/1000-08207320", "stdexten,1000,SIP/1000") in new stack
    -- Executing [s@macro-stdexten:1] NoOp("SIP/1000-08207320", "stdexten macro being executed") in new stack
    -- Executing [s@macro-stdexten:2] Set("SIP/1000-08207320","CALLFILENAME=/tmp/1000-1000-1236250345") in new stack
    -- Executing [s@macro-stdexten:3] Monitor("SIP/1000-08207320", "wav,/tmp/1000-1000-1236250345.wav,b") in new stack
    -- Executing [s@macro-stdexten:4] Dial("SIP/1000-08207320", "SIP/1000,10,rt") in new stack
  == Using SIP RTP CoS mark 5
    -- Called 1000
    -- SIP/1000-082258d8 is ringing
    -- Nobody picked up in 10000 ms
    -- Executing [s@macro-stdexten:5] Goto("SIP/1000-08207320", "s-NOANSWER,1") in new stack
    -- Goto (macro-stdexten,s-NOANSWER,1)
    -- Executing [s-NOANSWER@macro-stdexten:1]
    VoiceMail("SIP/1000-08207320", "1000,u") in new stack
    -- <SIP/1000-08207320> Playing 'vm-theperson.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'digits/1.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'digits/0.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'digits/0.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'digits/0.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'vm-isunavail.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'vm-intro.ulaw' (language 'en')
    -- <SIP/1000-08207320> Playing 'beep.ulaw' (language 'en')
    -- Recording the message
    -- x=0, open writing:
    /home/asterisk/asterisk-bin/spool/asterisk/voicemail/default/1000/tmp/RsGtig format: wav49, 0x820c6f8
    -- x=1, open writing: /home/asterisk/asterisk-bin/spool/asterisk/voicemail/default/1000/tmp/RsGtig format: gsm, 0x8235cf8
    -- x=2, open writing:
/home/asterisk/asterisk-bin/spool/asterisk/voicemail/default/1000/tmp/RsGtig format: wav, 0x8214618
DTMF begin '#' received on SIP/1000-08207320
DTMF begin passthrough '#' on SIP/1000-08207320
DTMF end '#' received on SIP/1000-08207320, duration 100 ms
DTMF end accepted with begin '#' on SIP/1000-08207320
DTMF end passthrough '#' on SIP/1000-08207320
    -- User ended message by pressing #
    -- <SIP/1000-08207320> Playing 'auth-thankyou.ulaw' (language 'en')
    -- Recording was 0 seconds long but needs to be at least 3 - abandoning
    -- Executing [s-NOANSWER@macro-stdexten:2] Goto("SIP/1000-08207320", "default,s,1") in new stack
    -- Goto (default,s,1)
  == Channel 'SIP/1000-08207320' jumping out of macro 'stdexten'
    -- Executing [s@default:1] Verbose("SIP/1000-08207320", "1|Unrouted call handler") in new stack 1|Unrouted call handler
    -- Executing [s@default:2] Answer("SIP/1000-08207320", "") in new stack
    -- Executing [s@default:3] Wait("SIP/1000-08207320", "1") in new stack
    -- Executing [s@default:4] Playback("SIP/1000-08207320", "tt-weasels")
    in new stack
    -- <SIP/1000-08207320> Playing 'tt-weasels.ulaw' (language 'en')
    -- Executing [s@default:5] Hangup("SIP/1000-08207320", "") in new stack
  == Spawn extension (default, s, 5) exited non-zero on 'SIP/1000-08207320'

В случае, если вызываемый абонент ответил:

*CLI>   == Using SIP RTP CoS mark 5
    -- Executing [1000@phones:1] Macro("SIP/1000-08207320", "stdexten,1000,SIP/1000") in new stack
    -- Executing [s@macro-stdexten:1] NoOp("SIP/1000-08207320", "stdexten macro being executed") in new stack
    -- Executing [s@macro-stdexten:2] Set("SIP/1000-08207320", "CALLFILENAME=/tmp/1000-1000-1236250481") in new stack
    -- Executing [s@macro-stdexten:3] Monitor("SIP/1000-08207320", "wav,/tmp/1000-1000-1236250481.wav,b") in new stack
    -- Executing [s@macro-stdexten:4] Dial("SIP/1000-08207320", "SIP/1000,10,rt") in new stack
  == Using SIP RTP CoS mark 5
    -- Called 1000
    -- SIP/1000-0820d108 is ringing
    -- SIP/1000-0820d108 answered SIP/1000-08207320
    -- Music class default requested but no musiconhold loaded.
  == Spawn extension (macro-stdexten, s, 4) exited non-zero on 'SIP/1000-08207320' in macro 'stdexten'
  == Spawn extension (phones, 1000, 1) exited non-zero on 'SIP/1000-08207320'

Толкование вышеприведенного выходит далеко за рамки данной Инструкции и требует глубоких знаний сути рассматриваемого предмета.

Примечание: когда имеется установленное соединение по протоколу SIP, то имя канала будет иметь такой формат:

SIP/peer-id

Поле peer - идентифицирует клиента, а id - это случайный идентификатор, используемый для уникальной идентификации канала, потому что с одним SIP клиентом может быть установлено несколько сеансов связи.

Например:

SIP/ipphone-45ed721c - SIP вызов, поступивший от клиента "ipphone"

SIP/192.168.1.8-01fb34d6 - SIP сеанс с IP адреса: 192.168.1.8

Примечание: Останов asterisk осуществляется командой stop now.

*CLI> stop now
Beginning asterisk shutdown....
Executing last minute cleanups
  == Destroying musiconhold processes
  Asterisk cleanly ending (0).

Подробности различных аспектов установки следует смотреть в оригинальной документации на программный продукт (http://www.asterisk.org/).

6   Список литературы

[1](1, 2, 3, 4) Меггелен Д., Мадсен Л., Смит Д., Asterisk: будущее телефонии. Издательство: Символ-Плюс. Дата выхода: ноябрь 2008 ISBN 5-93286-128-2 ISBN 978-5-93286-128-8 тираж 2000 экз. Оригинал: "Asterisk: The Future of Telephony, Second Edition" ISBN 0-596-51048-9 язык: английский год издания: 2007

7   Приложение А: sip.conf

файл sip.conf

[general]
context=default
; callerid=No CallID

; <1000> АРМ управления ЦОИ (yellow_ellipse)
;
; <1003> АРМ комплексирования
; <1004> АРМ управления МК
;
; <1001> АРМ управления ПМВО (yellow_ellipse)
; <1005> АРМ обработки информации от РЛС с координатным выходом
; <1006> АРМ контроля сопровождения трасс
; <1007> АРМ группирования и отбора для выдачи потребителям
; <1008> АРМ диспетчерского контроля
;
; <1009> АРМ тренажа
; <1010> АРМ документирования
; <1011> АРМ системного администратора
; <1012> АРМ администратора документооборота
;
; <1002> АРМ управления ПМННО (yellow_ellipse)
; <1013> АРМ обработки информации от РЛС с координатным выходом
; <1014> АРМ контроля сопровождения трасс
; <1015> АРМ группирования и отбора для выдачи потребителям
; <1016> АРМ диспетчерского контроля
; <1017> АРМ ДЗЗ

[sets](!)
type=friend
context=phones
host=dynamic
canreinvite=no               ; заставляет весь голосовой RTP трафик проходить через Asterisk

[241](sets)                  ; Linksys IP-phone SPA922
callerid=LinkSys
mailbox=241

[1000](sets)                 ; User 1000: АРМ управления ЦОИ
callerid=User 0
mailbox=1000

[1001](sets)                 ; User 1001: АРМ АРМ управления ПМВО
callerid=User 1
mailbox=1001

[1002](sets)                 ; User 1002: АРМ управления ПМННО.
callerid=User 2
mailbox=1002

[1003](sets)                 ; User 1003: АРМ комплексирования
callerid=User 3
mailbox=1003

[1004](sets)                 ; User 1004: АРМ управления МК
callerid=User 4
mailbox=1004

[1005](sets)                 ; User 1005: АРМ обработки информации от РЛС с координатным выходом
callerid=User 5
mailbox=1005

[1006](sets)                 ; User 1006: АРМ контроля сопровождения трасс
callerid=User 6
mailbox=1006

[1007](sets)                 ; User 1007: АРМ группирования и отбора для выдачи потребителям
callerid=User 7
mailbox=1007

[1008](sets)                 ; User 1008: АРМ диспетчерского контроля
callerid=User 8
mailbox=1008

[1009](sets)                 ; User 1009: АРМ тренажа
callerid=User 9
mailbox=1009

[1010](sets)                 ; User 1010: АРМ документирования
callerid=User 10
mailbox=1010

[1011](sets)                 ; User 1011: АРМ системного администратора
callerid=User 11
mailbox=1011

[1012](sets)                 ; User 1012: АРМ администратора документооборота
callerid=User 12
mailbox=1012

[1013](sets)                 ; User 1013: АРМ обработки информации от РЛС с координатным выходом
callerid=User 13
mailbox=1013

[1014](sets)                 ; User 1014: АРМ контроля сопровождения трасс
callerid=User 14
mailbox=1014

[1015](sets)                 ; User 1015: АРМ группирования и отбора для выдачи потребителям
callerid=User 15
mailbox=1015

[1016](sets)                 ; User 1016: АРМ диспетчерского контроля
callerid=User 16
mailbox=1016

[1017](sets)                 ; User 1017: АРМ ДЗЗ
callerid=User 17
mailbox=1017

8   Приложение Б: extensions.conf

файл extensions.conf

[general]
;
; If static is set to no, or omitted, then the pbx_config will rewrite
; this file when extensions are modified.  Remember that all comments
; made in the file will be lost when that happens..
;
; XXX Not yet implemented XXX
;
static=yes
;
;
; if stati=yes and writeprotect=no, you can save dialplan by
; CLI command 'save dialplan' too
;
writeprotect=yes
autofallthrough=yes


[globals]

; These variables are to avoid the irritating problem
; with inability to use regexp's on strings that have
; not been defined.
;
CALLFILENAME=foo
FOO=foo

[macro-stdexten]
exten => s,1,noop(stdexten macro being executed)
exten => s,n,Set(CALLFILENAME=/tmp/${CALLERID(num)}-${ARG1}-${EPOCH})  ; e.g. "/tmp/241-1000-1235991831"
exten => s,n,Monitor(wav,${CALLFILENAME}.wav,b) ; If flags contains the letter m, then when recording
                                                ; finishes, Asterisk will execute a unix program to combine
                                                ; the two sound files into a single sound file.
                                                ; By default, Asterisk will execute soxmix and then delete
                                                ; the original two sound files. Also b - Don't begin
                                                ; recording unless a call is bridged to another channel.
exten => s,n,Dial(${ARG2},10,rt)                ; Ring 10 seconds max
exten => s,n,Goto(s-${DIALSTATUS},1)            ; Jump based on status
                                                ; (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => s-NOANSWER,1,Voicemail(${ARG1},u)      ; If unavailable, send to voicemail w/ unavail announce
exten => s-NOANSWER,2,Goto(default,s,1)         ; If they press #, return to start
exten => s-BUSY,1,Voicemail(${ARG1},b)          ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,2,Goto(default,s,1)             ; If they press #, return to start
exten => _s-.,1,Goto(s-NOANSWER,1)              ; Treat anything else as no answer
exten => a,1,VoicemailMain(${ARG1})             ; If they press *, send the user into VoicemailMain


[default]
exten => s,1,Verbose(1|Unrouted call handler)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,Playback(tt-weasels)
exten => s,n,Hangup()

[incoming_calls]
exten => _X.,1.NoOp(incoming calls context)
exten => _X.,n,Dial(SIP/1000)

[outgoing_calls]
exten => _X.,1,NoOp()
exten => _X.,n,Dial(SIP/my_service_provider/${EXTEN})

[internal]
exten => 241,1, Verbose(1|Extension 241)
exten => 241,n, Dial(SIP/241, 30)
exten => s,n,Hangup()

exten => 1000,1, Macro(stdexten,1000,SIP/1000)
exten => user0, 1, Goto(1000|1)

exten => 1001,1, Macro(stdexten,1001,SIP/1001)
exten => user1, 1, Goto(1001|1)

exten => 1002,1, Macro(stdexten,1002,SIP/1002)
exten => user2, 1, Goto(1002|1)

exten => 1003,1, Macro(stdexten,1003,SIP/1003)
exten => user3, 1, Goto(1003|1)

exten => 1004,1, Macro(stdexten,1004,SIP/1004)
exten => user4, 1, Goto(1004|1)

exten => 1005,1, Macro(stdexten,1005,SIP/1005)
exten => user5, 1, Goto(1005|1)

exten => 1006,1, Macro(stdexten,1006,SIP/1006)
exten => user6, 1, Goto(1006|1)

exten => 1007,1, Macro(stdexten,1007,SIP/1007)
exten => user7, 1, Goto(1007|1)

exten => 1008,1, Macro(stdexten,1008,SIP/1008)
exten => user8, 1, Goto(1008|1)

exten => 1009,1, Macro(stdexten,1009,SIP/1009)
exten => user9, 1, Goto(1009|1)

exten => 1010,1, Macro(stdexten,1010,SIP/1010)
exten => user10, 1, Goto(1010|1)

exten => 1011,1, Macro(stdexten,1011,SIP/1011)
exten => user11, 1, Goto(1011|1)

exten => 1012,1, Macro(stdexten,1012,SIP/1012)
exten => user12, 1, Goto(1012|1)

exten => 1013,1, Macro(stdexten,1013,SIP/1013)
exten => user13, 1, Goto(1013|1)

exten => 1014,1, Macro(stdexten,1014,SIP/1014)
exten => user14, 1, Goto(1014|1)

exten => 1015,1, Macro(stdexten,1015,SIP/1015)
exten => user15, 1, Goto(1015|1)

exten => 1016,1, Macro(stdexten,1016,SIP/1016)
exten => user16, Goto(1016|1)

exten => 1017,1, Macro(stdexten,1017,SIP/1017)
exten => user17, 1, Goto(1017|1)

exten => 500,1,Verbose(1|Echo test application)
exten => 500,n,Echo()
exten => 500,n,Hangup()

[confs]
exten => 600,1,Answer()
exten => 600,2,MeetMe(600,DpM,54321)   ; 'D'- dynamically add conference, prompting for a PIN (54321)
                                       ; 'p'- allow user to exit the conference by pressing '#'
                                       ; 'M'- enable music on hold when the conference has a single caller


[phones]     ; Контекст phones позволяет вызвать всех АРМ-абонентов
include => internal
include => confs
include => outgoing_calls

9   Приложение В: voicemail.conf

файл voicemail.conf

[general]

format=wav49|gsm|wav
serveremail=asterisk
attach=yes
maxsecs=180
minsecs=3
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %B %d, %Y at %r

[default]

1234 => 4242,Example Mailbox,root@localhost
241  => 241,LinkSys,rtbr@localhost
1000 => 1000,ARM 0,rtbr@localhost
1001 => 1001,ARM 1,rtbr@localhost
1002 => 1002,ARM 2,rtbr@localhost
1003 => 1003,ARM 3,rtbr@localhost
1004 => 1004,ARM 4,rtbr@localhost
1005 => 1005,ARM 5,rtbr@localhost
1006 => 1006,ARM 6,rtbr@localhost
1007 => 1007,ARM 7,rtbr@localhost
1008 => 1008,ARM 8,rtbr@localhost
1009 => 1009,ARM 9,rtbr@localhost
1010 => 1010,ARM 10,rtbr@localhost
1011 => 1011,ARM 11,rtbr@localhost
1012 => 1012,ARM 12,rtbr@localhost
1013 => 1013,ARM 13,rtbr@localhost
1014 => 1014,ARM 14,rtbr@localhost
1015 => 1015,ARM 15,rtbr@localhost
1016 => 1016,ARM 16,rtbr@localhost
1017 => 1017,ARM 17,rtbr@localhost

10   Приложение Г: meetme.conf

файл meetme.conf

[general]

[rooms]
conf => 600