gifts2017

Связь Asterisk и 1С, внешняя компонента

Опубликовал Mishgan (BigTaur) в раздел Программирование - Внешние компоненты

Поддержка ROM-Asterisk прекращена, на 1С: Предприятии 8.3.6 вылетает. Пишем свою.

Столкнувшись с отказом от поддержки ROM-Asterisk, и ее проблемами в работе с 1С:Предприятием 8.3.6.

Для своих задач было решено написать свою компоненту с блек-джеком как минимум.

Компонента написана на C# для .Net 4й фреймворк. Компонента состоит из 2х библиотек Asterisk.NET.dll - для взаимодействия с Asterisk и AddIn.dll - обертка для 1С.

На текущий момент компонента умеет:

  • Подключаться и отключаться от Asterisk, он предварительно должен быть настроен
  • Получать внутри события Dial - Звонок и Hangup - Положить трубку и отправлять их во ВнешнееСобытие 1С, т.е. работает асинхронно и 1С не подвисает.
  • Фильтровать события внутри компоненты с помощью регулярных выражений, чтобы в 1Ску не поступало лишних.
  • Выбирать из сообщений только нужную информацию, с помощью рег. выражений, чтобы потом не обрабатывать в 1Ске
  • При событии Звонок передается "ОпределенныйНомер;Откуда;Куда" могут быть включены добавочные символы разделители, для выборки вида "!ОпределенныйНомер;@Откуда;#Куда"
  • Звонить на внешние и внутренние номера по каналу трубки, т.е. на телефоне пользователя раздается звонок, он снимает трубку и соеденяется с набранным в 1Ске номером.

В архиве компонента, пример для 1С (1С:Предприятие 8.3 (8.3.6.2363) тестировалось), программа для тестировани регулярных выражений, инструкция по установке и описание методов и свойств.

Компонента в любом случае будет развиваться, т.к. необходима для внутреннего пользования, но если она будет интересна, то жду ваших замечаний и предложений. Сейчас самое начало ее развития, поэтому критику прошу конструктивную, т.к. пока она под локальные задачи, но есть желание ее развивать и сделать более универсальной.

-----------------------------------------------

01.03.2016

Новая версия. Изменения:

- Добавлена обработка события CDR, это событие которое выдает сообщение по окончению звонка с информацией о нем, длина, время снятия трубки и другое, далее будет попытка получить файл с записью или путь к нему, после записи звонка. Для того, чтобы событие работало в Астериске должны быть права на чтение CDR и включено отправление CDR в Manager т.е. передача через AMI

- Теперь обработку регулярными выражениями не нужно влючать дополнительно, если строка выражения заполнена оно накладывается если нет то нет.

-Добавлены текстовые комментарии на руском для событий кроме не обрабатываемых (Unhandled), включаются свойством Enabletextlabel, является вытесняющим при формировании сообщения.

- Добавлен обработчик всех событий Астериска, т.е. я например могу не знать всех событий которые нужно отловить и передать в 1С, тогда можно использовать это событие, при включении туда "валится" все, что сообщает сервер, можно фильровать по рег. выражению, как сообщения в событии, так и выбирать выдачу в  1С. Но пока строка фильтра только одна, в ближайших версиях попробую сделать список, чтобы получать от туда не одно событие по фильтру, а выборку по списку, а остальное игнорировать.

Другие мелкие изменения. Более подробно "новости" интерфейса описаны в инструкции.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Asterisk
.zip 390,70Kb
03.03.16
92
.zip 390,70Kb 92 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Егор Фомин (siddy) 29.01.16 00:47
Добрый день!
Из хотелок:
1. Запись разговора - получение файла записи в 1С
2. Конференция
3. Подключение к разговору - т.н. "прослушка" разговора онлайн

Реально?
2. Влад Кайзер (Torin) 29.01.16 09:01
"... ее проблемами в работе с 1С:Предприятием 3.6..." это чего за платформа?
3. BAZIL BAZIL (wbazil) 29.01.16 09:27
4. Егор Иванов (Infactum) 29.01.16 09:50
Вот кто бы OpenSource версию опубликовал, да на C++ - цены бы не было..
chizh.84; sashocq; Romankhv7; baracuda; +4 Ответить 1
5. Алексей Ко (Жолтокнижниг) 29.01.16 11:22
(0) http://infostart.ru/public/236223/ не? не пробовали? И я так понимаю это COM-компонента?
6. Алексей Ко (Жолтокнижниг) 29.01.16 11:29
(4) Infactum, Могу выложить свою реализацию, но в плюсах я не большой специалист
7. Mishgan (BigTaur) 29.01.16 14:54
(1) siddy, Посмотрим как писал развитие в планах
(5) Жолтокнижниг, 1. Не пробовал, спасибо, интересно будет посмотреть.
2. Да это Com, с волшебным NativeAPI и как его связать с .Net C# сейчас разбираюсь.
8. Алексей Ко (Жолтокнижниг) 29.01.16 16:44
(7) BigTaur, Есть мнение, что никак. C# только COM.
9. Александр Никитин (ManyakRus) 29.01.16 18:51
а оно будет работать в 1С 7.7 ?
10. Александр Губанов (gubanoff) 01.02.16 11:46
В компоненте ROM-Asterisk используем следующее:
- получение данных от компоненты по событиям Dial, Bridge, Hangup, Varset (для записи разговоров), Status;
- фильтры входящих событий по регулярным выражениям;
- выполнение произвольной команды в астериске.

Тут все это доступно? С удовольствием бы перешел на вашу компоненту, если это есть.
11. В В (xorg_c) 02.02.16 12:33
Библиотеки AddIn.dll и Asterisk.NET.dll 32-х или 64-х разрядные? После успешной регистрации в ОС 64-х Windows 8.1 не удается подключить компоненту в обработке "ТестКомпоненты". Регил под правами админа, в 1С зашел тоже под правами админа. Что я делаю не так?
12. Вадим Окунев (Upiterus) 03.02.16 20:52
13. Mishgan (BigTaur) 04.02.16 10:33
(8) Жолтокнижниг, буду пробовать обертку на C++ и другие варианты.
14. Mishgan (BigTaur) 04.02.16 10:41
(11) xorg_c, Библиотеки собраны под любой процессор. Если честно, то на 32х я не пробовал еще. Для x64 проверялось на Win7 и Win10. Возможно там в файлах регистрации есть недочет. Совместно к ключу /tlb нужно добавить /codebase
Например
regasm.exe "C:\Asterisk\AddIn.dll" /tlb /codebase
15. Mishgan (BigTaur) 04.02.16 10:43
(10) gubanoff, Пока нет. Но есть планы на развитие. Что есть сейчас.
- получение данных от компоненты по событиям Dial, Hangup
- фильтры входящих событий по регулярным выражениям;
- отбор в сообщении для 1С по рег. выражению, чтобы не обрабатывать сообщение в 1С.
16. В В (xorg_c) 04.02.16 10:47
BigTaur, пробовал, при добавлении в Components пишет: "Один или несколько файлов не содержат ни компонентов, ни библиотек типов. Установить их нельзя." Так же пробовал через обертку уже зарегистрированных компонентов. Они добавились , но при обращении к ним через "ПодключитьВнешнююКомпоненту(IDComp)" выдает "ложь". Собери пжаста для 64-х серва
17. Mishgan (BigTaur) 04.02.16 11:43
(16) xorg_c, Какая точно операционка, напиши, я посмотрю.
18. Максим Шуйский (maxpiter) 07.02.16 18:21
Добрый день.
А набор доп номера/ов у вас реализован?
К примеру звоним 123-45-67 потом пауза и 0, пауза и 2
20. Александр Нестеренко (alexander.nesterenko) 03.03.16 11:45
Добрый день.
С какой версией Астериска у вас работает компонента?
У меня при подключении выдает ошибку:

Данные: Asterisk.NET.Manager.ManagerException: Unknown Asterisk version 1.8.27
at Asterisk.NET.Manager.ManagerConnection.determineVersion()
at Asterisk.NET.Manager.ManagerConnection.login(Int32 timeout)
at AddIn.SkaAsterisk.Connect(String Asterisk_Host, Int32 Asterisk_Port, String Asterisk_Login, String Asterisk_Loginpwd, Boolean DialEvent, Boolean HangupEvent)
21. Mishgan (BigTaur) 03.03.16 15:40
(20) alexander.nesterenko,
Выложил версию с исправлением данной ошибки, при проверке версии Asterisk'а. Попробуйте, если не трудно напишите заработало или нет, т.к. у меня не ваша версия.
22. Александр Нестеренко (alexander.nesterenko) 09.03.16 12:28
(21) BigTaur,
Обработка заработала, спасибо! Удалось подключиться к Asterisk. В тестовой обработке при нажатии на кнопку |Событие|, идет вызов метода asEv() (в описании метода указано" Тестовое, не исп"). В результате компонента оповещает внешним событием форму обработки, и выводит одно из последних событий.

Вопрос: как сделать так, чтобы компонента оповещала форму о событиях по мере их поступление? вызывать asEv() по в обработчике ожидания? Тогда с каким интервалом, чтобы гарантировано не пропустить ничего?

Вроде, в тестовой обработки, все что нужно для этого - сделано:
Компонента.EnableCDREvent();
Компонента.EnableTextLabel = Истина;
Компонента.EnableUnhandledEvent();
что делать дальше?
23. Mishgan (BigTaur) 11.03.16 11:41
(22) alexander.nesterenko,

Если работает тестовое asEv(), и событие приходит в 1С значит компонента работает.
Для того чтобы приходило оповещение о CDR (Компонента.EnableCDREvent()), должен быть соответствующим образом настроен Астериск, чтобы он отправлял CDR в Manager (например у меня по умолчанию не было), как это сделать должен знать спец. по Астериску, либо искать в Интернете. Лучше сначала попробовать на событии Dial например, оповещение должно приходить по звонку.
24. Александр Нестеренко (alexander.nesterenko) 15.03.16 13:32
(23) BigTaur,
До этого использовали ROM_Asterisk.dll
Сервер Asterisk соответственно - настроен.
После вызова метода РежимПрослушивания(1) старой компоненты(ROM_Asterisk), внешние события сыпались автоматом.
Здесь же,этого не происходит.
В чем еще может быть причина?
25. Юлия Зверева (Julz) 16.03.16 09:42
Здравствуйте!

У меня обработка ТЕСТ видит только события звонок и положить трубку, так же было замечено, что если через Connect передать два последних параметра ложь и ложь, то потом никакими процедурами подключить прослушивание звонков нельзя. Вопрос: почему в процедуре Connect нет для CDR параметра? Можно ли добавить? Получается, что все события EnableEvent не включают прослушивание, а включается оно только Connect.
26. Mishgan (BigTaur) 16.03.16 16:28
(24) alexander.nesterenko, К сожалению не знаю как работает ROM_Asterisk.dll и учитывая, что ее поддержка прекращена вероятно не узнаю именно поэтому пришлось заниматься собственной разработкой на основе различных решений.
Как уже писал для получения CDR через мою компоненту, необходима настройка Asterisk.

Для теста попробуйте убрать CDR и получить хотя-бы звонок

Компонента.EnableDialEvent();
Или инициализировать событие звонок при коннекте
Компонента.Connect("",,"","",Истина,Ложь);

Событие должно поступать в обработчик 1С, он должен быть прописан в свойствах формы как ВнешнееСобытие

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)

Сообщить("Источник: " + Источник);
Сообщить("Событие: " + Событие);
Сообщить("Данные: " + Данные);

КонецПроцедуры

Строки фильтрации должны быть пусты. Звонок фикс. стандартно и должно работать. Если нет, смотреть права пользователя который подключается на Asterisk`e
27. Mishgan (BigTaur) 16.03.16 16:34
(25) Julz, Странно, специально сделал проверку вкл., откл событий все события включаются и отключаются с помощью методов Enable[EventName]Event компоненты. Включение производил после коннекта к Астериску.
Попробуйте получить последнее исключение после включения, Компонента.LastExceptionMessage, может, ошибки внутри компоненты возникают.

Вопрос: почему в процедуре Connect нет для CDR параметра?
Потому, что так сделал на начальном этапе, но когда начало расти решил отказаться и все сделать методами вкл. откл., чтобы поток сообщений можно было регулировать.
28. Mishgan (BigTaur) 16.03.16 16:40
Так же в ходе тестирования обнаружил, что когда событий одновременно много, то часть из них "теряется", вероятно 1Ска не успевает их обрабатывать, либо они как-то одновременно приходят, этот момент сейчас изучается.

Еще планирую убрать вывод с символьными метками, т.к. они могут пересекаться с символами рег. выражений и на мой взгляд это лишнее.
Вместо этого будет добавлен "Дикий вывод", т.е. на вход к фильтрации или без нее будет подаваться строка со всеми данными из Asterisk, т.к. можно настраивать параметры различные (в частности CDR), которые предугадать и описать не возможно.
29. Юлия Зверева (Julz) 17.03.16 18:05
Пишу процедуру Соединить в форме тестовой обработки:
...................
Результат = Компонента.Connect("_____,_____,______,________,ложь,ложь);
сообщить(Компонента.EnableDialEvent());
Сообщить(Компонента.LastExceptionMessage);
....................

Вывод на экран два сообщения:
Да
//пустое сообщение

Кнопка Событие выводит в строке Данные пустую строку

Пишу в процедуре вместо тех трех строк:
.....................
Результат = Компонента.Connect("_____,_____,______,________,истина,ложь);
..................
Кнопка Событие возвращает в строке Данные информацию о звонке.

Тестировала кучу раз. Не получается. Вывод: я не могу пользоваться CDR
30. feoddor alexeev (feoddor) 18.03.16 10:05
(26) BigTaur, пишу от имени alexander.nesterenko (именно я занимаюсь разработкой).

Убрал CDR, оставил только EnableDialEvent(). Результата - нет. Внешние события не приходят.
Звонить пробовал, звонок - проходит. при этом внешних событий, по прежнему нет.
Куда теперь копать?
Спасибо.
31. Александр Нестеренко (alexander.nesterenko) 30.03.16 11:04
Уважаемый BigTaur.
Ответьте пож. на вопрос feoddor.
Спасибо
32. Дмитрий Шашков (Paltash) 13.04.16 17:12
(28) BigTaur,
Приветствую!
Присоединяюсь к 30 и 31.
Плюс ещё вопрос: Почему компонента постоянно перелогинивается?

ПыСы Компонента.asEv() - отрабатывает норм.
А вот при приходе звонка - ничего не проявляется.
33. Александр Нестеренко (alexander.nesterenko) 19.04.16 18:12
Я так понимаю, что автор "пропал". Печально очень.
34. Mishgan (BigTaur) 20.04.16 10:47
:) Нет, "не пропал", но сыграли аврал на работе и пока времени не хватает.
У кого не возникают события, выложите если можно права подключающегося пользователя из Астериск, версию Астериск.
Так же было бы интересно возникают-ли события при подключению к Астериск через Телнет под данным пользователем.
Я постараюсь в ближайшее время выложить программку которая получает данные с компоненты без 1С, но нужно время, чтобы от туда лишнее убрать.
35. ildar saitov8 (Raspik) 27.04.16 09:02
Добрый день, все работает хорошо, но я с толкнулся с проблемой мне нужно сделать подключение через сервер но подключитьвнешнююкомпаненту не работает в серверном режиме, новый comобъект ругается что AddIn.SkaAsterisk не зареган Connector= Новый COMОбъект("AddIn.SkaAsterisk");по причине:-2147221164(0x80040154): Class not registered, но я его зарегистрировал кто нибудь на сервер не переводи??( windows server 2003)
36. feoddor alexeev (feoddor) 11.05.16 12:34
Версия Asterisk: 5.211.65-12
Права пользователя- ALL (точнее все галки, кроме ALL)
37. Max (Masich) 20.05.16 21:44
Я правильно понял, что компонента работает с Астериском по AMI?

В таком случае пакеты на приеме могут теряться по причине малого размера буфера очереди событий.
Обратите внимание на

HRESULT SetEventBufferDepth(long lDepth)

38. Александр Кузнецов (kuzz) 09.07.16 14:46
Добрый день! Под Win7 платформа 8.3.8 все запустилось и работает отлично. Под Win8 получаю ошибку "Не удалось загрузить компоненту", Microsoft.NET установлен, компонента в системе зарегистрирована. Что я сделал не так?
39. Алексей Кит (kitun) 28.07.16 08:07
Добрый день, судя по bat-ку нужен именно
NET Framework v 4.0.30319 ?
40. Артём Артёмов (TeMochkiN) 27.08.16 15:46
на гитхабе не хотите выложить?
41. Дмитрий Королев (ArchLord42) 21.09.16 10:00
(40) TeMochkiN, могу выложить свою, на Native API публиковать тут не хочу, ибо не очень написано как по мне, но с нашей задачей в организации справляется)
42. Сергей Иванов (Джуниор) 05.10.16 12:34
Будет ли работать эта компонента по протоколу SCCP? Еще вопрос: при отправке команды звонка, соединение сразу проходит или нужно снимать трубку?
43. ba2000 (ba2000) 01.11.16 16:53
проконсультируйте плиз. слушать астериск получается, а звонки выполнять нет.
выдает ошибку

ManagerError {DateReceived:16:51:05; Message:Invalid channel; Response:Error}

номера телефонов в тесте компоненты указываю внутренние двухзначные.
44. Valery V (Valery19071988) 24.11.16 14:48
Скачали обратку и прилагающиеся файлы. Windows10,64 разрядная. Зарегистрировали dll-ки, сгенерился файл AddIn.tlb. При запуске прилагающейся обработки 1С при попытке подключить компоненту вот в этом фрагменте:

Если Не ПодключитьВнешнююКомпоненту("AddIn.SkaAsterisk") Тогда
Предупреждение("Не удалось загрузить компоненту");
Возврат Ложь;
КонецЕсли;

Вылезает сообщение "Не удалось загрузить компоненту". AddIn.SkaAsterisk в реестре зарегестрирован. В чем дело может быть?
45. Valery V (Valery19071988) 25.11.16 14:38
Разобралась, напишу, вдруг кому пригодится.
Компонента AddIn.dll в архиве сабжа - неподписанная. У нее нет строгого имени. Поэтому у нас она не регилась bat-ом из архива же.
Делаем вот что: скачиваем Visual Studio Community. Там есть инструмент - командная строка разработчика. В этой командной строке выполняем последовательность команд, описанную здесь : http://itw66.ru/blog/c_sharp/502.html
Далее меняем батник, как сказал сам автор темы - добавляем параметр codebase. Теперь он выглядит так:
@ECHO OFF
REM The following directory is for .NET 4.0
set DOTNETFX4=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX4%
echo ---------------------------------------------------
regasm.exe "AddIn.dll" /tlb /codebase
echo ---------------------------------------------------

ну и запускаем его из под командной строки. В моем случае - все зарегилось и 1с компоненту увидела. но почему-то не может к ней подключиться. копаю дальше. квест однако.

46. Сергей Смирнов (Serginio) 25.11.16 15:56
Откуда запускаешь, С клиента 32,64 разрядного, С сервера?
Регистрировать нужно в 2х ветках. Вот пример моего. Запускается из каталога с регистрируемой DLL

@echo off
setlocal
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "%~dp0NetObjetToIDispatch45.dll" /codebase

%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe "%~dp0NetObjetToIDispatch45.dll" /codebase

NetObjetToIDispatch45.dll замени на свою DLL

И запускай от админа
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа