Офисная АТС на 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

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

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

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

3.1.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"а. Все же имеются существенные отличия от оригинальной версии, поэтому есть смысл подробно описать все шаги установки, влючая те, что уже описаны в документе по вышеприведенной ссылке.

Итак, для начала, что позволяет этот модуль.
  1. Аутентификация
    • Есть возможность 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), то по истечении указанного времени также происходит автоматический разрыв соединения.
  2. Эккаунтинг
    • Отсылаютя стартовый, промежуточные и завершающий эккаунтинг пакеты. Можно настроить интервал отсылки промежуточных (alive) пакетов.
    • Существеннымограничением является отсутсвие возможности эккаунтинга для неаутентифицированных звонков.
  3. Достоинства
    • При общении с RADIUS сервером используются cisco VSA, что гарантирует совместимость со многими биллинговыми системами (в том числе LANBilling)
    • Модуль целиком написан на языке perl, поэтому он легко может быть расширен и доработан для обеспечения требуемого функционала
  4. Недостатки
    • Аутентификация и эккаунтинг осуществляются независимым образом двумя различными процессами. На администратора ложится задача мониторинга этих двух процессов помимо самой PBX для поддержания работоспособности узла.
    • Интеграция с asterisk ограничена средствами manager API и AGI интерфейса.


Установка
  1. Для 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

  2. Устанавливаем необходимые 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

  3. Скачиваем RADIUS клиент radiusclient.tar.gz и распаковываем архив:
    #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 строчки, которые будут запускать и останавливать этот демон. Однако запускать его пока рано...


  4. Теперь, собственно, настройка 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 ...



  5. Вызов скрипта аутентификации.

    Скрипт, выполняющий аутентификацию (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





  6. Для корректной работы RADIUS клиента необходим словарь (radius dictionary), расположенный в /etc/raddb/. Этот словарь, устанавливаемый по умолчанию вместе с perl модулем Authen::Radius, нуждается в исправлении, так как в нем не хватает некоторых необходимых атрибутов.
    Работающий пример можно взять здесь.


  7. Теперь можно запускать asterisk либо стартовым скриптом, либо вручную (при этом не забыв про ast-rad-acc.pl). При запуске среди активных процессов вы должны увидеть, примерно, следующее:

    #ps ax | grep ast
    19629 ?Ssl0:00 asterisk
    19759 ?S0:26 /usr/bin/perl /usr/sbin/ast-rad-acc.pl


  8. Настройка RADIUS сервера - VoIP агента LBircd

    Процесс установки и настройки АСР LANBilling описан в документации.

    В настройках агента нужно не забыть указать ip адрес NAS"a (в данном случае это ip адрес сервера, на котором установлен asterisk) и разделяемый секрет.
    На этапе отладки и тестирования рекомендуется также установить подробную детализацию лога ("Уровень детализации журнала событий" = 3).
    Затем создать учетные записи с логинами и паролями, указанными в sip.conf в настройках соответсвующего peer"а. Для автоматизации этого процесса (заведение peer"а при создании учетной записи в биллинге) нужно использовать скрипты vg.create, vg.delete, vg.edit которые запускаются соответственно при создании, удалении и редактировании учетной записи. В параметрах этим скриптам передаются логин, пароль и присвоенный телефонный номер учетной записи. Пример скрипта для редактирования sip.conf можно взять здесь.

    Процесс добавления/удаления SIP-пользователя в asterisk заметно упрощается, если для хранения настроек вместо текстового файла используется база данных (см. Конфигурация из БД).



  9. Если все настроено верно, то теперь исходящие звонки с телефонов, работающих по протоколу SIP, должны успешно аутентифицироваться на RADIUS сервере. Во время звонка, посмотрев "Активные сессии" в административном интерфейсе LANBilling, Вы должны увидеть текущее соединение.
    По окончании звонка он удаляется из активных сессий, и в статистике появится соответсвующая запись.
    Если что-то не получилось, нужно анализировать логи на предмет возникших в процессе ошибок.

    Ниже приведен лог успешного соединения

    lbircd.log

    Mon Oct3 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 Oct3 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 Oct3 2005".
    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 28.
    AVPair = "h323-connect-time=15:15:18.000 UTC Mon Oct3 2005".
    Time zone is UTC
    Time understanded as Mon Oct3 19:15:18 2005

    Attribute VENDOR_SPECIFIC
    Cisco Voice-Specific VSA. VSA number = 29.
    AVPair = "h323-disconnect-time=15:16:13.000 UTC Mon Oct3 2005".
    Time zone is UTC
    Time understanded as Mon Oct3 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 Oct3 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
    --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"


  10. Как быть с телефонами, не поддерживающими стандарт SIP?

    Можно использовать метод Account при вызове agi-rad-auth.agi. При этом в биллинге должна быть создана учетная запись с присвоенным телефонным номером(номерами), тогда эту учетную запись можно аутентифицировать по АОН:

    AGI(agi-rad-auth.agi|Mode=Account&Username=${CALLERID})

    Если в настройках учетной записи задана опция пароль для АОН, то нужно передать еще параметр Password=[password].


  11. Пример использования 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;
}




назад Обзор надстройки Potolook для Microsoft® Outlook® | далее Как назначить права доступа (разрешения) в Windows Xp Home Edition




Новости Hardware
Случайная программа
Электронная книга «1С Бухгалтерия 7.7» 1.0
Электронная книга «1С Бухгалтерия 7.7» ред. 4.5 является практическим руководством, при помощи которой пользователь самостоятельно обучится и быстро найдет нужные ответы. Имеется большой справочный...


Mail.ru
© 2005-2019 DDBS.Ru - каталог программ