Как я могу получить несколько звонков на линию в Tapiex ActiveX v3.6? - PullRequest
0 голосов
/ 26 июня 2018

Я пишу программу IVR с помощью tapiex activex v3.6, и я хочу получать несколько вызовов на линию, но в моей программе, когда программа находится в состоянии вызова, и я хочу вызвать ее одновременно, она занята!что я должен делать?я должен поставить связанный вызов на удержании?если да, когда я должен это сделать?будет ли происходить событие, когда программа находится в состоянии вызова и кто-то пытается вызвать ее одновременно?если да, какое событие?моя программа должна быть многопоточной?я попытался сделать его многопоточным, но эта ошибка произошла!

'COM-объект, который был отделен от лежащего в его основе RCW, не может быть использован.'

StartIvr();
//UiGlobal.ThreadManager.StartThread(o => StartIvr());

это мой метод startIvr

private void StartIvr()
        {
            UI.Class.IVR.EventHandler eventHandler = new Class.IVR.EventHandler();
            eventHandler.InitPhone();
            eventHandler.OpenLine(null);
            UiGlobal.eventHandler = eventHandler;
        }

, а это мой класс обработчика событий

class EventHandler
{
    public List<string> linesName { get; set; }
    public AxTAPIEXLib.AxTAPIExCtl Tapiex_com { get; set; }
    public bool IsOutputCall = false;
    CallHandler callHandler;


    public EventHandler()
    {
        linesName = new List<string>();
        Tapiex_com = new AxTAPIEXLib.AxTAPIExCtl();

    }

    public EventHandler(AxTAPIEXLib.AxTAPIExCtl Tapiex_com)
    {
        linesName = new List<string>();
        this.Tapiex_com = Tapiex_com;
    }

    public ITAPILine Find_line(string LineName)
    {
        ITAPILine line = null;
        for (int i = 0; i < Tapiex_com.Lines.Count; i++)
            if (Tapiex_com.Lines.Item(i).Name == LineName)
            {
                line = Tapiex_com.Lines.Item(i);
                break;
            }
        return line;

    }
    protected void Dispose(bool disposing)
    {
        if (disposing && (Tapiex_com != null))
        {
            Tapiex_com.Dispose();
        }
    }
    public bool InitPhone()
    {
        Tapiex_com.CreateControl();
        Tapiex_com.OnRing += new AxTAPIEXLib._ITAPIExEvents_OnRingEventHandler(this.Tapiex_com_OnRing);
        Tapiex_com.OnDTMF += new AxTAPIEXLib._ITAPIExEvents_OnDTMFEventHandler(this.Tapiex_com_OnDTMF);
        Tapiex_com.OnConnected += new AxTAPIEXLib._ITAPIExEvents_OnConnectedEventHandler(this.Tapiex_com_OnConnected);
        Tapiex_com.OnDisConnected += new AxTAPIEXLib._ITAPIExEvents_OnDisConnectedEventHandler(this.Tapiex_com_OnDisConnected);
        Tapiex_com.OnCallerID += new AxTAPIEXLib._ITAPIExEvents_OnCallerIDEventHandler(this.Tapiex_com_OnCallerID);
        Tapiex_com.OnNewCall += new AxTAPIEXLib._ITAPIExEvents_OnNewCallEventHandler(this.Tapiex_com_OnNewCall);
        bool init = Tapiex_com.initialize();

        foreach (ITAPILine tmpline in Tapiex_com.Lines)
            if ((tmpline.Caps.Media_Modes & LINEMEDIAMODE.MEDIAMODE_INTERACTIVEVOICE) > 0 ||
                (tmpline.Caps.Media_Modes & LINEMEDIAMODE.MEDIAMODE_AUTOMATEDVOICE) > 0)
                linesName.Add(tmpline.Name);
        return init;
    }

    public bool OpenLine(string lineName)
    {
        if (lineName == null)
        {
            foreach (string item in linesName)
            {
                var line = Find_line(item);
                if (!line.Opened)
                    line.Open();
            }
            return true;
        }
        else
        {
            var line = Find_line(lineName);
            if (line != null)
            {
                if (!line.Opened)
                    line.Open();
                return true;
            }
            else return false;
        }

    }
    private void Tapiex_com_OnDTMF(object sender, _ITAPIExEvents_OnDTMFEvent e)
    {
        if (!IsOutputCall)
        {
            isInDTMFMethod = true;
            callHandler.DTMF(e);
            isInDTMFMethod = false;
        }
    }
    private void Tapiex_com_OnNewCall(object sender, _ITAPIExEvents_OnNewCallEvent e)
    {
        callHandler = new CallHandler();
    }

    private void Tapiex_com_OnRing(object sender, AxTAPIEXLib._ITAPIExEvents_OnRingEvent e)
    {
        if (e.ringCount > 1) e.m_Call.Answer();
    }

    private void Tapiex_com_OnConnected(object sender, AxTAPIEXLib._ITAPIExEvents_OnConnectedEvent e)
    {
        callHandler.Connected(e, IsOutputCall);

    }

    private void Tapiex_com_OnDisConnected(object sender, AxTAPIEXLib._ITAPIExEvents_OnDisConnectedEvent e)
    {
        callHandler.HangUp(e.m_Call);
        IsOutputCall = false;
    }

    private void Tapiex_com_OnCallerID(object sender, AxTAPIEXLib._ITAPIExEvents_OnCallerIDEvent e)
    {
        callHandler.GetCallerID(e);
    }

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Во-первых, голосовой модем является худшим телефонным устройством.Вы никогда не будете работать так, как хотите.Да, вы можете использовать «ловушку», подключенную к аналоговой линии, чтобы использовать ожидание вызова или трехсторонний вызов, но у вас нет контроля или сообщений о вызовах.Вы не будете знать, сработало ли это, и какой звонок вы на самом деле делаете.См. Это: http://www.exceletel.com/products/TeleTools/Help/Working_With_Modems.htm. РЕШЕНИЕ: Получите Hi-Phone Way2Call для аналогового или, лучше, провайдера VoIP и используйте программное обеспечение SIP Communications Server для подключения вашей SIP-магистрали к TAPI (установка 2 минуты).Наконец, вы можете установить «бесплатную» УАТС, такую ​​как 3CX или Asterisk, и подключить ее к аналоговым линиям или магистрали SIP и установить TSP для УАТС на вашем компьютере для управления им.

Первый ответ полон дезинформации (извинения, Крис).Во-первых, TAPI не предназначен для «представления физического устройства телефона».TAPI может управлять «линейными устройствами», «телефонными устройствами», «оконечными устройствами» и доступом к волновым, факсимильным и другим устройствам.Чаще всего используется для контроля «линий».Он полностью контролирует все функции, предоставляемые производителем устройства.TAPI, безусловно, способен поддерживать многострочный IVR.Это часть того, что Intel и Microsoft разработали для этого.Пункт № 3 выше абсолютно неверен.Вот пример 4-строчной программы IVR, использующей всего несколько строк кода с элементами управления TAPI: http://www.exceletel.com/products/TeleTools/SamplePrograms/etIVR4Line/Index.htm. Вам может понадобиться устройство, которое предоставляет более одной строки, чтобы вы могли протестировать более одной строки за раз.время.

Если вы посмотрите на этот код, вы сможете перевести его на использование элементов управления TAPI, поскольку они скопировали многие из своих функций из элементов управления TeleTools.В общем случае вам нужно было бы выставлять несколько линий через TSP для устройства с помощью так называемого TSP «третьей стороны», а не просто «TSP первой стороны» (в противном случае вы будете контролировать только одну линию на каждом компьютере).(но, возможно, более одного вызова на линию для таких вещей, как передача и конференция).

Например, 4-портовая карта Dialogic выдаст вам 4 аналоговых линии. Карта T1 предоставит вам доступ к 24. АТСлибо предоставит вам линии через их TSP (программное обеспечение драйвера поставщика услуг телефонии), либо через SIP-магистраль, для которой вам потребуется программное обеспечение SIP Communication Server от компании, указанной выше, для подключения к нему. Использование модели SIP DOES для большей части телефоначто-то вроде этого, но это вариант для людей, у которых есть оборудование с ограниченной поддержкой TAPI или где установка SIP проще или устраняет проблемы с лицензированием на УАТС, которые взимают дополнительную плату за некоторые функции.

Например, УАТС Ciscoс установленным Call Manager может открывать несколько строк в TAPЯ приложений.То же самое касается Avaya и ее программного обеспечения IP Office.Вам не нужно ничего нить.Вам просто нужно несколько элементов управления.Каждый элемент управления инициализирует линию (как показано в примере IVR 4 Line).Если вы использовали такую ​​утилиту, как TeleScope или Julmar Phone, или даже версию EXE программы IVR, указанную выше, вы увидите в раскрывающемся списке все устройства, найденные в вашей системе.Таким образом, если вы увидели «Analog Line1» и «Analog Line2», то вы бы создали 2 линейных элемента управления и указали каждый на отдельное линейное устройство.Затем можно было бы иметь несколько обработчиков событий для каждой строки Line1_OnConnected, Line2_Onconnected или, что более эффективно, создать собственный обработчик события OnConnected и указать на него все элементы управления и использовать свойство, такое как свойство «tag» элемента управления илисвойство sender / object в обработчике событий, чтобы проанализировать, какой элемент управления по какой строке запустил ваш обработчик событий.Опять же, на этой странице примера IVR есть примеры нескольких сред разработки.

Вы можете использовать одну из упомянутых выше утилит для запроса «возможностей устройства», о которых сообщает устройство.Он сообщит вам количество вызовов на линию, которые он может обработать, и какие функции TAPI он поддерживает, такие как перевод вызова в режим удержания, поддержка слепых передач, контролируемые переводы, конференц-связь и т. Д. Если у вас не более одного вызова на линиютогда вы, очевидно, не можете набрать другой вызов.При 2 вызовах на линию вы должны либо удержать первый вызов (ссылаясь на его дескриптор вызова), а затем набрать другой вызов, либо настроить передачу или конференцию (для которой требуется минимум 3 вызова).В любом случае у вас будет не более нескольких звонков, и вам придется управлять ими только с одним активным одновременно, если вы не были на конференции.Используя один элемент управления на линию, вы можете иметь несколько вызовов, которые полностью независимы друг от друга.Надеюсь, это продвинет вас дальше!

0 голосов
/ 26 июня 2018

Хорошо, это много вопросов в одном посте.Приношу свои извинения, если в этом нет «практического» ответа, но мне нужно несколько страниц, чтобы охватить все ваши вопросы.Поэтому я сделаю общее замечание здесь в надежде, что это поможет вам немного его сузить.

1) Несколько строк на устройстве - это не "нормальное" или "среднее" поведение, это также не что-тоTAPI принимает решение, это полностью зависит от системы УАТС.Большинство разрешит только 1 звонок на добавочный номер, некоторые 2 и несколько исключений разрешат больше с особыми настройками конфигурации.Устройство, как обычно понимается в TAPI, предназначено для представления физического телефонного устройства.Обычно IVR будет использовать «Магистральную линию», но многие УАТС не будут публиковать / выставлять эти линии через TAPI.

2) ActiveX и COM должны обрабатываться по-разному в многопоточной среде: разные функции запуска и остановки.Возможно, вы захотите сначала найти учебник или книгу по многопоточному программированию COM.

3) Основное внимание TAPI уделяется мониторингу и управлению расширением, оно не очень подходит для поддержки IVR.Я не говорю, что это невозможно, но это определенно «трудный путь».В среде контакт-центра TAPI обычно используется для мониторинга вызова после того, как он покинул IVR, а не для самого IVR.Вы можете вместо этого рассмотреть возможность создания IVR на стеке SIP, H323 или промежуточного программного обеспечения.

4) Если вы полны решимости использовать TAPI, я бы рекомендовал использовать реализацию TAPI 3.TAPI 3 была попыткой внедрить TAPI в современный мир (1999 года) и не взяла все, так что много пропущено.Используемые технологии уже устарели или устарели.Если вы серьезно относитесь к созданию чего-то столь же сложного, как коммерческая система IVR, вы можете использовать систему на основе TAPI 2 для более полного и стабильного интерфейса (и есть некоторые оболочки .NET, если вы не в роднойC / C ++ кодирование).Это противоречит интуиции, но в этом случае 2 лучше и больше 3.Тем более, что для создания IVR вам понадобятся более «экзотические» детали, такие как обработка звука (что-то очень мало поддерживается АТС!).

...