Anruf ISDN über Fritzbox

Hallo,

ich habe folgendes Script erstellt (bzw. aus dem Forum kopiert), um aufgrund eines Ereignisses einen Anruf durchzuführen und eine Datei abzuspielen:

<?

set_time_limit(60);
$id = ISDN_Connect(15438 /*[ISDN Module]*/, "xxxxxxxxxxxx");

$i = 1;
while ($i < 4):
   ISDN_PlayWave(15438 /*[ISDN Module]*/, $id,"C:/IP-Symcon/media/test.wav");
   sleep(6);
   ISDN_StopPlay(15438 /*[ISDN Module]*/, $id);
   $i++;
endwhile;

ISDN_Disconnect(15438 /*[ISDN Module]*/, $id);
set_time_limit(30);

?>

Nun zum Problem:
Zum einen beginnt der zweite Durchlauf der Ansage bevor der erste fertig ist (ab dann klappte es) und zum anderen wird zwar aufgelegt, aber beim Fritzbox-Script bleibt das Gespräch aktiv, d.h., so wie es aussieht wird der disconnect nicht erkannt.
Kennt jemand das Phänomen oder hat jemand eine Idee, wie ich diese Probleme genauer analysieren und beheben kann ?
Überhaupt kommt es bei dem Anzeigen der aktuellen Gespräche immer wieder mal vor, dass nicht alle Variablen nach dem Auflegen gelöscht werden.

Moin,

also mit IPS_Sleep(6) kommst du nicht weit. Es sei den, dass dein Test.wav nur 6ms lang ist.

Wenn Du das Script so aufbauen willst, dann bitte so:


...
$len = ISDN_PlayWave(15438 /*[ISDN Module]*/, $id,"C:/IP-Symcon/media/test.wav"); // Spieldauer in ms 
IPS_Sleep($len+500); 
ISDN_StopPlay(15438 /*[ISDN Module]*/, $id); 
...

Ansonsten ist dein Script schneller als der Telefonanruf!

Allerdings würde ich dir empfehlen die Eventsteuerung des ISDN-Moduls zu verwenden. Passende Scripte gibt es hier und hier gibt es unter ISDN die passende Dokumentation.

Hallo,

ich habe das Script jetzt so umgebaut, aber das Ergebnis war leider nicht so toll:

Die Ansage kam nur noch einmal, das Script endete nicht mehr und es wurde kein Disconnect durchgeführt und … den IPS-Dienst musste ich über den Taskmanager kicken, da er als Dienst keine Antwort mehr gab und das gesamte IPS-System zum erliegen kam :frowning:

set_time_limit(60);
$id = ISDN_Connect(15438 /*[ISDN Module]*/, "xxxxxxxxxxxxx");

$i = 1;
while ($i < 4):
   $len = ISDN_PlayWave(15438 /*[ISDN Module]*/, $id,"C:/IP-Symcon/media/test.wav");
   sleep($len + 500);
   ISDN_StopPlay(15438 /*[ISDN Module]*/, $id);
   $i++;
endwhile;

ISDN_Disconnect(15438 /*[ISDN Module]*/, $id);
set_time_limit(30);

Kann mir jemand auf die Sprünge helfen, was ich hier falsch mache ?
Die Eventsteuerung kann man doch nur nutzen, wenn ein Anruf reinkommt - das Event soll ja mal von einem Rauchmelder kommen.

Also die Eventssteuerung funktioniert in beide Richtungen!

Du solltest aber in deinem Fall vielleicht folgendes versuchen:


//Verbindung herstellen
$ISDN_CONNECTION = ISDN_Connect($ISDN,$rufnummer);
$callinfo = ISDN_GetConnectionInfo($ISDN,$ISDN_CONNECTION);

//IPS soll so lange warten bis einer das Gespräch abnimmt.
do {
     IPS_Sleep(1000);
} while ($callinfo["State"] != 4 );

//Sobald die Verbindung hergestellt wird Script abfeuern!
if (($callinfo["State"] == 4 ) {
  for ($i=0;$i<4;$i++) {
    $len = ISDN_PlayWave($ISDN, $ISDN_CONNECTION, $file);
    IPS_Sleep ($len + 500);
    ISDN_StopPlay($ISDN, $ISDN_CONNECTION);
    IPS_Sleep(500);
  }
}
ISDN_Disconnect($ISDN, $ISDN_CONNECTION);

So könnte ich mir das vorstellen. Habe so etwas ähnliches schon mal gebaut. Habe noch ein Ausstiegstürchen in der Do schleife bei mir eingebaut, wenn keiner ran geht. So würde das Script immer in der Schleife hängen.
Ich glaube ich hatte das dann mit microtime() gelöst. Sprich wenn 15sec vergangen in der DO schleife einen Break gesetzt.

Wie gesagt die Eventsteuerung ist da besser:
Du löst mit einem Script den Anruf aus.

$ISDN_CONNECTION = ISDN_Connect($ISDN,$rufnummer);
$callinfo = ISDN_GetConnectionInfo($ISDN,$ISDN_CONNECTION);

Anschließend baust Du Dir ein Ereignissscript:


switch($_IPS['EVENT']) {
    case "Connect":
         ISDN_PlayWave($ISDN, $ISDN_CONNECTION, $file);
    break;
    case "PlayFinish":
         ISDN_StopPlay($ISDN, $_IPS['CONNECTION']);
         ISDN_Disconnect($ISDN, $_IPS['CONNECTION']);
    break;
 }

Da Du ja mehrere Files hintereinander abspielen willst müsste man sich Gedanken machen wie das ISDN_PlayWave mehrmals ausgeführt wird. Ich könnte mir vorstellen, dass das man das über eine Variable erschlagen könnte.
Prüfen wieviele Meldungen anliegen dann in die Variable schreiben (evtl in einem Array) welche Files abgespielt werden müssten und dann im PlayWave eine Meldung abfeuern. Warten bis das Ereignis PlayFinish kommt. Wave stoppen. Prüfen ob noch weitere Meldungen abgespielt werden müssen (wenn ja letzten Array eintrag löschen, so dass sich die Variable automatisch leert), wenn nein Disconnect. So könntest Du ohne Set_time_limit auskommen.

So auf die schnelle fällt mir da aber auch nichts besseres ein.

Hallo,

zunächt mal Danke für die Antwort - das mit dem sleep funktioniert einfach nicht richtig - wenn ich 6 angeben, dann klappt es einigermaßen, aber bei 500 kommt die Ansage gar nicht und zum Disconnect kommt er auch nicht mehr - nach 60 Sec. macht er zum Glück dicht…

Aber das mit dem Event sieht mir auch wie die bessere Lösung aus - allerdings habe ich es noch nicht ganz kapiert:

Durch welches Event wird das switch-Script getriggert ? Das ISDN-Modul kann ja kein Auslöser sein - muss man da Statusvariablen definieren oder wie geht das ?

Hallo,

das Script wird im ISDN Modul verknüpft.
Dann stehen der Variable $_IPS[‚EVENT‘] die benötigten Werte zu Verfügung.

Einfach mal im ISDN Modul unter Ereignisscript schauen! Der Vorteil das Script wird nur bei den im Switch genannten Werten gestartet. Siehe einfach mal in meinem ersten Post die Doku!

Gruß

Hallo,

ich habe das jetzt so wie beschrieben umgesetzt, aber leider kennt er die IPS[EVENT]-Variable nicht …

Auslöse-Script:

$ISDN_CONNECTION = ISDN_Connect(15438 /*[ISDN Module]*/, "xxxxxxxxxxxx");
$callinfo = ISDN_GetConnectionInfo(15438 /*[ISDN Module]*/,$ISDN_CONNECTION);

Ereignis-Script des ISDN-Moduls:

 switch($_IPS['EVENT'])
    {
    case "Connect":
         ISDN_PlayWave(15438 /*[ISDN Module]*/, $ISDN_CONNECTION,"C:/IP-Symcon/media/test.wav");
    break;
    case "PlayFinish":
         ISDN_StopPlay(15438 /*[ISDN Module]*/, $ISDN_CONNECTION);
         ISDN_Disconnect(15438 /*[ISDN Module]*/, $ISDN_CONNECTION);
    break;
    default:
    }

Du hast das Script nicht manuell gestartet, sondern es ist im ISDN Modul als Ereignisscript eingetragen? Nur dann wird die Variable durch IPS versorgt ;).

Ich habe das Auslösescript manuell gestartet und über das ISDN-Modul wurde das Ereignisscript automatisch gestartet - sollte also eigtl. funktionieren…

im Logfile steht : …Absender: ISDN Verbindng 1, Ereignis: Connect

trotzdem läuft er nicht in der Switch-Anweisung ind den Connect-Zweig

ich habe den Fehler nun gefunden

funktioniert nicht:

switch($_IPS['EVENT'])

funktioniert

switch($ISDN_EVENT)

Gab es im Forum diesbezüglich nicht schon mal eine Diskussion ? Ich hätte den Vorschlag, dass man das in den Doku evtl. anpasst.

Das obige Skript hat einen Fehler. Es bleibt immer in der Schleife um abzufragen, ob das Gespräch schon angenommen wurde - und zwar, weil die Abfrage des Status ausserhalb der Schleife stattgefunden hat. Der Status kann sich also nicht ändern.

So ist es besser:


//IPS soll so lange warten bis einer das Gespräch abnimmt.
do {
     $callinfo = ISDN_GetConnectionInfo($ISDN,$ISDN_CONNECTION);
     IPS_Sleep(1000);
} while ($callinfo["State"] != 4 );

Die Connection-Info darüber kann man entfernen…