[HowTo] Telefonbuch der Fritz!Box an Mitel SIP Telefon nutzen

chrsto

IPPF-Promi
Mitglied seit
8 Sep 2010
Beiträge
3,833
Punkte für Reaktionen
738
Punkte
113
Edit 20.10.2024, 18:15: Um einfache Suchfunktion ergänzt.
Edit 21.10.2024, 11:40: Belegung der Telefonbuchtaste ergänzt.




Ergänzend zu diesem HowTo eine Quick-and-Dirty Anleitung, wie das Telefonbuch der Fritz!Box an einem Mitel Telefon genutzt werden kann.

Die Voraussetzungen sind identisch. Werte in eckigen Klammern [] sind Platzhalter und müssen durch eigene, sinnvolle Werte ersetzt werden. Das betrifft insbesondere IP Adressen bzw. URL.

1. Provisionierungsdatei erweitern

In der Datei [macadresse].cfg folgende Zeilen einfügen:

Code:
topsoftkey1 type: xml
topsoftkey1 label: Telefonbuch
topsoftkey1 value: http://[ip-oder-url-vom-webserver]/buch.php

Mit topsoftkey1 ist die erste Taste, oben links neben dem Display gemeint und lässt sich natürlich beliebig abändern. Wenn kein Provisionierungsserver genutzt wird, kann die Taste auch über das Webinterface des Telefons angelegt werden.

Sofern das Telefon über eine eigene Taste für ein Telefonbuch verfügt, kann diese auch belegt werden:

Code:
directory script: http://[ip-oder-url-vom-webserver]/buch.php

Speichern und das Telefon neu starten

2. Telefonbuch mit fb_tools exportieren:

Bash:
$ php [/pfad/zu/fb_tools]/fb_tools.php http://[benutzername]:[kennwort]@fritz.box telefonbuch export /[pfad/zum/html/docroot]
$ mv /[pfad/zum/html/docroot]/[exportierte-xml-datei] /[pfad/zum/html/docroot]/buch.xml

Bei regelmäßigen Änderungen im Telefonbuch, lässt sich das auch über CronJobs automatisieren.

3. PHP Script für das Telefon auf dem Webserver erstellen:

Folgendes Script auf den Webserver ins DocRoot kopieren und als buch.php abspeichern.

PHP:
<?php

  $xml = simplexml_load_file('buch.xml');

  if(isset($_GET['selection'])) {

    $id = $_GET['selection'];
    $id = (int)$id;

    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>'.$xml->phonebook->contact[$id]->person->realName.'</TopTitle>';

    if ($xml->phonebook->contact[$id]->telephony->attributes()->nid == 1) {

      echo '<MenuItem><Prompt>'.$xml->phonebook->contact[$id]->telephony->number.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$xml->phonebook->contact[$id]->telephony->number.'</Dial></MenuItem>';

    } else {

      foreach ($xml->phonebook->contact[$id]->telephony->number as $value) {

        echo '<MenuItem><Prompt>'.$value.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$value.'</Dial></MenuItem>';

      }

    }

    echo '<SoftKey index = "1">
          <Label>Anrufen</Label>
          <URI>SoftKey:Dial2</URI>
          </SoftKey>
          <SoftKey index = "3">
          <Label>Verlassen</Label>
          <URI>SoftKey:Exit</URI>
          </SoftKey>
          </AastraIPPhoneTextMenu>';

  } else {

    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>Telefonbuch</TopTitle>';

    $i=0;
    foreach ($xml->phonebook->contact as $value) {
    if ($value->telephony->attributes()->nid == 1) {
        $number = $value->telephony->number;
    } else {
        $number = $value->telephony->number[0];
    }
    echo '<MenuItem><Prompt>'.htmlspecialchars($value->person->realName).'</Prompt><URI>http://[ip-oder-url-vom-webserver]/buch.php?selection='.$i.'</URI><Dial>'.$number.'</Dial><Selection>'.$i.'</Selection></MenuItem>';
    $i++;
  }

    echo '<SoftKey index = "1">
        <Label>Anrufen</Label>
        <URI>SoftKey:Dial2</URI>
        </SoftKey>
        <SoftKey index ="2">
        <Label>Anzeigen</Label>
        <URI>http://[ip-oder-url-vom-webserver]/buch.php</URI>
        </SoftKey>
        <SoftKey index = "3">
        <Label>Verlassen</Label>
        <URI>SoftKey:Exit</URI>
        </SoftKey>
        <SoftKey index = "4">
        <Label>Suchen</Label>
        <URI>http://[ip-oder-url-vom-webserver]/suche.php</URI>
        </SoftKey>
        </AastraIPPhoneTextMenu>';

}

?>

4. PHP Script für das Telefon auf dem Webserver erstellen:

Folgendes Script auf den Webserver ins DocRoot kopieren und als suche.php abspeichern.

PHP:
<?php

  if(isset($_GET['s'])) {

    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>Ergebnis</TopTitle>';

    $s = $_GET['s'];
    $xml = simplexml_load_file('buch.xml');
    $c = 0;
    $i = 0;
    foreach ($xml->phonebook->contact as $value) {

    $result = strpos(strtolower($value->person->realName), strtolower($s));

    if ($result !== false) {

      echo '<MenuItem><Prompt>'.$value->person->realName.'</Prompt><URI>http://[ip-oder-url-vom-webserver]/buch.php?selection='.$i.'</URI></MenuItem>';
      $c++;
    }
    $i++;

    }

    if ($c == 0) {

      echo '<MenuItem><Prompt>kein Ergebnis</Prompt><URI>http://[ip-oder-url-vom-webserver]/buch.php</URI></MenuItem>';
    }
    echo '</AastraIPPhoneTextMenu>';

  } else {

   echo '<AastraIPPhoneInputScreen type="string">
         <TopTitle>Suche</TopTitle>
         <Prompt>Namen suchen</Prompt>
         <URL>http://[ip-oder-url-vom-webserver]/suche.php</URL>
         <Parameter>s</Parameter>
         <Default></Default>
         </AastraIPPhoneInputScreen>';

}

?>

Den Spaghetti-Code bitte ich erneut zu entschuldigen, ich bin weiterhin kein Informatiker.
 
Zuletzt bearbeitet:
Wer die fb_tools nicht nutzen und sich den Umweg über Export/Import sparen möchte hier ein angepasstes Script. Zu beachten ist folgende Zeile:

PHP:
if ($contact->uniqueid >= 100) { // ich gehe hier davon aus, dass es sich um ein CardDav Adressbuch handelt und das interne Telefonbuch (Nebenstellen, Anrufbeantworter, etc.) in den ersten 100 IDs zu finden sind

Wenn die internen Nummern mit angezeigt werden sollen, kann der ganze if-Block entfernt werden.

Weitere Änderungen:
  • Suche integriert, nur noch eine Datei
  • Blättern durch die Einträge, da das Telefon nur max. 30 Einträge anzeigen kann
  • Tasten des Suchbildschirms sinnvoll belegt

PHP:
<?php

// Config
$fb_url = 'fritz.box'; // Url oder IP der Fritz!Box, ohne http
$fb_user = 'fritz47110815';
$fb_pass = '';
$fb_book = 3; // ID des Telefonbuchs

$webserver_url = 'http://192.168.178.10/fritzbox';

// Config Ende

$client = new SoapClient(
     null,
     array(
       'location' => "http://$fb_url:49000/upnp/control/x_contact",
       'uri'      => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
       'noroot'   => False,
       'login'    => $fb_user,
       'password' => $fb_pass
     )
  );

$result = $client->GetPhoneBook(new SoapParam($fb_book, 'NewPhoneBookID'));
$xml = simplexml_load_file($result['NewPhonebookURL']);

if(isset($_GET['suche']) AND ($_GET['suche'] == 1)) {
  
  echo '<AastraIPPhoneInputScreen type="string">
        <TopTitle>Suche</TopTitle>
        <Prompt>Namen suchen</Prompt>
        <URL>'.$webserver_url.'/buch.php</URL>
        <Parameter>suche</Parameter>
        <Default></Default>
    <SoftKey index ="1">
    <Label>Suchen</Label>
    <URI>SoftKey:Submit</URI>
    </SoftKey>
    <SoftKey index ="2">
    <Label></Label>
    <URI>SoftKey:ChangeMode</URI>
    </SoftKey>
    <SoftKey index ="3">
    <Label>Löschen</Label>
    <URI>SoftKey:BackSpace</URI>
    </SoftKey>
    <SoftKey index ="4">
    <Label>Verlassen</Label>
    <URI>SoftKey:Exit</URI>
    </SoftKey>
        </AastraIPPhoneInputScreen>';
  exit;
    
}

if(isset($_GET['suche'])) {
 
  echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>Ergebnis</TopTitle>';
      
  $suche = $_GET['suche'];
  $c = 0;
  foreach ($xml->phonebook->contact as $contact) {
  
    $result = strpos(strtolower($contact->person->realName), strtolower($suche));
    
    if ($result !== false) {
              
      echo '<MenuItem><Prompt>'.$contact->person->realName.'</Prompt><URI>'.$webserver_url.'/buch.php?selection='.$contact->uniqueid.'</URI><Selection>'.$contact->uniqueid.'</Selection></MenuItem>';
      $c++;
    
    }

  }
      
  if ($c == 0) {
          
    echo '<MenuItem><Prompt>kein Ergebnis</Prompt><URI>'.$webserver_url.'/buch.php</URI></MenuItem>';
 
  } else {
      
    echo '<SoftKey index ="2">
    <Label>Anzeigen</Label>
    <URI>'.$webserver_url.'/buch.php</URI>
    </SoftKey>';
      
  }
    
    echo '<SoftKey index = "3">
    <Label>Verlassen</Label>
    <URI>SoftKey:Exit</URI>
    </SoftKey>
       </AastraIPPhoneTextMenu>';
      exit; 
 
}

if(isset($_GET['selection']) AND ($_GET['limit'])) {

    $limit = $_GET['limit'];
    $limit = (int)$limit;

    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>Telefonbuch</TopTitle>';
 
    foreach ($xml->phonebook->contact as $contact) {

      if ($contact->uniqueid >= 100) { // ich gehe hier davon aus, dass es sich um ein CardDav Adressbuch handelt und das interne Telefonbuch (Nebenstellen, Anrufbeantworter, etc.) in den ersten 100 IDs zu finden sind
        $contacts[] = $contact;
      }

    }
    for ($c=$limit; $c<$limit+30; $c++) {
      if (!is_array($contacts[$c]->telephony->number)) {
        $number = $contacts[$c]->telephony->number;
      } else {
        $number = $contacts[$c]->telephony->number[0];
      }
      echo '<MenuItem><Prompt>'.htmlspecialchars($contacts[$c]->person->realName).'</Prompt><URI>'.$webserver_url.'/buch.php?selection='.$contacts[$c]->uniqueid.'</URI><Dial>'.$number.'</Dial><Selection>'.$contacts[$c]->uniqueid.'</Selection></MenuItem>';
    }

echo '<SoftKey index = "1">
      <Label>Anrufen</Label>
      <URI>SoftKey:Dial2</URI>
      </SoftKey>
      <SoftKey index ="2">
      <Label>Anzeigen</Label>
      <URI>'.$webserver_url.'/buch.php</URI>
      </SoftKey>
      <SoftKey index = "3">
      <Label>Verlassen</Label>
      <URI>SoftKey:Exit</URI>
      </SoftKey>';
      
      if($limit == 0) {
      echo '<SoftKey index = "4">
      <Label>Suchen</Label>
      <URI>'.$webserver_url.'/buch.php?suche=1</URI>
      </SoftKey>';
      } else {
      echo '<SoftKey index = "4">
      <Label>&lt; zurück</Label>
      <URI>'.$webserver_url.'/buch.php?limit='.$limit-30 .'</URI>
      </SoftKey>';
      }
      echo '<SoftKey index = "5">
      <Label>Weiter &gt;</Label>
      <URI>'.$webserver_url.'/buch.php?limit='.$limit+30 .'</URI>
      </SoftKey>
      </AastraIPPhoneTextMenu>';

} elseif(isset($_GET['selection'])) {
    
  $id = $_GET['selection'];
  $id = (int)$id;
 
  foreach($xml->phonebook->contact as $contact) {

    if($contact->uniqueid == $id) {

      echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>'.$contact->person->realName.'</TopTitle>';
      if (count($contact->telephony->number) == 1) {
      
        echo '<MenuItem><Prompt>'.$contact->telephony->number.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$contact->telephony->number.'</Dial></MenuItem>';
    
      } else {
        
        foreach ($contact->telephony->number as $number) {
    
          echo '<MenuItem><Prompt>'.$number.'</Prompt><URI>SoftKey:Dial2</URI><Dial>'.$number.'</Dial></MenuItem>';
      
        }
    
      }
    
    }
      
  }
    
    echo '<SoftKey index = "1">
          <Label>Anrufen</Label>
          <URI>SoftKey:Dial2</URI>
          </SoftKey>
          <SoftKey index = "3">
          <Label>Verlassen</Label>
          <URI>SoftKey:Exit</URI>
          </SoftKey>
          </AastraIPPhoneTextMenu>';
    
  } else {

    if(isset($_GET['limit'])) {
      
      $limit = $_GET['limit'];
      $limit = (int)$limit;

    } else {
      
      $limit = 0;
      
    }
 
    echo '<AastraIPPhoneTextMenu fontMono="no"><TopTitle>Telefonbuch</TopTitle>';
 
    foreach ($xml->phonebook->contact as $contact) {

      if ($contact->uniqueid >= 100) {
        $contacts[] = $contact;
      }

    }
    for ($c=$limit; $c<$limit+30; $c++) {
      if (!is_array($contacts[$c]->telephony->number)) {
        $number = $contacts[$c]->telephony->number;
      } else {
        $number = $contacts[$c]->telephony->number[0];
      }
      echo '<MenuItem><Prompt>'.htmlspecialchars($contacts[$c]->person->realName).'</Prompt><URI>'.$webserver_url.'/buch.php?selection='.$contacts[$c]->uniqueid.'</URI><Dial>'.$number.'</Dial><Selection>'.$contacts[$c]->uniqueid.'</Selection></MenuItem>';
    }

echo '<SoftKey index = "1">
      <Label>Anrufen</Label>
      <URI>SoftKey:Dial2</URI>
      </SoftKey>
      <SoftKey index ="2">
      <Label>Anzeigen</Label>
      <URI>'.$webserver_url.'/buch.php</URI>
      </SoftKey>
      <SoftKey index = "3">
      <Label>Verlassen</Label>
      <URI>SoftKey:Exit</URI>
      </SoftKey>';
      
      if($limit == 0) {
      echo '<SoftKey index = "4">
      <Label>Suchen</Label>
      <URI>'.$webserver_url.'/buch.php?suche=1</URI>
      </SoftKey>';
      } else {
      echo '<SoftKey index = "4">
      <Label>&lt; zurück</Label>
      <URI>'.$webserver_url.'/buch.php?limit='.$limit-30 .'</URI>
      </SoftKey>';
      }
      echo '<SoftKey index = "5">
      <Label>Weiter &gt;</Label>
      <URI>'.$webserver_url.'/buch.php?limit='.$limit+30 .'</URI>
      </SoftKey>
      </AastraIPPhoneTextMenu>';

  }
 
?>
 
  • Like
Reaktionen: Rangierdraht
Chrsto,
tolle Sache auch wenn ich persönlich hierfür keine Anwendung für habe.

Da ich ebenfalls kein Anwendungsentwickler bin, bin ich über solche speziellen HowTos immer wieder froh.

Eine Frage da Du Dich wohl aus gegebenem Anlass um eine Lösung für dieses Problem gekümmert hast:
Gibt es sowas in der Art, die den Inhalt aus der Fritzbox über nen (open)LDAP für eine Gigaset Pro Installation einfach „umsetzt„ ?
Ich weiß, man könnte das Adressbuch sicherlich exportieren und über ne MetaDirectory zur Verfügung stellen.
Aber für gewisse Installationen ist so manches mit Kanonen auf Spatzen geschossen.

qbaah
 
Fritz!Box -> CardDav -> Nextcloud (oder DavServer) -> CardDav -> l2cpbg -> LDAP -> Gigaset LDAP Client

 
Ok, Danke!
Da muss ich mich tiefer mit auseinandersetzen, klingt interessant!

Schönen Abend
q
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.