en / de
Expertisen
Methoden
Dienstleistungen
Referenzen
Jobs & Karriere
Firma
Technologie-Trends TechCast WebCast TechBlog News Events Academy

Geräteerkennung mit SSDP in .NET im lokalen Netzwerk

Geräteerkennung mit SSDP in  .NET im lokalen Netzwerk

Einfache Implementation mit RSSDP von Troy Willmot

SSDP ist ein gängiges Protokoll, um eine Geräteerkennung im lokalen Netzwerk durchzuführen. Im .NET Umfeld existieren hilfreiche Libraries, um dies erfolgreich umzusetzen.

Problemstellung

In einem Projekt mussten alle Geräte eines Typs aus dem lokalen Netzwerk in einem Portal aufgelistet werden. Dafür muss eine einfache, aber geläufige Methode zur Geräteerkennung implementiert werden. Dafür existieren schon Protokolle wie mDNS, UPNP und SSDP. Diese basieren meist auf sogenannten ‘Advertisements’. Dabei meldet sich das zu erkennende Geräte periodisch im lokalen Netzwerk mit (meist) UDP Paketen und schickt so Daten ins Netzwerk.

Ziel der Geräteerkennung für dieses Portal ist jedoch, dass es so wenig Netzwerkverkehr wie möglich generiert wird. Potenziell stehen in diesem konkreten Beispiel mehrere Hundert Geräte im Netzwerk. Üblicherweise funktionieren solche “Service Discovery” Protokolle in einem “Publish” Modus.
Dadurch fallen mDNS und UPNP gänzlich weg, da diese nur mit dieser Publishing-Methode pro Gerät funktionieren. Damit wird das Netzwerk mit einem ungewollten Grundrauschen von Daten belegt.
SSDP hingegen ermöglicht, nach dessen Protokoll, auch eine einfache Suche vom Service aus (“Discovery”) auf die dann Geräte antworten. In dieser Antwort ist eine URL enthalten, welche auf weitere Geräteinformationen zeigt oder als Input für die weitere Verarbeitung dient.

 

SSDP

SSDP benutzt einfache HTTP-artige Anfragen und Antworten. Eine Antwort kann in den vom Protokoll definierten Feldern (USN, ST, …) Referenzen auf andere Ressourcen enthalten. Oder auch nur ID’s und Beschreibungen. Die meisten SSDP Implementationen, die ich finden konnte, haben komplexe Regeln für diese Felder. Meist sind diese Regeln vom SSDP Protokoll inspiriert und zu stark einschränkend.

Das Nuget Paket RSSDP (https://github.com/Yortw/RSSDP)

erwies sich für dieses Vorhaben als sehr nützlich, da es das freie Setzen des USN (Universal Service Name) und die unabhängige Verwendung der ‘Location’ zulässt.
Der USN identifiziert jedes Gerät mit einer UUID und einer URN (Universal Ressource Name). Ein URN definiert den Service oder Typ des Gerätes. Ein Gerät kann mehrere Services anbieten und dadurch auf verschiedene URN antworten/erreichbar sein. Grundsätzlich ist der URN ein String, der nach einem gewissen Schema, alles beinhalten kann.
Das Feld Location dient dazu, eine Referenz für weiterführende Daten zuliefern. Dies ist meist eine URL auf ein XML-Dokument oder ein JSON.

SSDP funktioniert über Multicast. Dafür wird immer die IPv4 Adresse 239.255.255.250 und der Port 1900 verwendet.
Zu erkennende Geräte hören diese Adresse und diesen Port ab und Antworten auf SSDP Suchanfragen)

Eine SSDP-Discovery-Anfrage auf die Multicast Adresse kann wie folgt aussehen:

M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:WANDevice:1

Eine mögliche Antwort auf eine SSDP-Discovery wäre beispielsweise:

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=120
ST: urn:schemas-upnp-org:device:WANDevice:1
USN: uuid:fc4ec57e-b051-11db-88f8-0060085db3f6::urn:schemas-upnp-org:device:WANDevice:1
LOCATION: http://192.168.17.35:8080/apiv2

MAN = Namespace des SSDP Discovery Requests
MX = Maximale Wartezeit für eine Antwort (SSDP sieht eine Verteilung der Antworten auf eine bestimmte Zeitspanne vor um das Netzwerk und den Server nicht zu überlasten)
ST = Search Target. Es kann nach allen Geräten, bestimmten UUIDs oder bestimmten URN gesucht werden

 

Geräteerkennung im Netzwerk

Bei den zu erkennenden Geräten wurde die Gerätesoftware um die SSDP-Antwort Funktionalität erweitert. Geräte antworten mit dem obigen Antwortschema, wenn sie eine Suchanfrage auf ihr definiertes Search Target (ST) erhalten.

Multicasts werden nicht geroutet und sind somit immer nur in einem Subnetz sichtbar. In diesem Beispiel sind alle Geräte auf allen erreichbaren Subnetzen interessant. Daher müssen auf dem Portal alle dafür geeigneten Netzwerkadapter vor der Suche gefunden werden:

var ipAddresses = new List<string>();

foreach (var netIf in NetworkInterface.GetAllNetworkInterfaces())
{
    if (netIf.NetworkInterfaceType.Equals(NetworkInterfaceType.Ethernet) &&
        netIf.OperationalStatus.Equals(OperationalStatus.Up) &&
        !netIf.Name.Contains("vEthernet"))
    {
        foreach (var ip in netIf.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily.Equals(AddressFamily.InterNetwork))
            {
                var ipAddress = ip.Address.ToString();
                Console.WriteLine($"{netIf.Name}: {ipAddress}'");
                ipAddresses.Add(ipAddress);
            }
        }
    }
}

 

Anschliessend kann eine Suche mit dem Rssdp.SsdpDeviceLocator initialisiert werden. Dieser benötigt die IP-Adresse eines Netzwerkadapters als Parameter.
Für die Suche kann ein SearchTarget angegeben werden. Dies kann, wie oben beschrieben, eine UUID oder ‘urn:’ Definition sein. 2
Um die Suche auch zeitlich einzuschränken kann eine Zeitspanne von z.B. 10 Sekunden angegeben werden. Geräte haben also 10 Sekunden ab Start der Suche Zeit zu Antworten.

Beispiel:

var searchTarget = "urn:schemas-upnp-org:device:WANDevice:1"
var devices = new ConcurrentBag<Discovered​Ssdp​Device>();

Parallel.ForEach(ipAddresses, (ipAddress) =>
{
    using (var deviceLocator = new SsdpDeviceLocator(ipAddress))
    {
        var foundDevices = await deviceLocator.SearchAsync(searchTarget, TimeSpan.FromSeconds(10));

        foreach (var foundDevice in foundDevices)
        {
            var device = new Discovered​Ssdp​Device(foundDevice);
            Console.WriteLine($"Device: usn={device.Usn}");
            devices.Add(device);
        }
    }
});

Das Resultat der Suche beinhaltet nun eine Liste mit DiscoveredSsdpDevice. Weitere Daten können nun pro Gerät über das Feld ‹Location› abgeholt werden.

 

The more you know

Das ST ssdp:all dient zur Suche von allen SSDP Geräten. (Respektive sollte dies laut IETF Draft für SSDP so implementiert sein)
Viele Geräte und Apps die an eurem Netzwerk angeschlossen sind, benutzen SSDP (Sonos Produkte, Chromium-Browser, Sony Lautsprecher, DLNA Media Server, etc.).
Schaut also mal in eurem Heimischen Netzwerk nach und findet heraus was sich so alles tummelt.

 


1https://github.com/Yortw/RSSDP – GitHub Repository zum SSDP Nuget
2https://yortw.github.io/RSSDP/api/Rssdp.Infrastructure.SsdpDeviceLocatorBase.SearchAsync.html – API Dokumentation zur DeviceLocator Search Methode
3https://datatracker.ietf.org/doc/html/draft-cai-ssdp-v1-03#section-7 – SSDP IETF Drav V1.03 – Abschnitt zu ’ssdp:all›

Kommentare

Schreiben Sie einen Kommentar

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

Newsletter - aktuelle Angebote, exklusive Tipps und spannende Neuigkeiten

 Jetzt anmelden
NACH OBEN
Zur Webcast Übersicht