Fritzbox auslesen und auswerten

Hallo Forum,

Ich habe mal ein kleines Script für die Fritzbox zusammen gestellt.

Das Script beinhaltet eine kleine interne Datenbank(Array) welche eingehende Nummern vergleicht, welche nicht gelistet(aber übertragen werden) und intern bekannt sind.
Sollte vor allen Intressant sein, welche nichts mit Datenbanken am Hut haben.
So wie ich :wink:

Hier sind auch einige Codeschnippsel von anderen Usern miteingebaut.

Vorraussetzung Freigabe des Port 1012 an der Fritzbox.
Zum öffnen des Port.
Angeschlossenes Telefon und #965 eingeben und Bestättigungston abwarten.
Zum Schliessen des Port.
Angeschlossenes Telefon und #964 eingeben und Bestättigungston abwarten.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Fritzbox.ips.php
Trigger  : OnUpdate
Interval : Fritzbox
*/

$Fritzbox = GetValueString("Fritzbox");
$daten    = explode(";", $Fritzbox);

// Nummern ohne Eintrag welche aber bekannt sind und übertragen werden (intern).
// Kleine interne Datenbank, erweiterbar.

  $array["Nummer"][1] = "06043xxxxxxx";
  $array["Name"]  [1] = "Rainer";
  $array["Nummer"][2] = "0604398xxxxxxx";
  $array["Name"]  [2] = "Gabi";
  $array["Nummer"][3] = "0151xxxxxxxxx";
  $array["Name"]  [3] = "Rainer Handy";
  $array["Nummer"][4] = "0161xxxxxxx";
  $array["Name"]  [4] = "Rainer Firma";

// Daten einlesen und auswerten
switch($daten[1])
{
  case "RING":
   $Rufnummer = ($daten[3]);
     if(in_array($Rufnummer, $array["Nummer"]))
      {
       $intern = array_search($Rufnummer, $array["Nummer"]);
       COMPort_SendText(50814, chr(27)."ZV".chr(5));
       COMPort_SendText(50814, chr(27)."ZL".chr(5).chr(32)."Anruf von " . $array["Name"][$intern].".".chr(0));
       return;
      }
       else
        {
         $Rufnummer = SucheNummer($Rufnummer);
        }
   break;
  case "DISCONNECT":
   SetValueString("Fritzbox","");
   return;
   break;
}

// Funktion zur Nummersuche und Umwamdlung von Ää,Öö,Üü,ß in das richtige Format
// zum Senden nach Edip muss entsprechend gewandelt werden, je nach Konfig mit \xAdresse oder .(chr).
function SucheNummer($Rufnummer)
{
   $url_orig = XXXXXXXXXXXXXXXXXXXXXXXXXXXX
   $url = str_replace("#TEL#","$Rufnummer",$url_orig);
   //$url = $url_orig.$Rufnummer;
   $Ausgabe = fopen("$url", "r");
   if (!$Ausgabe){
      echo("ERROR : Kann URL nicht öffnen : '$url'
");  // Kann URL nicht öffnen
   }
   $lineNb     = 0;
   $searchTag0 = '&Name=';
   $searchTag1 = '&Vorname=';
   $searchTag2 = '&Strasse';
   $gefunden   = 0;
   while(!$gefunden && !feof($Ausgabe))
   {
    $lineNb++;
    $buffer = fgets($Ausgabe);
      if (strpos($buffer, $searchTag0) !== false)
        {
        $gefunden = 1;
        $startLN  = (strpos($buffer, $searchTag0)+6);
        $endeLN   =  strpos($buffer, $searchTag1);
        $Nachname = substr($buffer, $startLN, ($endeLN-$startLN));
        $startFN  = (strpos($buffer, $searchTag1)+9);
        $endeFN   =  strpos($buffer, $searchTag2);
        $Vorname  = substr($buffer, $startFN, ($endeFN-$startFN));
        $Name = $Vorname." ".$Nachname."
\r";
        $Name = str_replace('+', ' ',$Name);
        $Name = str_replace("Ä","Ä",$Name);
        $Name = str_replace("ä","ä",$Name);
        $Name = str_replace("Ö","Ö",$Name);
        $Name = str_replace("ö","ö",$Name);
        $Name = str_replace("%F6","ö",$Name);
        //$Name = str_replace("%FC","ü",$Name);
        $Name = str_replace("%FC","\x81",$Name); //Auflösung Edip
        $Name = str_replace("Ãœ","Ü",$Name);
        $Name = str_replace("ü","ü",$Name);
        $Name = str_replace("ß","ß",$Name);
        SetValueString("Teststring", $Name);
        COMPort_SendText(50814, chr(27)."ZV".chr(5));
        COMPort_SendText(50814, chr(27)."ZL".chr(5).chr(32)."Anruf von " .$Name.chr(0));
        }
         else {$Name = "Unbekannt";}
         COMPort_SendText(50814, chr(27)."ZV".chr(5));
         COMPort_SendText(50814, chr(27)."ZL".chr(5).chr(32)."Anrufer " .$Name.chr(0));
       }
   fclose($Ausgabe);
   return $Name;
}

?>

Hallo Rainer,

dies ist die Lösung mit Com/Lan Schnittstelle, richtig? Funktioniert die Schnittstelle bei dir einwandfrei? Bei mir hatte ich oft das Gefühl, das die Verbindung ausfällt, so das ich dann die Capi Variante gewählt habe.

Gruß
Jens

Hallo Jens,

das ist eine Möglichkeit, sie läuft im Moment über Lan. Sollte allerdings auch genauso über Capi laufen, bei entsprechender Anpassung des Dateneingangs.

Zum Testen über Capi, werde ich allerdings nicht mehr kommen, ich werde umgestellt auf analog. Ich nutze schon seit 2 Jahren Voip. Was ich noch machen werde, ist das auslesen von meinen Siemens Telefonen IP 45, weil diese direkt am Lan angeschlossen sind.

Hallo Rainer,

dein Script werde ich morgen gleich mal testen. Danke erstmal fürs veröffentlichen.

Die ComPort_SendText sind bei dir alle nur fürs EDip, oder sendest du noch etwas zurück an die Fritzbox?

Für die Reversesuche benötigst du keine WWW_Reader und Parser, ist das richtig? Wie lange dauert in etwa die Reversesuch bis zum Ergebnis?

Am Ende steht ein „RETURN $Name;“ innerhalb der Funktion. Bedeutet das, das die Variable $Name damit auch noch ausserhalb der Funktion zur Verfügung steht?

Fragen über Fragen???

Grüße,
Doc

Hallo Doc,

Die ComPort_SendText sind bei dir alle nur fürs EDip, oder sendest du noch etwas zurück an die Fritzbox?

Richtig, es wird nur ausgelesen. Normal steht da auch XbeeSendBuffer, ist auf dem Testrechner.

Für die Reversesuche benötigst du keine WWW_Reader und Parser, ist das richtig? Wie lange dauert in etwa die Reversesuch bis zum Ergebnis?

Richtig, Hmm sofort. Sobald das Telefon klingelt ist in Info da. Verzögerungen im Netz nicht berücksichtigt.

Am Ende steht ein „RETURN $Name;“ innerhalb der Funktion. Bedeutet das, das die Variable $Name damit auch noch ausserhalb der Funktion zur Verfügung steht?

Sofern sie als Variable vorliegt, ja.

Hallo,

wer mit dem Com/Lan-Modul Probleme haben sollte, kann auch das ClientSocket-Modul verwenden. IPS V1

Nur zur Info.

Hallo Rainer,

habe mal versucht dein Script zu verwenden, aber scheinbar funktioniert die Rückwärtssuche nicht mehr … Änderung bei Klicktel?

Gruß
Jens

Hallo Jens,

nein, warum? Geht einwandfrei.

Kopier dieses mal in deinen Eingang von der Fritzbox.

'24.07.08 19:16:23;RING;0;06402504903;
'

Wenn das nicht geht, hast Du ein anderes Problem. Deine Verbindung über den Port zur Fritzbox steht noch?

Nein, nein … das funktioniert soweit … das Problem ist, das egal welche Nummer rein kommt ein „Anrufer unbekannt“ zurück kommt … obwohl ich bei Manueller Eingabe auf der Webseite ein Ergebnis bekomme …

Hallo Jens,

das kann ich so nicht nachvollziehen, das einzige was ist, wenn eine Nummer unbekannt ist, zeigt er die erstbeste Auswahl an.

Schneid doch unten die Abfrage unbekannt ab und setz im Array unbekannt „“

$array["Nummer"][5] = "";
  $array["Name"]  [5] = "Unbekannt";

schnipp

    $Name = str_replace("ß","ß",$Name);
        SetValueString("Teststring", $Name);
        XBee_SendBuffer(49578, chr(27)."ZV".chr(5));
        XBee_SendBuffer(49578, chr(27)."ZL".chr(5).chr(32)."Anruf von " .$Name.chr(0));
        }
   }
   fclose($Ausgabe);
   return $Name;
}

schnapp.

Denk dran, Nummern die nicht bekannt sind aber übertragen werden verursachen soetwas.
Diese sollten ins Array übertragen werden.

Bei Nummern ohne Kennung „“ unbekannt setzen.