Domain-Adresse in eine IP-Adresse umwandeln

Hallo,
ich möchte gerne die Domain-Adresse in eine IP-Adresse umwandeln. Jedoch muss ein Fehler im Script sein.
Die geschweiften Klammern werden ebenfalls abgelehnt. Was muss geändert werden ?

Gruß Gerd

//Beispiel einer IP-Abfrage beliebigen Webseite

#include <SPI.h>
#include <Ethernet.h>
#include "dns.h"
int ret;

void setup() {
   Serial.begin(9600);
  
   Serial.print("TEST "); 
DNSClient dns;
 char host[] = "http://www.google.de";
 IPAddress remote_addr;
 IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
 //IPAddress server_ip = { 8, 8, 8, 8 }; // [color=red]Fehlerausgabe, dass die geschweiften Klammern nicht genutzt werden dürfen[/color]
 dns.begin(server_ip);
  Serial.println(remote_addr);
 ret = dns.getHostByName(host, remote_addr);
 //[color=red]ab hier läuft nichts mehr[/color]
 Serial.print("Ausgabe"); 
 Serial.print(remote_addr);
 }

 void loop()
{
 
 }

Welche Arduino-Version benutzt du denn? Bei mir (Version 1.0) läßt sich das ohne Probleme übersetzen.

Rudi

Hallo Rudi,
ich verwende die Arduino-Version 1.0 .1 und als Antwort bekomme ich so wie jetzt das Listing ist

TEST 0.0.0.0

verwende ich die geschweiften Klammern, so bekomme ich diesen Fehler

"brakes around initializer for non-arrregate type 'IPAddress' "

Wie sieht dein Listing aus ?
Edit:
Ebenso würde ich gerne wissen, was man bei einer anderen Domain angeben muss - bleibt dann "IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS" oder was trägt man an dessen Stelle ein ?

Gruß Gerd

Warum verwendest Du für DNS überhaupt eine externe Lib? Ab Version 1 kann die Ethernet-Lib der IDE doch bereits DNS.
Schau mal hier:

In der Doku stehen alle Parameter, die man den begin() übergeben kann.
Der dritte ist der DNS Server.
Zu Deinem Problem mit den Klammern.
Mit dem Aufruf

IPAddress server_ip = ( 8, 8, 8, 8 );

deklarierst Du eine Variable vom Typ "IPAddress". IPAddress ist eine eigene Klasse, die einen sogenannten "Konstruktor" hat. Das ist eine spezielle Methode (Funktion dieser Klasse), die beim Erzeugen eines Objektes (Variable) dieser Klasse aufgerufen wird und der man Parameter mitgeben kann. Man könnte auch schreiben

IPAddress* server_ip = new IPAddress( 8, 8, 8, 8 );

Es ist also im Grunde ein Funktionsaufruf und der wird nun mal in "runde" Klammern gesetzt.
Geschweifte Klammern verwendet man um Arrays zu initialisieren.
Das bei Deinem Test "0.0.0.0" raus kommt, liegt vermutlich an der DNS-Lib die Du verwendest. Poste mal einen Link auf die Lib.

Außerdem fehlt bei Deinem Sketch die komplette Initialisierung der Ethernet-Lib. Ggf. hat damit Dein Arduino gar keine IP-Adresse und auch keine Gateway nach draussen.

Ich finde das absolut toll, wenn man geholfen wird, aber manchmal ist es für jemand schwer, der nicht so fit ist, die Infos zu verstehen. Daher habe ich auch danach gefragt, was am Listing geändert werden muss. Aber darauf reagiert niemand, warum auch immer ?
Ich habe jetzt Änderungen eingebracht und habe somit ein unbefriedigendes Ergebnis, so, dass mir eine eigenartige IP angeboten wird.
Wenn ich "#include "dns.h" herausnehme, bekomme ich den Fehler : 'DNSClient' was not declared in this scope

Ausgabe: TEST Ausgabe 17.113.0.0

Was must wie abgeändert werden ?

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 177 };
byte sub[] = { 255, 255, 255, 0 };
#include "dns.h"
int ret;

void setup() {
   Serial.begin(9600);
  Ethernet.begin(mac, ip, sub);
   Serial.print("TEST "); 
DNSClient dns;
 char host[] = "http://www.google.de";
 IPAddress remote_addr;
 IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
 dns.begin(server_ip);
 ret = dns.getHostByName(host, remote_addr);
 //ab hier läuft nichts mehr
 Serial.print("Ausgabe "); 
 Serial.print(remote_addr);
 }

 void loop()
{
 
 }

Gruß Gerd

Ich finde das absolut toll, wenn man geholfen wird, aber manchmal ist es für jemand schwer, der nicht so fit ist, die Infos zu verstehen. Daher habe ich auch danach gefragt, was am Listing geändert werden muss. Aber darauf reagiert niemand, warum auch immer ?

Das ist einfach zu erklären. Tipps kann jeder gerne haben. Aber "Änderungen am Listing" sind eine Anfrage für einen Programmierservice. Dazu müsste man sich ja in Dein Programm hineinarbeiten und verstehen. Das kannst Du auch haben, aber nicht in einem freien Forum. Für sowas werden Entwickler bezahlt.

Entweder Du versuchst Deine Probleme selber zu verstehen und zu lösen oder Du musst Dir Hilfe irgendwo kaufen. Stell Dir mal vor Du fragst einen Handwerker ob Du besser einen Stein oder Metallbohrer für ein Loch nimmst. Da kannst Du eine Antwort bekommen. Aber wenn Du fragst ob Dir jemand ohne Gegenleistung ein Loch irgendwo bohrt, dann wirst Du nicht viele Freiwillige finden.

Hallo Udo,
danke für deine Belehrung ! Ich glaube, dass deine Aussage total daneben ist und ich hätte von dir, jemanden, der einen grossen Teil seiner Freizeit damit verbringt, anderen zu helfen, nicht gedacht, oder habe ich mich da grundliegend getäuscht ? Alle Achtung und dann solche Antwort ! Was ist mit den anderen Helfern - sie schlagen im Internet nach, suchen nach Ansätzen, bringen Vergleiche, ergänzen Scripts usw. alles in ihrer Freizeit, alles umsonst und alles mit einer Ausdauer, wo viele schon den Löffel geschmissen hätten ! Nochmals DANKE an alle. Hast du dir schon mal die Frage gestellt : WARUM ? Weil es im grunde genommen Idealisten sind die sich freuen, um Gleichgesinnte zu helfen.
Ich bin schon vielen Hinweisen nachgegangen, weil Antworten und Hinweise unterschiedlich waren, die jedoch leider manchmal nicht zum Ziel führten und bitte jetzt darum, 1 oder 2 Zeilen zu korrigieren.
Da muss ich mir deinen Schwachsinn und blöden Vergleich anhören, dass ich dafür einen Entwickler bezahlen muss - hier soll niemand was entwickeln.
Ich glaube, dass ich auf deine Sprüche auch verzichten kann.
Noch einen schönen Sonntag.

Gerd

Hallo Gerd,

die Hilfe die hier gegeben wird ist freiwillig und jeder der sich hier mit den geposteten Problemen beschäftigt und versucht zu helfen, macht das in seiner Freizeit und entscheided selbst, wann er die Zeit hat etwas zu posten. Es ist also manchmal ein wenig Geduld notwendig, keiner kann erwarten das sofort und zeitnah die richtigen Antworten kommen. Zudem setzen wir auch immer ein wenig Eigeninitiative des Fragestellenden voraus.
In meinem Post hatte ich ja bereits auf die Fähigkeit der Ethernet-Lib selbst hingewiesen, DNS Server zu nutzen. In Deinem Sketch steht aber lediglich ein "Ethernet.begin(mac, ip, sub)". Abgesehen davon das das Subnet NICHT der dritte Parameter ist, das wäre der DNS-Server (siehe Ethernet - Arduino Reference), kann Dein Sketch auch mit der zusätzlichen DNS-Lib nicht funktionieren, denn es fehlt das Gateway. Dein Arduino weiss also nicht, wo er Daten hinschicken soll, wenn sie nicht in Dein lokales Netz 192.168.178.0/24, sondern nach "Draussen" gehen sollen. Ich vermute mal Du hast ein FritzBox und vermutlich hat diese die 192.168.178.1. Das ist das Gateway, also wenn Du so willst die Vermittlungsstelle in die weite Welt. Diese Gateway-IP musst Du beim Ethernet.begin() mit angeben, dann gehen auch die DNS-Anfragen nach draussen.

Nun zu Deinem Problem, wenn Du das include "dns.h" entfernst. Damit wird dann die zusätzliche DNS-Lib nicht mehr geladen. Allerdings verwendest Du in Deinem Sketch aber weiter die Funktionen und Klassen dieser Lib. Das kann dann natürlich nicht mehr funktionieren und erklärt die Fehler die Du bekommst.

Ich persönlich verfolge bei meinem Post immer den Ansatz - Hilfe zur Selbsthilfe. Ich denke das ich auch das was Udo meint. Es geht darum etwas zu lernen und am besten lernt man aus den Fehlern, die man selbst behebt, weil man das Problem vestanden hat. Daher auch mein Hinweis, Dir die Parameter des Ethernet.begin() genauer anzuschauen.

Deinen Sketch solltest Du also erstmal um die zusätzlichen Parameter für die Kommunikation mit der weiten Welt ergänzen:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 177 };
byte dns[] = { 8,8,8,8 };
byte gateway[] = { 192, 168, 178, 1 };
byte sub[] = { 255, 255, 255, 0 };

...

Ethernet.begin(mac, ip, dns,gateway,sub);

ACHTUNG!! die Gateway-IP ist nur geraten, hier solltest Du die tatsächliche IP Deines Routers verwenden.

Mario.

Hallo Mario,
danke für deine Meinung. Ich möchte gerne darauf antworten.
Wie ich es zuvor beschrieben habe rechne ich es hoch an, wenn jemand in seiner Freizeit Hilfestellungen gibt.
Auch ich will lernen, aber bitte es sollte niemand darüber befinden, wie und nach welcher Methode ich das machen will. Mit 65 Jahren ist alles nicht mehr so einfach und ich will ja auch kein Profi werden, sondern meine kleinen Projekte irgendwann mal beenden.
Somit habe ich auch Zeit, um auf eine Antwort zu warten !
Wie ich auch schon zuvor erwähnt hatte, bekomme ich meist im deutschen Forum Hinweise, das ist im internationalen Forum ganz anders, hier wird kreativ auf das Problem eingegangen. (Sag jetzt nicht, warum ich denn nicht gleich da frage.)
Diese Hinweise sind häufig auch nur Gedankensplitter, die nicht funktionieren können oder müssen.
Nehmen wir jetzt mal deine Antwort. Du schreibst, dass das Subnet nicht an dritter Stelle stehen darf. Das ist nicht richtig - es kann auch an zweiter Stelle stehen, sofern die anderen in der Reihe nicht gewählt wurden.
Ebenso führt dein Beispiel, wie auch die der meisten anderen Ansätze und Hilfen zu neuen Fragen, die ich nicht beantworten kann.
Nach deiner Vorgabe bekomme ich die Fehlermeldung " 'byte dns[] redeclared as different kind of symbol " und nun ??? Das ist doch kein LERN-Vorschlag, das ist verwirrend und hilf nicht, damit ich es besser verstehe.
Hättest du es selbst ausprobiert, würdest du es sicherlich selbst erkennen, jedoch für mich wird alles nur schwerer, wenn ich solchen Hilfen nachgehen soll.
Nimm es mir nicht übel, ich freue mich für jeden Hinweis, aber ich wollte dir mal aufzeigen, was es häufig für einen Anfänger bedeutet, wenn man mit solchen Sachen konfrontiert wird.
Du bist auch mal unten angefangen und kannst nicht erwarten, dass ich deine Gedankengänge sofort verstehe.

Gruß Gerd

Wie ich bereits geschrieben habe, mußt Du auch die verwendeten Datentypen aus Deinem Script entfernen, wenn Du die DNS-Lib entfernst. Der Fehler den Du siehst, bezieht sich auf das immer noch vorhandene "DNSClient dns;".

Nehmen wir jetzt mal deine Antwort. Du schreibst, dass das Subnet nicht an dritter Stelle stehen darf. Das ist nicht richtig - es kann auch an zweiter Stelle stehen, sofern die anderen in der Reihe nicht gewählt wurden.

Kannst Du mir bitte erklären wo diese Information herkommt? Laut offizieller Dokumentation von Arduino ist bei einem Aufruf mit 3 Parametern der 3. Parameter der DNS-Server und nicht das Subnetz:

Syntax
Ethernet.begin(mac);
Ethernet.begin(mac, ip);
Ethernet.begin(mac, ip, dns);
Ethernet.begin(mac, ip, dns, gateway);
Ethernet.begin(mac, ip, dns, gateway, subnet);

Hallo Mario,
ich habe alles entfernt, um das Script neu zu erstellen.
Es kommt aber schon zu Fehlern, wie oben beschrieben " 'byte dns[] redeclared as different kind of symbol ", wenn ich nur deinen Vorschlag verwende. Das Problem ist
byte dns[] = { 8,8,8,8 }; . Ich habe im Netzt nach Lösungen gesucht und dabei festgestellt, dass das schon eine bekannte Sache sein könnte, die vielleicht mit der IDE zusammenhängen
könnte. Ich weiss es nicht. Du kannst es selbst ausprobieren - es geht nicht.
Es ist nicht so, dass der DNS-Server an 3. Stelle stehen muss. Es kommt darauf an, wie viele Parameter zur Verfügung gestellt werden. Wenn Parameter fehlen, oder nicht benötigt werden, kann die Reihenfolge sich verschieben. Kannst du selber ausprobieren, wenn du etwas falsch machst, wir gleich vom Prog. gemeckert,

Gruß Gerd

Poste doch bitte mal den kompletten Sketch den Du jetzt zu Testen hast.

Es sind bestimmt Fehler drin, die ich aber nicht erkenne. Es hat sich nichts Wesentliches geändert. Selbst, wenn ich das Setup weglassen würde, kommt es zu den Fehlern.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 177 };
byte dns[] = { 8,8,8,8 };
byte gateway[] = { 192, 168, 178, 150 };
byte sub[] = { 255, 255, 255, 0 };

int ret;

void setup() {
   Serial.begin(9600);
  Ethernet.begin(mac, ip, dns, gateway, sub);
   Serial.print("TEST "); 
DNSClient dns;
 char host[] = "http://www.google.de";
 IPAddress remote_addr;
 IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
 dns.begin(server_ip);
 ret = dns.getHostByName(host, remote_addr);
 Serial.print("Ausgabe "); 
 Serial.print(remote_addr);
 }

 void loop()
{
 
 }

Ich wiederhole mich ja nur ungern, abe Du musst schon alle zusätzlichen Dinger der DNS-Lib entfernen. Oder zumindest auskommentieren.
Dann läßt sich der Sketch sehr wohl compilieren.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 177 };
byte dns[] = { 8,8,8,8 };
byte gateway[] = { 192, 168, 178, 150 };
byte sub[] = { 255, 255, 255, 0 };

int ret;

void setup() {
   Serial.begin(9600);
  Ethernet.begin(mac, ip, dns, gateway, sub);
   Serial.print("TEST "); 
//DNSClient dns;
 char host[] = "http://www.google.de";
 IPAddress remote_addr;
 IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
 //dns.begin(server_ip);
 //ret = dns.getHostByName(host, remote_addr);
 Serial.print("Ausgabe "); 
 Serial.print(remote_addr);
 }

 void loop()
{
 
 }

Es ist nicht so, dass der DNS-Server an 3. Stelle stehen muss. Es kommt darauf an, wie viele Parameter zur Verfügung gestellt werden. Wenn Parameter fehlen, oder nicht benötigt werden, kann die Reihenfolge sich verschieben. Kannst du selber ausprobieren, wenn du etwas falsch machst, wir gleich vom Prog. gemeckert,

Das sich die Parameter ändern, ja nach Anzahl ist richtig, aber laut Doku gilt bei 3 Parametern:

Ethernet.begin(mac, ip, dns);

Woher soll bitte der Compiler wissen, was mit "dns" gemeint ist? Für den Compiler ist das nur eine Variable die entweder ein Array oder ein IPAddress Objekt ist. Also bitte woher hast Du die Information, das bei 3 Parametern der 3. Parameter das Subnet sein soll?

Bezüglich des Vorwurfs ich sollte die Sachen die ich poste doch ausprobieren. Bisher hast Du noch keine Quelle Deine DNS-Lib gepostet. Woher sollen wir also wissen welche Lib Du da verwendest. Ein Link wäre da hilfreich.

Wenn Du die Lib verwenden willst, reicht es sicherlich die Variablen anders zu benennen:

#include <SPI.h>
#include <Ethernet.h>
#include "dns.h"

byte mymac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte myip[] = { 192, 168, 178, 177 };
byte mydns[] = { 8,8,8,8 };
byte mygateway[] = { 192, 168, 178, 150 };
byte mysub[] = { 255, 255, 255, 0 };

int ret;

void setup() {
   Serial.begin(9600);
  Ethernet.begin(mymac, myip, mydns, mygateway, mysub);
   Serial.print("TEST "); 
 DNSClient dns;
 char host[] = "www.google.de";
 IPAddress remote_addr;
 IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
 dns.begin(server_ip);
 ret = dns.getHostByName(host, remote_addr);
 Serial.print("Ausgabe "); 
 Serial.print(remote_addr);
 }

 void loop()
{
 
 }

ACHTUNG Dieser Code ist ungetestet, weil ich Deine DNS-Lib nicht habe.
Weiterhin habe ich mal das char host[] = "www.google.de"; richtig gesetzt. Du willst einen Hostnamen auflösen, das ist NUR "www.google.de", das HTTP:// davor ist ein Protokoll das für eine bestimmte Art steht wie dann mit dem Server geredet werden soll, das hat nichts mit Hostnamen zutun.

Versuch's mal mit dieser Version:

#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 178, 177 };
byte dnsserver[] = { 8,8,8,8 };
byte gateway[] = { 192, 168, 178, 150 };
byte sub[] = { 255, 255, 255, 0 };

int ret;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip, dnsserver, gateway, sub);
  Serial.print("TEST "); 
  DNSClient dnsC;
  char host[] = "http://www.google.de";
  IPAddress remote_addr;
  IPAddress server_ip = ( 8, 8, 8, 8 ); // Google DNS
  dnsC.begin(server_ip);
  ret = dnsC.getHostByName(host, remote_addr);
  Serial.print("Ausgabe "); 
  Serial.print(remote_addr);
}

void loop() {
}

Die kompiliert bei mir (IDE 1.0.1) ohne Fehler. Zu Deinem Fehler: Du darfst den Namen "dns" nicht zweimal vergeben, mit unterschiedlicher Bedeutung. Dies hat der Compiler reklamiert und das zu Recht.

Der Include "Dns.h" ist keine Fremd-Bibliothek, die Datei ist Teil der Ethernet-Bibliothek. Sie wird normalerweise intern verwendet, es hält uns jedoch niemand davon ab, sie auch direkt zu verwenden. Wenn der OP die IP-Adresse des verwendeten Dienstes unbedingt wissen will, dann darf er das, auch wenn er den Namen im Sketch auch direkt verwenden kann.

pylon:
Der Include "Dns.h" ist keine Fremd-Bibliothek, die Datei ist Teil der Ethernet-Bibliothek. Sie wird normalerweise intern verwendet, es hält uns jedoch niemand davon ab, sie auch direkt zu verwenden. Wenn der OP die IP-Adresse des verwendeten Dienstes unbedingt wissen will, dann darf er das, auch wenn er den Namen im Sketch auch direkt verwenden kann.

Hmm, es ist aber ein Unterschied ob ich "#include <Dns.h>" oder #include "dns.h" schreibe. Letzteres sieht sehr nach einer zusätzlichen, lokal im Projekt liegenden Lib aus.

Hier zur Ergänzung noch ein Auszug aus der Definition der Ethernet-Klasse. Wie man sieht ist der DNS-Server IMMER der 3. Parameter.

int begin(uint8_t *mac_address);
void begin(uint8_t *mac_address, IPAddress local_ip);
void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server);
void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway);
void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);

Hallo Mario,

ich hatte anfangs nicht verstanden, warum du die Quelle meiner Lib haben wolltest. Ich habe keine zusätzliche Lib verwendet, es ist die unveränderte Ethernet-Lib, die bei der IDE 1.0.1 dabei ist.
Aufgrund deiner erneuten Nachfrage habe ich mal meinen Rechner nach einer "dns.h" absuchen lassen - nicht enthalten, nur die "Dns.h" unter Ethernet.
Also Schreibfehler - eigenartig ist nur, warum meine Schreibweise "#include "dns.h" nicht angemeckert wurde - ist also erledigt, Fehler bei mir.
Dein erster Code lässt sich kompilieren, das Ergebnis ist jedoch - TEST Ausgabe 0.0.0.0 -
Bei deinem letzten Code bekomme ich das Ergebnis - TEST Ausgabe 17.113.0.0 - Genau das gleiche Ergebnis hatte ich auch schon mit meiner falschen Variante.

Da ich das nicht mehr verstehe, kann ich dazu leider keinen Kommentar abgeben. Es scheint doch ein wenig komplizierter zu sein.

Gruß Gerd

Habe mal im Netz nachgeschaut.

Die IP, die ausgeworfen ist, ist die IP von Apple in Kalifornien ???

Bildschirmfoto 2012-11-05 um 17.34.04.png

Ich habe noch einen Fehler gefunden, ändere mal die folgende Zeile:

char host[] = "http://www.google.de";

in

char host[] = "www.google.de";

Ein DNS kann nur einen Hostnamen auflösen, die Interpretation einer URL ist aber dem aufrufenden Programm überlassen. "http://" spezifiziert das Protokoll (HTTP) und hat mit dem DNS nichts zu tun.