Fritzbox Anrufbeantworter

Hallo,
bin grade dabei den FritzBox AB auszulesen.
Wie man an die wav Dateien kommt ist ja klar, nur wie man den zusammenhang Herstellt zwischen Anrufer/Name/Nummer und wav, ist noch nicht ganz klar. Habe mir mal die Meta Dateien (meta0 etc…) mal angeschaut, da steht Nummer als auch Dateiname drin. Hat sich jemand schon die mühe gemacht, den Aufbau dieser Meta Dateien genau anzuschauen?
Wenn nicht werde ich mich mal dran machen…

Grüße
Marcus

Den Beitrag zum FritzBox AB hast du bestimmt gefunden ;).

Hallo Ralf,
den habe ich gefunden. Die Nachrichten werden einfach nur gezählt, konvertiert und ausgegeben, einen zusammenhang über die erstellungszeit wollte ich mir sparen, da nicht ganz sauber. Es gibt aber eine Verzeichnis ebene drüber auch eine Datei (meta0) die den Zusammenhang zwischern Anrufer/Nummer und Aufnahme herstellt. Habe auch schon rausgefunden das die Datei Einträge mit fester länge enthält, also recht einfach zu dekodieren ist. Denke werde die Datei in PHP auseinander nehmen und die Daten so anzeigen (EInfach mit zusätzlichem Symbol in der Anruferliste), sollte eigentlich kein Problem sein. Nur wenns sich schon jemand mal die mühe gemacht hätte das Format auseinander zu nehemen, wäre es für mich einfacher gewesen :-).
Grüße
Marcus
:loveips:

Hi kermitted,

es gibt von mir ein Plugin für MediaPortal, welches die MetaX Files dekodiert um die Nachrichten für MediaPortal aufzubereiten. Das ist aber C# Code.

Den Code findest Du hier: https://mp-plugins.svn.sourceforge.net/svnroot/mp-plugins/trunk/plugins/FritzBox/FritzBox

bzw. die betreffende Code-Stelle:


  internal class ABReader
  {
  	static Logger Log = LoggerFactory.getLogger("ABReader");
  	
    public static List<VoiceboxItem> loadVoiceboxDir(string basepath)
    {
      //string basepath = @"C:\Dokumente und Einstellungen\sr\Eigene Dateien\sharpproj\FritzABBrowser\voicebox\";
      List<VoiceboxItem> result = new List<VoiceboxItem>();
      try
      {
        for (int i = 0; i < 5; i++)
        {
          string meta = String.Format("{0}\\meta{1}", basepath, i);
          Log.Debug("Reading voicebox items from {0}", meta);
          FileStream stream = File.OpenRead(meta);
          MyBinaryReader r = new MyBinaryReader(stream);
          int p = 0;
          while (stream.Position < stream.Length)
          {
            stream.Position = p * 348;
            int len = r.ReadInt32();
            if (len == 348)
            {
              VoiceboxItem item = new VoiceboxItem();
              item.voicebox = i; // what voicebox
              item.seq = r.ReadInt32();
              item.type = r.ReadInt32();
              r.ReadInt32();
              item.filelen = r.ReadInt32();
              item.lenInSec = r.ReadInt32();
              item.isNew = r.ReadInt32();
              // 24 Bytes
              stream.Position += 24;
              long pos = stream.Position + 18 * 4;
              item.callerId = r.ReadCString();
              stream.Position = pos;
              pos += 32;
              item.filename = r.ReadCString();
              stream.Position = pos;
              pos += 32 * 4;
              item.pathname = r.ReadCString();
              stream.Position = pos;
              pos += 9 * 4;
              // read date
              int Day = r.ReadByte();
              int Month = r.ReadByte();
              int Year = r.ReadByte() + 2000;
              int Hour = r.ReadByte();
              int Minute = r.ReadByte();
              int Second = r.ReadByte();
              item.time = new DateTime(Year, Month, Day, Hour, Minute, Second);

              stream.Position = pos;
              pos += 32;
              item.mynumber = r.ReadCString();
              stream.Position = pos;
              result.Add(item);
              Log.Debug("found voicebox item {0}", item);
            }
            else
            {
              Log.Debug("Bad length inidcator: {0}", len);
            }
            p++;
          } // while
          stream.Close();
          //Console.ReadLine();
        } // for
      }
      catch (Exception e)
      {
        Log.Debug("Exception {0}", e.Message);
      }
      return result;
    }
  }


Der Code funktioniert für die 7270 bis zur aktuellen Firmware, laut den Feedbacks anderer Nutzer aber auch mit anderen Modellen.

Vielleicht hilft es Dir ja, wenn Du eine PHP Implementierung erstellst.

Gruß Steve

mal ne andere idee. warum lasst ihr euch das wav nicht von der fritzbox als mail schicken?

einfach mit ips die mail mit anhang abfragen und schon hat man es. ich hab mich noch nicht ran gesetzt aber das wäre mein ansatz.

Hallo zusammen,

Muss ich doch gleich mal ausgraben…
Ist hiermit jemand weitergekommen?

Schöne Grüße
Joerg

Hallo Leute,

gibt es inzwischen eine PHP-Lösung zur Decodierung der FritzBox Meta-Datei?

Joachim

Hallo Leute,

da mir die Informationen dieser MetaX-Datei gerade auch mit der Integration in das Webfront sehr interessant erscheinen, habe ich mich daran gemacht und ein kleines Testskript geschrieben.

$userdatei = fopen("F:/IP-Symcon/webfront/user/Fritzbox/Anrufbeantworter/meta0c","r");
$z = 0;
while(!feof($userdatei))
   {
	$zeile = fread($userdatei, 348);
	If (strlen($zeile) == 348)
	   {
	   // Länge des Datensatzes (sollte immer 348 sein!)
		$datalenght = bin2hex(substr($zeile, 2, 2));
	   //echo hexdec($datalenght)." - ";

		// Aufnahmelänge
		$reclenght = bin2hex(substr($zeile, 23, 1));
	   echo hexdec($reclenght)."s ";

		// Zeiger ob die Nachricht schon abgehört wurde
      $new = bin2hex(substr($zeile, 27, 2)); // Neue Nachrichten haben den Wert 256, schon angehörte den Wert 0
	   echo hexdec($new)." - ";

		// Nummer des Anrufers sofern vorhanden
		$callerID = (substr($zeile, 52, 15));
		echo $callerID;

		// Name der Datei
		$filename = (substr($zeile, 124, 15));
		echo $filename;

		// Pfad und Name der Datei
	   $path = (substr($zeile, 156, 60));
		echo $path;

		// Tag des Anrufes
		$day = bin2hex(substr($zeile, 284, 1));
		echo hexdec($day).".";

		// Monat des Anrufes
		$month = bin2hex(substr($zeile, 285, 1));
		echo hexdec($month).".";

		// Jahr des Anrufes
		$year = bin2hex(substr($zeile, 286, 1));
		echo (hexdec($year) + 2000)." - ";

		// Stunde des Anrufes
		$hour = bin2hex(substr($zeile, 287, 1));
		echo hexdec($hour).":";

		// Minute des Anrufes
		$minute = bin2hex(substr($zeile, 288, 1));
		echo hexdec($minute).":";

		// Sekunden des Anrufes (ist wahrscheinlich immer 0)
		$second = bin2hex(substr($zeile, 289, 1));
		echo hexdec($second)." - ";

		// Nummer die angerufen wurde
		$calledID = trim(substr($zeile, 320, 10));
		echo $calledID;

		echo "
";
		$z = $z + 1;
		}
	}
fclose($userdatei);

Es ist sicherlich an der einen und anderen Stelle noch verbesserungswürdig, erfüllt aber zumindest vom Prinzip her seine Anforderungen (darum ging es mir an dieser Stelle).

Ich würde mich über weitere Ideen zur Umsetzung und den Möglichkeiten freuen…

Joachim

Nachtrag:
Was mir bei der Gelegenheit in der FritzBox-Oberfläche aufgefallen ist: Dort wird bei allen AB-Aufzeichnungen die Dauer mit einer Sekunde angegeben und noch etwas: Wenn ich das Video aus der Oberfläche heraus lösche, dann wird zwar die Sprachaufzeichnung selbst gelöscht, der Eintrag in der metaX-Datei bleibt aber erhalten.
Ist das bei Euch auch so?

Moin Joachim,

ich finde die Idee mit den meta* Dateien gut. Mir fehlt schon lange eine vernünftige IPS Lösung für die ABs.

Ich habe 4 meta* Dateien für 4 Anrufbeantworter. Nach ein paar Optimierungen bezüglich Pfadlänge und Ausgabe passen meine Ergebnisse zu den Erwartungen :).

Auch deine Erkenntnis bezüglich Löschung der letzten Aufnahme kann ich teilen. Es bleibt immer eine Aufnahme in der meta* stehen. Das würde sich aber mit einem file_exists() prüfen lassen.
Allerdings habe ich eh’ eine Zeile mehr in der Datei, nämlich die Referenz auf die uvp.0.000. Das ist die entsprechende Ansage zum jeweiligen AB.

Und das jetzt aufbereitet mit Kopieren in den webfront Ordner, Konvertieren und optisch aufgehübscht zum Abspielen im webfront :cool:. Alle notwendigen Schnipsel gibt ja eigentlich schon.

Guten Morgen Ralf,

wie Du schon richtig angemerkt hast, sind viele der notwendigen Puzzle-Teile hier schon im Forum zu finden.
Für das Kopieren, die Umwandlung in wav und die Löschung der Originale habe ich mal dieses Puzzle-Teil gebastelt (ist so eine Art „Best-of“ der Beispiele hier im Forum (noch nicht ganz fertig!):

//Serveradresse/Name
$conn_id = ftp_connect("192.168.178.1");

// Login mit Benutzername und Passwort
ftp_login($conn_id, "ftpuser", "Passwort");
ftp_pasv($conn_id, true);

// Nach Verzeichnis .... wechseln
ftp_chdir($conn_id, "CnMemory-01/FRITZ/voicebox/rec/");

$files = ftp_nlist($conn_id, ".");

print_r($files);

if($files == "")
{
   SetValue(26193 /*[Fritz!Box\Anrufbeantworter\Anzahl Anrufe]*/ , 0);
   echo "Keine Daten vorhanden";
}
else
{
   $zaehler = count($files);
   //echo $zaehler;
   SetValue(26193 /*[Fritz!Box\Anrufbeantworter\Anzahl Anrufe]*/ , $zaehler);
   //**************************************************
      $z = 0;
      
		$source = "/CnMemory-01/FRITZ/voicebox/rec/$files[$z]";
		$target =  fopen("F:/IP-Symcon/webfront/user/Fritzbox/Anrufbeantworter/$files[$z]", "w");
		ftp_fget($conn_id, $target, $source, FTP_ASCII);
		fclose($target);
		IPS_Execute("F:\IP-Symcon\dec.exe", "F:/IP-Symcon/webfront/user/Fritzbox/Anrufbeantworter/$files[$z] F:/IP-Symcon/webfront/user/Fritzbox/Anrufbeantworter/$files[$z].wav", false, false);
      IPS_Sleep(5000);
		ftp_delete($conn_id, "/CnMemory-01/FRITZ/voicebox/rec/$files[$z]");
		unlink ("F:\IP-Symcon\webfront\user\Fritzbox\Anrufbeantworter/$files[$z]");

	//**************************************************
}

ftp_close($conn_id);

Da die Datei bei mir sowieso parallel per Mail versendet wird, ist es für mich in Ordnung wenn das Original auf der FB gelöscht wird - ich habe es ja als Mail und dann eine Datei noch im IPS-Ordner. Wobei mir noch unklar ist wie die FB mit der „externen Löschung“ umgeht, da zwar die Aufzeichnung fehlt, in der meta*-Datei der Eintrag noch vorhanden ist…

Die Umwandlung über das Tool „dec“ funktioniert, die Qualität ist aber m.E. bei der Umwandlung über die FB besser. In anderen Foren wird da mit anderen Tools („speex“) gearbeitet, ich habe dazu aber noch keine Windows-Lösung gefunden…

Die Integration in das Webfront stelle ich mir in ähnlicher Form vor, wie ich es für die Videoaufzeichnungen der IP-Camsrealisiert habe.
Andere habe aber über HTML-Funktionen da deutlich schönere Umsetzungen programmiert.

Schön wäre, wenn Du mir noch mal Deine Anpassung bzw. Ergänzung bezüglich der uvp.0.000-Datei posten würdest…

Joachim

Meine Anpassungen waren eher kosmetischer Natur um meinen langen Pfad angezeigt zu bekommen. Außerdem stören die 0-Bytes die IPS Ausgabe in der Console und eine gleich Feldlänge zur Anzeige untereinander erleichtert die Analyse.

<?

$userdatei = fopen("D:/IP-Symcon/webfront/user/Fritzbox/voicebox/meta3","r");
$z = 0;
while(!feof($userdatei)) {
    $zeile = fread($userdatei, 348);
    If (strlen($zeile) == 348) {

        $seq = trim(hexdec(bin2hex(substr($zeile, 0, 1))));
        echo $seq." - ";
        $type = trim(hexdec(bin2hex(substr($zeile, 1, 1))));
        echo $type." - ";

       // Länge des Datensatzes (sollte immer 348 sein!)
       $datalenght = trim(hexdec(bin2hex(substr($zeile, 2, 2))));
       echo $datalenght." - ";

       // Aufnahmelänge
       $reclenght = trim(hexdec(bin2hex(substr($zeile, 23, 1))));
       echo str_pad($reclenght,3," ",STR_PAD_LEFT)."s - ";

       // Zeiger ob die Nachricht schon abgehört wurde
       $new = trim(hexdec(bin2hex(substr($zeile, 27, 2)))); // Neue Nachrichten haben den Wert 256, schon angehörte den Wert 0
       echo str_pad($new,3," ",STR_PAD_LEFT)." - ";

        // Nummer des Anrufers sofern vorhanden
        $callerID = trim(substr($zeile, 52, 15));
        echo str_pad($callerID,15," ")." - ";

        // Name der Datei
        $filename = trim(substr($zeile, 124, 15));
        echo str_pad($filename,15," ")." - ";

        // Pfad und Name der Datei
        $path = trim(substr($zeile, 156, 128));
        echo str_pad($path,70," ") . " -- ";

        // Tag des Anrufes
        $day = trim(hexdec(bin2hex(substr($zeile, 284, 1))));
        echo str_pad($day,2,"0",STR_PAD_LEFT).".";

        // Monat des Anrufes
        $month = trim(hexdec(bin2hex(substr($zeile, 285, 1))));
        echo str_pad($month,2,"0",STR_PAD_LEFT).".";

        // Jahr des Anrufes
        $year = trim(hexdec(bin2hex(substr($zeile, 286, 1))));
        echo $year + 2000 . " -- ";

        // Stunde des Anrufes
        $hour = trim(hexdec(bin2hex(substr($zeile, 287, 1))));
        echo str_pad($hour,2,"0",STR_PAD_LEFT).":";

        // Minute des Anrufes
        $minute = trim(hexdec(bin2hex(substr($zeile, 288, 1))));
        echo str_pad($minute,2,"0",STR_PAD_LEFT).":";

        // Sekunden des Anrufes (ist wahrscheinlich immer 0)
        $second = trim(hexdec(bin2hex(substr($zeile, 289, 1))));
        echo str_pad($second,2,"0",STR_PAD_LEFT)." - ";

        // Nummer die angerufen wurde
        $calledID = trim(substr($zeile, 320, 10));
        echo str_pad($calledID,32," ");

        echo "--
";
        $z = $z + 1;
        }
    }
fclose($userdatei);

?>

Die uvp… ist als eigener Eintrag mit in der meta* Datei. Die Zeile lässt sich auch ganz normal lesen und auswerten.

Deine Video-Darstellung ist doch völlig ausreichend ;). Die Fragmente für den Dateinamen sind in der Meta-Datei vorhanden. Mal sehen, ob ich heute Abend zum kombinieren kommen.

Hallo Ralf,

welchen Informationen beinhalten die Variablen $seq und $type? Ich hatte das auch schon im C#-Skript gesehen, konnte aber auch dort nicht zuordnen wozu mir diese Daten dienen…

Joachim

Ich habe das auch nur aus dem C#-Code und wollte sehen, ob es überhaupt Daten gibt und ob man daraus Rückschlüsse ziehen kann.

Hallo Ralf,

wenn Du Deinen Datenauszug betrachtest, dann beginnt bei Dir (wie auch bei mir) der Datensatz mit „00 00 01 5C“. Nach dem C#-Skript würdest Du aber die Daten für $seq und $type an den ersten beiden Stellen erwarten…

Ich habe mir mal die meta-Datei von einem Freund zusenden lassen - dort beginnt jeder neue Datensatz mit „5C 01 00 00“. Was immer diese Daten zu sagen haben, jeder Datensatz beginnt mit der gleichen Sequenz…

Joachim

Nachtrag: Hier übrigens auch so…

Hat jemand ein funktionierendes Script für die AVM Fritz!Box 7330 für den Anrufbeantworter?

Hallo Thomas,

m.W. gibt es nur diverse Fragmente, einige davon sind in diesem Thread. Ich habe nun aber auch erst angefangen die Puzzleteile mal sinnvoll und komfortabel zusammenzubringen…

Joachim

Hi,
habt ihr schon weitere Infos bzw. Ideen bezgl. Auslesen der Meta Datei ?

gruß
jens

Hallo Gemeinde,

da kann ich mich dem großen Nagus nur anschließen :slight_smile:

Würd mich auch wahnsinnig über ein passendes Script freuen…

Das mit den Puzzelteilen zusammenlöten bekomme ich leider selbst nicht hin :frowning:

Könnte aber abgestandene Cola und kalte Pizza an den Programmierer schicken :slight_smile:

Liebe Grüße
Sascha