www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Ethernet Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Achim A. (Firma: augilabs) (womisa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe von Reichel eine NETIO-230B Ethernet Steckdose. Dies 
funktioiert mit dem Firefox problemlos.

Beispiel:> 
http://192.168.1.212/tgi/control.tgi?login=p:admin...

setzt die Steckdosen je nach Einstellung der Portangabe.

Ich wollte den GLEICHEN String mit Hilfe der Arduino Client Library 
absetzen. Aber das gelingt mir nicht. Laut Wireshark steht da TCP 
Protokoll und ist in mehrere Pakete aufgeteilt.
Sollte aber HTTP Protokoll sein und 1 Paket.

Das Standardbeispiel mit der Google suche geht problemlos....

Weiß jemand einen Rat und kann mir weiterhelfen?

Gruß
Achim


/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen
 
 */

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte gateway[] = { 192,168,1,254};
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };
String str="";

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(192,168,1,212);

// numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)
//char server[] = "www.augilabs.de";    // name address for Google (using DNS)


// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,1,177);

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
 //  while (!Serial) {
 //   ; // wait for serial port to connect. Needed for Leonardo only
 // }

  // start the Ethernet connection:
 /*
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
 */
 // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);
//     Ethernet.begin(mac, ip);

  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:

  if (client.connect(server, 80)) {
     Serial.print("connected to");
     Serial.println(server);
  
    // Make a HTTP request:
/*
   client.print("GET /tgi/control.tgi?login");
   client.print("=");
   client.print("p:admin:admin");
   client.print("&port=list");
   client.println(" HTTP/1.1");
    client.println("User-Agent: Arduino");
    client.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8");
    client.println();
    client.stop();
*/
   client.println("GET /tgi/control.tgi?login=p:admin:admin&port=0110 HTTP/1.1 ");

   } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }

}

void loop()
{
//      Serial.println("Ich bin im LOOP");

  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}


Autor: Sebastian W. (sebastian_w29)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HTTP basiert auf TCP.

Die Arduino Ethernet-Library setzt jeden einzelnen print(...) als 
einzelnes TCP-Paket ab, um nicht puffern zu müssen.

In deinem Code fehlt die obligatorische Leerzeile hinter dem HTTP-Header 
(siehe http://tools.ietf.org/html/rfc2616).

Versuch mal client.print("GET 
/tgi/control.tgi?login=p:admin:admin&port=0110 HTTP/1.1\r\n\r\n");

LG, Sebastian

Autor: Achim A. (Firma: augilabs) (womisa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sebastian,

vielen Dank für den Hinweis

>>>
Die Arduino Ethernet-Library setzt jeden einzelnen print(...) als
einzelnes TCP-Paket ab, um nicht puffern zu müssen.
>>>

..ich habe mehre Varianten probiert. Mit Deinem Hinweis kann ich jetzt 
die Steckdosen schalten.

Vielen Dank
Achim

Autor: womisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forengemeinde,

ich weiß  dass dieses hier kein Arduino Forum ist, aber mir wurde hier 
schon oft geholfen.
Ich habe mit meinem Arduino Ethernet-Client zur Steuerung meiner 
Netzwerksteckdos ein für mich unüberwindbares Problem.....

Ich schicke unter anderem zur Statusabfrage folgendes Kommando an die 
Steckdose:
    client.print("GET /cgi/control.cgi?login=p:admin:admin&port=list HTTP/1.1\r\nHost: 192.168.1.212 Connection: keep-alive\r\n\r\n");

das funktioniert auch soweit ganz gut.

Ziel ist es aber auch einzelne Steckdosen Ein/Aus zu schalten. Dazu 
möchte ich den zu sendenden String dynamisch zusammenbauen.

Erster nicht erfolgreicher Test hierzu ist folgendes:
 
....
String strRequest="GET /cgi/control.cgi?login=p:admin:admin&port=list 
HTTP/1.1\r\nHost: 192.168.1.212 Connection: keep-alive\r\n\r\n";
.
.
.
       client.print(strRequest);

....

Ich habe also nichts anderes gemacht, wie das "Kommando" in einen String 
gespeichert und dann abgesetzt.

Leider macht dieses "client.print(strRequest)" mit einer Stringvariablen 
laut Wireshark wieder mehrere TCP Pakete und nicht einen einzigen HTTP 
Request wie bei der funktionierenden Variante. Und das versteht die 
Steckdos nicht.

Hat mir Jemand einen Lösungsvorschlag? Bin für alle Tipps, die mich der 
Lösung näher bringen dankbar.

Gruß
Achim

Autor: womisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ok. Ich habe ne Lösung gefunden. Anstatt ein String habe ich ein char 
Array genommen.....

Warum auch immer, dann gehts.

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




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.