Programmierung > Delphi/Lazarus > FRITZ!Box

Online Telefonbuch auslesen (Klasse von v0.13 bis v0.16)

Das Telefonbuch lässt sich als TelCfg-Abfrage auslesen. Im Moment funktioniert es hier nur eintragsweise und es wird davon ausgegangen, dass nur ein Telefonbuch existiert. Damit Anfrage beantwortet wird muss das Telnet eingeschaltet sein. Zum Einschalten am Telefon #96*7* bzw zum Ausschalten #96*8* wählen. Im Display des Telefons wird der Status angezeigt. Ab Firmware xx.05.50 funktioniert die Abfrage nicht mehr.

Telefonbuch

Eigenschaften

Es steht folgende Eigenschaft zur Verfügung:

property OPB: Boolean;
property OPBInternCount: Integer;
property OPBInternName[const idx: Integer]: AnsiString;
property OPBInternCategory[const idx: Integer]: AnsiString;
property OPBInternNumberCount[const idx: Integer]: Integer;
property OPBInternNumber[const idx, nbr: Integer]: AnsiString;
property OPBInternType[const idx, nbr: Integer]: AnsiString;
property OPBInternPrio[const idx, nbr: Integer]: AnsiString;
property OPBExternCount: Integer;
property OPBExternName[const idx: Integer]: AnsiString;
property OPBExternCategory[const idx: Integer]: AnsiString;
property OPBExternNumberCount[const idx: Integer]: Integer;
property OPBExternNumber[const idx, nbr: Integer]: AnsiString;
property OPBExternType[const idx, nbr: Integer]: AnsiString;
property OPBExternPrio[const idx, nbr: Integer]: AnsiString;

OPB: Damit wird das Online-Telefonbuch abgerufen. Die gefundenen Einträge sind nur alphabetisch sortiert und werden beim Auslesen in Listen nach Intern und Extern aufgeteilt. Das Ergebnis gibt an, ob mindestens ein Eintrag gefunden wurde.

OPBInternCount: Gibt die Anzahl der gefundenen internen Einträge an.

OPBInternName: Gibt den Namen eines bestimmten Eintrages in der internen Liste zurück.

OPBInternCategory: Gibt an, ob ein bestimmter Eintrag in der internen Liste als Wichtig markiert ist. (Sollte nicht vorkommen.)

OPBInternNumberCount: Gibt die Anzahl der Rufnummern eines bestimmten Eintrages in der internen Liste an. (Sollte immer 1 sein.)

OPBInternNumber: Gibt zu einem bestimmten Eintrag in der internen Liste eine bestimmte Nummer an.

OPBInternType: Gibt zu einem bestimmten Eintrag in der internen Liste den Type einer bestimmten Nummer an.

OPBInternPrio: Gibt zu einem bestimmten Eintrag in der internen Liste die Priorität eine bestimmte Nummer an.

OPBExternCount: Gibt die Anzahl der gefundenen externen Einträge an.

OPBExternName: Gibt den Namen eines bestimmten Eintrages in der internen Liste zurück.

OPBExternCategory: Gibt an, ob ein bestimmter Eintrag in der internen Liste als Wichtig markiert ist.

OPBExternNumberCount: Gibt die Anzahl der Rufnummern eines bestimmten Eintrages in der internen Liste an. Maximal 3

OPBExternNumber: Gibt zu einem bestimmten Eintrag in der internen Liste eine bestimmte Nummer an.

OPBExternType: Gibt zu einem bestimmten Eintrag in der internen Liste den Type einer bestimmten Nummer an.

OPBExternPrio: Gibt zu einem bestimmten Eintrag in der internen Liste die Priorität eine bestimmte Nummer an.

Anwendung

Nach der Anmeldung an der FRITZ!Box kann das Telefonbuch ausgelesen werden. Beispiel für die Anwendung der Eigenschaft

procedure TfrmMain.sbnReloadClick(Sender: TObject);
var
  i, j : Integer;
begin
  sbnReload.Enabled := False;
  lvwIntern.Items.Clear;
  lvwExtern.Items.Clear;
  Application.ProcessMessages;
  if fFritzBox.OPB
  then begin
    for i := 0 to fFritzBox.OPBInternCount - 1 do
    with lvwIntern.Items.Add
    do begin
      Caption := fFritzBox.OPBInternName[i];
      SubItems.Add(fFritzBox.OPBInternCategory[i]);
      SubItems.Add(fFritzBox.OPBInternNumber[i, 0]);
      SubItems.Add(fFritzBox.OPBInternType[i, 0]);
      SubItems.Add(fFritzBox.OPBInternPrio[i, 0]);
      if fFritzBox.OPBInternNumberCount[i] > 1 then
      for j := 1 to fFritzBox.OPBInternNumberCount[i] - 1 do
      with lvwIntern.Items.Add
      do begin
        Caption := '';
        SubItems.Add('');
        SubItems.Add(fFritzBox.OPBInternNumber[i, j]);
        SubItems.Add(fFritzBox.OPBInternType[i, j]);
        SubItems.Add(fFritzBox.OPBInternPrio[i, j]);
      end;
    end;
    for i := 0 to fFritzBox.OPBExternCount - 1 do
    with lvwExtern.Items.Add
    do begin
      Caption := fFritzBox.OPBExternName[i];
      SubItems.Add(fFritzBox.OPBExternCategory[i]);
      SubItems.Add(fFritzBox.OPBExternNumber[i, 0]);
      SubItems.Add(fFritzBox.OPBExternType[i, 0]);
      SubItems.Add(fFritzBox.OPBExternPrio[i, 0]);
      for j := to fFritzBox.OPBExternNumberCount[i] - 1 do
      with lvwExtern.Items.Add
      do begin
        Caption := '';
        SubItems.Add('');
        SubItems.Add(fFritzBox.OPBExternNumber[i, j]);
        SubItems.Add(fFritzBox.OPBExternType[i, j]);
        SubItems.Add(fFritzBox.OPBExternPrio[i, j]);
      end;
    end;
  end;
  sbnReload.Enabled  := True;
end;

Es wird die Liste der Einträge abgerufen. Ist dies erfolgreich geschehen, werden die Einträge der internen und externen Listen sowie deren Eigenschaften einzeln abgerufen und die TListView eingetragen.

Informationen

Nach einer Anmeldung an der Fritzbox kann das Telefonbuch abgefragt werden. Im Moment wird als erstes die Anzahl der Einträge ermittelt:

GET /query.lua?sid=...&Count=telcfg:settings/Phonebook0/Entry/count HTTP/1.1
Host: fritz.box:80
Accept: text/xml
Keep-Alive: 115
Connection: Keep-Alive
 

In diese Abfrage muss nur die aktuelle SessionID und die PhonebookID - hier 0 - eingetragen werden.

Die Antwort sieht zum Beispiel so aus:

HTTP/1.0 200 OK
Content-type: application/json
Expires: -1
 
{
  "Count": "16"
}
 

Die Antwort ist ein JSON (JavaScript Object Notation)-Dokument, welche hier zur besseren Lesbarkeit formatiert wurde. Das heißt Zeilenumbrüche sind als #$A dargestellt und Einrückungen werden nicht vorgenommen.

Wenn man die Anzahl ermittelt hat, können man die Einträge in einer Schleife abgefragt werden. Eine Abfrage sieht im Moment zum Beispiel für den zweiten Eintrag (Entry1) so aus:

GET /query.lua?sid=...&
     Name=telcfg:settings/Phonebook0/Entry1/Name;
 Category=telcfg:settings/Phonebook0/Entry1/Category;
    Count=telcfg:settings/Phonebook0/Entry1/Number/count;
   Number=telcfg:settings/Phonebook0/Entry1/Number/list(Number,Type,Prio) HTTP/1.1
Host: fritz.box:80
Accept: text/xml
Keep-Alive: 115
Connection: Keep-Alive
 

Die erste Zeile beginnt mit GET und endet mit HTTP/1.1. Das Ergebnis sieht im Beispiel formatiert so aus:

HTTP/1.0 200 OK
Content-type: application/json
Expires: -1
 
{
  "Name": "Alle (Rundruf)",
  "Category": "",
  "Count": "1",
  "Number" : [
    {
      "Number" : "**9",
      "Type" : "intern",
      "Prio" : "Prio0"
    }
  ]
}

Im Moment benutzt die Komponente keinen JSON-Parser sondern sucht sich die Werte anhand der Variablennnamen heraus.

Oben in der Abbildung sieht man einen Eintrag für einen Anrufbeantworter. Dieser Eintrag ist auch vorhanden, wenn der Anrufbeantworter nicht eingerichtet wurde.

Links

Telcfg: Phonebook bei WeHaveMoreFun
Wikipedia: JavaScript Object Notation
Einführung in JSON