Монитор вызовов с использованием C # TAPI - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно создать программу для отслеживания активности телефонного звонка. И получить информацию о звонках, такую ​​как номер и Имя.Я не очень силен с кодом TAPI и C #, поэтому надеюсь, что кто-нибудь может мне помочь, я в отчаянии.

У меня есть этот код, где я пытаюсь обнаружить доступные устройства и получить информацию с этих устройств, когдавходящий вызов:

using System;
using TAPI3Lib; 
using JulMar.Atapi; 

namespace ConsoleApp1
{
  class Program
  {
    private void tapi_ITTAPIEventNotification_Event(TAPI_EVENT TapiEvent, object pEvent)
    {
        try
        {
            ITCallNotificationEvent cn = pEvent as ITCallNotificationEvent;
            if(cn.Call.CallState == CALL_STATE.CS_CONNECTED)
            {
                string calledidname = cn.Call.get_CallInfoString(CALLINFO_STRING.CIS_CALLEDIDNAME);
                Console.WriteLine("Called ID Name " + calledidname);
                string callednumber = cn.Call.get_CallInfoString(CALLINFO_STRING.CIS_CALLEDIDNUMBER);
                Console.WriteLine("Called Number " + callednumber);
                string calleridname = cn.Call.get_CallInfoString(CALLINFO_STRING.CIS_CALLERIDNAME);
                Console.WriteLine("Caller ID Name " + calleridname);
                string callernumber = cn.Call.get_CallInfoString(CALLINFO_STRING.CIS_CALLERIDNUMBER);
                Console.WriteLine("Caller Number " + callernumber);


            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }



    static void Main(string[] args)
    {
        TapiManager mgr = new TapiManager("ConsoleApp1");
        mgr.Initialize();

        foreach(TapiLine line in mgr.Lines)
        {
            foreach (string s in line.Capabilities.AvailableDeviceClasses)
                Console.WriteLine("{0} - {1}", line.Name, s);
        }
    }
}
}

Но когда я запускаю его, просто вижу доступные устройства, но не вижу никакой информации о вызовах.Я привык к программированию на Java, поэтому я думаю, что мне следует отправить метод вызова, который получает информацию о вызове в основном, но я не знаю, как это сделать, и в любом коде, который я видел, они это делают.Итак, надеюсь, что вы поможете мне понять, как работает TAPI и что я могу сделать, чтобы мой код работал.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Хорошо, во-первых, вы хотите придерживаться одной версии TAPI.В ваших заявлениях using вы импортируете управляемую библиотеку TAPI 2.x и управляемую библиотеку TAPI 3.x.

using TAPI3Lib; // this is a TAPI 3.x library
using JulMar.Atapi; // this is a TAPI 2.x library

Если вы решили использовать TAPI 3.x, вам следует начатьсоздав новый класс, который обрабатывает различные виды событий TAPI.Для этого ему необходимо реализовать интерфейс ITTAPIEventNotification:

public class CallNotification : ITTAPIEventNotification
{
    public void Event(TAPI_EVENT TapiEvent, object pEvent)
    {
        if(pEvent == null)
            throw new ArgumentNullException(nameof(pEvent));

        switch (TapiEvent)
        {
            case TAPI_EVENT.TE_CALLNOTIFICATION:
                // This event will be raised every time a new call is created on an monitored line-
                // You can use CALLINFO_LONG.CIL_ORIGIN to see weather it's an inbound call, or an
                // outbound call.
                break;
            case TAPI_EVENT.TE_CALLSTATE:
                // This event will be raised every time the state of a call on one of your monitored
                // Lines changes.
                // If you'd want to read information about a call, you can do it here:
                ITCallStateEvent callStateEvent = (ITCallStateEvent)pEvent;
                ITCallInfo call = callStateEvent.Call;

                string calledidname = call.get_CallInfoString(CALLINFO_STRING.CIS_CALLEDIDNAME);
                Console.WriteLine("Called ID Name " + calledidname);

                string callednumber = call.get_CallInfoString(CALLINFO_STRING.CIS_CALLEDIDNUMBER);
                Console.WriteLine("Called Number " + callednumber);

                string calleridname = call.get_CallInfoString(CALLINFO_STRING.CIS_CALLERIDNAME);
                Console.WriteLine("Caller ID Name " + calleridname);

                string callernumber = call.get_CallInfoString(CALLINFO_STRING.CIS_CALLERIDNUMBER);
                Console.WriteLine("Caller Number " + callernumber);
                break;
        }

        // Since you're working with COM objects, you should release any used references.
        Marshal.ReleaseComObject(pEvent); 
    }
}

Чтобы использовать этот класс, вам необходимо создать новый экземпляр TAPI3Lib.TAPIClass и вызвать его метод Initialize.После этого вы можете присоединить ваш только что созданный класс CallNotification в качестве обработчика событий.Вы также можете указать, какие типы событий вы хотите, чтобы ваш обработчик получал.Обратите внимание, что в этот момент вы не будете получать никаких уведомлений о событиях, потому что вы не сказали TAPIClass, какие линии он должен отслеживать:

CallNotification callevent = new CallNotification();
TAPIClass tapi = new TAPIClass();
tapi.Initialize();
tapi.EventFilter = (int)(TAPI_EVENT.TE_CALLNOTIFICATION | TAPI_EVENT.TE_CALLSTATE);
tapi.ITTAPIEventNotification_Event_Event += new ITTAPIEventNotification_EventEventHandler(callevent.Event);

Чтобы сообщить TAPIClass, какие линии он должен отслеживать, вынужно сделать две вещи.запросить все линии, зарегистрированные для вас IPBX, и определить, является ли линия, на которую у вас есть права на мониторинг (это конфигурация IPBX):

public List<ITAddress> EnumerateLines(TAPIClass tapi)
{
    List<ITAddress> addresses = new List<ITAddress>();

    ITAddress address;
    uint arg = 0;

    ITAddressCapabilities addressCapabilities;
    int callfeatures;
    int linefeatures;
    bool hasCallFeaturesDial;
    bool hasLineFeaturesMakeCall;

    IEnumAddress ea = tapi.EnumerateAddresses();

    do
    {
        ea.Next(1, out address, ref arg);

        if (address != null)
        {
            addressCapabilities = (ITAddressCapabilities)address;

            callfeatures = addressCapabilities.get_AddressCapability(ADDRESS_CAPABILITY.AC_CALLFEATURES1);
            linefeatures = addressCapabilities.get_AddressCapability(ADDRESS_CAPABILITY.AC_LINEFEATURES);

            hasCallFeaturesDial = (callfeatures1 & (int)0x00000040) != 0; //Contains LineCallFeatures Dial; see Tapi.h for details
            hasLineFeaturesMakeCall = (linefeatures & (int)0x00000008) != 0; //Contains LineFeatures MakeCall; see Tapi.h for details

            // this is basically saying "Am I allowed to dial numbers and create calls on this specific line?"
            if(hasCallFeaturesDial && hasLineFeaturesMakeCall)
                address.Add(address);
        }
    } while (address != null);

    return addresses;
}

public void RegisterLines(TAPIClass tapi, IEnumerable<ITAddress> addresses)
{
    if (tapi == null)
        throw new ArgumentNullException(nameof(tapi));

    if (addresses == null)
        throw new ArgumentNullException(nameof(addresses));

    foreach (ITAddress address in addresses)
    {
        tapi.RegisterCallNotifications(address, true, true, TapiConstants.TAPIMEDIATYPE_AUDIO, 2);
    }
}

, поэтому ваша инициализация будет выглядеть следующим образом:

CallNotification callevent = new CallNotification();
TAPIClass tapi = new TAPIClass();
tapi.Initialize();

IEnumerable<ITAddress> addresses = this.EnumerateLines(tapi);
this.RegisterLines(tapi, addresses);

tapi.EventFilter = (int)(TAPI_EVENT.TE_CALLNOTIFICATION | TAPI_EVENT.TE_CALLSTATE);
tapi.ITTAPIEventNotification_Event_Event += new 
ITTAPIEventNotification_EventEventHandler(callevent.Event);

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

Надеюсь, вы сможете следить за этим сообщением.Если у вас есть какие-либо вопросы, просто спросите =)

0 голосов
/ 19 февраля 2019

Строка TapiLine, вы должны использовать TapiCall.

...