Asterisk: различия между версиями

Материал из support.qbpro.ru
imported>Vix
Нет описания правки
imported>Vix
Нет описания правки
Строка 1164: Строка 1164:
<hr style="noshade; size=2px;">
<hr style="noshade; size=2px;">


'''ПРОБЛЕМЫ И РЕШЕНИЯ'''
=='''ПРОБЛЕМЫ И РЕШЕНИЯ'''==
<hr>
<hr>
* '''Uhhuh. NMI received for unknown reason 20 on CPU 0.'''
* '''Uhhuh. NMI received for unknown reason 20 on CPU 0.'''
Строка 1183: Строка 1183:
  #reboot
  #reboot


'''ПОЛЕЗНОЕ'''
=='''ПОЛЕЗНОЕ'''==
<hr>
<hr>
* [http://habrahabr.ru/post/158057/ asterisk FreePBX]
* [http://habrahabr.ru/post/158057/ asterisk FreePBX]

Версия от 17:52, 18 февраля 2020

Офисная АТС на Asterisk малой кровью или бюджетный способ получить мини АТС с функциями серьезной станции.

1. Почему (На правах введения).

  • Практика работы на телекоммуникационном рынке показывает существование серьезного интереса к VoIP решениям на базе ПО, реализующего функции некогда доступные только в телефонных станциях уровня Definity и аналогичных. То, что VoIP технология будет идти вперед и если не вытеснит, то существенно подвинет позиции "железных" решений, это так же очевидно как, то, что отсутствие "интернет" - если и не останавливает работу в офисе IT компании, то существенно ее затрудняет . Прогнозы дело не благодарное, кроме того, их на сегодняшний день существует большое кол-во от разных аналитических изданий, в одном они сходятся со стопроцентной уверенностью - очевиден рост темпа внедрений VoIP решений (несмотря на существование пресловутых правил подключения).

2. Что.

  • В данной статье преследуется "простая" цель - показать возможность реализации функций офисной АТС уровня, например, Panasonic KX-TD 1232 (12 внешних линий, 32 внутренних) при помощи PC сервера, одной или нескольких специализированных плат (Digium) для подключения аналоговых или цифровых внешних линий, программного обеспечения Asterisk (Офисная станция) и LANBilling (тарификация, сбор статистики). Результатом будет являться полноценная IP АТС, в которой могут быть реализованы функции, ранее недоступные, "простому смертному" (компании малого бизнеса с количеством сотрудников около 10-30 человек). Почему Asterisk - потому что это бесплатное, широко распространенное (а значит, по его внедрениям проще найти информацию), и что не менее важно, opensource решение, реализующее большинство необходимых мелкому и среднему офису функций.

3. Как.

  • Как и любая мини АТС, описанное в статье решение, коммутирует телефонные каналы внутренних абонентов во внешнюю телефонную сеть (как правило, внешних каналов несколько меньше, чем, в общем случае, внутренних). В качестве интерфейса подключения к IP PBX внутренних абонентов используется Ethernet интерфейс сервера, в составе которого мы будем реализовывать решение. Соответственно, транспортом для абонентских телефонных каналов, служит Ethernet среда, по определению, не гарантирующая качества канала (и это является основным камнем преткновения технологии). Поэтому первое, на что стоит обратить внимание при реализации решения, это меры по предотвращению коллизий в Ethernet сегменте. Часто для пакетной телефонии выделяется отдельный Ethernet сегмент в рамках СКС предприятия, что определенным образом гарантирует качество абонентских каналов. Способов же подключить внешние телефонные каналы к АТС существует великое множество, поэтому мы будем рассматривать реализацию решения безотносительно типа подключения АТС к внешней телефонной сети, перечислив лишь способы, которыми могут быть подключены к серверу внешние "линии".
  • Во-первых, внешним каналом может служить обычный Интернет канал, с той лишь оговоркой, что он должен быть достаточного для прохождения всех пакетов выбранного протокола VoIP качества и гарантировать минимальность задержки при передаче пакетов. Весьма абстрактное требование. Более точно требования к внешнему каналу в случае использования пакетной телефонии нужно рассчитывать в зависимости от ряда параметров, рассмотрение которых выходит за рамки статьи. Этот способ (при помощи Интернет канала) наименее предпочтителен с точки зрения гарантий качества передачи голоса, по понятным причинам, - у потребителя нет возможности выделения определенной полосы пропускания для голосовых данных. Не стоит строить систему полагаясь только на интернет канал - как известно интернет бывает, что "пропадает", мало того что неприятно оставваться без интернет, но вдвойне неприятно при этом оставться еще и без телефонной связи, не имея возможности высказать свои претензии провайдеру.
  • Второй способ это подключение аналоговых линий к IP АТС при помощи плат Digium. Если линий не очень много (до 16), то способ примелем с практической точки зрения, и гарантирует качество переговоров т.к. в данном случае качество может пострадать только из-за перегрузок во внутренней транспортной сети.
  • Третий способ - это использование плат вышеуказанного производителя (или аналогичных) для стыка E1 и более скоростных. Так же как и способ №2 этот способ гарантирует приемлемое качество телефонных разговоров. Его целесообразно применять при необходимости подключения большего количества внешних линий (более 16, как правило). Существует возможность комбинирования указанных способов подключения внешних линий. Например, когда в нормальной ситуации используется стык канал E1, в случае проблем с основным поставщиком услуг телефонии используется аналоговые каналы, и при их отсутствии диалпир провайдера VoIP, доступный через общий интернет канал. ПО Asterisk позволяет гибко управлять коммутацией при возникновении перегрузок и пр. событий задействуя все внешние каналы безотносительно того, каким способом они подключены к IP АТС.
  • В практически в любой аппаратной мини АТС имеется COM порт (устаревающие модели) или другой способ (CDR файлы, информация, передаваемая через интерфейс сокетов и т.д.) снятия данных о состоявшихся телефонных разговорах или разговорах находящихся в активном состоянии (начавшихся, но еще не завершившихся). В рассматриваемом нами случае в качестве способа снятия звонковой информации используется интерфейс на базе RADIUS протокола, который не является, к слову, встроенным средством Asterisk, а настраивается в дополнение к основному функционалу при помощи разработанных плагинов (PlugIn - встариваемый код).
  • До сих пор статья описывает принципы построения решения, т.е. отвечает на вопрос "Что мы получим в результате?". Резюмируя, можно сказать, что помимо возможностей коммутации телефонных разговоров (основная функция АТС) IP АТС сможет:
   работать в качестве карточной платформы
   обеспечивать функции виртуального секретаря через IVR (тоновый донабор внутреннего номера внешним абонентом, как пример) Прим: IVR - Interactive
    Voice Response
   обеспечивать функции MailBox - голосового почтового ящика
   обеспечить переадресацию вызовов на любой номер (внешний / внутренний)

а также реализовать другие, не характерные для обычных мини АТС функции.

  • Прежде чем перейти к разделу, в котором подробно описана установка RADIUS клиента для Asterisk - собственно способ интеграции Asterisk и LANBilling, следует отметить что, как и любое свежее решение (не путать с ментос) данное имеет недостатки - например, отсутствие более-менее удобного интерфейса для конфигурирования Asterisk, все настройки приходится применять, редактируя текстовые файлы конфигурации, хотя, что можно придумать неудобнее, чем нажатие кнопок системного телефона при конфигурировании АТС LG-GHX 616, например. Успокаивает то, что не так часто приходится менять настройки станции. По мере внедрения описанного решения статья будет дополняться информацией по новым возможностям как Asterisk, так и всех модулей, участвующих в функционировании предлагаемого решения

3.1 Установка Asterisk

В этом подразделе мы опишем установку asterisk под Linux безотноситильно какого-либо дистрибутива, то есть речь будет идти о сборке из исходников, взять которые можно на asterisk.org. При установке под FreeBSD есть ряд особенностей, на которых сейчас не хотелось бы останавливаться.

В первую очередь распаковываем исходный код:

  1. tar -zxf asterisk-1.0.9.tar.gz
  2. cd asterisk-1.0.9/

Для того, чтобы была возможность запускать asterisk от имени непривилегированного пользователя, необходимо отредактировать Makefile, заменив "ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run" (приблизительно строка 123) на "ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run/asterisk". Затем:

  1. make clean
  2. make
  3. make install

Если asterisk устанавливается "с нуля", то рекомендуется установить примеры конфигурационных файлов:

  1. make samples

Теперь создаем пользователя для asterisk и меняем владельца рабочих директорий:

  1. groupadd asterisk
  2. useradd -c "asterisk PBX" -d /var/lib/asterisk -g asterisk asterisk
  3. chown -R asterisk:asterisk /var/run/asterisk
  4. chown -R asterisk:asterisk /etc/asterisk
  5. chown -R asterisk:asterisk /var/lib/asterisk
  6. chown -R asterisk:asterisk /var/log/asterisk
  7. chown -R asterisk:asterisk /var/spool/asterisk

Запускать asterisk нужно с ключами -G asterisk -U asterisk. Пример стартового скрипта можно посмотреть здесь.

Основные действия по установке выполнены. В результате имеется практически готовая к использованию IP АТС. Самое время приступать к конфигурированию и подключению абонентов. На данном этапе мы пока не можем использовать протокол H323 и Zaptel (аналоговые POTS lines, цифровые каналы E1/T1/J1). Инструкции по поводу установки и настройки этих модулей смотрите в соответсвующих разделах статьи.

3.1.1 Подключение абонентов

По умолчанию вся конфигурация asterisk хранится в виде текстовых файлов (как правило, в /etc/asterisk/). Разработчиками была проделана большая работа для перенесения конфигурации в базу данных, но это отдельный вопрос... Конфигурационных файлов достаточно много: каждому модулю asterisk соответсвует свой файл. Но это не должно пугать. Скорее всего многие модули Вы просто не будете использовать, поэтому не спешите тонуть в этой куче файлов и непонятных инструкций. На самом деле все конфиги выдержаны в одном стиле, поэтому более-меенее разобравшись с основными, не составит труда освоить новый.

Базовая конфигурация (asterisk.conf)

Файл asterisk.conf содержит пути к основным рабочим директориям АТС. Если после установки эти директории никуда не переносились, то файл в исправлении не нуждается.

Настройка протокола SIP/IAX. Подключение SIP/IAX пользователей (sip.conf/iax.conf)

Файлы sip.conf, iax.conf имеет сходную структуру. Эти конфигурационные файлы содержат специфические настройки протокола и определяют профили подключенных пользователей. Рассмотрим для примера sip.conf (взято из asterisk samples):

В этом файле содержится конфигурация, касающаяся протокола SIP
Синтаксис для указания SIP-устройства(это может быть IP телефон, либо
софтфон, либо VoIP шлюз) в extensions.conf следующий
SIP/[имя устройства], где [имя устройства] определяется ниже.
Можно также использовать следущую конструкцию
SIP/[имя пользователя]@[домен], чтобы позвонить пользователю
в сети Итернет
Можно описать узел (peer) для произвольного SIP-прокси (см. ниже),
тогда вызов пользователя через этот шлюз будет выглядеть так
SIP/[SIP-прокси]/[пользователь] или SIP/[пользователь]@[SIP-прокси].
Что есть SIP-прокси определяется ниже.
Несколько слов об используемой здесь терминалогии
user (пользователь) - может звонить на asterisk, либо через него.
peer (узел) - может только принимать звонки от asterisk.
friend - объединяет в себе оба вышеупомянутых понятия.
Полезные команды консоли asterisk для контроля SIP узлов/пользователей
sip show peers
Покажет все SIP peer'ы (включая friends)
sip show users
Покажет все SIP user'ы (включая friends)
sip show registry
Статус установленной регистрации
sip debug
Повышенная детализация сообщений в консоли
reload chan_sip.so
Перегрузить конфиг. файл
Конфигурация активных SIP peer'ов изменена не будет


Раздел общих настроек

[general] context=default

Контекст по умолчанию для входящих звонков
recordhistory=yes
хранить историю SIP подключений
(см. sip history / sip no history)
realm=mydomain.tld
Realm (атрибут области) для digest аутентификации
по умолчанию - "asterisk"
Realms должны быть уникальны в соответсвии с RFC 3261
Принято указывать здесь свое доменное имя

port=5060

Прослушиваемый UDP порт (стандартный порт - 5060)

bindaddr=0.0.0.0

Слушать конкретный IP адрес (0.0.0.0 - слушать на всех)

srvlookup=yes

Разрешить использование DNS
Замечание
Asterisk использует только первую запись
в ответе DNS сервера.
Если эта опция выключена, вы не сможете установить
SIP соединение, определяемое именем хоста
(напр. SIP/user@voip.somewhere.com)
pedantic=yes
Разрешить медленную, более точную проверку Pingtel заголовков,
обеспечивающую строгое соответсвие стандарту SIP.
(По умолчанию "no")
tos=184
Установить IP QoS. Допускается указать численное значение либо
tos=lowdelay
одно из служебных слов
lowdelay,throughput,reliability,mincost,none
maxexpirey=3600
Максимальное значение периода входящих регистраций.
defaultexpirey=120
Значение периода входящих/исходящих регистраций по умолчанию
notifymimetype=text/plain
Явное указание mime типов в MWI NOTIFY
videosupport=yes
Поддержка SIP видео
disallow=all
Запретить все кодеки (ниже указывается список разрешенных кодеков)
allow=ulaw
Разрешаем кодеки в порядке, соответсвующем их приоритету
allow=ilbc
Замечание
порядок кодеков имеет смысл задавать только в разделе
[general]
musicclass=default
Установить класс по умолчанию для мелодий во время ожидания.
Он может задаваться индивидуально для пользователей/узлов
language=en
Выбор языка по умолчанию
Также может задаваться индивидуально для пользователей/узлов.
relaxdtmf=yes
"смягченный" режим распознавания dtmf
rtptimeout=60
Разрывать соединение, если в течение 60 сек. не было RTP трафика,
при условии что мы не находимся в режиме ожидания.
rtpholdtimeout=300
То же самое, но относится к режиму ожидания
(rtpholdtimeout > rtptimeout)
trustrpid = no
Полагаться на значение поля Remote-Party-ID
progressinband=no
Всегда передавать вызывающий сигнал in-band
useragent=Asterisk PBX
Задать значение поля user agent
nat=no
настройки NAT
yes = всегда игнорировать информацию в пакетах, предполагая наличие NAT
no = использовать режим NAT в соответсвие с RFC3581
never = не использовать NAT режим
route = использовать режим NAT, не отсылать удаленный порт
promiscredir = no
Позволяет разрешить 302 или REDIR (переадресации)
на нелокальные SIP адреса
Со включенным promiscredir переадресации на локальные адреса
приведут к зацикливанию, т.к. протокол SIP неспособен
осуществлять "петлевые" звонки.
Если определен regcontext, Asterisk будет динамически создавать
экстеншн "NoOp" с приоритетом, равным 1, для peer'а,
который регистрируется у нас и удалять его при снятии
регистрации. Действительный экстеншн для этого peer'а
определяется параметром 'regexten' либо его именем,
если 'regexten' не указан.
Может быть задано несколько экстеншенов, разделенных '&'.
Разрешается использовать шаблоны.
regcontext=iaxregistrations
Asterisk может регистрироваться как SIP-пользователь
у своего SIP провайдера
Соответсвующая инструкция имеет следующий формат
register => user[
secret[:authuser]]@host[:port][/extension]
Необязательные параметры заключены в скобки [].
Если, не задан экстеншн (extension), используется экстеншн 's'.
Соответсвующий экстеншн должен быть определен в extensions.conf,
чтобы принимать звонки от своего SIP-провайдера
host - это либо DNS имя, либо имя одной из определенных ниже секций.
Пример
register => 1234
password@mysipprovider.com
Здесь входящие звонки будут приходить в экстеншн 's'
register => 2345
password@sip_proxy/1234
Регистрируем 2345 на SIP-провайдере 'sip_proxy'.
Входящие звонки от провайдера будут приходить
в экстеншн 1234, определенном в extensions.conf в default-контексте,
либо любом другом, если
вы сконфигурируете раздел [sip_proxy] и зададите там нужный контекст.
Совет 1
Не используйте DNS имя для названия секций в sip.conf,
например, [provider.com]
Совет 2
Используйте раздельно две секции type=peer
и type=user для SIP-провайдера (вместо одной секции type=friend)
если звонки идут в обоих направлениях
externip = 200.201.202.203
Адрес, который будет помещен в исходящие SIP-пакеты,
если мы находимся за NAT'ом (наш внешний ip)
externip и localnet используются при общении
с SIP-провайдерами, где мы зарегистрированы
Можно добавить несколько локальных сетей (localnet).
Ниже перечислены "стандартные" локальные сети
localnet=192.168.0.0/255.255.0.0;
localnet=10.0.0.0/255.0.0.0  ;
localnet=172.16.0.0/12  ;
localnet=169.254.0.0/255.255.0.0 ;
-------------------------------------------------------------------
user и peer имеют различные наборы настроек. friend может использовать
все нижеперечисленные настройки
настройки user
настройки peer:
-------------------- -------------------
context context
permit permit
deny deny
secret secret
md5secret md5secret
dtmfmode dtmfmode
canreinvite canreinvite
nat nat
callgroup callgroup
pickupgroup pickupgroup
language language
allow allow
disallow disallow
insecure insecure
trustrpid trustrpid
progressinband progressinband
promiscredir promiscredir
callerid
accountcode
amaflags
incominglimit
restrictcid
mailbox
username
template
fromdomain
regexten
fromuser
host
mask
port
qualify
defaultip
rtptimeout
rtpholdtimeout
Ниже приведены примеры настроек различных узлов
user, peer, friend
[sip_proxy]
Только для входящих звонков
type=user
context=from-fwd
[sip_proxy-out]
type=peer
только для исходящих звонков
secret=guessit
username=yourusername
имя пользователя для аутентификации на SIP-прокси
fromuser=yourusername
многие SIP-провайдеры требуют наличия этого поля!
host=box.provider.com
[grandstream1]
type=friend
либо "friend" (peer+user), либо "peer", либо "user"
context=from-sip
fromuser=grandstream1
если не задан, используется callerid
callerid=John Doe
host=192.168.0.23
у нас статический IP
nat=no
между телефоном и Asterisk'ом нет NAT'а
canreinvite=yes
разрешить "проксирование" голосового RTP трафика
dtmfmode=info
режим тонального набора
incominglimit=1
разрешить только один исх. звонок
с телефона на Asterisk
mailbox=1234@default
голосовая почта 1234 в контексте "default"
disallow=all
запрещаем все кодеки, чтобы потом определить разрешенные (allow)
allow=ulaw
Замечание
в секции с type=user порядок кодеков
не учитывается
allow=alaw
allow=g723.1
allow=g729
.....

Для примера рассмотрим самый простой случай: у нас есть два ip-телефона, и необходимо звонить с одного на другой, используя номера 101 и 102. sip.conf в этом случае может выглядить так:

[general]

port=5060 bindaddr=0.0.0.0 srvlookup=yes language=en dtmfmode=RFC2833 promiscredir = no nat=no

disallow=all allow=alaw

[101] host=dynamic context=default type=friend username=101 nat=no secret=secret101 callerid=phone1 <101>

[102] host=dynamic context=default type=friend username=102 nat=no secret=secret102 callerid=phone2 <102>

В настройках телефонов нужно указать точно такие же имя пользователя и пароль. Кроме того, в extensions.conf нужно определить соответсвующие экстеншены в контексте default. Например, так:

... skipped ...

[default] exten => 101,1,Dial(SIP/101) exten => 102,1,Dial(SIP/102) ... skipped ...

Теперь, запустив Asterisk и убедившись, что оба телефона успешно зарегистрировались, можно смело набирать номер.

Подключение аналоговых телефонов

(Раздел в разработке)

3.1.2 Подключение внешних каналов

В первую очередь необходимо установить математическое обеспечение (драйверы) той системы сигнализации которую использует Ваш провайдер внешнего телефонного канала.

H.323

Существуют две распространенные реализации H323 драйвера для asterisk: h323, входящий в состав дистрибутива asterisk, и oh323, который разрабатывается InAccess Networks (http://www.inaccessnetworks.com/projects/asterisk-oh323). До сих пор идут споры о том, какой драйвер лучше использовать. Первым появился oh323. Он считается более стабильным в работе, в нем, в отличии от h323, реализован буфер для устранения дрожания. Для передачи используется RTP/RTCP стэк. В то же время h323 гораздо более производительный (загрузка ЦП может быть в 10-15 раз меньше, чем при использовании oh323 на тех же потоках).

Оба модуля имееют подробные интструкции по установке. Единственное, на что следует обратить особое внимание, это требование к библиотекам pwlib и openh323, необходимым для сборки драйвера: они должны быть в точности такими, как указано в инструкции по установке. При установке asterisk'а h323 по умолчанию не собирается. Нужно перейти в директорию asterisk-1.0.9/channels/h323/ и последовательно выполнить все инструкции из README. Если же вы решили использовать oh323, то необходимо предварительно скачать его исходники.

Рассмотрим для примера установку asterisk-oh323-0.6.5. Согласно инструкции нам потребуются библиотеки pwlib (v1.6.6) и openh323 (v1.13.5). Необходимые файлы можно взять здесь.

  1. tar -zxf pwlib-v1_6_6-src.tar.gz
  2. tar -zxf openh323-v1_13_5-src.tar.gz
  3. tar -zxf asterisk-oh323-0.6.5.tar.gz
  4. export PWLIBDIR="`pwd`/pwlib"
  5. export OPENH323DIR="`pwd`/openh323"
  6. export LD_LIBRARY_PATH="$PWLIBDIR/lib:$OPENH323DIR/lib"
  7. cd pwlib/
  8. ./configure
  9. make
  10. cd ../openh323/
  11. patch -p1 < ../asterisk-oh323-0.6.5/openh323_1.13.5-make.patch
  12. ./configure
  13. make opt

В этом месте компиляции может случиться конфуз (Fedora Core 3, gcc-3.4.2, glibc-2.3.3):

gkserver.h:434: error: `virtual H323Transaction::Response H323GatekeeperRRQ::OnHandlePDU()' is protected gkserver.h:1946: error: within this context


В этом случае нужно отредактировать файл include/gkserver.h, закомментировав строку 433:

  H225_RegistrationReject  & rrj;

// protected:

   virtual Response OnHandlePDU();

};

Далее:

  1. cd ../asterisk-oh323-0.6.5/

Нужно отредактировать Makefile, указав пути к pwlib, openh323 и asterisk в соответствии с вашими настройками. Например, на демонстрационном стенде это выглядит так:

  1. ...skipped...

PWLIBDIR=/usr/local/src/pwlib

  1. ...skipped...

OPENH323DIR=/usr/local/src/openh323

  1. ...skipped...

ASTERISKINCDIR=/usr/local/src/asterisk-1.0.9/include

Все остальное по умолчанию.

  1. make
  2. make install

Проследите, чтобы директория /usr/local/lib была добавлена в /etc/ld.so.conf, и запустите ldconfig. Теперь, после запуска asterisk'а нам будет доступен канал OH323. Конфигурационный файл для него - /etc/asterisk/oh323.conf. Выглядит он, приблизительно, следующим образом:

Файл конфигурации OpenH323 драйвера
-----------------------------------------
Основные настройки
(порты, буфер дрожания, гейткипер, ...)
-----------------------------------------

[general]

Прослушиваемый адрес для входящих подключений.
По умолчанию - слушать на всех интерфейсах.

listenAddress=0.0.0.0

Прослушиваемый порт.
По умолчанию 1720.

listenPort=1720

Порт для удаленного подключения.
(Используется только при отсутствии гейткипера)
Значение по умолчанию - 1720.

connectPort=1720

Диапазон используемых TCP портов

tcpStart=10000 tcpEnd=20000

диапазон используемых UDP портов
Замечание
диапазон портов, используемых RTP
настраивается в "rtp.conf"

udpStart=10000 udpEnd=20000

включить "быстрый старт" (yes,no).

fastStart=yes

разрешить H.245 туннелирование (yes,no).

h245Tunnelling=no

разрешить early H.245 сообщения на этапе инициализации звонка.

h245inSetup=no

разрешить in-band-DTMF.
(замечание
Netmeeting использует именно in-band DTMF)

inBandDTMF=no

Не передавать тишину.

silenceSuppression=no

Настройки буфера дрожания (в миллисекундах, 20...10000).

jitterMin=20 jitterMax=100

Установить флаг "тип сервиса" в ip пакетах для RTP траффика.
Возможные значения
lowdelay, throughput, reliability, mincost, none

ipTos=none

Максимальное число входящих/исходящих/одновременных
H.323 подключений.

outboundMax=10 inboundMax=10 simultaneousMax=10

Пропускная способность H.323 соединений.
Значение задается в Кбит/с.
bandwidthLimit=1024
Настройки лога
В качестве libTraceFile можно задать либо стандарный вывод 'stdout',
либо полный путь к лог-файлу

wrapLibTraceLevel=1 libTraceLevel=0 libTraceFile=/var/log/asterisk/oh323.log

Настройки гейткипера.
Допустимые значения
DISABLE - отключен
DISCOVER - автоопределение
< DNS имя гейткипера >,
< ip гейткипера >,
GKID
<идентификационный номер гейткипера>

gatekeeper=DISABLE

Установить пароль для гейткипера
gatekeeperPassword=secret
Таймаут регистрации на ГК

gatekeeperTTL=600

Режим отправки ввода пользователя
Допустимые значения
Q931 - Q.931 Keypad Information Element
STRING - H.245 string
TONE - H.245 tone
RFC2833 - RFC2833

userInputMode=RFC2833

флаги AMA (автоматический учет стоимости)
возможные значения
default, omit, billing, documentation

amaFlags=billing

Имя для эккаунтинга

accountCode=H323

контекст по умолчанию для H.323 звонков.

context=h323-incoming

-----------------------------------------
Настройки H.323 алиасов (синонимов), префиксов и
привязка к контекстам ASTERISK
-----------------------------------------

[register]

алиасы/префиксы, связанные с контекстом по умолчанию,
определенном в разделе [general].

alias=asterisk alias=123

алиасы/префиксы, попадающие в контекст "all-aliases".

context=all-aliases alias=ASTERISK alias=666

алиасы/префиксы, попадающие в контекст "more-aliases".

context=more-aliases alias=665

алиасы/префиксы, попадающие в контекст "all-prefixes".

context=all-prefixes gwprefix=00 gwprefix=01

алиасы/префиксы, попадающие в контекст "more-stuff".

context=more-stuff alias=664 gwprefix=02

-----------------------------------------
Настройки, относящиеся к кодекам
-----------------------------------------

[codecs]

Определение списка доступных кодеков.
Каждая опция "codec" может иметь связанную с ней настройку "frames"
Допустимые значения опции "codec"
G711U - G.711 u-Law
G711A - G.711 A-Law
G7231 - G.723.1(6.3k)
G72316K3 - G.723.1(6.3k)
G72315K3 - G.723.1(5.3k)
G7231A6K3 - G.723.1A(6.3k)
G7231A6K3 - G.723.1A(6.3k)
G726 - G.726(32k)
G72616K - G.726(16k)
G72624K - G.726(24k)
G72632K - G.726(32k)
G72640K - G.726(40k)
G728 - G.728
G729 - G.729
G729A - G.729A
G729B - G.729B
G729AB - G.729AB
GSM0610 - GSM 0610
MSGSM - Microsoft GSM Audio Capability
LPC10 - LPC-10
Количество фреймов в RTP пакете (если не задано явно) равно 1.

codec=G711A frames=20

codec=GSM0610
frames=4
codec=G729
frames=2
codec=G7231
frames=2

3.1.2.1 Через DialPeer провайдера VoIP используя обычный IP канал

(Раздел в разработке)

3.1.2.2 Через аналоговые карты Digium

(Раздел в разработке)

3.1.2.3 Через цифровые карты E1 потока Digium или аналогичные

(Раздел в разработке)

3.2 Установка RADIUS плагина для Asterisk. Взаимодействие с LANBilling VoIP RADIUS агентом (выполняет функции сервера RADIUS).


  RADIUS модуль, о котором пойдет речь, основан на клиенте от PortaOne.

Он представляет из себя два perl-скрипта для аутентификации и эккаунтинга и набор патчей для asterisk'а. Все же имеются существенные отличия от оригинальной версии, поэтому есть смысл подробно описать все шаги установки, влючая те, что уже описаны в документе по вышеприведенной ссылке. Итак, для начала, что позволяет этот модуль.

   Аутентификация.
       Есть возможность SIP Digest аутентификации (Draft RADIUS digest-auth) и PAP (rfc 2138). Второй метод удобно использовать для организации карточной платформы, либо для аутентификации узлов, не поддерживающих протокол SIP (для примера см. agi-card.agi)
       Запрос к RADIUS'у можно послать только при инициации звонка, так как на этапе регистрации телефона(софтфона) на asterisk'е последний не может обратиться к RADIUIS серверу (разработчиками не была предусмотрена такая возможность), поэтому здесь проверку подлинности осуществляет сама PBX.
       Имеется возможность задавать индивидуальные настройки RADIUS сервера для различных расширений в dialplan'е (extensions).
       По умолчанию происходит разрыв соединения в случае неудачной аутентификации. Если RADIUS возвращает атрибут Session-Timeout или h323-credit-time (cisco VSA), то по истечении указанного времени также происходит автоматический разрыв соединения. 
   Эккаунтинг.
       Отсылаютя стартовый, промежуточные и завершающий эккаунтинг пакеты. Можно настроить интервал отсылки промежуточных (alive) пакетов.
       Существенным ограничением является отсутсвие возможности эккаунтинга для неаутентифицированных звонков. 
   Достоинства.
       При общении с RADIUS сервером используются cisco VSA, что гарантирует совместимость со многими биллинговыми системами (в том числе LANBilling)
       Модуль целиком написан на языке perl, поэтому он легко может быть расширен и доработан для обеспечения требуемого функционала
   Недостатки.
       Аутентификация и эккаунтинг осуществляются независимым образом двумя различными процессами. На администратора ложится задача мониторинга этих двух процессов помимо самой PBX для поддержания работоспособности узла.
       Интеграция с asterisk ограничена средствами manager API и AGI интерфейса. 


Установка.

   Для asterisk-1.0.x необходим патч, реализующий dialplan-приложение SIPGetHeader. В asterisk-1.2 соответсвующий код уже включен (следите за changelog'ом, т.к. он неоднократно модифицировался), поэтому если Вы используете версию 1.2, можете пропустить этот пункт.
   На момент написания статьи последней стабильной версией asterisk была 1.0.9. Ниже речь будет идти именно о ней.
   Необходимый патч можно взять здесь.
   Применяем патч и пересобираем asterisk:
   #cp patch-chan_sip.c-1.0.9 asterisk-1.0.9
   #cd asterisk-1.0.9/
   #patch -p0 < patch-chan_sip.c-1.0.9
   #make clean && make && make install
   		
   Устанавливаем необходимые perl-модули
   #perl -MCPAN -e shell
   cpan>install Crypt::CBC
   cpan>install Crypt::DES
   cpan>install Digest::MD5
   cpan>install Authen::Radius
   cpan>q
   		
      Также нам потребуется asterisk-perl, взять который можно здесь или здесь.
   #tar -zxf asterisk-perl-0.08.tar.gz
   #cd asterisk-perl-0.08/
   #perl Makefile.PL
   #make all
   #make install
   		
   Скачиваем RADIUS клиент radiusclient.tar.gz или radiusclient-1.4.tar.gz(для asterisk-1.4.x) и распаковываем архив:
   #tar -zxf radiusclient.tar.gz
   		
   Копируем agi-rad-auth.agi в директорию, определяемую переменной astagidir из asterisk.conf (по умолчанию /var/lib/asterisk/agi-bin):
   #cp agi-rad-auth.agi /var/lib/asterisk/agi-bin/
   		
   Копируем ast-rad-acc.pl в любую удобную директорию:
   #cp ast-rad-acc.pl /usr/sbin/
   		
   Запуск скрипта ast-rad-acc.pl следует включить в автозагрузку сиситемы. Лучше всего запускать его вместе с asterisk, добавив в стартовый скрипт для asterisk строчки, которые будут запускать и останавливать этот демон. Однако запускать его пока рано...
   Теперь, собственно, настройка asterisk.
   Нам потребуется отредактировать ряд конфигурационных файлов, которые по умолчанию находятся в /etc/asterisk/
   modules.conf
   Добавьте загрузку модуля res_agi.so:
   load => res_agi.so
   		


   manager.conf
   Необходимо добавить менеджера для подключения эккаунтинг-модуля.
   Пример:
   enabled =yes
   port = 5038
   bindaddr = 127.0.0.1
   secret = test
   permit= 127.0.0.1
   [test]
   secret = test
   permit= 127.0.0.1
   read = system,call,log,verbose,command,agent,user
   write = system,call,log,verbose,command,agent,user
   		
   Замечание: логин и пароль для менеджера прописаны в скрипте ast-rad-acc.pl (по умолчанию test/test). Если в manager.conf используются другие параметры доступа, то скрипт необходимо отредактировать.
   sip.conf
   В настройках peer'а, для которого планируется использовать SIP-аутентификацию, нужно указать 'externalauth=yes'. Также удобно определить общий контекст для таких пользователей: 'context=sip_auth'
   Пример:
   [123]
   type=friend 
   username=123
   secret=123
   context=sip_auth
   callerid=123
   host=dynamic
   nat=no
   canreinvite=no
   externalauth=yes
   		


   extensions.conf
   В разделе [globals] определяются глобальные настройки RADIUS сервера: ip,порты аутентификации и эккаунтинга, разделяемый секрет и интервал отсылки промежуточных пакетов эккаунтинга (0 - отменяет alive пакеты). Далее нужно создать контекст [sip_auth], упомянутый в sip.conf
   Пример:
   [general]
   static=yes
   writeprotect=no
   [globals]
   RADIUS_Server=127.0.0.1
   RADIUS_Secret=secret
   RADIUS_Auth_Port=34009
   RAIUS_Acct_Port=34008
   Acct_Update_Timeout=60
   NAS_IP_Address=127.0.0.1
   [sip_auth]
   exten => _X.,1,SIPGetHeader(SIP_Authorization=Proxy-Authorization)
   exten => _X.,2,AGI(agi-rad-auth.pl|AuthMode=SIP)
   exten => _X.,3,Goto(default,${DNID},1)
   exten => _X.,4,Hangup()
   [default]
   ; ... skipped ...
   		


   Вызов скрипта аутентификации.
      Скрипт, выполняющий аутентификацию (agi-rad-auth.agi), является AGI-приложением и вызывается в dialplan'е следующим образом:
   AGI(agi-rad-auth.pl|Var1=Value1&Var2=Value2&...)
   		
   В параметрах можно передавать ряд переменных:
   AuthMode=SIP|Account|AuthOnly - Тип аутентификации
     SIP cоответсвует SIP-аутентификации. Для ее использования необходимо предварительно вызвать SIPGetHeader следующим образом:
   SIPGetHeader(SIP_Authorization=Proxy-Authorization)
   		
     Account - метод по умолчанию. Здесь просто проверяется имя пользователя и пароль, которые также передаются в параметрах (см. ниже).
     AuthOnly - от метода Account отличается тем, что RADIUS в этом случае не будет создавать сессию с последующим эккаунтингом: просто проверяется логин, пароль и возвращается accept либо reject. Используется для "промежуточных" запросов при реализации карточной платформы (см. пример agi-card.agi).
   Username=[username],
   Password=[password] - cоответсвенно имя пользователя и пароль. Используется в методах Account и AuthOnly.
   IfFailed=DoNotHangup - Не разрывать соединения при неудачной аутентификации. Можно проанализировать возвращаемый RADIUS'ом статус для ответа абоненту, используя IVR.
     После завершения RADIUS клиентом устанавливаются следующие переменные, которые можно использовать в dialplan'е:
       SIP_Username - Имя пользователя, получаемое от клиента при SIP-аутентификации.
       RADIUS_Status - Содержит ответ RADIUS сервера. Возможные значения:
         Accept - аутентификация прошла успешно
         Reject - доступ запрещен
         NoResponce - сервер не отвечает на запрос
         ConfigurationError - не получен SIP Header, необходимый для SIP аутентификации
       Все атрибуты, возвращаемые RADIUS сервером, например
       Session-Timeout
       h323-credit-time
       h323-credit-amount
       h323-currency
   Для корректной работы RADIUS клиента необходим словарь (radius dictionary), расположенный в /etc/raddb/. Этот словарь, устанавливаемый по умолчанию вместе с perl модулем Authen::Radius, нуждается в исправлении, так как в нем не хватает некоторых необходимых атрибутов. Работающий пример можно взять здесь.
   Теперь можно запускать asterisk либо стартовым скриптом, либо вручную (при этом не забыв про ast-rad-acc.pl). При запуске среди активных процессов вы должны увидеть, примерно, следующее:
   #ps ax | grep ast
   19629 ?        Ssl    0:00 asterisk
   19759 ?        S      0:26 /usr/bin/perl /usr/sbin/ast-rad-acc.pl
   		
   Настройка RADIUS сервера - VoIP агента LBircd
   Процесс установки и настройки АСР LANBilling описан в документации.
   В настройках агента нужно не забыть указать ip адрес NAS'a (в данном случае это ip адрес сервера, на котором установлен asterisk) и разделяемый секрет. На этапе отладки и тестирования рекомендуется также установить подробную детализацию лога ("Уровень детализации журнала событий" = 3). Затем создать учетные записи с логинами и паролями, указанными в sip.conf в настройках соответсвующего peer'а. Для автоматизации этого процесса (заведение peer'а при создании учетной записи в биллинге) нужно использовать скрипты vg.create, vg.delete, vg.edit которые запускаются соответственно при создании, удалении и редактировании учетной записи. В параметрах этим скриптам передаются логин, пароль и присвоенный телефонный номер учетной записи. Пример скрипта для редактирования sip.conf можно взять здесь.
   Процесс добавления/удаления SIP-пользователя в asterisk заметно упрощается, если для хранения настроек вместо текстового файла используется база данных (см. Конфигурация из БД).
   Если все настроено верно, то теперь исходящие звонки с телефонов, работающих по протоколу SIP, должны успешно аутентифицироваться на RADIUS сервере. Во время звонка, посмотрев "Активные сессии" в административном интерфейсе LANBilling, Вы должны увидеть текущее соединение. По окончании звонка он удаляется из активных сессий, и в статистике появится соответсвующая запись. Если что-то не получилось, нужно анализировать логи на предмет возникших в процессе ошибок.
   Ниже приведен лог успешного соединения
   lbircd.log
   Mon Oct  3 19:15:19 2005, Info: Header->Code: 1, 
   Header->Identifier: 216, Header->Length: 258
   Attribute NAS_IP_ADDRESS = 127.0.0.1
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 2. 
   AVPair = "SIP/777-1098".
   Info: Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 1. 
   AVPair = "call-id=1128352518.2".
   Attribute CALLING_STATION_ID = 777
   Attribute CALLED_STATION_ID = 7720863
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 24. 
   AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
   Attribute USER_NAME = '777'
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_ATTRIBUTES
   Attribute DIGEST_RESPONSE
   Create Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6, 
   Session-num: 0
   Info: SELECT above,call_mode,cat_number,free_seconds,round_seconds 
   FROM tarifs WHERE tar_id=4
   Passed: above=5, call_mode=0, cat_number=0
   ANI User: 1 (phone=777)
   xpgk-ep-number=777
   Access granted USER=777, Phone=7720863, h323-credit-time=18000
   Authentication answer sent successfully
   Packet received from 127.0.0.1, size: 327
   Header->Code: 4, Header->Identifier: 104, Header->Length: 327
   Attribute ACC_STATUS_TYPE = '1'
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 25. 
   AVPair = "h323-setup-time=15:15:18.000 UTC Mon Oct  3 2005".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 27. 
   AVPair = "h323-call-type=VoIP".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 26. 
   AVPair = "h323-call-origin=answer".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 31. 
   AVPair = "h323-voice-quality=0".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 1. 
   AVPair = "session-protocol=sipv2".
   Attribute VENDOR_SPECIFIC
   Info: Cisco Voice-Specific VSA. VSA number = 1. 
   AVPair = "call-id=1128352518.2".
   Attribute NAS_IP_ADDRESS = 127.0.0.1
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 2. 
   AVPair = "SIP/777-1098".
   Attribute USER_NAME = '777'
   Attribute CALLING_STATION_ID = 777
   Attribute CALLED_STATION_ID = 7720863
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 24. 
   AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
   Accounting START USER=777, Phone=7720863, h323-credit-time=0, 
   h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
   Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6, 
   Session-num: 0
   Accounting answer sent successfully


   Packet received from 127.0.0.1, size: 127
   Header->Code: 4, Header->Identifier: 105, Header->Length: 127
   Attribute ACC_STATUS_TYPE = '3'
   Attribute NAS_IP_ADDRESS = 127.0.0.1
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 2. AVPair = "SIP/777-1098".
   Attribute USER_NAME = '777'
   Attribute CALLING_STATION_ID = 777
   Attribute CALLED_STATION_ID = 7720863
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 24. 
   AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
   Accounting UPDATE USER=777, Phone=7720863, h323-credit-time=0, 
   h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
   Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6, 
   Session-num: 0
   Accounting answer sent successfully


   Packet received from 127.0.0.1, size: 397
   Header->Code: 4, Header->Identifier: 106, Header->Length: 397
   Attribute ACC_STATUS_TYPE = '2'
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 25. 
   AVPair = "h323-setup-time=15:15:18.000 UTC Mon Oct  3 2005".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 28. 
   AVPair = "h323-connect-time=15:15:18.000 UTC Mon Oct  3 2005".
   Time zone is UTC
   Time understanded as Mon Oct  3 19:15:18 2005
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 29. 
   AVPair = "h323-disconnect-time=15:16:13.000 UTC Mon Oct  3 2005".
   Time zone is UTC
   Time understanded as Mon Oct  3 19:16:13 2005
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 30. 
   AVPair = "h323-disconnect-cause=0".
   Attribute ACC_SESSION_TIME = 55
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 1. 
   AVPair = "session-protocol=sipv2".
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 1. 
   AVPair = "call-id=1128352518.2".
   Attribute NAS_IP_ADDRESS = 127.0.0.1
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 2. 
   AVPair = "SIP/777-1098".
   Attribute USER_NAME = '777'
   Attribute CALLING_STATION_ID = 777
   Attribute CALLED_STATION_ID = 7720863
   Attribute VENDOR_SPECIFIC
   Cisco Voice-Specific VSA. VSA number = 24. 
   AVPair = "h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6".
   Get Session: Conf-id: 0B26C680 B73367FC 27D5214A 71D01BB6, 
   Session-num: 0
   delete from sessionsradius where id=1 and 
   session_id='0B26C680 B73367FC 27D5214A 71D01BB6'
   Accounting STOP USER=777, Phone=7720863, h323-credit-time=0, 
   h323-conf-id=0B26C680 B73367FC 27D5214A 71D01BB6
   Mon Oct  3 19:16:13 2005, Info: Accounting answer sent successfully
   		
   asterisk -rvvv
    -- Executing SIPGetHeader("SIP/777-1098", 
    "SIP_Authorization=Proxy-Authorization") in new stack
    -- Executing AGI("SIP/777-1098", "agi-rad-auth.agi|Mode=SIP") 
    in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/agi-rad-auth.agi
    --  agi-rad-auth.agi|Mode=SIP: AGI Environment Dump:
    --  agi-rad-auth.agi|Mode=SIP:  -- accountcode = 
    --  agi-rad-auth.agi|Mode=SIP:  -- callerid = 777 <777>
    --  agi-rad-auth.agi|Mode=SIP:  -- channel = SIP/777-1098
    --  agi-rad-auth.agi|Mode=SIP:  -- context = sip_auth
    --  agi-rad-auth.agi|Mode=SIP:  -- dnid = 7720863
    --  agi-rad-auth.agi|Mode=SIP:  -- enhanced = 0.0
    --  agi-rad-auth.agi|Mode=SIP:  -- extension = 7720863
    --  agi-rad-auth.agi|Mode=SIP:  -- language = en
    --  agi-rad-auth.agi|Mode=SIP:  -- priority = 2
    --  agi-rad-auth.agi|Mode=SIP:  -- rdnis = unknown
    --  agi-rad-auth.agi|Mode=SIP:  -- request = agi-rad-auth.agi
    --  agi-rad-auth.agi|Mode=SIP:  -- type = SIP
    --  agi-rad-auth.agi|Mode=SIP:  -- uniqueid = 1128352518.2
    --  agi-rad-auth.agi|Mode=SIP: RADIUS server response type = 2
    --  agi-rad-auth.agi|Mode=SIP: 
    attr: name=h323-credit-time value=18000
    --  agi-rad-auth.agi|Mode=SIP: 
    attr: name=Session-Timeout value=18000
    --  agi-rad-auth.agi|Mode=SIP: 
    attr: name=h323-credit-amount value=963.73
    --  agi-rad-auth.agi|Mode=SIP: 
    attr: name=h323-currency value=USD
    --  agi-rad-auth.agi|Mode=SIP: 
    attr: name=Cisco-AVPair value=xpgk-ep-number=777
    -- AGI Script Executing Application: (UserEvent) 
    Options: (_SIP_Auth|User-Name: 777)
    -- AGI Script Executing Application: (UserEvent) 
    Options: (_SIP_Auth|DNID: 7720863)
    -- AGI Script agi-rad-auth.agi completed, returning 0
    -- Executing Goto("SIP/777-1098", "default|7720863|1") 
    in new stack
    -- Goto (default,7720863,1)
    -- Executing Dial("SIP/777-1098", "SIP/out/7720863|30|tr") 
    in new stack
    -- Called out/7720863
    -- SIP/out-e234 is ringing
    -- SIP/out-e234 answered SIP/777-1098
    -- Attempting native bridge of SIP/777-1098 and SIP/out-e234
   == Spawn extension (default, 7720863, 2) exited non-zero on 
   'SIP/777-1098'
   		


   Как быть с телефонами, не поддерживающими стандарт SIP?
   Можно использовать метод Account при вызове agi-rad-auth.agi. При этом в биллинге должна быть создана учетная запись с присвоенным телефонным номером(номерами), тогда эту учетную запись можно аутентифицировать по АОН:
   AGI(agi-rad-auth.agi|Mode=Account&Username=${CALLERID})
   		
   Если в настройках учетной записи задана опция пароль для АОН, то нужно передать еще параметр Password=[password].


   Пример использования RADIUS клиента для реализации карточной платформы - agi-card.agi
   В примере используются звуковые файлы из asterisk-sounds-1.0.9. Данный скрипт пытается аутентифицировать звонящего по АОН. В случае неудачи запрашивается номер карты и пин. Затем, в случае успеха, сообщается баланс и запрашивается телефонный номер, на который желаете позвонить. После подтверждения объявляется максимальная продолжительность звонка, и скрипт завершается, установив переменную ${DNID2} с набранным номером.
   Пример extension.conf:
   [card_platform]
   exten => s,1,Wait(1)
   exten => s,2,Answer()
   exten => s,3,AGI(agi-card.agi)
   exten => s,4,Dial(SIP/${DNID2}@voip.my_provider.com,20)
   exten => s,5,Hangup()
   exten => t,1,Playback(number-not-answering)
   exten => t,2,Hangup()
   		


Совет: Если во время работы в консоли постоянно появляются сообщения типа Odd number of elements in hash assignment at /usr/lib/perl5/site_perl/5.8.5/Asterisk/Manager.pm line 330, нужно отредактировать модуль Manager.pm, заменив строку 330

my %resp = map { split(': ', $_); } $self->read_response;


следующей конструкцией:

my %resp; foreach ($self->read_response){

 my ($a,$b) = split(': ',$_);
 $resp{$a} = $b;

}

взято тут:статья


ПРОБЛЕМЫ И РЕШЕНИЯ


  • Uhhuh. NMI received for unknown reason 20 on CPU 0.
  • Решение:
# cat /etc/modprobe.d/nmi-watchdog-blacklist.conf
...
blacklist iTCO_wdt
blacklist iTCO_vendor_support
...
edit /etc/default/grub
 ...
#
#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="ro quiet nmi_watchdog=0 pcie_aspm=off idle=nomwait"
...
# update-grub

end

#reboot

ПОЛЕЗНОЕ