shachneff / BROM-Asterisk-Native

Открытая, работающая в 1С >= 8.3.6 версия компоненты ROM-Asterisk-Native от Simplit
38 stars 35 forks source link

Скомпилированная dll #3

Closed SimolSem closed 4 years ago

SimolSem commented 7 years ago

Добрый день! А можно попросить положить и скомпилированную DLL? Попросил товарища скомпилировать (он и писал предыдущее ижью про заголовки) он скомпилил, кодировка не 1251 в dll и свойства с методами - крякозяблы. А при вызове методов латинской 1С возвращает ошибку при вызове метода "Подключиться" причем написано кракозяблами, хотя я вызывал "Connect". Получается dll сопоставило Connect=Подключиться но что-то скомпилилось не так и не работает. (старая dll на 8.2 рабтает с этим экземпляром астериска)

korv1982 commented 7 years ago

Ищи в пулл реквест

oleksandr-lysak commented 7 years ago

Свой архив с длл и манифестом поместить в общий макет?

oleksandr-lysak commented 7 years ago

Проблема решена, собирать библиотеку нужно в Microsoft Visual Studio 2015, в 2010 и в 2017 правильно собрать не получалось. Хотя при компиляции никаких ошибок не выдавалось.

oleksandr-lysak commented 7 years ago

Рано радовался, под Windows 10 работает, а под Windows Server 2012 R2 - нет, подскажите как собрать по Server 2012r2?

korv1982 commented 7 years ago

Напишите в почту 1с@innova-it.org. Можем обсудить некоторые детали.

dakotikov commented 7 years ago

Доброго дня! А получилось что то с Windows Server 2012 R2 ? Как то не хочет она у меня подключаться =\

azubar commented 7 years ago

А получилось что то с Windows Server 2012 R2 ?

Под Windows Server 2016 / 1C 8.3.9.x b 8.3.6.x работает: https://github.com/azubar/BROM-Asterisk-Native-1C/blob/master/bin/BROM-Asterisk-Native.dll

dakotikov commented 7 years ago

Спасибо! У меня сейчас 8.3.10.2252 Пробую типа такого: Попытка ПутьКДЛЛ = "\\...имя сервера.\1C_Base\VK\BROM-Asterisk-Native_github.dll"; Результат = ПодключитьВнешнююКомпоненту(ПутьКДЛЛ, "Test", ТипВнешнейКомпоненты.Native); Сообщить("Результат - "+Результат+" {"+ПутьКДЛЛ+"}"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; говорит Результат - нет =\

azubar commented 7 years ago

Я компоненту пихаю в макет "BROM_Asterisk_Native_1C" и подключаю ее следующим образом:

` РезПодключение = Ложь;

Если НЕ ЗначениеЗаполнено(ХЭШ_Компонент) Тогда
    СсылкаНаАрхив = ПоместитьВоВременноеХранилище(ЭтотОбъект.ПолучитьМакет("BROM_Asterisk_Native_1C"), Новый УникальныйИдентификатор);
    Если ПодключитьВнешнююКомпоненту(СсылкаНаАрхив, "Asterisk", ТипВнешнейКомпоненты.Native) Тогда
        Попытка
            Компонент = Новый ("AddIn.Asterisk.ROM-Asterisk-Native");
            РезПодключение = Истина;

            ХЭШ_Компонент = Компонент;
        Исключение
            Компонент = Неопределено;
            Сообщить("Исключение при инициализации компоненты AddIn.Asterisk.ROM-Asterisk-Native, проверьте установлена ли система защиты.");
        КонецПопытки; 
    КонецЕсли;
Иначе   
    Компонент      = ХЭШ_Компонент;
    РезПодключение = Истина;
КонецЕсли;

`

dakotikov commented 7 years ago

Сделал все также... У меня вот тут Если ПодключитьВнешнююКомпоненту(СсылкаНаАрхив, "Asterisk", ТипВнешнейКомпоненты.Native) Тогда ложь.

dakotikov commented 7 years ago

А какой студией делал DLL ?

oleksandr-lysak commented 7 years ago

Кто не силен в с++ просто откройте проект в студии прям на нужном сервере, она сама подтянет нужные зависимости и установит в винде

dakotikov commented 7 years ago

Попробовал в 2015 студии собрать прямо на сервере - не помогло =( Подключил отладку в студии, но не могу понять как посмотреть на чем именно валится =(

"1cv8.exe" (Win32). Загружено "C:\Users\1CAdmin2\Desktop\BROM-Asterisk-1C-master\Debug\BROM-Asterisk-Native.dll". Символы загружены. "1cv8.exe" (Win32). Выгружено "C:\Users\1CAdmin2\Desktop\BROM-Asterisk-1C-master\Debug\BROM-Asterisk-Native.dll" Вызвано исключение по адресу 0x00007FFB58FB95FC в 1cv8.exe: исключение Microsoft C++: core::ContextException по адресу памяти 0x000000000013D460.

Может кто подскажет, как это дело правильно дебажить, что бы понимать где ошибка?

А еще, в свойствах проекта есть пункты "Версия целевой платформы" и "Набор инструментов..."

Грусть тоска берет, явно какая то мелкая ошибка - а не понять где =\

dakotikov commented 7 years ago

На всякий случай если кто будет читать. У меня проблема была с клиентом 64bit - помогло немного подправить код и пере собрать под 64. Плюс описание вот отсюда - https://stackoverflow.com/questions/35805113/visual-studio-2015-run-time-dependencies-or-how-to-get-rid-of-universal-crt

korv1982 commented 7 years ago

На всякий случай если кто будет читать. У меня проблема была с клиентом 64bit - помогло немного подправить код и пере собрать под 64. Плюс описание вот отсюда - https://stackoverflow.com/questions/35805113/visual-studio-2015-run-time-dependencies-or-how-to-get-rid-of-universal-crt

А сюда выложить?

dakotikov commented 7 years ago

Сюда не выкладывал - я в с++ не силен , и у меня там остались ошибки в коде которые студия подсвечивает, после компиляции под 64 - еще правлю. В общих чертах - DLL подключилась и события слушает Я пока точно не уверен будет ли толком работать дальше =)

По ответу на SO - без вот смены вот этих параметров: For Debug: from /MDd to /MTd For Release: from /MD to /MT dll собранная под 64 не подключалась.

shachneff commented 7 years ago

Подключилась и слушает события - это уже победа! Останется только проверить на ошибки выделения памяти, утечки... Если не сильны в C++ и в git, можете прислать мне ссылку на Ваш локальный проект x64, я добавлю сюда и оформлю отдельные ветки под разную разрядность.

zadevil commented 7 years ago

Доброго дня. Поделитесь пожалуйста последней dll и примером использования.

Racefeeder commented 6 years ago

@zadevil Ссылки на последнюю DLL и исходники указаны выше, если интересует х64 версия, то надо всего навсего открыть проект в MSVS2015, вот тут https://docs.microsoft.com/en-us/cpp/build/how-to-configure-visual-cpp-projects-to-target-64-bit-platforms написано как добавить целевую платформу, здесь https://stackoverflow.com/questions/35805113/visual-studio-2015-run-time-dependencies-or-how-to-get-rid-of-universal-crt как установить свойства проекта, что бы не ставить на конечную машину вот это "Download The Microsoft Visual C++ 2010 Redistributable" http://www.microsoft.com/en-gb/download/details.aspx?id=14632, компилируем и радуемся жизни.

Пример использования есть в исходниках, выше писали как и что работает...

p.s. @shachneff, @korv1982 - спасибо за исходники и ссылочки, избавили от лишней работы, на счет утечек - я временно "забил" на варнинги несоответствия типов при компиляции х64 версии, но работает без перерыва неделю, слушает сообщения, посылает команды - полет нормальный, позже надо будет в профайлере прогнать...

uva21 commented 6 years ago

Добрый день. Подскажите платформа 8.2.15 Какую dll нужно использовать? у меня есть такая: https://cloud.mail.ru/public/L6Xu/S2nusL7Tx но она никак не регится. В 1С при запуске Панели телефонии пишет: Не удалось подключить загрузить компоненту для связи с Asterisk Не создать объект внешней компоненты для связи с Asterisk.{ВнешняяОбработка.ПанельТелефонии.МодульОбъекта(26)}: Тип не определен (AddIn.ROM-Asterisk)

Может кто подсказать этапы как все правильно настроить или сказать что не так?

ghsns commented 6 years ago

32-х разрядная тут уже есть, добавлю от себя х64. Скомпилированная х64 версия в приложенном макете вместе с manifest. Проверена на 8.3.11.3034, winserver 2008 r2.

BROM-Asterisk-Native_maket.zip

PotapX commented 6 years ago

Добрый день. 32-х разрядная компонента работает некоторое время, затем перестает вызывать внешние события 1С, хотя компонента возвращает Телефония.Подключено=истина. Помогите понять в чем может быть проблема

Racefeeder commented 6 years ago

PotapX, 1 - в это время коннект по AMI к Астериску есть? (в CLI Asterisk команда manager show connected) 2 - в примере обработки для 1с есть закомменченный код - процедура ВнешнееСобытие, в самом начале проверка на “подписку” на события и переподписка в случае отваливания проверьте ее...

вообще, по своему опыту - работает с ноября 2017 круглые сутки - отваливания происходят крайне редко, и то из за багов в сети, может быть раз в месяц. По наблюдениям - если очень часто слать события между ДЛЛ и 1с - могут теряться некоторые сообщения, хотя по логике работы там буфер довольно большой и теряться не должно, все события от АТС тебе явно не нужны - поставь фильтр на самое нужное - мне, для регистрации звонков и их промежуточных статусов надо всего 6 событий - newChannel, dialEnd, bridgeEnter, hangup, transfer, originate - все остальное шлак по сути

shachneff commented 6 years ago

Да, тем более на свежих версиях Астериска более продвинутые фильтры событий при настройке AMI, можно меньше мусора слать в 1С.

Уточните так же версию платформы - на 8.3.13 заметил нестабильную работу с другой внешней компонентой, возможно, 1С что-то у себя поменяли или сломали )

PotapX commented 6 years ago

Racefeeder,

  1. Про это и не подумал. Проверю отпишусь.
  2. Так же попробую.

И настройку AMI нужно посмотреть. За телефонию у нас отвечает отдельный человек, попробуем с ним настройть необходимые фильтры со стороны астериска.

Если не сложно можете прислать саму dll. Может я не ту использую. И пример кода 1с установки фильтров и регулярных выражений.

shachneff, До перехода на 8.3.10, раньше была 8.3.5, все работало отлично. Сейчас одни проблемы.

Racefeeder commented 6 years ago

PotapX, куда слать?

1с была так же 8.3.9.1850, потом обновили до 8.3.10.хххх, но видимых глюков не наблюдается - как раньше, так и сейчас наблюдается иногда или запаздывание или пропажа событий, но редкое 1 на 100...

korv1982 commented 6 years ago

Запаздывания могут быть по двум причинам. 1) Буфер 1С переполнен. (Не используются внутренние фильтра компоненты, медленный компьютер) 2) Пропажа или задержка пакетов по UDP (Ну тут раздолье полное, от включен дебаг на астере до хреновая сеть, петля, в сети куча всего гуляет в т.ч. видео. По моей практике даже на ADSL держит достаточно хорошо когда астер в датацентре а клиенты в филиале за не очень стабильным проводом. При этом их 20 человек.

И настройку AMI нужно посмотреть. За телефонию у нас отвечает отдельный человек, попробуем с ним настройть необходимые фильтры со стороны

Там с двух сторон надо резать. Командой из 1С в астер по евентам и регуляркой в компоненте. Пример: УстановитьРегулярноеВыражение("BridgeEnter([^.])Channel: ([^.])PJSIP/4104|BridgeLeave([^.])Channel: ([^.])PJSIP/4104|MIXMONITOR_FILENAME|Disconnected")

korv1982 commented 6 years ago

. По наблюдениям - если очень часто слать события между ДЛЛ и 1с - могут теряться некоторые > сообщения, хотя по логике работы там буфер довольно большой и теряться не должно

Есть такое, буфер пробовал менять, но похоже 1С забила на эту функцию и установила в константу, пробовал выкидывать в консоль, там проблемы с потерей нет. Это на стороне 1С, больше 1к сообщений в сек и все стает колом.

PotapX commented 6 years ago

Racefeeder, a11mir@yandex.ru

Буфер тоже пробовали менять видимого результата нет. Пробовал даже отключаться от телефонии и заново подключаться, когда в 1С закрывают событие звонок, чтобы во время разговора не приходили сообщения (после длительного простоя компонента перестает реагировать). Хотел даже сделать обработчик ожидания, чтобы проверять есть ли подключение с телефонии, но всегда возвращает что подключено хотя компонента не реагирует на звонки.

Кстати у нас сделано так, что все пользователи к телефонии подключаются по одному логину и паролю, разница только в регулярном выражении (по событию и номеру телефона). На 8.3.5 работало без проблем.

korv1982 commented 6 years ago

я (после длительного простоя компонента перестает реагировать).

Полагаю что есть косяк с полученными данными. Может кто лучше посмотрит этот кусок кода

if (recived > 0) {} else{И вот тут идет проверка на ошибки сокета. Но есть подозрение, что конект уже упал, а в Received лежит число. *И Received наверное надо бы обнулить.*

Racefeeder commented 6 years ago

PotapX, чтоб не было простоя, можно подписаться на какое нибудь “левое” событие, которое прилетает раз в Н-минут, например, что нибудь из разряда регистрация пиров или типа того, что Астер сам изредка делает сам... ДЛЛки отправил.

PotapX commented 6 years ago

korv1982, Вот в этом месте надо делать костыль, БОЛЬШОЙ БОЛЬШОЙ.

Racefeeder пишет что у него работает уже пол года без проблем. понять бы как у него это получилось

dakotikov commented 6 years ago

Сейчас на 8.3.10.2252 никаких проблем не наблюдается. Единственное, что вот это: Кстати у нас сделано так, что все пользователи к телефонии подключаются по одному логину и паролю, разница только в регулярном выражении (по событию и номеру телефона). На 8.3.5 работало без проблем. у нас не так, сделаны логины под каждый телефон, и события режутся со стороны астериска только по нужному номеру. Ну и плюс фильтры на сами события - только нужное нам. Не пробовали переключать ListenMode (режим прослушивания или как оно там) туда/обратно?

PotapX commented 6 years ago

Добрый день.В dll от Racefeeder наблюдалась такая же картина, компонента зависала и не реагировала. Для решения данной проблемы сделал следующее:

  1. Наложил фильтры в AMI и в компоненте
  2. Создал обработчик ожидания, которая отправляет каждую минуту в телефонию команду пинг, если результат истина то все работает, если ложь то отключаюсь от компоненты и заново подключаюсь.

3-4 дня жалоб от пользователей нет.

Большое Всем спасибо!!!

Racefeeder commented 6 years ago

сделайте там таймаут на слушание сокета и проблем не будет

а в самом астере есть косяк - он тоже не ловит обрыва связи и тупо думает что все ОК, сам не смотрел в код - но похоже так и есть - срубаешь ДЛЛ и он не видит этого

shachneff commented 6 years ago

сделайте там таймаут на слушание сокета и проблем не будет

Можете прокомментировать более подробно? Где" там"? Не понятно

antonwantstosleep commented 6 years ago

Здрасьте!

Я может быть и не прав, что после недолгого просмотра исходников сразу решил написать вам, но вдруг вам не сложно ответить? С++ я вижу впервые, так что прошу понять и простить (но я разберусь со временем).

  1. Вижу в коде какой-то демо-режим, ключи и т.д. Это всё для красоты, или ограничения реально работают?
  2. Вижу отсылки к Winsock для TCP-сокета. А работает ли компонента под линуксом?

Спасибо!

shachneff commented 6 years ago

Тут же исходники, можете поудалять все что не нужно и собрать компоненту. По хорошему, просто руки не доходят почистить тут все от мусора (ключи, демы).

Под Линукс не работает, надо делать, нет реальных знаний и потребностей, одна теория

korv1982 commented 6 years ago

1) Вы можете собрать компоненту с Демо режимом. В одном месте заменив условие. Это было сделано чтобы заказчику продавать поддержку по количеству рабочих мест. А код я чистить не стал. 2) Под Linux работать не будет. НО если сервер на Linux , а клиенты на Windows то все будет работать.

gav08215 commented 5 years ago

Друзья, скажите пожалуйста, не удалось скомпилить исправленную dll-ку, если есть возможность, выложите пожалуйста. Заранее, добра вам)

hellslade commented 5 years ago

BROM-Asterisk-Native.zip DLL с выключенным демо режимом, x86

korv1982 commented 5 years ago

BROM-Asterisk-Native.zip DLL с выключенным демо режимом, x86

Так я ее давно вычистил, что поменялось?

hellslade commented 5 years ago

Так я ее давно вычистил, что поменялось?

Да? В той, что я скачал, демо было включено. Скачал исходники и убрал условие. Демо было как-то по-другому выключено? Я вообще не рублю в С, первый раз в глаза видел :)

korv1982 commented 5 years ago

Демо было как-то по-другому выключено? Я вообще не рублю в С, первый раз в глаза видел :)

  • if(_wcsicmp(valid_key, key) == 0) { isDemo = false; } else { isDemo = true; } +if(_wcsicmp(valid_key, key) == 0) { isDemo = false; } else { isDemo = false; } Почему то думал что удалил все что касаемо демо. Оказывается сделал это локально. Вот ссылка на вычищенный релиз. Сразу извиняюсь @shachneff мержить нет времени. Может кто -то возьмется. Исправлены некоторые проблемы с сокетами. Обновлена основа в соответствии с рекомендациями 1С.

https://github.com/korv1982/InnovaIT-Asterisk-Native/releases/tag/1.0.0.20

hellslade commented 5 years ago

Отлично, спасибо! Будем этим пользоваться.

shachneff commented 5 years ago

Демо было как-то по-другому выключено? Я вообще не рублю в С, первый раз в глаза видел :)

  • if(_wcsicmp(valid_key, key) == 0) { isDemo = false; } else { isDemo = true; } +if(_wcsicmp(valid_key, key) == 0) { isDemo = false; } else { isDemo = false; } Почему то думал что удалил все что касаемо демо. Оказывается сделал это локально. Вот ссылка на вычищенный релиз. Сразу извиняюсь @shachneff мержить нет времени. Может кто -то возьмется. Исправлены некоторые проблемы с сокетами. Обновлена основа в соответствии с рекомендациями 1С.

https://github.com/korv1982/InnovaIT-Asterisk-Native/releases/tag/1.0.0.20

Спасибо! Сделаю мерж на выходных

korv1982 commented 5 years ago

Спасибо! Сделаю мерж на выходных

Брать из DEV ветки

yakutyan commented 4 years ago

не срабатывает событие "DialEnd" при исходящем звонке занятому абоненту. Что делать, нужно отслеживать занятость абонента при исходящем звонке?

Racefeeder commented 4 years ago

не срабатывает событие "DialEnd" при исходящем звонке занятому абоненту. Что делать, нужно отслеживать занятость абонента при исходящем звонке?

А дллка тут при чем? :)... с этим вам к астероводам надо...

yakutyan commented 4 years ago

не срабатывает событие "DialEnd" при исходящем звонке занятому абоненту. Что делать, нужно отслеживать занятость абонента при исходящем звонке?

А дллка тут при чем? :)... с этим вам к астероводам надо...

С компонентой от платного продукта это событие приходит, получается что нужно доработать dll не пока не могу разобраться как именно)