mikrocontroller.net

Forum: PC Hard- und Software Netzwerkname via MAC-Adresse zuweisen


Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: c.m. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei meinem telekom router [name].local

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Little B. (lil-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also:

send host-name ...

in die Konfiguration eintragen.

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Little B. (lil-b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Little B. (lil-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Little B. (lil-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Little B. (lil-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
if (
  ( LlmnrPacketPart2->RequestHostType == LLMNR_HOSTTYPE_A) &&
  ...
) {...}

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.