Jtapi

hashii

Mitglied
Guten Abend zusammen

Ich habe ein Problem mit dem ich seit Stunden konfrontiert bin und kein Erfolg bei der Suche im Internet bis jetzt habe.

Ich habe probiert mit Jtapi zu arbeiten aber bin kein Schritt weiter gekommen. Zuerst habe ich mal die Blbliotheken reinkopiert und eine erste Klasse erstellt, die aus dem Internet kopiert wurde und zwar folgendes:

Java:
package main;
import javax.telephony.JtapiPeer;
import javax.telephony.JtapiPeerFactory;
import javax.telephony.JtapiPeerUnavailableException;
import javax.telephony.Provider;


public class ProviderService 
{
	
	
	private static ProviderService instance;
	private static Provider provider;
 
	public ProviderService() {
		bootStrap();
		
		//System.out.println(getProvider());
	}
 
	private void bootStrap(){
		try {
			JtapiPeer peer = JtapiPeerFactory.getJtapiPeer("");
			String[] myServices = peer.getServices();
                        String providerString=myServices[0]+
                                                ";login=*;passwd=*";
			provider = peer.getProvider(providerString);
		} catch (JtapiPeerUnavailableException e) {
			e.printStackTrace();
		}
	}
 
	public static Provider getProvider(){
		if (instance == null){
			instance = new ProviderService();
		}
		System.out.println(provider);
		
		return provider;
	}

}

Nun sagt er mir bei der Ausführung immer
PHP:
JtapiPeer: DefaultJtapiPeer could not be instantiated.

Unsere Telefonanlage funktioniert über VoiP und mit fertige Software funktionierts einwandfrei. Das Passwort und der Benutzername stimmen aber soweit kommt es gar nicht.

Was ist das Problem? und Wie kann ich es lösen?
 

Kevin94

Top Contributor
Ist auch kein Wunder, dass es so nicht funktioniert. In der JavaDoc steht dazu folgendes:
Applications use the JtapiPeerFactory.getJtapiPeer() method to obtain a JtapiPeer object. The argument to this method is a classname which represents an object which implements the JtapiPeer interface

Wenn das Argument allerdings kein valider Klassenname ist, kanns auch nicht funktionieren. Entweder du versuchst es mit "DefaultJtapiPeer" oder du liest beim Anbieter der Implementierung nach wie die anzugebende Klasse heist.
 

hashii

Mitglied
Es gibt leider keine weitere Angaben auf der Herstellerseite.

Aber das heisst, dass es nicht an die Hardware liegt für das Erkennen der Anrufe? Es fehlt lediglich eine weitere Klasse?
 

Kevin94

Top Contributor
Es fehlt (hoffentlich) keine Klasse, sondern nur deren Name, wenn es eine solche Klasse nicht gibt, dann wäre die Implementierung vermutlich nutzlos. Wenn der Hersteller nichts angibt, probier einfach
Code:
"DefaultJtapiPeer"
. Alternativ könntest du dir ein kleines Tool schreiben, das dir die .jar nach Klassen durchsucht, die JtapiPeer implementiern. Dürften mit Reflections nur ein paar Zeilen sein.
 

hashii

Mitglied
Guten Abend,

Danke für deine Hilfe Kevin94 aber leider komme ich immer noch nicht weiter. Die Klasse "DefaultJtapiPeer" ist nirgends auffindbar, ich finde diese Klasse einfach nicht. Auf die Oracle-Website habe ich alle JTapi-Dateien heruntergeladen und dies in meinem Projekt hinzugefügt. Dann habe ich mir ein Beispiel auf einer Website angeschaut und die Codezeile kopiert. Nun zeigt es mir diesen Fehler, den ich oben erwähnt habe.

Gibt es keine andere Möglichkeiten um Anruferkennung mit Java zu ermöglichen? Gibt es keine Bibliotheken, die einfach sind um zu implementieren. Ich komme einfach nicht weiter..
 

matschi

Mitglied
Hey,

guck dir doch einfach mal diese schon geschriebenen JTAPI-Implementierungen an:

Generic JTAPI and JCC Project

oder

http://xtapi.sourceforge.net/

Dort sind schon Beispiele (bei xtapi grafisch, bei gjtapi ein Emulator), an denen du dich orientieren kannst.

Ich benutze z.B. bei meinem XTapi-Programm folgenden Code:
Code:
      JtapiPeer peer = JtapiPeerFactory.getJtapiPeer("net.xtapi.XJtapiPeer");
      myprovider = peer.getProvider("net.xtapi.serviceProvider.MSTAPI");

Zudem hab ich hier auch noch die Spezifikation der JTapi gefunden:
Java Telephony API (JTAPI) Specification<br> Version 1.4 <br>(Final Release)

Viel Erfolg
 

hashii

Mitglied
Hallo Matschi,

Zuerst mal Danke für die weitere Hilfe.

Nun habe ich mir das angeschaut, und das ganze sieht wiederum so aus:

screeni3jrlbegsz.jpg


Es scheint, als hätte ich das gleiche Problem wie vorher, füge ich die Bibliotheken falsch ein?
 

matschi

Mitglied
Hey,
da ich die gleichen Anfangsschwierigkeiten hatte, kann ich die Verwirrung gut verstehen.

Also grundsätzlich kommt es erst einmal darauf an, ob du einen Anruf absetzen möchtest oder einen Anruf empfangen möchtest. Dann kommt es darauf an, welche Hardware du zur Verfügung hast (IP-Telefon oder reine IP-Telefonie mit einem "SoftPhone" oder willst du über eine FritzBox telefonieren, usw.). Ich habe z.B. ein IP-Telefon zu Hause stehen. Grundsätzlich musste ich dann einen den Telefontreiber (vom Hersteller) installieren, damit das Telefon von Windows erkannt wird.

Die Imports die du in deinem Projekt hast (xopen), kannst du wieder entfernen und lädst dir von der folgenden Seite "xtapi.zip" und "mstapi_sp.zip" herunter, entpackst alles und steckst sie in dein Projekt:
Download - XTAPI JTapi Implementation - SourceForge.JP

Letzlich reicht es auch nicht nur den Provider zuzuweisen. Ein Telefonat braucht ein Terminal (das Telefon an sich), eine Adresse (die Telefonnummer), einen "Call" (also das Gespräch) und eine Connection. Zudem muss dem "Call" noch ein Observer zugewiesen werden, der dem Anruf mitteilt, welcher Status gerade gesetzt ist. Das alles ist schon in den klassischen Beispielen (siehe unten) angezeigt.

Hier mal das Beispiel zum Anruf absetzen:
Code:
import javax.telephony.*;

public class MakeCall {
  public static final void main(String args[]) {
    String myNumber="454545";
    String numberToCall="069123123123";
    Provider myprovider = null;
    try {
      JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
      myprovider = peer.getProvider(null);
    } catch (Exception e) {
      System.out.println("Kann keinen Provider? " + e.toString());
      System.exit(0);
    }
    Address origaddr = null;
    Terminal origterm = null;
    try {
      origaddr = myprovider.getAddress(myNumber);
      Terminal[] terminals = origaddr.getTerminals();
      if (terminals == null) {
        System.out.println("Diese Telefonnummer ist keinem Gerät zugeordnet ");
        System.exit(0);
      }   
      origterm = terminals[0];
    } catch (Exception excp) {
    // Exception behandeln
    }
    Call mycall = null;
    try {
       mycall = myprovider.createCall();
       mycall.addObserver(new MyCallObserver());
    } catch (Exception excp) {
    //Exception behandeln
    }
    try {
      Connection c[] = mycall.connect(origterm, origaddr, numberToCall);
    } catch (Exception excp) {
	  // Exception behandeln
	 }
  }
}

Hier der CallObserver:
Code:
import javax.telephony.*;
import javax.telephony.events.*;
public class MyCallObserver implements CallObserver {
  public void callChangedEvent(CallEv[] evlist) {
    for (int i = 0; i < evlist.length; i++) {
      if (evlist[i] instanceof ConnEv) {
        String name = null;
        try {
          Connection connection = evlist[i].getConnection();
          Address addr = connection.getAddress();
          name = addr.getName();
        } catch (Exception excp) {
			  	//Fehlerbehandlung einfügen
        }
        String msg = "Status für anruf an : " + name + ": ");
        if (evlist[i].getID() == ConnAlertingEv.ID) {
          System.out.println(msg + "ALERTING");
          else if (evlist[i].getID() == ConnInProgressEv.ID) {
            System.out.println(msg + "INPROGRESS");
          }
          else if (evlist[i].getID() == ConnConnectedEv.ID) {
            System.out.println(msg + "CONNECTED");
          }
	       else if (evlist[i].getID() == ConnDisconnectedEv.ID) {
	         System.out.println(msg + "DISCONNECTED");
	       }
        }
	   }
    }
  }
}

Letztlich noch zum weiteren Verständnis dieser Link, wo erklärt wird, wie das Call-Modell aussieht und wie das mit den Connection-Status funktionieren soll:
Java Telephony API (JTAPI) Specification<br> Version 1.4 <br>(Final Release): Package javax.telephony

Ich hoffe ich konnte helfen.
 

hashii

Mitglied
Hallo zusammen,

Inzwischen ist jetzt genau ein Jahr vorbei, jedoch habe ich es noch bis heute nicht geschafft, eine Telefonnummer zu erkennen. Leider habe ich das genau so getan wie "matschi" es hier beschrieben hat, jedoch erfolglos. Mir fehlt das Verständnis, welches ich mir seit einem Jahr noch nicht beigebracht habe.

Könnt ihr mir bitte weiterhelfen? Oder muss ich es nun endlich aufgeben?

Ich komme gar nicht weiter, das ist das Problem, deshalb kann ich hier auch keine Codeausschnitte posten.


Schönen Abend
hashii
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B jtapi <-> tapi Kommunikation Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben