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:
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.
Inhaltsverzeichnis
1. Der PlanDie 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.
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:
ping findet ihn ebenfalls nicht:
haben längere Netzrecherchen gebracht. Das Programm
nslookup findet meinen Raspberry 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!
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:
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:
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 ...
... und Linux auch: