Связь 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
127
.zip 390,70Kb 127 Скачать

См. также

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

Реально?
2. Влад Кайзер (Torin) 197 29.01.16 09:01 Сейчас в теме
"... ее проблемами в работе с 1С:Предприятием 3.6..." это чего за платформа?
3. BAZIL BAZIL (wbazil) 104 29.01.16 09:27 Сейчас в теме
4. Егор Иванов (Infactum) 216 29.01.16 09:50 Сейчас в теме
Вот кто бы OpenSource версию опубликовал, да на C++ - цены бы не было..
chizh.84; sashocq; Romankhv7; baracuda; +4 Ответить 1
5. Алексей Ко (Жолтокнижниг) 234 29.01.16 11:22 Сейчас в теме
(0) http://infostart.ru/public/236223/ не? не пробовали? И я так понимаю это COM-компонента?
6. Алексей Ко (Жолтокнижниг) 234 29.01.16 11:29 Сейчас в теме
(4) Infactum, Могу выложить свою реализацию, но в плюсах я не большой специалист
7. Mishgan (BigTaur) 47 29.01.16 14:54 Сейчас в теме
(1) siddy, Посмотрим как писал развитие в планах
(5) Жолтокнижниг, 1. Не пробовал, спасибо, интересно будет посмотреть.
2. Да это Com, с волшебным NativeAPI и как его связать с .Net C# сейчас разбираюсь.
8. Алексей Ко (Жолтокнижниг) 234 29.01.16 16:44 Сейчас в теме
(7) BigTaur, Есть мнение, что никак. C# только COM.
9. Александр Никитин (ManyakRus) 266 29.01.16 18:51 Сейчас в теме
а оно будет работать в 1С 7.7 ?
10. Александр Губанов (gubanoff) 43 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) 47 04.02.16 10:33 Сейчас в теме
(8) Жолтокнижниг, буду пробовать обертку на C++ и другие варианты.
14. Mishgan (BigTaur) 47 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) 47 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) 47 04.02.16 11:43 Сейчас в теме
(16) xorg_c, Какая точно операционка, напиши, я посмотрю.
18. Максим Шуйский (maxpiter) 139 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) 47 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) 47 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) 47 16.03.16 16:28 Сейчас в теме
(24) alexander.nesterenko, К сожалению не знаю как работает ROM_Asterisk.dll и учитывая, что ее поддержка прекращена вероятно не узнаю именно поэтому пришлось заниматься собственной разработкой на основе различных решений.
Как уже писал для получения CDR через мою компоненту, необходима настройка Asterisk.

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

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

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

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

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

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

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

Вопрос: почему в процедуре Connect нет для CDR параметра?
Потому, что так сделал на начальном этапе, но когда начало расти решил отказаться и все сделать методами вкл. откл., чтобы поток сообщений можно было регулировать.
28. Mishgan (BigTaur) 47 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) 47 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 Bykov (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) 58 21.09.16 10:00 Сейчас в теме
(40) TeMochkiN, могу выложить свою, на Native API публиковать тут не хочу, ибо не очень написано как по мне, но с нашей задачей в организации справляется)
42. Сергей Иванов (Джуниор) 59 05.10.16 12:34 Сейчас в теме
Будет ли работать эта компонента по протоколу SCCP? Еще вопрос: при отправке команды звонка, соединение сразу проходит или нужно снимать трубку?
43. ba2000 (ba2000) 13 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) 557 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

И запускай от админа
47. Александр Кузнецов (kuzz) 15.12.16 07:58 Сейчас в теме
(46) Добрый день! Не помогает ни Ваш совет, ни рекомендации из поста (45). Под Win7 компонента прекрасно работает, нет никаких нареканий. Попытки запустить под Win10 продолжаются уже несколько месяцев.

Изначально 1С не видела компоненту. Но после подписи сборок (пост 45) компонента обнаружилась 1С'кой. Однако работать не хочет. Ошибка:

Текст ошибки


Подскажите кто-нибудь как добиться работы под Win10?
48. Сергей Смирнов (Serginio) 557 15.12.16 10:20 Сейчас в теме
49. Александр Кузнецов (kuzz) 15.12.16 10:41 Сейчас в теме
(48) Списывались... К сожалению он прекратил работу над этим проектом(
50. Сергей Смирнов (Serginio) 557 15.12.16 11:40 Сейчас в теме
Надо смотреть зависимости. Возможно не все сборки подписаны либо прав не хватает на папку.
Часто если из архива нужно флаг только для чтения или чего там убрать. Посмотри
51. Сергей Смирнов (Serginio) 557 15.12.16 11:44 Сейчас в теме
52. Александр Кузнецов (kuzz) 15.12.16 13:21 Сейчас в теме
(50) Проверил. По Вашему совету. Блокировок не обнаружил. Флаг "Только чтение" снял. Все заново проделал: отменил регистрацию, заново подписал, зарегистрировал. Ошибка та же. Видимо все-таки компоненты как-то не так подписываются. Хотя по инструкции (45) выдает успешно подписаны и регистрация проходит успешно.
53. Александр Кузнецов (kuzz) 15.12.16 13:22 Сейчас в теме
(51) А нельзя в Win10 изменить политики безопасности? Чтобы отключать строгую подпись компонент?
55. Сергей Смирнов (Serginio) 557 15.12.16 15:58 Сейчас в теме
На всякий случай обнови .Net Framework https://www.microsoft.com/ru-ru/download/details.aspx?id=49981
Хотя сейчас 4.6.2
56. Александр Кузнецов (kuzz) 16.12.16 05:37 Сейчас в теме
(54)(55) Включил логирование по по советам из ссылки. Ситуация такая: библиотека AddIn.dll из этого проекта подключается успешно. А вот именно Asterisk.NET.dll не может подключить по причине отсутствия строго имени - подписать ее корректно не имея исходников не получается. Дальнейшее гугление и ответы из стаковерфлоу говорят о том, что нужно связываться с разработчиком,получать исходники и подписывать ее у себя. Если я все правильно понял. Сейчас еще раз пытаюсь связаться с разработчиком. Если побежу проблему отпишусь.

Всем спасибо за попытку помочь!
58. Сергей Смирнов (Serginio) 557 16.12.16 10:53 Сейчас в теме
59. Вадим Нечаев (kraspila) 17 22.12.16 14:25 Сейчас в теме
Поддерживается ли платформа 1С:Предприятие 8.3 (8.3.8.2027)?
60. Александр Кузнецов (kuzz) 23.12.16 08:44 Сейчас в теме
(59) Ограничений по платформе нет. Есть проблема с подключением компоненты по Win10. Под Win7 все работает на последней версии платформы
63. Иван Сафонов (Fatalist08) 25.01.17 12:50 Сейчас в теме
Подскажите а как установить фильтр по телефону? Ну что бы выплывали не все события звонков а только для нужного аппарата?
Оставьте свое сообщение