Свободная компонента подключения к Asterisk. BROM-Asterisk-Native.dll
25.05.17 22:23

Когда я столкнулся с необходимостью обрабатывать звонки, поступающие на телефоны менеджеров по продажам, я первым делом стал искать что-то бесплатное, так как денег на платные решения в бюджете заложено не было. Да и задачи у меня были не столь глобальными, как предлагают создатели коробочных CRM. Оказалось, что раньше существовала ROM-Asterisk.Dll, которой все счастливо пользовались до выхода платформы 8.3.6, где эта Dll-ка стала тупо зависать.

Ещё несколько часов поисков привели меня на гитхаб. Конкретно сюда: https://github.com/shachneff/BROM-Asterisk-Native

Если кто-то хочет скомпилировать библиотеку самостоятельно, то там есть одна небольшая проблема. Там файл AddInNative.cpp не содержит первые три байта, которые указывают на кодировку UTF-8 (без BOM). Поэтому русские буквы работать не будут, пока не исправите кодировку. А ещё в этих исходниках есть привязка к компьютеру и работа в режиме демо-версии. Режим демо-версии я для себя вырезал. Мне не улабывается бегать по всему предприятию и регистрировать эту библиотеку.

Сама компонента это NativeAPI.

Поэтому, подключаем мы её таким кодом:


		Если ПодключитьВнешнююКомпоненту(АдресКомпоненты, "Asterisk", ТипВнешнейКомпоненты.Native) Тогда
			Телефония = Новый ("AddIn.Asterisk.ROM-Asterisk-Native");
		Иначе
			Сообщить("Не смогли загрузить компоненту BROM-Asterisk-Native.");
		КонецЕсли;

Если компонента нормально подключилась, то у нее доступны следующие свойства:

Подключено (Connected) - показывает, есть ли соединение с портом сервера АТС. 

РежимПрослушивания (Listen) - постоянный мониторинг сокета включен, или нет. Генерятся события ВнешнееСобытие, или нет.

РегулярноеВыражение (RegEx) - выражение, которое фильтрует входящие сообщения от АТС. ВнешнееСобытие генерируется только для подходящих под выражение пакетов.

Версия (Version) - версия Dll. Я не менял номер версии, хоть и отключил привязку к компьютеру

ОшибкаКакСобытие (ErrorAsEvent) - При включенном режиме, компонента не генерирует событие, а просто шлёт во ВнешнееСобытие описание ошибки.

ДемонстрационныйРежим (IsDemo) - Показывает, соответствует ли ключ продукта идентификатору компьютера. Ограничения демо-режма сняты.

Идентификатор (ID) - Идентификатор компьютера

КлючПродукта (Key) - Ключ продукта

И ещё вам доступны методы:

Подключиться(Сервер, Порт) (Connect(Server, Port)) - установить соединение с AMI сервером. После установки соединения вам нужно самим залогиниться на сервер специальной AMI-командой.

Отключиться() (Disconnect()) - отключиться от AMI сервера

ВыполнитьКоманду(Команда) (SendCommand(Command)) - послать команду к АТС

РежимПрослушивания(ДаНет) (ListenMode(YesNo)) - Влючить/отключить режим прослушивания. Режим прослушивания сам по себе не включит поток сообщений. Необходимо попросить сервер слать вам сообщения специальной командой.

УстановитьРегулярноеВыражение(РегулярноеВыражение) (SetRegEx(RegEx)) - Устанавливает фильтр на входящие от сервера сообщения. Дело в том, что даже при "EVENTMASK: call", астериск просто бомбардирует сообщениями (если это конечно рабочая АТС).

В самой обработке для управляемых форм реализованы:

  • Установка и подключение к компоненте.
  • Вход на сервер AMI
  • Обработка сообщений от сервера
  • Простая команда звонка с одного телефона на другой. Originate.

Внимание: Библиотека только для 32-разрядного клиента. Для 64-разрядного клиента или сервера я не пробовал компилировать.

Добавлю бонус. Каждое сообщение от AMI очень удобно положить в структуру, вот таким кодом:


Функция РазложитьЗвонокВСтруктуру(Знач ТекстСервера)
	СтрЗвонка = Новый Структура;
	СтрЗвонка.Вставить("Текст", ТекстСервера);
	Для Счт = 1 По СтрЧислоСтрок(ТекстСервера) Цикл
		ТекСтр = СтрПолучитьСтроку(ТекстСервера, Счт);
		Поз = Найти(ТекСтр, ":");
		Если Поз > 0 Тогда
			Попытка
				СтрЗвонка.Вставить(СокрЛП(Лев(ТекСтр, Поз - 1)), СокрЛП(Сред(ТекСтр, Поз + 1)));
			Исключение
			КонецПопытки;
		КонецЕсли;
	КонецЦикла;
	
	Возврат СтрЗвонка;
КонецФункции

Это, конечно, будут накладные расходы, но так становится заметно удобнее отрабатывать сообщение. У меня так решено в продакшне, а в обработке - нет. Решил поделиться.

Read Full Article