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(СтрокаФильтра)- установить фильтр на базе регулярного выражения
Ссылки
Удачной интеграции!
Автор: simplit