CBuilder und ISDN

Liebe/-r Experte/-in,

ich versuche eine Möglichkeit zu bauen , ankommende Anrufe in meiner Software anzuzeigen. Hierzu müßte ich die Capi2032.dll abhören.
Ich kann derzeit Hersteller und Sernummer der Capi auslesen, weiß aber nicht wie ich mich mit der capi „unterhalte“.
ich arbeite mit Cbuilder 6 pro.

Gruß Manfred

Hallo Manfred,

leider arbeite ich seit längerem nicht mehr mit der CAPI und kann Dir daher keine konkreten Code-Beispiele geben. Sinnvoll ist, sich mit der CAPI genauer zu befasssen, um zu verstehen, wie sie arbeitet. Unter http://www.capi.org/pages/downloads.php kann man sich als ZIP-File die gesamte Dokumentation herunterladen. Schon mal zum Verständnis einiges vorneweg: Die Aufrufnamen sind recht selbsterklärend. Für jeden Aufruf gibt es eine eigene Datenstruktur. Grundsätzlich gibt es 4 Typen: _REQ, _CONF, _IND, _RESP (Alle Aufrufe enden auf eine dieser 4 Arten).
_REQ sendet der Anwender an die CAPI, die CAPI antwortet mit einem passenden _CONF-Block. _IND sendet die CAPI an den Anwender, um asynchrone Ereignisse (z.B. ankommender Anruf, Unterbrechung der Verbindung usw.) anzuzeigen. Der Anwender hat mit einem _RESP-Block zu antworten. (Siehe Kapitel 3.1 in capi20-1.pdf der ZIP-Datei).

Um nicht alles selbst schreiben zu müssen (elendig viele Datenstrukturen), sollte man auf das zurückgreifen, was das Internet so bietet. Google mit dem Stichwort „CAPI2032 CBUILDER“ gibt sicherlich gute Treffer. Einer davon scheint mir gut geeignet zu sein, da auf deutsch beschrieben und Beispiel-Code in Delphi: http://www.the-infobase.de/isdn/msk0401.htm. Falls es zur IDSN-Baugruppe auch einen TAPI-Treiber gibt, wäre es auch möglich per TAPI ankommende Anrufe zu erkennen. Möglicherweise findet man zur TAPI aktuellere Informationen und Programmbeispiele, da dies das „modernere“ Protokoll ist.

Beschreibung der Aufrufe der CAPI:
(Lässt sich alles noch im Detail in der Doku des ZIP-Files von capi.org nachlesen)

  1. CAPI_REGISTER: Anmelden der eigenen Applikation bei der CAPI und festlegen der Größe des Nachrichtenpufferbereiches usw.

  2. CAPI_RELEASE: Abmelden der Applikation bei der CAPI und Freigabe des von der CAPI benutzten Speichers.

  3. CAPI_PUT_MESSAGE: Nachrichtenblock (_REQ oder _RESP) an die CAPI senden.

  4. CAPI_GET_MESSAGE: Nachrichtenblock (_CONF oder _IND) von der CAPI abholen.

  5. CAPI_SET_SIGNAL: Adresse an die CAPI übermitteln, die aufgerufen werden soll, wenn die CAPI eine Nachricht an die Applikation senden will.

  6. CAPI_WAIT_FOR_SIGNAL: Diese Funktion wartet so lange, bis die CAPI eine neue Nachricht übermitteln möchte.

  7. CAPI_GET_PROFILE: Abrufen der technischen Möglichkeiten der ISDN-Einheit (Anzahl der Kanäle, mögliche Protokolle usw.)

  8. CAPI_GET_MANUFAKTURER: Informationen zum Hersteller der CAPI / der ISDN-Einheit.

  9. CAPI_GET_VERSION: Versionsinformationen abrufen

  10. CAPI_GET_SERIAL_NUMBER: Seriennummer der ISDN-Karte abrufen

  11. CAPI_INSTALLED: Prüfen, ob die CAPI überhaupt benutzt werden kann (alle notwendigen Teiber und Hardwar installiert sind)

  12. CAPI_MANUFAKTURER: Diese Funktion kann vom CAPI-Hersteller nach eigener Spezifikation benutzt werden.

Für Deine Aufgabe ist in etwa folgendes notwendig:

  1. Mit CAPI_INSTALLED prüfen, dass CAPI funktionsfähig.
  2. Mit CAPI_REGISTER bei der CAPI anmelden
  3. Mit CAPI_PUT_MESSAGE das Kommando LISTEN_REQ absenden
  4. Mit CAPI_WAIT_FOR_SIGNAL auf eine Antwort warten
  5. Antwort (LISTEN_CONF) abholen
  6. Anrufe aufnehmen
  7. Mit CAPI_RELEASE bei der CAPI wieder abmelden
  8. Programm beenden

Hier der Punkt 6 etwas genauer:
Es gibt 3 Möglichkeiten, um auf einen Anruf zu warten:
a) CAPI_WAIT_FOR_SIGNAL aufrufen (Funktion kehrt zurück, wenn ein neues Ereignis wie z.B. Anruf auftritt)
b) Mit CAPI_GET_MESSAGE regelmäßig nach einer neuen Nachricht fragen (es wird ein entsprechender Fehlercode zurückgegeben, wenn noch keine Nachricht da ist)
c) Mit CAPI_SET_SIGNAL der CAPI eine eigene Adresse mitteilen, die die CAPI aufrufen soll, wenn sie eine neue Nachricht hat.

Am einfachsten ist Methode a), sinnvoll ist Methode b) und c) ist etwas komplexer, ermöglicht in objektorientierter Umgebung aber die beste Einbindung.

In Fall a) und c) muss man dann die eigentliche Nachricht noch mit CAPI_GET_MESSAGE abholen.

In allen Fällen muss die Nachricht mit dem passenden _RESP-Block bestätigt werden.

Der Empfang eines Anrufes wird mit CONNECT_IND übermittelt.
Wichtig: Da über eine CAPI viele Aktionen gleichzeitig auftreten können, benötigt jeder Aufruf einen „Bezugspunkt“. Beim CONNECT_IND ist das der PLCI (Physical Link Connection Identifier), den man mit dem CONNECT_RESP wieder angeben muss. Weiterhin gibt man einen „Reject“-Wert an. Wenn man das Gespräch nicht auf der ISDN-Karte annehmen will, sollte dieser nicht 0 sein. In deinem Fall sollte man für „Reject“ den Wert 1 für „Ignore call“ angeben, damit man das Gespräch am Telefon auch noch annehmen kann. Bei anderen Werten würde der Anruf abgewiesen.
Mit dem CONNECT_IND-Paket erhälst Du in dessen Felder alle Informationen wie Anrufernummer (soweit vorhanden), angerufene Nummer, gewünschter Dienst (Voice, Fax, usw.) und einiges mehr.

Ich hoffe, dass Du mit diesen Information ein Stück weiter kommst.

Liebe Grüße,
Wolfgang

Hallo Wolfgang,

erst mal lieben Dank für die Infos, die ich leider erst heute sehe (die Mail von werweisswas ist von gestern)
Die Delphi Seite hatte ich bereits gesehen komme aber mit dem Code nicht zurecht, ich bin fortgeschrittener Hobbyprogrammierer und kann nur c++ in der Borland Variante.
Aber die Angaben helfen mir sicher schon mal weiter und ich werde mich nochmal melden und den Stand mitteilen.

Gruß aus Worms
Manfred Schreiber