Wer kennt das nicht: Man sitzt gerade gemütlich auf der Couch und schaut Fernsehen und es klingelt das Telefon. Aber wer ruft denn gerade jetzt an? Mit ein paar Tricks kann man die eingebauten UPnP-Funktionen von Samsung-TVs nutzen, um eingehende Anrufe oder sogar SMS anzuzeigen.

Voraussetzungen

Man benötigt:

  • eine Fritz!Box
  • einen Samsung Fernseher
  • einen dauerhaft laufenden Server (z.B. einen RaspberryPI oder ein NAS) mit Linux Shell

Auf dem Server wird außerdem perl benötigt, um eine Verbindung zur Fritz!Box herstellen zu können und curl für den Versand der Nachricht an den Fernseher. Die Scripte, die hier gezeigt werden, sind allesamt im Netz so verfügbar und lediglich etwas angepasst, da die vorhandenen Scripte teilweise nicht funktioniert haben.

Funktionsweise

Wie funktioniert das ganze? Was inzwischen im Allgemeinen bekannt ist, ist die DLNA-Unterstützung der Fernsehgeräte, um Videos, Bilder und so weiter von einem Mediaserver oder PC abzuspielen. Wenn man aber zum Beispiel mit einem UPnP-Inspector sich die angebotenen UPnP-Services ansieht, stellt man fest, dass es noch einen weiteren Dienst neben dem MediaRenderer:1-Service gibt: den PersonalMessageReceiver:1. Das ist ein proprietärer UPnP-Service von Samsung. Aus diesem Grund ist es sehr wahrscheinlich, dass diese Anleitung nur auf Samsung-Geräten funktionieren wird.

Wir kennen nun also die Schnittstelle beim Fernseher. Jetzt benötigen wir noch die Informationen über die eingehenden Anrufe. Hierfür bietet die Fritz!Box eine sehr nützliche Möglichkeit des Anrufmonitors. Dieser gibt eine textbasierte Übersicht über alle Anrufzustände aus, die wir im Folgenden nutzen werden. Der Server, in meinem Fall ein RaspberryPI, lauscht nun dauerhaft am Anrufmonitor und meldet bei eingehenden Anrufen per UPnP-SOAP-Aufruf dem Fernseher, dass jemand anruft. Und das war es auch schon.

Nachricht an Fernseher senden

Der PersonalMessageReceiver:1-Service bietet über den MessageBoxService:1 zwei Funktionen an:

  • AddMessage
  • RemoveMessage

Letztere scheint aber nicht wirklich zu funktionieren. Aber dazu später. Wichtig für uns ist nur die AddMessage-Funktion.

AddMessage-Funktion

Diese Funktion wird für den Versand der Nachrichten an den Fernseher verwendet. Sie erwartet drei Paramter:

  • MessageType
  • MessageID
  • Message

Der MessageType ist immer der MIME-Type

text/xml

Das heißt, dass alle Nachrichten im XML-Format vorliegen müssen.

Die MessageID kann beliebig gewählt werden und wird nicht überprüft. Wir können hier zum Beispiel das aktuelle Datum verwenden. Die MessageID wird auch bei der RemoveMessage-Funktion verwendet, jedoch gibt diese Funktion immer einen Fehler aus, egal ob eine Nachricht mit identischer ID kurz vorher übermittelt wurde oder nicht. Daher gehe ich davon aus, dass diese Funktion nicht implementiert ist.

Der Message-Paramter enthält dann die eigentliche Mitteilung und unterstützt nach bisherigen Erkenntnissen im Web (SamyGo) drei Arten (Kategorien) von Nachrichten:

  • Eingehende Anrufe (Incoming Call)
  • SMS bzw. Textnachrichten (SMS)
  • Terminerinnerungen (Schedule Reminder)

Ich werde hier nur die eingehenden Anrufe beleuchten. Die anderen Kategorien folgen später. Bei SamyGo findet man den grundlegenden Aufbau der Nachricht, es fehlen jedoch noch die Kategorie und der Display-Typ. Im folgenden findet ihr eine funktionierende Struktur:

<Category>Incoming Call</Category>
<DisplayType>Maximum</DisplayType>
<CallTime>
   <Date>YYYY-MM-DD</Date>
   <Time><time>HH:MM:SS</Time></time>
 </CallTime>
 <Callee>
   <Number>angerufene Telefonnummer</Number>
   <Name>Name des Angerufenen</Name>
 </Callee>
 <Caller>
   <Number>Telefonnummer des Anrufers</Number>
   <Name>Name des Anrufers</Name>
 </Caller>

Wenn der DisplayType den Text “Maximum” enthält, wird die Anrufernummer bzw. Name angezeigt. Enthält er irgendeinen anderen Text, wird nur eine verkürzte Meldung angezeigt. Mit dem UPnP-Inspector können wir den Request testen.

Script

Nun kommt der Server ins Spiel. Mit dem nachstehenden Script kann man die Anfragen direkt von der Kommandozeile aus absetzen.

#! /bin/sh
# usage: ./makeSoap2 "06.05.10 19:19:50;RING;1;1234;4567;SIP1;" 192.168.178.3

# ENTER NETCAT PATH HERE
########################
NETCAT="nc"
# ENTER PATH Telefonbuch
########################
TBOOK="/etc/telefonbuch"

# TEST IF MESSAGE TYPE IS RING, OTHERWISE QUIT
case $1 in
*RING*)
# SPLIT MESSAGE STRING
DESTINATION=$2
IFS=";"
set -- $1
DATETIME=$1
CALLEE=$5
CALLER=$4
CALLEENAME="Dein Name"

#Anrufer nach Nummer im Telefonbuch suchen
TMP1=`grep -i $CALLER $TBOOK`
name=${TMP1#*;}
if [ "$name" = "" ]
then

#wenn kein Telefonbucheintrag dann online reverssuche starten
SUCHZEILE=$(wget -qO- --tries=3 --timeout=5 "http://www1.dasoertliche.de/?form_name=search_inv&ph=$CALLER" | grep "na:")
TMP1=${SUCHZEILE#*na:}

IFS="&"
set -- $TMP1
name=$1
street=$2
nr=$3
plz=$4
fi

IFS=" "
set -- $DATETIME
CALLDATE=$1
CALLTIME=$2

# BUILD XML
soap="<?xml version=\"1.0\" encoding=\"utf-8\"?>
<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" >
<s:Body>
<u:AddMessage xmlns:u=\"urn:samsung.com:service:MessageBoxService:1\\\">
<MessageType>text/xml</MessageType>
<MessageID>'$(date +%H%M%S)'</MessageID>
<Message>
<Category>Incoming Call</Category>
<DisplayType>Maximum</DisplayType>
<CallTime>
<Date>$CALLDATE</Date>
<Time>$CALLTIME</Time>
</CallTime>
<Callee>
<Number>$CALLEE</Number>
<Name>$CALLEENAME</Name>
</Callee>
<Caller>
<Number>$CALLER</Number>
<Name>$name</Name>
</Caller>
</Message>
</u:AddMessage>
</s:Body>
</s:Envelope>
"

# SEND MESSAGE TO TV
curl -X POST --silent -H "SOAPACTION: \"urn:samsung.com:service:MessageBoxService:1#AddMessage\"" -H "Content-Type: text/xml ;charset=\"utf-8\"" --data $soap $DESTINATION:52235/PMR/control/MessageBoxService > /dev/null
;;

*)
;;

esac

Anrufmonitor

Um den Anrufmonitor der Fritz!Box zu aktivieren, muss man mit einem Telefon, das an der Fritz!Box angemeldet ist, die Kurzwahl #96*5* anrufen. Sobald das erfolgt ist, kann man über den TCP-Port 1012 textbasierte Ausgaben abrufen.

Wenn eine Zeile vom Typ “RING” ist, handelt es sich um einen eingehenden Anruf. Diese Zeile ist wichtig für uns.

Script

Abschließend fehlt noch das Script zum Senden der Benachrichtigungen an den Fernseher, wenn ein eingehender Anruf erkannt wurde.

#!/usr/bin/perl -w
use IO::Socket;
use strict;

# your fritz box (ip or hostname)
my $FRITZBOX="fritz.box";
my $EXTPRO="/etc/makeSoap2.sh";
my $TV="wohnzimmer-tv";

my $sock = new IO::Socket::INET (
        PeerAddr => $FRITZBOX,
        PeerPort => '1012',
        Proto => 'tcp'
        );
        die "Could not create socket: $!\n" unless $sock;

while(<$sock>) {
        if ($_ =~ /RING/){
                my @args = ($EXTPRO, $_, $TV);
                system(@args);
        }
}

Das externe Programm ist das makeSoap2.sh-Skript von oben. Das Monitorscript wird jetzt noch in die rc.local eintragen:

/etc/init.d/callmonitor &

Und das war’s schon. Ich hoffe, dass diese Zusammenfassung euch hilft, denn ich habe schon einiges gebraucht, um alles im Netz zu finden.

Tags:

9 Responses

  1. Hi,

    ist der MessageBoxService nicht die Schnittstelle, die bei den neueren Samsung Modellen und auch bei 2011 Modellen via Firmware-Update entfernt wurde?
    Oder ist das hier tatsächlich eine neue Möglichkeit Nachrichten an den TV zu senden?

  2. Hallo Denis,
    welche Samsung TVs funktionieren hiermit. Ich habe ein UE55D6200. Ich weiss das nach dem Firmware 1005. Die Message Funktion entfernt wurde. Da dein Script, so wie ich es verstanden habe, per Upnp läuft, könntest du mal ein Screen der Message hinzufügen ?

    Danke

  3. Hallo Denis,

    wie ich öfter im Netz gelesen habe, wird der MessageBoxService von Samsung bei Geräten der D-Serie (und höher) nicht mehr zur Verfügung gestellt. Demnach funktioniert deine Anleitung auf diesen Geräten doch sicher nicht mehr, oder?

  4. Halllo…

    Tolle Arbeit…
    Bei mir wird der Service am UE55F8090 nicht angezeigt.
    Und Dein Script bekomme ich auch nicht ans laufen…

    LG
    Stefan

  5. Hallo,

    danke für die Kommentare. Leider habe ich festgestellt, dass mein 2011er-Modell die letzte Serie war, die den MessageBoxService noch angeboten hat. Ich habe allerdings noch keine Alternative dazu gefunden. Wenn ich etwas finde, werde ich darüber berichten.

    VG Denis

  6. Für alle, die ausschließlich FireTv benutzen oder ein Android TV haben:
    gibt es:

    “Notifications for FireTV” oder “Notifications for Android TV”

    die Apps sind eigentlich dazu gedacht, das Handy mit dem TV zu verbinden.
    Hier hat sich jemand die Mühe gemacht, den traffic zu analysieren und ein kleines Go Programm für die http api zu schreiben:

    https://github.com/robbiet480/nfa/

    erster Test mit:
    ~/go/bin/nfa notify -a 192.168.178.68

    -> funktioniert

    also könnte man jetzt entweder, das Go Programm so benutzen, wie es ist oder hier:
    https://github.com/robbiet480/nfa/blob/master/cmd/notify.go#L115

    mal den multipart/form-data request in ein curl umschreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert