Книга знаний

Рекламное место пустует
1С:Предприятие / Приемы программирования / Внешние компоненты

1С+Asterisk

Пример интеграции 1С:Предприятие и Asterisk PBX. Прослушивание событий, совершение исходящих звонков, отправка команд в Asterisk.Автор статьи: oleg rizvanov | Редакторы:
Последняя редакция №7 от 27.04.12 | История
URL: http://kb.mista.ru/article.php?id=860

Ключевые слова: asterisk,1с


Какая самая распространенная система IP-телефонии? Правильно - Asterisk.
Какая самая распространенная учетная система? Правильно - 1С.
А если их подружить, тогда - профит.

Предисловие


Возможно, статья написана излишне подробно - не обессудьте. Хотелось, чтобы было понятно всем, да и множество важных деталей упустить не хотелось.

Условия.


Начнем "дружить" 1С и Asterisk. Возьмем самый тяжелый случай со стороны 1С - версию 7.7, а со стороны Asterisk версию 1.6.2.x.

Чего мы хотим:


  1. Функцию исходящего звонка из 1С.
  2. Знать в 1С-е номер звонящего при входящем звонке.

Как будем строить.


У Asterisk-а есть свой API, через который мы и будем подключаться к нему. Называется он AMI - Asterisk Management Interface. Со стороны 1С будем использовать механизм внешних компонент.

Выбор внешней компоненты.


Google в помощь, ищем готовые внешние компоненты. Находим Asterisk.dll, находим Obeliks, находим VVSAst.dll, находим ROM-Asterisk.dll. Смотрим, анализируем... Возможно, в будущем захочется развить нашу систему, поэтому смотрим еще и на масштабируемость и наличие универсальных методов отправки команд в Asterisk.

Asterisk.dll только для 1С версии 8.х, к тому же у этой ВК нет универсального метода отправки команд в AMI, она может только позвонить и все. Не подходит. :(

Obeliks - ограничения функциональности в шареварной версии. Каждый час перезагрузка, разговор 3 минуты. Снятие ограничений только в платной версии. Не подходит. :(

VVSAst.dll - для версии 7.7 ограничений нет, для 8.х - платно. Есть универсальные методы отправки команд в AMI. Подходит частично - только для 7.7 :(


ROM-Asterisk.dll - полностью свободная и для 7.7, и для 8.х. Есть универсальные методы отправки команд в AMI. Есть мощная система фильтрации. Подходит для всех версий.

Подключение внешней компоненты.


Компонента ROM-Asterisk саморегистрирующаяся, загружается через ЗагрузитьВнешнююКомпоненту().
Функция _АстерискЗагрузитьВК()Экспорт;
    Попытка
        ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"ROM-Asterisk.dll");
    _Телефония = СоздатьОбъект("AddIn.ROM-Asterisk");
        Возврат 1;
    Исключение
        Сообщить("Не удалось загрузить внешнюю компоненту для связи с Asterisk");
    КонецПопытки;
    Возврат 0;
КонецФункции 

Дальше, нам нужна еще одна предопределенная процедура - ОбработкаВнешнегоСобытия()
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    Если Источник="ROM-Asterisk" Тогда
        Сообщить(Данные);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Теперь, нам нужно будет выполнить настройку со стороны Asterisk-а, а уже затем будем продолжать разбираться с 1С.

Настройка доступа со стороны Asterisk


Теперь, выполняем настройку со стороны Asterisk. Для простоты, IP адрес нашего Asterisk-a статический 192.168.1.100, подключения будут выполняться из той же подсети 192.168.1.0/24

Настройка доступа к AMI


Заходим на консоль или же подключаемся через SSH к Asterisk-у. Нас интересует файл /etc/asterisk/manager.conf
[general]

enabled=yes              ; возможность работать с AMI (по-умолчанию no)
port=5038                ; на порту TCP 5038
bindaddr=192.168.1.0     ; принимать соединения в лок. сети (0.0.0.0 - все)
timestampevents = no     ; Отправлять в пакетах событий временную метку
displayconnects = yes    ; Отображать факт подключения пользователя к AMI
allowmultiplelogin = yes ; Разрешить несколько подключений с одним именем

Настройка пользователя


Перейдем к секции, которая отвечает за пользователя:

[admin]                            ; имя пользователя
secret=passwd1234                  ; пароль пользователя AMI
deny=0.0.0.0/0.0.0.0               ; запретить все ip-адреса
permit=192.168.1.0/255.255.255.0   ; разрешить соединение с подсети
read=system, call, log, verbose, command, agent, user   ; список классов событий
write=system, call,log, verbose, command, agent, user   ; список классов команд

Проверка


Проверяем. Заходим на порт 5038, используя PuTTY. Если все хорошо, то увидим приветствие Asterisk. Вводим команду:

Action: login
Username: admin
Secret: passwd1234

В конце дважды нажимаем Enter. Asterisk на это должен ответить:

Response: Success
Message: Authentication accepted

Значит, все замечательно - получилось :)

Окончательная настройка 1С


Выполним окончательную настройку 1С. Переходим к 1С-у, к глобальному модулю. Напишем пару сервисных функций и будем уже слушать наш Asterisk. Для начала, сделаем переменную _Телефония глобальной и экспортной. Мы уже инициализировали эту переменную в функции _АстерискЗагрузитьВК()
Перем _Телефония Экспорт;

Напишем функцию для организации подключения к AMI
Функция _АстерискСоединиться(IP,Port=5038)Экспорт
    _Телефония.Connect(IP,Port);
    Если _Телефония.Connected=0 Тогда
        Сообщить("Ошибка соединения");
        Возврат 0;
    КонецЕсли;
    Возврат 1;
КонецФункции

Нужна универсальная функция, которая позволяет выполнять произвольную команду в AMI.
Функция _АстерискВыполнитьКоманду(ТекстКоманды) Экспорт;
    Если _Телефония.Connected=0 Тогда
        Сообщить("Соединение не установлено");
        Возврат 0;
    КонецЕсли;

    ТекстКоманды=ТекстКоманды+РазделительСтрок;
    Флаг=_Телефония.ВыполнитьКоманду(ТекстКоманды);
    Если Флаг=0 Тогда
            Сообщить("Asterisk. Выполнение команды. Ошибка: "+КодОшибки);
            Сообщить("Asterisk. ТекстКоманды: "+ТекстКоманды);
    КонецЕсли;
    Возврат Флаг;
КонецФункции

Теперь, нужна функция авторизации. Выше, мы авторизовались из командной строки, теперь сделаем тоже самое из 1С.
Функция _АстерискАвторизоваться(Юзер,Хеш)Экспорт
    CRLF=РазделительСтрок;
    ТекстКоманды="Action: login"+CRLF+
    "Username: "+Юзер+CRLF+
    "Secret: "+Хеш+CRLF;

    Если _АстерискВыполнитьКоманду(ТекстКоманды)=0 Тогда
        Возврат 0;
    КонецЕсли;
    Возврат 1;
КонецФункции

Напишем функцию прослушивания событий AMI
Процедура _АстерискСлушать() Экспорт;
    Если _Телефония.Connected=0 Тогда
        Сообщить("Соединение не установлено");
        Возврат;
    КонецЕсли;
    _Телефония.РежимПрослушивания(1);
КонецПроцедуры

Осталось только вызвать все эти процедуры и функции. Сделаем это ПриНачалеРаботыСистемы(), добавим в эту процедуру строки:
Если _АстерискЗагрузитьВК()=1 Тогда
    Если _Телефония.Connected=0 Тогда
        Если _АстерискСоединиться("192.168.1.100",5038)=0 Тогда
            Сообщить("Не удалось соединиться с сервером Астериск");
            Возврат;
        КонецЕсли;

        АмиПользователь="admin";
        АмиХешПароля="password1234";
        Если _АстерискАвторизоваться(АмиПользователь,АмиХешПароля)=0 Тогда
            Сообщить("Не удалось авторизоваться на сервере Астериск");
            Возврат;
        КонецЕсли;
    КонецЕсли;
    _АстерискСлушать();
КонецЕсли;

Загружаем 1С в режиме "Предприятие". Если все сделано правильно, то в строке сообщений появится куча всяких интересных событий AMI. Как минимум, мы должны увидеть событие своей успешной авторизации. Если это случилось - поздравляю, вы слышите Asterisk

А что дальше?


Слышать Asterisk - это прекрасно, но этого мало. С помощью написанного выше, мы можем,не только слушать события, но и выполнять любые команды, доступные в Asterisk AMI. Все необходимые для этого функции 1С у нас уже есть.

Например, для совершения исходящего звонка, можно воспользоваться командой Originate.


    ТекстКоманды="Action: Originate"+CRLF+
    "Channel: SIP/"+СокрЛП(Источник)+CRLF+
    "Context: from-internal"+CRLF+
    "Exten: "+СокрЛП(Приемник)+CRLF+
    "Priority: 1"+CRLF+
    "Callerid: "+СокрЛП(Источник)+CRLF+
    "Timeout: 30000"+CRLF+
    "Async: true"+CRLF;

Пример, вы можете посмотреть в обработке Originate, которая есть в составе конфигурации.


Полный список команд Asterisk AMI можно посмотреть на сайте Asterisk.org, либо в русскоязычной версии справки voip.rus.net.

Форум поддержки внешней компоненты ROM-Asterisk.dll: http://simplit.com.ua/forum/viewforum.php?f=5

Описание внешней компоненты и примера: http://simplit.com.ua/index.php/ip-phone-menu/ipphone-integration-menu/204-1cphone-free

Загрузить готовый пример: http://simplit.com.ua/index.php/downloads-top-menu/category/3-integration?download=10%3Arom-asterisk

Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2011 | Mista.ru

Яндекс.Метрика