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
:
Verschoben durch Moderator
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.
send host-name ... wird wohl leider nicht direkt unterstützt: http://egli.homelinux.org/blog/wp-content/uploads/2011/09/rs9110-n-11-22_24_26_28_software_prm-v2.28.pdf http://www.reyax.com/Module/WiFi/RS/RS9110-N-11-22_24_28_EVB_UserGuide_v3.12.pdf Aber vielleicht hast Du eine neuere Firmware. Sonst bleibt wohl nur selbst bauen oder eine andere Methode finden.
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
:
Bearbeitet durch User
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.
1 | if ( |
2 | ( LlmnrPacketPart2->RequestHostType == LLMNR_HOSTTYPE_A) && |
3 | ...
|
4 | ) {...} |
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 ;-).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.