Für ein geplantes Projekt ist es notwendig, eine Verbindung zu einem bestimmten Teilnehmer im lokalen WLAN herzustellen. Zunächst hatte ich gedacht, das es ausreichend wäre, einfach eine feste IP-Adresse zu vergeben, über die das Gerät (ein ESP8266) zuverlässig erreicht werden kann. Aber dann bekam ich einen neuen Router! Dieser Router hatte eine neue Netzwerk-Adresse mit anderer Netzmaske. Mit einer fest eingestellten IP-Adresse wäre ich nun nicht weiter gekommen. Die Geräte hätten die eingestellte IP nicht mit dem Router vereinbaren können, wären also nicht mehr erreichbar.

Besonderheit an der Geschichte:

  1. Das Gerät ist eingebaut und nur sehr schwer zugänglich.
  2. Das Gerät besitzt eine serielle Schnittstelle, über die geänderte Daten übermittelt werden könnten (wenn zugänglich). Aber hierzu hätte man ein portables Gerät mit serieller Schnittstelle und entsprechendem Programm entwickeln müssen.

Die zweite Idee war, die MAC-Adresse zu nutzen. Diese ist zwar weltweit eindeutig für das Gerät und lässt auch eine eindeutige Identifizierung zu. Leider gilt sie nur für die Lebensdauer des Geräts. Muss das Gerät getauscht werden, müssen in allen Applikationen Anpassungen gemacht werden, die diese MAC-Adresse verwenden.

Wünschenswert wäre es deshalb, eine Verbindung zu einem Teilnehmer im lokalen WLAN anhand eines frei vergebenen  Namens herzustellen, z.B. "Jalousie" oder "Weihnachtsbeleuchtung". Diese müssten eindeutig sein, aber das sollte man regeln können.

Es bietet sich an, den im Netzwerk bekannten Hostname zu nutzen.

In­halts­ver­zeich­nis

1. Der Plan
2. Erste Versuche
3. Erste Erfolge
4. So geht's!
5. JAVA kann's auch!

Der Plan

Die ESP8266 können sich nun allein mit SSID und Passwort am WLAN anmelden. SSID und Passwort kann man auch bei einem Router-Wechsel beibehalten. Vom Router beziehen sie dann eine beliebige IP-Adresse. Geräte, die mit den ESP8266 Verbindung aufnehmen wollen, können mit Hilfe des Hostname vom Router die IP-Adresse beziehen und sich mit dieser beim ESP8266 anmelden.

Erste Versuche,

meinen Raspberry Pi mit dem Hostname "Pi" unter Windows 10 per dotNET wieder zu finden, sind gescheitert. Die Code-Zeile

Dim Pi = System.Net.Dns.GetHostEntry("Pi")

führt zu einer Exception:
Exception beim Suchen nach 'Pi'

 ping findet ihn ebenfalls nicht:
ping findet den Netzwerkteilnehmer nicht

Erste Erfolge,

haben längere Netzrecherchen gebracht. Das Programm nslookup findet meinen Raspberry Pi:
nslookup findet Pi

Es muss also doch irgendwie gehen!

Nach weiterem Suchen habe ich auch dotNet-Bibliotheken gefunden, die ebenfalls die IP-Adresse meines Raspberry Pi ermitteln konnten (z.B. Simple DNS Plus). Aber eigentlich sollte es einfacher gehen!

So geht's!

Durch Zufall bin ich den umgekehrten Weg gegangen und habe mir angeschaut, was die System.Net.Dns-Klasse liefert, wenn ich mit der nun bekannten IP-Adresse herangehe:

Dim Pi = System.Net.Dns.GetHostEntry("192.168.178.50")

Das Ergebnis war überraschend:
Gerfundener Hostname

Die als Router verwendete FRITZ!Box 6490 fügt den Namen des DNS-Servers an den Hostnamen an! Der Zugriff auf den Raspberry Pi mit dem so herausgefundenen Namen klappte einwandfrei.

Ein kleines Konsolen-Programm, dass alle IP-Adressen ausprobiert und die zugehörigen Hostnamen auflistet:

Module ListLAN

   Sub Main()
      For i = 0 To 255
         Dim ip As String = "192.168.178." & i ' Basis-Adresse ersetzen!
         Dim t As String = ip
         Try
            Dim mIpHostEntry = Net.Dns.GetHostEntry(ip)
            t &= " : " & mIpHostEntry.HostName
         Catch
         End Try
         Console.WriteLine(t)
      Next
   End Sub
End Module

Man muss ein wenig Geduld mitbringen, wenn man das Programm laufen lässt. Das Timeout bis eine Adresse als nicht belegt erkannt wird, ist ziemlich hoch. Man erhält dann so etwas:
IP-Liste

JAVA kann's auch!

Dieses kleine JAVA-Programm ermittelt die IP-Adressen meines Raspberry Pi und die meines Windows-Rechners.

public static void main(String[] args) {
        try {
            System.out.println(InetAddress.getByName("Pi.fritz.box").toString());
            System.out.println(InetAddress.getByName("RedBaron.fritz.box").toString());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

Windows kann's ...
JAVA-Output Windows

... und Linux auch:
JAVA-Output Linux