Книга знаний |
|
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
Описание
| Рубрикатор
| Поиск
| ТелепатБот
| Захваченные статьи
| Установки
| Форум
|