Свободная библиотека для интеграции 1С и Asterisk

Cтолкнулся с задачей интеграции 1С и Asterisk. Сразу же выяснилось, что Asterisk дает API для доступа снаружи (Asterisk Management Interface, сокращенно AMI) — мол, подключайтесь из любого приложения и работайте. Чем, собственно, активно пользуются разработчики ПО при интеграции с Asterisk.

А вот с 1С была проблема… Отсутствовала хорошая и главное — бесплатная библиотека для связи 1С и Asterisk. Захотелось исправить эту ситуацию. Поэтому, была написана свободная DLL-библиотека (в терминах 1С — «внешняя компонента») для связи 1C и Asterisk.

Статья будет полезна в первую очередь для программистов 1С. Речь пойдет о библиотеке и некоторых аспектах интеграции 1С и Asterisk.

О библиотеке


Библиотека ROM-Asterisk является свободной. Реализует асинхронный неблокируемый сокет, основанный на событиях. Платформа 1С: Предприятие налагает определенные требования при разработке внешних библиотек, поэтому, DLL написана в строгом соответствии с рекомендациями 1С. Из особенностей библиотеки, хочется отметить реализацию внутри нее фильтров на базе регулярных выражений.

Особенности фильтрации событий AMI


В Asterisk, только начиная с версии 10 появилась возможность гибкой фильтрации событий AMI. До версии 10, клиент AMI вынужден обрабатывать избыточное количество событий.

Приведу пример пакета AMI при входящем звонке, чтобы было понятнее:

Event: Dial
Privilege: call,all
SubEvent: Begin
Channel: SIP/202-0000019c
Destination: SIP/200-0000019d
CallerIDNum: 202
CallerIDName: Operator202
ConnectedLineNum: 200
ConnectedLineName: Operator200
UniqueID: 1335616897.790
DestUniqueID: 1335616897.791
Dialstring: 200


Средствами Asterisk, можно установить фильтр на классы привилегий Privilege: call, dialplan, agent, и т.д. Но, нельзя ограничить клиента подпиской только на определенные типы событий внутри класса привилегий — Event: Dial, Bridge, Hangup и т.д. И уж тем более, нельзя накладывать фильтр по значению поля события — ConnectedLineNum: 200.

Хотелось, чтобы кесарю — кесарево.
Допустим, сеансу пользователя 1С необходимо отслеживать состояние его настольного IP-телефона/софтфона с внутренним номером 200 и в случае входящего звонка открыть форму «Карточка клиента».
При этом, сеанс 1С получит абсолютно все события «Event: Dial», возникшие в Asterisk. Потом, он должен их все проанализировать и выбрать только те, которые относятся к номеру 200. Куча бесполезной работы!

Фильтрация событий на стороне библиотеки


Чтобы избавить сеанс пользователя 1С от получения ненужных событий, на стороне библиотеки реализованы методы фильтрации событий. Велосипед изобретать не хотелось, поэтому, использован механизм регулярных выражений, основанный на PCRE

Пример фильтра: Dial.{1,}?200|Bridge.{1,}?200|Hangup.{1,}?200

Теперь, сеанс 1С получит внутри класса привилигий call, только события Dial, Bridge, Hangup, причем только те, в которых есть номер 200.

Настройка со стороны Asterisk


Ничего сложного. В случае использования чистого 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 ; Разрешить несколько подключений с одним именем


Секция, которая отвечает за пользователя:

[user1c] ; имя пользователя
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,command,agent ; список классов событий
write=system,call,command,agent ; список классов команд


В случае использования FreePBX версии 2.9 и выше, настройка выполняется через веб-интерфейс.

Использование в среде 1С: Предприятие


Библиотека будет работать в 1С версий 7.7, 8.1, 8.2. Единственное ограничение — запуск в режиме веб-клиента в версии 8.2. Это вынужденная мера — пришлось пожертвовать веб-клиентом 8.2 ради совместимости с версией 7.7.

Загрузка выполняется с помощью стандартных методов 1С: ЗагрузитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту.

События, полученные внешней компонентой ROM-Asterisk в среде 1С будут доступны в предопределенной процедуре ОбработкаВнешнегоСобытия

Свойства компоненты:

Подключено / Connected – (чтение) состояние подключения к Asterisk
Фильтр / Filter – (чтение) обычный строковый фильтр, для поиска вхождения подстроки
РегулярноеВыражение / RegEx – (чтение) фильтр, на основе регулярного выражения
РежимПрослушивания / Listen – (чтение) режим прослушивания событий Asterisk AMI, 1-включен, 0-нет
Версия / Version – (чтение) версия внешней компоненты

Методы компоненты:

Подключиться / Connect ( IP, Port) — установить соединение с AMI сервера Asterisk
Отключиться / Disconnect( ) — разорвать соединение с сервером Asterisk
ВыполнитьКоманду / SendCommand(СтрокаКоманды)- выполнить произвольную команду Asterisk AMI
РежимПрослушивания / ListenMode(Флаг)- включить/выключить режим прослушивания событий Asterisk AMI, 1-включить, 0-выключить
УстановитьФильтр / SetFilter(СтрокаФильтра)- установить обычный вхождения подстроки
УстановитьРегулярноеВыражение / SetRegEx(СтрокаФильтра)- установить фильтр на базе регулярного выражения

Ссылки


Готовый пример для версии 8.2

Описание свойств и методов

Удачной интеграции!
Share post

Comments 12

    0
    Интересно было бы послушать как это используется в компании на примере!
      +1
      У нас это применяется так:
      1) При входящем звонке идет поиск клиента в базе 1С по номеру телефона, затем автоматически создается документ «Событие» с признаком «Входящий звонок»
      2) Для исходящих звонков из различных форм 1С «click-to-call»
      3) Автоматически создается документ «Событие» при исходящем звонке
      4) Для хранения ссылок на файлы записи разговора с привязкой к документу «Событие»
      5) Для прослушивания разговора «в один клик»

      Еще, используется привязка клиента к его менеджеру для прямой маршрутизации клиента на своего менеджера. Это напрямую к теме не относится, но если интересно, то расскажу.
        0
        То есть получается примерно так: у секретаря открыта 1С, когда поступает звонок, у нее появляется уведомление в 1С с карточкой информации о клиенте. Примерно так?
          0
          Да, только лучше. Появляется у сотрудника, на которого пришел звонок. Например, если секретаря нет на месте. Если все же звонок взял секретарь и потом переключил на специалиста, то в 1С создается сооттветствующая цепочка связанных событий
            0
            Да, тогда очень интересно и полезно! Из пожеланий доделайте поддержку тонкого клиента, думаю в будущем многих менеджеров переведут на тонкий(веб клиент)1С, у нас все движется к этому!
              0
              Спасибо. Тонкий клиент и сейчас поддерживается. А поддержка веб-клиента запланирована на 4 квартал этого года.
      0
      Как поведет себя библиотека при 200+ клиентах? Понятно, что сама компонента выполняться будет на клиенте. Но вот как она разделенный доступ к событиям обрабатывает? Подклчит 200 AMI-операторов с одинаковыми логинами? Каждый оператор увидет каждое событие?
        0
        Как вы правильно заметили, компонента выполняется на клиенте. Она и не должна обрабатывать разделенный доступ — это делает Asterisk AMI. Компонента — это клиент AMI.
        Насчет 200+ клиентов, то при большом количестве подключений, сам AMI начинает глючить — обрыв соединений, задержки. Лечится с помощью AMI-proxy.
        0
        Есть библиотека Asterisk.NET жеж. Вполне себе свободная. Реализует тот самый AMI протокол. Я не специалист в 1С, но неужели к нему нельзя прикрутить .Net сборку?
          0
          Есть. Но, как написано выше, 1С хочет «особенных» библиотек для интеграции с собой родимой. 1С даже название для таких dll придумал — «внешняя компонента»
            0
            А как эти внешние компоненты используются из 1С-ки? Есть напрямую .Net сборку не заюзать, то COM, видимо? И если да, то почему не написать легкую COM-обёртку для той же Asterisk.NET? Или там всё как-то более по-другому? И если да, то как?
              0
              В принципе, можно и .Net использовать, можно и COM-обертку написать, не напрямую конечно, но способы есть к 1С их прикрутить. По большому счету, для реализации обмена с AMI кроме сокета особо ничего и не нужно. Все остальное легко реализуется средствами 1С.

        Only users with full accounts can post comments. Log in, please.