пятница, 7 июня 2013 г.

Конфигурация и настройка Asterisk

Рассмотрим свободное решение компьютерной телефонии Asterisk от компании Digium. но прежде чем  приступить к описанию конфигурационных файлов, определимся что мы будем делать:
  1. Добавим несколько внутренних клиентов
  2. Добавим подключение к внешнему провайдеру
  3. Составим план набора номеров для внутренних и внешних звонков
  4. Организуем возможность перехвата вызовов
Вся настройка сервера телефонии Asterisk производиться на Ubuntu Server 12.04 LTS, предполагается что Asterisk уже установлен. Итак, начнем...
Для настройки сервера Asterisk существует множество различных конфигурационных файлов, но ключевыми и необходимыми являются всего лишь два: /etc/asterisk/sip.conf, в котором описываются основные параметры сервера, и учетные данные пользователей, и /etc/asterisk/extensions.conf файл, в котором описывается вся логика ATC.
Начнем с редактирования файла /etc/asterisk/sip.conf, в нём секция general должна выглядеть следующим образом:
[general]
context=default     ;контекст по умолчанию
allowguest=no       ;запрещает неавторизированный доступ
bindaddr=0.0.0.0    ;интерфейс на котором ожидаем клиентов
localnet=192.168.1.0/255.255.255.0 ;наша внутренняя подсеть

  1. Добавление клиентов происходит в файле /etc/asterisk/sip.conf, ниже приведен пример добавления клиентов с именами 201 и 202:
[201]
type=friend
host=dynamic           ;возможность цепляться откуда угодно
username=201           ;имя пользователя
secret=user1_password  ;и пароль
dtmfmode=rfc2833       ;способ передачи сигналов DTMF
nat=no                 ;клиент не может быть за NAT
canreinvite=no         ;трафик проходит только через сервер
context=office         ;контекст с таким именем должен 

;существовать в dialplan’е (файл extensions.conf)
callerid="User1" <201> ;CallerID - идентификационная ;строка, отображается при звонках от данного пользователя (АОН)
disallow=all           ;сначала запрещаем все кодеки
allow=ulaw             ;разрешаем те что будем использовать
allow=alaw
allow=g729

[202]
type=friend
host=dynamic
username=202
secret=user2_password
dtmfmode=rfc2833
nat=no
canreinvite=no
context=office
callerid="User2" <202>
disallow=all
allow=ulaw
allow=alaw
allow=g729
Поле type, определяющее тип клиента, может принимать три значения:
user - возможны только входящие звонки;
peer - возможны только исходящие звонки;
friend - разрешены как исходящие, так и входящие вызовы.
Аналогично можно добавить и других внутренних клиентов для сервера Asterisk.
  2. Для того чтобы совершать звонки "наружу", например на стационарные телефоны, необходимо обратиться к услуге провайдера ip-телефонии. Для примера в качестве выхода "наружу" будем использовать SIP-сервер Sipnet. После регистрации на сайте провайдера, перейдем к настройке файла конфигурации в /etc/asterisk/sip.conf добавим следующий пир:
[sipnet]
secret = {пароль}        ;пароль аккаунта sipnet;
defaultuser = {SIP ID}   ;id - аккаунта sipnet
trunkname = sipnet
host = sipnet.ru
type = peer
context = sipnet
insecure = invite
callbackextension = 201  ;внутренний номер, для входящих вызовов
fromuser = {SIP ID}
fromdomain = sipnet.ru
disallow = all
allow = alaw
allow=ulaw
allow=g729
nat = no
dtmfmode = rfc2833
Этот файл конфигурации можно взять за основу для подключения к любому SIP-серверу.
  3. Настало время разобраться с входящими и исходящими звонками. Номерной план в Asterisk (Dial-plan) задается при помощи так называемых расширений (extension), которые находятся в отдельных кон текстах в зависимости от задачи. C учётом созданных выше клиентов, нужно добавить два контекста, office для совершения внутренних звонков и sipnet для звонков "наружу". Откроем файл конфигурации /etc/asterisk/extensions.conf и добавим контекст оffice:
[office]
exten =>201, 1, Dial(SIP/201,30)
exten =>201, n, Playback(vm-nobodyavail)
exten =>201, n, Hangup()
exten =>202, 1, Dial(SIP/202,30)
exten =>202, n, Playback(vm-nobodyavail)
exten =>202, n, Hangup()
include=>sipnet
Обработка контекста office начинается с записей, в которых номер "201" является первым символом. Так, сначала Asterisk будет вызывать SIP клиента с именем 201, вызов будет продолжаться 30 секунд, проиграет содержимое файла vm-nobodyavail, и завершит вызов. Аналогично с номером 202. Далее в строке include=>sipnet подключается контекст sipnet для возможности внутренним клиентам совершать внешние звонки. Теперь добавим контекст sipnet:
[sipnet]
exten=>_8., 1, Dial(SIP/${EXTEN}@sipnet,30)
exten=>_8., n, Playback(vm-nobodyavail)
exten=>_8., n, Hangup()
exten =>_0041., 1, Dial(SIP/${EXTEN}@sipnet,30)
exten =>_0041., n, Playback(vm-nobodyavail)
exten =>_0041., n, Hangup()
include=>office
Для исходящих звонков через sipnet используется префикс _8 звонки на все номера начинающиеся с 8-ки, и _0041 для звонков другим абонентам Sipnet, номер которых начинается с символов 0041, ${EXTEN}-переменная установленная самим Asterisk, обозначающая текущий екстеншен. В опции include подключаем контекст office для совершения входящих внешних звонков на внутренние номера.
  4. Если, например, звонит соседний телефон и на него никто не может ответить, то в случае использования Asterisk можно "перехватить" этот звонок и ответить на него с любого другого телефона. Для этого необходимо задать группы вызова и группы "перехвата". В нашем случае сделаем так, что все телефоны могут перехватывать вызов. Для этого в секции описания клиентов ([201], [202], [sipnet]) в файле /etc/asterisk/sip.conf добавим следующие две строки (в каждую секцию):
callgroup=1
pickupgroup=1
Далее добавим саму возможность "перехвата" внесем в Dial-plan контекста office следующую строку
[office]
exten => *8, 1 ,PickUP()
Теперь, после перезагрузки Dial-planа, появиться возможность перехватить входящий звонок просто нажав *8 и клавишу вызова, разговор будет переключен на Ваш телефон.

Полезные ссылки:
Asterisk и Linux - миссия IP-телефония
Asterisk, или домашняя телефония для (про)двинутых пользователей
Asterisk Dialplan - план набора (одной страницей)

1 комментарий: