Artikelformat

Die ganze Schweiz im Adressbuch: SNOM 370

Snom 370 PhoneDas Telefon klingelt. Ich laufe gehetzt dem Festnetz-Telefon entgegen. Der Anruf könnte ja wichtig sein. Nur um dann festzustellen, dass Herr Müller von der Telefonmarketing-Agentur XY mir ein Abo für eine Zeitung aufschwatzen will. Seit der Einführung von CLIP im Analognetz ist zwar wenigstens eine Rufnummernanzeige im Festnetz möglich, aber die Nummer bringt mich auch nicht viel weiter. Wie schön wäre es, wenn nicht nur die Rufnummer, sondern gleich die vollständige Adresse des Anrufenden auf dem Display erscheinen würde.

Mittlerweile wurde das analoge Festnetz-Telefon durch ein VoIP-Telefon abgelöst. Doch das Problem blieb bestehen. Aber dank funktionsreichen VoIP-Telefonen kann man nun selbst für Abhilfe sorgen. Endlich!

Meine Wahl fiel vor gut 2 Jahren auf ein SNOM-Gerät. Mit dem SNOM 370 habe ich mir ein IP-Telefon mit grossem Display besorgt, welches sich gleichzeitig mit bis zu 10 SIP-Anbietern verbindet. Das Telefon bietet 12 programmierbare Funktionstasten, welche sich mit einem optionalen Erweiterungsmodul gar auf 54 Tasten erweitern liessen. Die unzähligen Features – welche mich nicht wirklich interessierten – kannst du auf dem Datenblatt zum SNOM 370 nachlesen. Dass sich sämtliche Einstellungen des Telefons über ein Webinterface ändern lassen, versteht sich da schon von selbst. Ich war besonders auf die Aktions-URLs scharf.

Eine Aktions-URL kann zu den folgenden Ereignissen aufgerufen werden:

  • DND (Do Not Disturb) an/aus
  • Umleitung an/aus
  • Eingehender/ausgehender Anruf
  • Telefon betriebsbereit
  • Bei Hörer abnehmen/auflegen
  • Verpasster Anruf
  • Registrierung fehlgeschlagen
  • Anruf verbunden/beendet
  • Identität anmelden/abmelden
  • Anruf halten/wiederaufnehmen/durchstellen/direkt durchstellen
  • Durchstellen mit Nachfrage

Die Aktions-URLs können selbstverständlich mit Variablen gespickt werden. Es stehen unter anderem $local, $remote, $active_url, $active_user, $active_host, $csta_id und $call-id zur Verfügung.

So lässt sich beim Ereignis „eingehender Anruf“ die URL http://dein.server.com/call.php?caller=$remote&line=$local aufrufen, welche die Identifikationen des rufenden und des angerufenen Teilnehmers enthält. Die halbe Arbeit ist nun bereits erledigt und wir können die Anfrage des SNOM 370 auf dem Server per PHP (oder einer Sprache deiner Wahl) mit einem XML-Dokument beantworten. Die $local-Variable übergebe ich übrigens nur, weil mein SNOM-Telefon für verschiedene Rufnummern zuständig ist. Für das unten gezeigte Code-Beispiel brauchst du diese nicht zu übermitteln.

Ein Anruf vom Mobiltelefon auf meinen VoIP-Anschluss bei Netvoip.ch löst dann beispielsweise folgende Aktions-URL aus (xxx von mir eingefügt).

http://dein.server.com/call.php?caller=079xxxxxxx@62.65.128.62&line=031xxxxxxx@62.65.128.62

Du fragst dich jetzt vielleicht, wie wir die übergebene Rufnummer in eine Postadresse umwandeln können. Freundlicherweise stellt uns tel.search.ch hierzu eine API zur Verfügung. Toller Service!

API-Aufruf:
http://tel.search.ch/api/?was=$rufnummer&key=$deinkey

Den API-Key erhälst du hier. Zu Testzwecken kannst du den Key jedoch weglassen – die Abfrage funktioniert (zumindest bisher) auch ohne Key. Deine Abfrage wird durch die API mit einem ATOM-Feed beantwortet.

Für die Interaktion mit dem Server kannst du das folgende PHP-Script verwenden. Das ist zwar Quick & Dirty, erfüllt jedoch seinen Zweck.

<?php
// Adressabfrage via tel.search.ch v1.0
// Siehe http://picks.ch/voip-telefon-snom-370/

// Server interessiert nicht. Wir brauchen die Rufnummer.
$tmp = explode('@', $_GET['caller']);
$caller = $tmp[0];
$origin = $caller;

askTelsearch($caller);

// Falls wir keine Resultate haben verkürzen wir die Rufnummer um max. 3 Ziffern.
// Eventuell stammt der Anruf aus einem Durchwahlbereich.
for ($i = 1; $i <= 3 && count($name[1]) == 0; $i++) {
	$caller = substr($caller, 0, strlen($caller)-1);
	$modcaller = true;
	askTelsearch($caller);
}

$body = '';
$title = 'Anruf von '.$origin;
// Mehrere Resultate für diese Rufnummer.
// Wir zeigen alle Namen als Liste.
if (count($name[1]) > 1) {
	$title .= ' ('.count($name[1]).' Resultate)';
	$i = 0;
	if ($modcaller) { $body .= 'Keine exakten Treffer!!!<br/>'; }
	foreach ($name[1] as $eintrag) {	
		$body .= $eintrag;
		if ($modcaller) { $body .= ' ('.$phone[1][$i].')'; }
		$body .= '<br/>';
		$i++;
	}
// Nur 1 Resultat für diese Rufnummer.
// Wir zeigen die vollständige Adresse.
} elseif (count($name[1]) == 1) {
	preg_match_all('/<content\ type=\"text\">(.*?)<\/content>/i', $atom, $single);
	if ($modcaller) { $body .= 'Keine exakten Treffer!!!<br/>'; }
	$body .= $single[1][0];
} else {
	$body = 'Keine Resultate gefunden :-(';
}

// XML für das SNOM 370 ausgeben
echo '<?xml version="1.0" encoding="UTF-8"?>';
?><SnomIPPhoneText>
<Title><?=$title?></Title>
<Prompt><?=$title?></Prompt>
<Text>
<?=$body?>
</Text>
</SnomIPPhoneText>
<?php

// Funktion zur API-Abfrage von tel.search.ch
function askTelsearch($caller) {
	global $atom, $name, $phone;
	$atom = file_get_contents("http://tel.search.ch/api/?was=$caller");
	$atom = str_replace("\n", '<br/>', $atom);
	$atom = utf8_encode($atom);
	
	$offset = strpos($atom, '<entry>', $offset);
	if ($offset) {
		preg_match_all('/<title\ type=\"text\">(.*?)<\/title>/i', $atom, $name, PREG_PATTERN_ORDER, $offset);
		preg_match_all('/<br\/>\ *\*{0,1}([0-9 ]*?)<\/content>/i', $atom, $phone, PREG_PATTERN_ORDER, $offset);
	}
}

Eingehende Anrufe werden nun mit der vollständigen Adresse angezeigt.

Snom 370 Screen 1

SNOM 370 – eingehender Anruf mit Anzeige der vollständigen Adresse

Sollte eine Rufnummer mehrere Resultate zurückliefern oder wird eine Rufnummer mangels Resultaten auf einen Durchwahlbereich gekürzt, so werden alle gefundenen Resultate als Liste dargestellt.

Snom 370 Screen 2

SNOM – eingehender Anruf mit mehreren Resultaten

Eine Inverssuche für internationale Rufnummern liesse sich natürlich ebenfalls implementieren. Für mobile Rufnummern haben ich bisher leider keine geeignete Rückwärtssuche gefunden.

Für die Darstellung wird der XML-Minibrowser verwendet. Dieser bleibt auch nach dem Beenden des Anrufs aktiv. Falls dieser geschlossen werden soll, kann die Aktions-URL http://127.0.0.1/command.htm?key= F_MINIBROWSER_EXIT beim Ereignis „Anruf beendet“ eingetragen werden.

SNOM stellt ein ausgezeichnetes Wiki zur Verfügung. Auch die Geräte sind robust und Anfragen an den Support werden rasch beantwortet. Feature-Requests werden gerne angenommen. So wie es sein sollte – aber leider viel zu selten der Fall ist.

Autor: Matthias

Gründer des GeekBox-Blogs und Inhaber der sitepoint gmbh. Mag Apfelkram, Tech Gadgets aller Art, sowie Mobile Devices welche uns das Leben leichter machen. Schreibt für den Blog in Markdown Pro auf einem MacBook Air, administriert mehrere Webserver und bastelt an Arduino-Projekten. Auch zu finden bei Twitter und Google+.

1 Kommentar

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.