Добрый день!
Из хотелок:
1. Запись разговора - получение файла записи в 1С
2. Конференция
3. Подключение к разговору - т.н. "прослушка" разговора онлайн
(1) siddy, Посмотрим как писал развитие в планах
(5) Жолтокнижниг, 1. Не пробовал, спасибо, интересно будет посмотреть.
2. Да это Com, с волшебным NativeAPI и как его связать с .Net C# сейчас разбираюсь.
В компоненте ROM-Asterisk используем следующее:
- получение данных от компоненты по событиям Dial, Bridge, Hangup, Varset (для записи разговоров), Status;
- фильтры входящих событий по регулярным выражениям;
- выполнение произвольной команды в астериске.
Тут все это доступно? С удовольствием бы перешел на вашу компоненту, если это есть.
(10) gubanoff, Пока нет. Но есть планы на развитие. Что есть сейчас.
- получение данных от компоненты по событиям Dial, Hangup
- фильтры входящих событий по регулярным выражениям;
- отбор в сообщении для 1С по рег. выражению, чтобы не обрабатывать сообщение в 1С.
Библиотеки AddIn.dll и Asterisk.NET.dll 32-х или 64-х разрядные? После успешной регистрации в ОС 64-х Windows 8.1 не удается подключить компоненту в обработке "ТестКомпоненты". Регил под правами админа, в 1С зашел тоже под правами админа. Что я делаю не так?
(11) xorg_c, Библиотеки собраны под любой процессор. Если честно, то на 32х я не пробовал еще. Для x64 проверялось на Win7 и Win10. Возможно там в файлах регистрации есть недочет. Совместно к ключу /tlb нужно добавить /codebase
Например
regasm.exe "C:\Asterisk\AddIn.dll" /tlb /codebase
BigTaur, пробовал, при добавлении в Components пишет: "Один или несколько файлов не содержат ни компонентов, ни библиотек типов. Установить их нельзя." Так же пробовал через обертку уже зарегистрированных компонентов. Они добавились , но при обращении к ним через "ПодключитьВнешнююКомпоненту(IDComp)" выдает "ложь". Собери пжаста для 64-х серва
(20) alexander.nesterenko,
Выложил версию с исправлением данной ошибки, при проверке версии Asterisk'а. Попробуйте, если не трудно напишите заработало или нет, т.к. у меня не ваша версия.
22.
alexander.nesterenko
09.03.16 12:28 Сейчас в теме
(21)
Обработка заработала, спасибо! Удалось подключиться к Asterisk. В тестовой обработке при нажатии на кнопку |Событие|, идет вызов метода asEv() (в описании метода указано" Тестовое, не исп"). В результате компонента оповещает внешним событием форму обработки, и выводит одно из последних событий.
Вопрос: как сделать так, чтобы компонента оповещала форму о событиях по мере их поступление? вызывать asEv() по в обработчике ожидания? Тогда с каким интервалом, чтобы гарантировано не пропустить ничего?
Вроде, в тестовой обработки, все что нужно для этого - сделано:
Компонента.EnableCDREvent();
Компонента.EnableTextLabel = Истина;
Компонента.EnableUnhandledEvent();
что делать дальше?
Если работает тестовое asEv(), и событие приходит в 1С значит компонента работает.
Для того чтобы приходило оповещение о CDR (Компонента.EnableCDREvent()), должен быть соответствующим образом настроен Астериск, чтобы он отправлял CDR в Manager (например у меня по умолчанию не было), как это сделать должен знать спец. по Астериску, либо искать в Интернете. Лучше сначала попробовать на событии Dial например, оповещение должно приходить по звонку.
24.
alexander.nesterenko
15.03.16 13:32 Сейчас в теме
(23)
До этого использовали ROM_Asterisk.dll
Сервер Asterisk соответственно - настроен.
После вызова метода РежимПрослушивания(1) старой компоненты(ROM_Asterisk), внешние события сыпались автоматом.
Здесь же,этого не происходит.
В чем еще может быть причина?
(24) alexander.nesterenko, К сожалению не знаю как работает ROM_Asterisk.dll и учитывая, что ее поддержка прекращена вероятно не узнаю именно поэтому пришлось заниматься собственной разработкой на основе различных решений.
Как уже писал для получения CDR через мою компоненту, необходима настройка Asterisk.
Для теста попробуйте убрать CDR и получить хотя-бы звонок
Компонента.EnableDialEvent();
Или инициализировать событие звонок при коннекте
Компонента.Connect("",,"","",Истина,Ложь);
Событие должно поступать в обработчик 1С, он должен быть прописан в свойствах формы как ВнешнееСобытие
Строки фильтрации должны быть пусты. Звонок фикс. стандартно и должно работать. Если нет, смотреть права пользователя который подключается на Asterisk`e
(26) пишу от имени alexander.nesterenko (именно я занимаюсь разработкой).
Убрал CDR, оставил только EnableDialEvent(). Результата - нет. Внешние события не приходят.
Звонить пробовал, звонок - проходит. при этом внешних событий, по прежнему нет.
Куда теперь копать?
Спасибо.
У меня обработка ТЕСТ видит только события звонок и положить трубку, так же было замечено, что если через Connect передать два последних параметра ложь и ложь, то потом никакими процедурами подключить прослушивание звонков нельзя. Вопрос: почему в процедуре Connect нет для CDR параметра? Можно ли добавить? Получается, что все события EnableEvent не включают прослушивание, а включается оно только Connect.
(25) Julz, Странно, специально сделал проверку вкл., откл событий все события включаются и отключаются с помощью методов Enable[EventName]Event компоненты. Включение производил после коннекта к Астериску.
Попробуйте получить последнее исключение после включения, Компонента.LastExceptionMessage, может, ошибки внутри компоненты возникают.
Вопрос: почему в процедуре Connect нет для CDR параметра?
Потому, что так сделал на начальном этапе, но когда начало расти решил отказаться и все сделать методами вкл. откл., чтобы поток сообщений можно было регулировать.
Так же в ходе тестирования обнаружил, что когда событий одновременно много, то часть из них "теряется", вероятно 1Ска не успевает их обрабатывать, либо они как-то одновременно приходят, этот момент сейчас изучается.
Еще планирую убрать вывод с символьными метками, т.к. они могут пересекаться с символами рег. выражений и на мой взгляд это лишнее.
Вместо этого будет добавлен "Дикий вывод", т.е. на вход к фильтрации или без нее будет подаваться строка со всеми данными из Asterisk, т.к. можно настраивать параметры различные (в частности CDR), которые предугадать и описать не возможно.
Пишу процедуру Соединить в форме тестовой обработки:
...................
Результат = Компонента.Connect("_____,_____,______,________,ложь,ложь);
сообщить(Компонента.EnableDialEvent());
Сообщить(Компонента.LastExceptionMessage);
....................
Вывод на экран два сообщения:
Да
//пустое сообщение
Кнопка Событие выводит в строке Данные пустую строку
Пишу в процедуре вместо тех трех строк:
.....................
Результат = Компонента.Connect("_____,_____,______,________,истина,ложь);
..................
Кнопка Событие возвращает в строке Данные информацию о звонке.
Тестировала кучу раз. Не получается. Вывод: я не могу пользоваться CDR
:) Нет, "не пропал", но сыграли аврал на работе и пока времени не хватает.
У кого не возникают события, выложите если можно права подключающегося пользователя из Астериск, версию Астериск.
Так же было бы интересно возникают-ли события при подключению к Астериск через Телнет под данным пользователем.
Я постараюсь в ближайшее время выложить программку которая получает данные с компоненты без 1С, но нужно время, чтобы от туда лишнее убрать.
Добрый день, все работает хорошо, но я с толкнулся с проблемой мне нужно сделать подключение через сервер но подключитьвнешнююкомпаненту не работает в серверном режиме, новый comобъект ругается что AddIn.SkaAsterisk не зареган Connector= Новый COMОбъект("AddIn.SkaAsterisk");по причине:-2147221164(0x80040154): Class not registered, но я его зарегистрировал кто нибудь на сервер не переводи??( windows server 2003)
Добрый день! Под Win7 платформа 8.3.8 все запустилось и работает отлично. Под Win8 получаю ошибку "Не удалось загрузить компоненту", Microsoft.NET установлен, компонента в системе зарегистрирована. Что я сделал не так?
(40) TeMochkiN, могу выложить свою, на Native API публиковать тут не хочу, ибо не очень написано как по мне, но с нашей задачей в организации справляется)
Скачали обратку и прилагающиеся файлы. Windows10,64 разрядная. Зарегистрировали dll-ки, сгенерился файл AddIn.tlb. При запуске прилагающейся обработки 1С при попытке подключить компоненту вот в этом фрагменте:
Если Не ПодключитьВнешнююКомпоненту("AddIn.SkaAsterisk") Тогда
Предупреждение("Не удалось загрузить компоненту");
Возврат Ложь;
КонецЕсли;
Вылезает сообщение "Не удалось загрузить компоненту". AddIn.SkaAsterisk в реестре зарегестрирован. В чем дело может быть?
Разобралась, напишу, вдруг кому пригодится.
Компонента 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с компоненту увидела. но почему-то не может к ней подключиться. копаю дальше. квест однако.
Откуда запускаешь, С клиента 32,64 разрядного, С сервера?
Регистрировать нужно в 2х ветках. Вот пример моего. Запускается из каталога с регистрируемой DLL
@echo off
setlocal
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "%~dp0NetObjetToIDispatch45.dll" /codebase
(46) Добрый день! Не помогает ни Ваш совет, ни рекомендации из поста (45). Под Win7 компонента прекрасно работает, нет никаких нареканий. Попытки запустить под Win10 продолжаются уже несколько месяцев.
Изначально 1С не видела компоненту. Но после подписи сборок (пост 45) компонента обнаружилась 1С'кой. Однако работать не хочет. Ошибка:
Текст ошибки
Данные: System.Reflection.TargetInvocationException: Адресат вызова создал исключение. ---> System.IO.FileLoadException: Не удалось загрузить файл или сборку "Asterisk.NET, Version=1.6.3.1, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Требуется сборка со строгим именем. (Исключение из HRESULT: 0x80131044)
в AddIn.SkaAsterisk.Connect(String Asterisk_Host, Int32 Asterisk_Port, String Asterisk_Login, String Asterisk_Loginpwd, Boolean DialEvent, Boolean HangupEvent)
--- Конец трассировки внутреннего стека исключений ---
в System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
в System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
в AddIn.AddIn.CallAsFunc(Int32 methodNum, Object& retValue, Object[]& pParams)
Подскажите кто-нибудь как добиться работы под Win10?
Надо смотреть зависимости. Возможно не все сборки подписаны либо прав не хватает на папку.
Часто если из архива нужно флаг только для чтения или чего там убрать. Посмотри
(50) Проверил. По Вашему совету. Блокировок не обнаружил. Флаг "Только чтение" снял. Все заново проделал: отменил регистрацию, заново подписал, зарегистрировал. Ошибка та же. Видимо все-таки компоненты как-то не так подписываются. Хотя по инструкции (45) выдает успешно подписаны и регистрация проходит успешно.
(54)(55) Включил логирование по по советам из ссылки. Ситуация такая: библиотека AddIn.dll из этого проекта подключается успешно. А вот именно Asterisk.NET.dll не может подключить по причине отсутствия строго имени - подписать ее корректно не имея исходников не получается. Дальнейшее гугление и ответы из стаковерфлоу говорят о том, что нужно связываться с разработчиком,получать исходники и подписывать ее у себя. Если я все правильно понял. Сейчас еще раз пытаюсь связаться с разработчиком. Если побежу проблему отпишусь.
ROM-Asterisk изначально была ущербна так как в нее как из ведра лилась вся инфа с Asteriskа. Но раз уж на то пошло то на гитхабе есть ее форк который нормально работает с 8.3.6 и выше (тестировалась на windows server 2016 / 1С 8.3.10 и 1С 8.3.11):
https://github.com/shachneff/BROM-Asterisk-Native
Но ИМХО сейчас смысла развивать ее нет, так как есть RESTfull Interface (ARI) и достаточно 1С научить работать с WebSocket, чтоб избавится от всего (ну или хоть от части) геморроя который разработчики получали вместе с ROM-Asterisk.
Да, и такую компоненту сделал именно создатель ROM-Asterisk, и продает ее за деньги ROM-WebSocket: https://simplit.com.ua/blog/?p=1018
(78)сорри, за вложенность ... не специально :)
На гетхабе исходники лежат, а вот самой компоненты нет в открытом доступе?
Понятно что можно скомпилировать, но все же продакшн от создателя всегда надежнее собственного компилирования.... Вдруг параметры не те, или еще что :)
(68) я сделал на 1С 7.7
при поднятии трубки в 1С у оператора ставится статус "Разговариваю по телефону", потом статус "Свободен"
а также автоматически создаётся, заполняется и открывается документ "Обращение" :)
как не помню уже, уже нету 7.7
Я никак не могу получить событие "поднятие трубки" (или, если я правильно понимаю "Bridge Link") События "Звонок" и "Положили трубку" приходят исправно.
(81) Именно про ROM-Asterisk.dll не подскажу, но Com компонента она на то и com, что методы у нее внутри, нужно только подключить ее. 1Cv77 работу с Com умеет, так, что теоретически может заработать и моя. Правда не проверял, но если будет интерес напишите можно будет попробовать проверить на подключение и авторизацию.
84.
user708386_crunchlab
11.03.20 16:06 Сейчас в теме
Пытаюсь подключить компоненту к 7.7.
При выполнении Connect не могу передать последние 2 логических параметра.
В семерке нет логического типа, но обычно для com-объектов true замещаем на -1, а false на 0. А тут, если указать 0, 1 либо -1 выдает ошибку:
Текст ошибки
System.ArgumentException: Невозможно преобразовать объект типа "System.Int32" к типу "System.Boolean".
в System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
в System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
в System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
в AddIn.AddIn.CallAsFunc(Int32 methodNum, Object& retValue, Object[]& pParams)
Также свойства, имеющие логический тип (IsConnected, к примеру), возвращают пустое значение.
Добрый день, Михаил. Скачали вашу обработку для работы с Asterisk. Возникла проблема. С одним сервером Астериска работает хорошо, компонента обрабатывает событие "звонок" и "положена трубка". С другим сервером Астериска компонента обрабатывает только событие "положена трубка". Ищем какие настройки на Астериске могут влиять на событие "звонок". Может вы подскажите каким образом вы отлавливаете событие "звонок" в вашей компоненте или на какие настройки обратить внимание. Заранее спасибо.