[HowTo] PoC: Einfaches BLF für Mitel Telefone (6800/6900) in Verbindung mit einer Fritz!Box

chrsto

IPPF-Promi
Mitglied seit
8 Sep 2010
Beiträge
3,755
Punkte für Reaktionen
716
Punkte
113
Die Fritz!Box unterstützt bis zuletzt kein BLF (BusyLampField), trotzdem kommt dazu immer mal wieder eine Nachfrage auf.

Dieses Proof of Concept soll darlegen, dass es möglich ist, dies mit etwas Aufwand nachzurüsten. In wie weit der Aufwand sinnvoll gegenüber der Wahl einer "richtigen" Telefonanlage ist, soll hier nicht Thema sein.


Voraussetzungen:
  • Fritz!Box (oder ein beliebiger anderer Router, die Einrichtung der SIP Konten muss dann entsprechend angepasst werden)
  • zwei oder mehrere Mitel Telefone mit festen IP Adressen
  • ein Webserver mit PHP im lokalen Netzwerk
  • ein Provisionierungsserver (z.B. TFTP), alternativ können die Telefone auch von Hand konfiguriert werden


Was funktioniert:

Bei zwei Telefonen ist jeweils eine Taste als BLF eingerichtet und leuchtet entweder rot, wenn auf dem anderen Telefon gesprochen wird, blinkt (gelb) wenn auf dem anderen Telefon ein Anruf eingeht, oder ist aus (grün), wenn das Gespräch beendet wurde bzw. die Leitung frei ist. Zusätzlich kann mit einem Druck auf die Taste das andere Telefon gerufen werden.


Was funktioniert nicht:
  • Es ist kein Heranholen möglich. Mit dem Einsatz einer Datenbank und dem Zwischenspeichern des Status des jew. Telefons lässt sich das aber nachrüsten.
  • Schnurlose, ISDN und analoge Telefone an der Fritz!Box werden nicht unterstützt. Die Fritz!Box bietet afaik keine Möglichkeit den Status bzw. ein Event zu einem Server zu senden. Es existiert zwar ein CallMonitor, dieser müsste aber aktiv abgefragt werden.
  • Bei einem Neustart des Telefons ist der Status des anderen Telefons 'unbekannt'. Durch die Einbindung der Action URI register lässt sich das aber korrigieren.


Einrichtung:

Anpassung der Konfigurationsdateien für die Telefone auf dem Provisionierungsserver. Betrachtet werden hier nur die Zeilen, die für die Funktion des BLF notwendig sind:

startup.cfg
Code:
[...]
xml application post list: <ip des webservers>
[...]

Erläuterung:
Damit wird festgelegt, dass von dieser IP XML Code zum Telefon gesendet und dort ausgeführt werden darf.


<mac des telefons>.cfg für das Telefon mit der internen Nummer 620
Code:
[...]
sip line1 screen name: <name>
sip line1 screen name 2: <name>
sip line1 user name: <benutzername fritzbox ip telefon 620>
sip line1 display name: 620
sip line1 auth name: <benutzername fritzbox ip telefon 620>
sip line1 password: <passwort fritzbox ip telefon 620>
[...]
action uri incoming: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=incoming
action uri connected: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=connected
action uri disconnected: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=disconnected
[...]
topsoftkey12 type: xml
topsoftkey12 label: <beschriftung der taste>
topsoftkey12 value: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&call=**621
[...]

Erläuterung:
Im ersten Teil wird das SIP Konto der Fritz!Box eingerichetet. Die Action URI werden beim jeweiligen Event aufgerufen. incoming ist dabei ein eingehender Ruf, connected ist ein laufendes Gespräch und disconnected ist auflegen.
Für dieses Telefon wurde die obere Taste mit der ID 12 als BLF ausgewählt. Durch die Definition als xml kann die Taste von außen manipuliert werden. In unserem Fall hier, soll sie blinken (Anruf geht ein), leuchten, oder aus sein. Bei Telefonen mit entsprechenden Displays soll das Event zusätzliche farblich marktiert werden: grün, wenn die Leitung frei ist, gelb blinkend, wenn ein Anruf eingeht und rot, wenn gesprochen wird. Beim drücken der Taste wird auch wieder eine URL aufgerufen, dazu später mehr.


<mac des telefons>.cfg für das Telefon mit der internen Nummer 621
Code:
[...]
sip line1 screen name: <name>
sip line1 screen name 2: <name>
sip line1 user name: <benutzername fritzbox ip telefon 621>
sip line1 display name: 621
sip line1 auth name: <benutzername fritzbox ip telefon 621>
sip line1 password: <passwort fritzbox ip telefon 621>
[...]
action uri incoming: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=incoming
action uri connected: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=connected
action uri disconnected: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&action=disconnected
[...]
topsoftkey2 type: xml
topsoftkey2 label: <beschriftung der taste>
topsoftkey2 value: http://<ip des webservers>/xml.php?nst=$$DISPLAYNAME$$&call=**620
[...]

Erläuterung:
Siehe Erläuterung Telefon 620.


Datei xml.php auf dem Webserver:
PHP:
<?php

function push2phone($server,$phone,$data)
{
    $xml = "xml=".$data;
    $post = "POST / HTTP/1.1\r\n";
    $post .= "Host: $phone\r\n";
    $post .= "Referer: $server\r\n";
    $post .= "Connection: Keep-Alive\r\n";
    $post .= "Content-Type: text/xml\r\n";
    $post .= "Content-Length: ".strlen($xml)."\r\n\r\n";
    $fp = @fsockopen ( $phone, 80, $errno, $errstr, 5);
    if($fp)
    {
        fputs($fp, $post.$xml);
        flush();
        fclose($fp);
    }
}

$server = '<ip des webservers';

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

  $action = $_GET['action'];
  $nst = $_GET['nst'];
  if($nst == 620) { $phoneip = '<ip des telefons mit der nst 621>'; $phonekey = 'topsoftkey2'; }
  if($nst == 621) { $phoneip = '<ip des telefons mit der nst 620>'; $phonekey = 'topsoftkey12'; }

  $actions = [
    'incoming' => '<AastraIPPhoneExecute><ExecuteItem URI="Led: '.$phonekey.'=fastflash:yellow"/></AastraIPPhoneExecute>',
    'connected' => '<AastraIPPhoneExecute><ExecuteItem URI="Led: '.$phonekey.'=on:red"/></AastraIPPhoneExecute>',
    'disconnected' => '<AastraIPPhoneExecute><ExecuteItem URI="Led: '.$phonekey.'=off:green"/></AastraIPPhoneExecute>',
  ];

  $xml = $actions[$action];
  push2phone($server,$phoneip,$xml);

}

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

  $call = $_GET['call'];
  $nst = $_GET['nst'];

  if($nst == 620) { $phoneip = '<ip des telefons mit der nst 620>'; }
  if($nst == 621) { $phoneip = '<ip des telefons mit der nst 621>'; }

  $xml = '<AastraIPPhoneExecute triggerDestroyOnExit="yes"><ExecuteItem URI="Dial:'.$call.'" interruptCall="yes" title="Test"/></AastraIPPhoneExecute>';
  push2phone($server,$phoneip,$xml);

}

?>

Erläuterung:
Diese PHP Script besteht aus zwei Teilen: action für die Manipulation der BLF Taste und call für den Ruf des jeweils anderen Telefons. Über die Funktion push2phone() wird das XML zum Telefon gesendet und dort ausgeführt. Hinweis für action: Hier sind Nebenstelle und IP Adresse des Telefons vertauscht. Es soll ja die Taste des anderen Telefons blinken oder leuchten.

Das Script lässt sich natürlich um weitere Telefone erweitern. Bei 3 und mehr Telefonen lohnt dann aber wahrscheinlich schon der Einsatz einer Datenbank inkl. Schleifen. Damit ist es einfacher festzuhalten, welches Telefon, welche BLF an welcher Position eingerichetet hat.
 
Erweiterung für beliebig viele (an der Fritz!Box bis zu 10) Mitel SIP Telefone:

  • Die Erweiterung setzt zusätzlich einen SQL Server (evtl. auch SQLite) voraus
  • Es ist jetzt auch möglich Anrufe heranzuholen
  • Reboot des Telefons berücksichtigt.
  • Die Action URIs wurden zentral für alle Telefone in die startup.cfg verschoben

Anbei die nötigen Anpassungen der Konfigurationsdateien (Provisionierung):

startup.cfg:
Code:
[...]
xml application post list: [ip des webservers]
[...]
action uri startup: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=startup&ip=$$LOCALIP$$
action uri incoming: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=incoming&remotenumber=$$REMOTENUMBER$$&duration=$$CALLDURATION$$
action uri connected: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=connected&remotenumber=$$REMOTENUMBER$$&duration=$$CALLDURATION$$
action uri disconnected: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=disconnected
action uri registered: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=registered&ip=$$LOCALIP$$&linestate=$$LINESTATE$$
action uri outgoing: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=outgoing&remotenumber=$$REMOTENUMBER$$
action uri registration event: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=regevent&regstate=$$REGISTRATIONSTATE$$&regcode=$$REGISTRATIONCODE$$&ip=$$LOCALIP$$
action uri offhook: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=offhook
action uri onhook: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=onhook&duration=$$CALLDURATION$$
action uri poll: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=poll
action uri poll interval: 60
[...]

<mac des telefons>.cfg für das Telefon mit der internen Nummer 620
Code:
[...]
topsoftkey3 type: xml
topsoftkey3 label: 621
topsoftkey3 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**621

topsoftkey4 type: xml
topsoftkey4 label: 622
topsoftkey4 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**622
[...]

<mac des telefons>.cfg für das Telefon mit der internen Nummer 621
Code:
[...]
topsoftkey2 type: xml
topsoftkey2 label: 620
topsoftkey2 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**620

topsoftkey3 type: xml
topsoftkey3 label: 622
topsoftkey3 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**622
[...]

<mac des telefons>.cfg für das Telefon mit der internen Nummer 622
Code:
topsoftkey2 type: xml
topsoftkey2 label: 620
topsoftkey2 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**620

topsoftkey3 type: xml
topsoftkey3 label: 621
topsoftkey3 value: http://[url-und-pfad-des-webservers]/xml.php?nst=$$DISPLAYNAME$$&action=call&remotenumber=**621

Die Dateien xml.php mitelcti.sql sind als Archiv.zip an diesem Beitrag.

Für die Beispielkonfiguration oben, muss die Tabelle 'tasten' mit folgenden Daten befüllt werden:

Code:
SELECT * FROM `tasten`


id    nst    taste    ziel  
1    620    topsoftkey3    621  
2    620    topsoftkey4    622  
3    621    topsoftkey2    620  
4    621    topsoftkey3    622  
5    622    topsoftkey2    620  
6    622    topsoftkey3    621

Die anderen Tabellen füllen sich mit der Zeit automatisch.
 

Anhänge

  • Archiv.zip
    2.3 KB · Aufrufe: 0
Zuletzt bearbeitet:
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.