Книга знаний |
|
| 1С:Предприятие / Приемы программирования / Внешние компоненты |
|
| Пример интеграции 1С:Предприятие и Asterisk PBX. Прослушивание событий, совершение исходящих звонков, отправка команд в Asterisk. | Автор статьи: oleg rizvanov | Редакторы: Последняя редакция №7 от 27.04.12 | История URL: http://kb.mista.ru/article.php?id=860 |
Какая самая распространенная система IP-телефонии? Правильно - Asterisk.
Какая самая распространенная учетная система? Правильно - 1С.
А если их подружить, тогда - профит.
У Asterisk-а есть свой API, через который мы и будем подключаться к нему. Называется он AMI - Asterisk Management Interface. Со стороны 1С будем использовать механизм внешних компонент.
Asterisk.dll только для 1С версии 8.х, к тому же у этой ВК нет универсального метода отправки команд в AMI, она может только позвонить и все. Не подходит. :(
Obeliks - ограничения функциональности в шареварной версии. Каждый час перезагрузка, разговор 3 минуты. Снятие ограничений только в платной версии. Не подходит. :(
VVSAst.dll - для версии 7.7 ограничений нет, для 8.х - платно. Есть универсальные методы отправки команд в AMI. Подходит частично - только для 7.7 :(
ROM-Asterisk.dll - полностью свободная и для 7.7, и для 8.х. Есть универсальные методы отправки команд в AMI. Есть мощная система фильтрации. Подходит для всех версий.
Функция _АстерискЗагрузитьВК()Экспорт;
Попытка
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"ROM-Asterisk.dll");
_Телефония = СоздатьОбъект("AddIn.ROM-Asterisk");
Возврат 1;
Исключение
Сообщить("Не удалось загрузить внешнюю компоненту для связи с Asterisk");
КонецПопытки;
Возврат 0;
КонецФункции
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
Если Источник="ROM-Asterisk" Тогда
Сообщить(Данные);
Возврат;
КонецЕсли;
КонецПроцедуры
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 ; список классов команд
Action: login
Username: admin
Secret: passwd1234
Response: Success
Message: Authentication accepted
Перем _Телефония Экспорт;
Функция _АстерискСоединиться(IP,Port=5038)Экспорт _Телефония.Connect(IP,Port); Если _Телефония.Connected=0 Тогда Сообщить("Ошибка соединения"); Возврат 0; КонецЕсли; Возврат 1; КонецФункции
Функция _АстерискВыполнитьКоманду(ТекстКоманды) Экспорт;
Если _Телефония.Connected=0 Тогда
Сообщить("Соединение не установлено");
Возврат 0;
КонецЕсли;
ТекстКоманды=ТекстКоманды+РазделительСтрок;
Флаг=_Телефония.ВыполнитьКоманду(ТекстКоманды);
Если Флаг=0 Тогда
Сообщить("Asterisk. Выполнение команды. Ошибка: "+КодОшибки);
Сообщить("Asterisk. ТекстКоманды: "+ТекстКоманды);
КонецЕсли;
Возврат Флаг;
КонецФункции
Функция _АстерискАвторизоваться(Юзер,Хеш)Экспорт
CRLF=РазделительСтрок;
ТекстКоманды="Action: login"+CRLF+
"Username: "+Юзер+CRLF+
"Secret: "+Хеш+CRLF;
Если _АстерискВыполнитьКоманду(ТекстКоманды)=0 Тогда
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции
Процедура _АстерискСлушать() Экспорт;
Если _Телефония.Connected=0 Тогда
Сообщить("Соединение не установлено");
Возврат;
КонецЕсли;
_Телефония.РежимПрослушивания(1);
КонецПроцедуры
Если _АстерискЗагрузитьВК()=1 Тогда Если _Телефония.Connected=0 Тогда Если _АстерискСоединиться("192.168.1.100",5038)=0 Тогда Сообщить("Не удалось соединиться с сервером Астериск"); Возврат; КонецЕсли; АмиПользователь="admin"; АмиХешПароля="password1234"; Если _АстерискАвторизоваться(АмиПользователь,АмиХешПароля)=0 Тогда Сообщить("Не удалось авторизоваться на сервере Астериск"); Возврат; КонецЕсли; КонецЕсли; _АстерискСлушать(); КонецЕсли;
Например, для совершения исходящего звонка, можно воспользоваться командой Originate.
ТекстКоманды="Action: Originate"+CRLF+
"Channel: SIP/"+СокрЛП(Источник)+CRLF+
"Context: from-internal"+CRLF+
"Exten: "+СокрЛП(Приемник)+CRLF+
"Priority: 1"+CRLF+
"Callerid: "+СокрЛП(Источник)+CRLF+
"Timeout: 30000"+CRLF+
"Async: true"+CRLF;
Полный список команд 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
Описание
| Рубрикатор
| Поиск
| ТелепатБот
| Захваченные статьи
| Установки
| Форум
|