Hallo zusammen,
ich würde gerne wissen, ob es in Windows möglich ist, einem Gerät in
einem WiFi-Netzwerk einen festen Namen zuzuweisen, der sich an die
MAC-Adresse bindet?
Zur Erklärung:
Ich habe ein selbstgebautes WLAN-Modul mit dem Chip RS-9110-n-11-22. Ich
verbinde das Modul mit meinem WiFi-Netzwerk und kann anschließend durch
Eingabe der IP-Adresse auf das Gerät zugreifen. Nun möchte ich aber
lieber einen Namen eingeben, z.B. "meinModul", statt die IP-Adresse.
Denn: Jedes Mal, wenn das Gerät angeschlossen wird, erhält es eine neue
IP vom Router, und das soll auch so sein (!). Ich möchte nicht in die
Router-Einstellungen und dort der MAC-Adresse meines Moduls eine feste
IP zuweisen - es soll wirklich jedes Mal per DHCP eine neue erhalten.
Ich will jedoch, dass mein PC erkennt, dass sich das Gerät mit genau
dieser MAC-Adresse im Netzwerk befindet, und darauf will ich mit einem
vorher festgelegten Namen ("meinModul") zugreifen können.
Ist das per Windows möglich?
Falls nicht, gibt es eine Möglichkeit, mit dem verwendeten WiFi-Chip,
das Modul selbst so zu programmieren, dass es den Namen "meinModul"
erhält?
Danke im Voraus!
Grüße
so etwas macht man nicht im Windows sondern ist Aufgabe vom dhcp/dns
Server.
Dein modul muss seinen namen an den dhcp-Server übermitteln. Dieser
trägt ihn dann ins DNS ein.
Wenn du eine Fritzbox hast, kannst du einfach mit [Name].fritz.box. auf
dein Gerät zugreifen.
> Dein modul muss seinen namen an den dhcp-Server übermitteln.
Geht auch anders herum. In der Admin-Oberfläche des dhcp/dns Servers die
MAC auswählen und einen Namen vergeben.
Peter II schrieb:> Dein modul muss seinen namen an den dhcp-Server übermitteln. Dieser> trägt ihn dann ins DNS ein.
DAS genau würde mich interessieren. Langfristig soll mein Modul nicht
nur für mich nutzbar sein, sondern auch für Fremde, die keine Ahnung von
Technik haben. Für eine Zielgruppe, denen sämtliche Anweisungen, ins
Router-Menü zu gehen, zu viel fürs Verständnis sind.
Es wird sich nicht vermeiden lassen, dass auf den Modulnamen
unterschiedlich zugegriffen werden muss (name.local oder name.fritz.box
oder was auch immer) - aber das wäre fürs erste in Ordnung.
Jetzt würde mich interessieren, wie so eine Funktion in
WiFi-Fachdeutsch/englisch heißt, die beschreibt, wie mein Modul seinen
Namen an den DHCP-Server übermittelt.
Emanuel schrieb:> Jetzt würde mich interessieren, wie so eine Funktion in> WiFi-Fachdeutsch/englisch heißt, die beschreibt, wie mein Modul seinen> Namen an den DHCP-Server übermittelt.
Hat nichts mit WIFI zu tun, das ist ein Teil des DHCP-Protokolls, und
das ist vom Medium unabhängig.
http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_discovery
Der Name dürfte als Option 12 im DHCPDISCOVER-Paket untergebracht
werden.
Zur Namensauflösung im lokalen Netzwerk wird bei Microsoft seit Windwos
Vista das Protokoll LLMNR verwendet. Dein WLAN-Chip scheint das nicht an
Board zu haben, aber vieleicht kannst du das auf Controllerseite
implementieren. Dazu wird ein UDP Multicast Socket benötigt. Kann das
dein Chip? LLMNR basiert auf DNS und ist entsprechend einfach zu
implementieren.
Das Modul muss dem DHCP Server seinen Namen mitteilen damit dieser in
das DNS einetragen wird.
Gibt es darauf eine dhclient.conf o.ä.?
Dann hilft vielleicht:
http://forum.ubuntuusers.de/topic/dhcp-bedeutung-von-dhcp-client-identifier/
Was passiert wenn 2 von deinen Modulen im gleichen Netz sind?
Haben alle einen eigenen Namen?
Little Basdart schrieb:> Board zu haben, aber vieleicht kannst du das auf Controllerseite> implementieren. Dazu wird ein UDP Multicast Socket benötigt.
Danke für Eure Vorschläge!
Der Chip kann einen UDP Socket und einen UDP Listening Socket öffnen.
Ist "multicast" noch eine zusätzliche Option, die ich damit nicht zur
Verfügung habe, oder wäre das ausreichend?
Hast Du eine Infoseite für das LLMNR Protokoll (außer Wikipedia)?
Ansonsten würde ich mich selbst mal da ein lesen.
hp-freund schrieb:> Gibt es darauf eine dhclient.conf o.ä.?
Nein, leider nicht
hp-freund schrieb:> Was passiert wenn 2 von deinen Modulen im gleichen Netz sind?> Haben alle einen eigenen Namen?
Gute Frage, die Möglichkeit besteht. In diesem Fall sollte ggf. eine
Namensabfrage bestehen, oder die Geräte müssen von Haus aus
Durchnummeriert werden.
Emanuel schrieb:> Hast Du eine Infoseite für das LLMNR Protokoll (außer Wikipedia)?> Ansonsten würde ich mich selbst mal da ein lesen.
im Wiki ist der link zum RFC - da steht alles was man zu Umsetzung
braucht.
Da es wirklich kein großes Ding ist, hier mal mein Quellcode.
Das ganze basiert auf einen selbst geschriebenen TCP/IP Stack, somit
sind die Schnittstellen vieleicht etwas gewöhnungsbedürftig.
Zusammengefasst:
1. Empfang eines Multicast Pakets
2. Nachsehen, ob der eigene Hostname drin steht
3. Senden einer Unicast Nachricht mit eigenem Namen und IP Adresse
Little Basdart schrieb:> Da es wirklich kein großes Ding ist, hier mal mein Quellcode.
Vielen Dank dafür!
Sieht interessant und gut implementierbar aus. Nur hab ich noch eine
Frage, da ich es so nicht ganz erkennen kann: Wie wird der eigene Name
gesendet? Bzw. welche Variable müsste initialisiert werden (mit einem
String), z.B. "meinModul", damit diese Zeichen als Antwort gesendet
werden.
Emanuel schrieb:> Wie wird der eigene Name> gesendet? Bzw. welche Variable müsste initialisiert werden (mit einem> String), z.B. "meinModul", damit diese Zeichen als Antwort gesendet> werden.
Hää? verstehe nicht, worauf du hinaus willst, deshalb noch zwei
informationen:
Der Hostname wird in meinem Programm mit dem Define "TCPIP_OWNHOSTNAME"
festgelegt. "TCPIP_OWNHOSTNAME_LENGTH" ist dann entsprechend
sizeof(TCPIP_OWNHOSTNAME).
LLMNR ist kein Client-Server-Protokoll, sondern P2P. Eine Anfrage zu
einer Namensauflösung wird nicht an einen zentralen Server geschickt,
sondern an alle Netzwerkteilnehmer. Das hat zum Nachteil, dass der Name
nur so lange aufgelöst werden kann, wie der Service auf deinem
Mikrocontroller läuft.
Little Basdart schrieb:> Eine Anfrage zu> einer Namensauflösung wird nicht an einen zentralen Server geschickt,> sondern an alle Netzwerkteilnehmer. Das hat zum Nachteil, dass der Name> nur so lange aufgelöst werden kann, wie der Service auf deinem> Mikrocontroller läuft.
Jetzt hab ichs verstanden, mir war die generelle Funktionsweise noch
nicht klar gewesen, welche Daten wem gesendet oder zurückgegeben wird.
Der Service verleicht eine kommende Anfrage also mit dem
eingespeicherten Namen und gibt die IP-Adresse und andere Daten zurück.
Mit dem laufenden Service meinst Du, dass die Funktion periodisch
aufgerufen werden muss, um auf Namensauflösungsanfragen zu antworten -
richtig?
Zwei weitere Fragen dann:
1. Was passiert, wenn nach dem Namen gesucht wird, aber die Funktion
gerade nicht aufgerufen ist? Ergo: Reichen periodisch 3 Sekunden, oder
eher 30 ms?
2. Verstehe ich es richtig, dass ich dann mit einem Windows PC und einem
beliebigen Browser den Namen meines Moduls eingebe und er automatisch
die IP-Adresse erhält? Muss ich dann ggf. noch ".fritz.box" oder
dergleichen anhängen, je nach Router?
zu 2.
Es reicht tatsächlich der Hostname allein. Im Sinne von "ping meinModul"
oder "http://meinModul"
zu 1.
Was die Latenzzeit angeht, habe ich keinen genauen Wert parat. Perse
muss aber nur was getan werden, wenn ein UDP-Paket am gegebenen Port
angekommen ist.
Je nach Anwendung kannst du nach einer erfolgreichen Beantwortung einer
Namensanfrage den UDP Socket schließen und den Service stoppen, da du
jetzt eine Verbindung von eben diesem Netzwerkteilnehmer erwartest. Neu
starten kannst du den Service dann wieder, nachdem die Verbindung
beendet wurde oder nach einem Timeout.
Erwähnt werden sollte an der Stelle noch, dass Windows sehr viel
Netzwerkkram puffert und cached. Es wird nur beim ersten Mal
nachgefragt, welche IP dieser Hostname hat. Bei nachfolgenden
Verbindungen wird die gepufferte information verwendet und nur
aktuallisiert, wenn keine Verbindung möglich ist
Little Basdart schrieb:> zu 2.> Es reicht tatsächlich der Hostname allein. Im Sinne von "ping meinModul"> oder "http://meinModul"
Super!
> zu 1.> Was die Latenzzeit angeht, habe ich keinen genauen Wert parat. Perse> muss aber nur was getan werden, wenn ein UDP-Paket am gegebenen Port> angekommen ist.>> Je nach Anwendung kannst du nach einer erfolgreichen Beantwortung einer> Namensanfrage den UDP Socket schließen und den Service stoppen, da du> jetzt eine Verbindung von eben diesem Netzwerkteilnehmer erwartest. Neu> starten kannst du den Service dann wieder, nachdem die Verbindung> beendet wurde oder nach einem Timeout.>> Erwähnt werden sollte an der Stelle noch, dass Windows sehr viel> Netzwerkkram puffert und cached. Es wird nur beimb ersten Mal> nachgefragt, welche IP dieser Hostname hat. Bei nachfolgenden> Verbindungen wird die gepufferte information verwendet und nur> aktuallisiert, wenn keine Verbindung möglich ist
Alles super klasse Tipps und Wissen, danke! Ich habe auch gesehen, dass
der Chip UDP und TCP parallel kann, das war bei meinem Vorhaben noch
wichtig. Wobei es ja scheinbar am reicht, am Anfang den UDP Socket bis
zur Abfrage zu öffnen.
Jetzt noch fürs Verständnis: Wenn ich - ganz regulär - in meinem Browser
etwas eintippe, z.B. einen Namen, sendet Windows damit automatisch eine
UDP-"Anfrage" ins ganze Netzwerk und wartet auf Antwort? Oder anders
gefragt: Reicht es, auf meinem Chip einen UDP Listening Socket zu
öffnen, oder muss ich gezielt (per Port und IP vom PC) mit dem PC
verbinden, damit ich über meinen Browser die Anfrage per UDP abschicke?
schonmal ausprobiert? du hast doch wireshark!
Ich hab das so beobachtet:
Windows versucht den namen via DNS aufzulösen und erhält keine Antwort.
Danach wird auf verschiedenste Methoden LLMNR verwendet.
1. via IPv6 eine IPv6 Adresse anfragen (Adresstyp AAAA)
2. via IPv4 eine IPv4 Adresse anfragen (Adresstyp A)
3. via IPv4 eine IPv6 Adresse anfragen (Adresstyp AAAA)
an der stelle musst du darauf achten, dass du nur auf die unterstützten
Protokolle antwortest. In meinem Beispiel nur auf 2. IPv6 unterstützt
mein Stack nicht und ignoriert entsprechend alle IPv6-Pakete.
IPv4-Pakete mit IPv6-Anfragen werden von meinem LLMNR ignoriert, nur
Adresstyp A wird bearbeitet.
Little Basdart schrieb:> schonmal ausprobiert? du hast doch wireshark!
Gute Idee, danke. Bisher hatte ich wirklich noch fast gar nicht mit
irgendwelcher Netzwerk-Programmierung zu tun und die Programmierung des
Chips wurde großteils von meinem Kollegen übernommen.
Die Infos haben uns aber gereicht, wir werden es demnächst wohl
ausprobieren und mit Hilfe von Deinem Quellcode programmieren - das
Feature wäre echt cool, ist nur die Frage, ob die Zeit dafür da ist.
Danke auf jeden Fall für Deine hilfreichen Tipps, das war klasse! Jetzt
weiß ich, wie es prinzipiell möglich ist, und das sogar relativ einfach.
Ich schreib dann, wenn ich wieder Fragen habe ;-).