Redfly - PHP Request starten

OK - jetzt wissen wir schon mehr - laut Log konte sich dein Arduino verbinden. was er jetzt genau als Post gesendet hat, wissen wir allerdings noch nicht... aber auch das kann man herausfinden.

Nein, ich glaube das war vorallem mein RechnerG

ICh bekomme folgenden Fehler bei deinem Link:

Un
AT+RSI_FWVERSION?
AT+RSI_BAND=0
AT+RSI_INIT
AT+RSI_NUMSCAN=0
AT+RSI_SCAN=0
AT+RSI_NETWORK=INFRASTRUCTURE
AT+RSI_PSK=1*********
AT+RSI_JOIN=*********,0,2
AT+RSI_DNSSERVER=192.168.1.1
AT+RSI_IPCONF=0,192.168.1.48Q38,255.255.255.0,192.168.1.1
AT+RSI_DNSGET=http://mwsystec.de
AT+RSI_DNSGET=http://mwsystec.de
AT+RSI_DNSGET=http://mwsystec.de
DNS ERR
AT+RSI_DISASSOC

Also muss irgendwie schon wieder ein DNS fehler auftauchen

probier jetzt nochmal den Logger - ich hab ihn umgebastelt, so dass er den Request mitloggt.

EDIT - da warst du schneller als ich... also sieht aus, als ob er den Namen nicht auflösen kann - warum auch immer... wichtig wäre jetzt zu wissen, ob es über ip gehen würde, sprich ob es wirklich "nur" am DNS liegt...

du kannst Spasshalber mal statt des Hostnames die IP meines Servers eingeben, müsste auch funktionieren: http://188.40.236.77/redfly.php ... hab ihn so eingestellt, dass er ip-requests annimmt.

EDIT 2: Poste mal bitte deinen KOMPLETTEN Sketch - naürlich mit geschwärzten Zugangsdaten für dein WLAN

Ich bekomme leider immer diesen DNS Error

Poste mal bitte deinen KOMPLETTEN Sketch - natürlich mit geschwärzten Zugangsdaten für dein WLAN

Also jetzt initialisiert er nicht einmal mehr das WLAN Shield, warum auch immer.....Mal sehen woran das liegt.

Ich glaube nur langsam nicht mehr dran, weil er das Shield wie gesagt nicht mehr initialisiert.....eventuell hat sich die firmware verabschiedet

/*
  Web Client
 
  This sketch connects to a website using a RedFly-Shield. 
 */

#include <RedFly.h>


byte ip[]        = { 192,168,  1,138 }; //ip from shield (client)
byte netmask[]   = { 255,255,255,  0 }; //netmask
byte gateway[]   = { 192,168,  1,  1 }; //ip from gateway/router
byte dnsserver[] = { 192,168,  1,  1 }; //ip from dns server
byte server[]    = { 188, 40,236, 77 }; //85.25.245.16
#define HOSTNAME "http://mwsystec.de"  //host  www.hemitheconyx-caudicinctus.de

uint8_t http=0xFF;   //socket handle
uint16_t http_len=0; //receive len
char http_buf[512];  //receive buffer


//serial format: 9600 Baud, 8N2
void debugout(char *s)  { RedFly.disable(); Serial.print(s);   RedFly.enable(); }
void debugoutln(char *s){ RedFly.disable(); Serial.println(s); RedFly.enable(); }


void setup()
{
  uint8_t ret;
  //init the WiFi module on the shield
  ret = RedFly.init();
  if(ret)
  {
    debugoutln("INIT ERR"); //there are problems with the communication between the Arduino and the RedFly
  }
  else
  {
    //scan for wireless networks (must be run before join command)
    RedFly.scan();

    //join network
    ret = RedFly.join("******", "1*****", INFRASTRUCTURE);
    if(ret)
    {
      debugoutln("JOIN ERR");
      for(;;); //do nothing forevermore
    }
    else
    {
      //set ip config
      // ret = RedFly.begin(); //DHCP
      // ret = RedFly.begin( 2 ); //1=DHCP or 2=Auto-IP
      // ret = RedFly.begin(ip);
      ret = RedFly.begin(ip, dnsserver, gateway, netmask);
      if(ret)
      {
        debugoutln("BEGIN ERR");
        RedFly.disconnect();
        for(;;); //do nothing forevermore
      }
      else
      {
        if(RedFly.getip(HOSTNAME, server) == 0) //get ip
        {
          http = RedFly.socketConnect(PROTO_TCP, server, 80); //start connection to server on port 80
          if(http == 0xFF)
          {
            debugoutln("SOCKET ERR");
            RedFly.disconnect();
            for(;;); //do nothing forevermore
          }
          else
          {
            //send HTTP request
            RedFly.socketSendPGM(http, PSTR("POST / HTTP/1.1\r\nHost: "HOSTNAME"/redfly.php\r\n\r\n"));
          }
        }
        else
        {
          debugoutln("DNS ERR");
          RedFly.disconnect();
          for(;;); //do nothing forevermore
        }
      }
    }
  }
}


void loop()
{
  uint8_t sock, buf[32];
  uint16_t rd, len;
  //Serial.println("Ausgabe");
  if(http == 0xFF) //no socket open
  {
    return;
  }

  sock = 0xFF; //0xFF = return data from all open sockets
  rd = RedFly.socketRead(&sock, &len, buf, sizeof(buf));
  if(sock == http)
  {
    if((rd != 0) && (rd != 0xFFFF))
    {
      if((http_len+rd) > sizeof(http_buf))
      {
        rd = sizeof(http_buf)-http_len;
      }
      memcpy(&http_buf[http_len], buf, rd);
      http_len += rd;
    }

    if((rd == 0xFFFF) || (len == 0)) //connection closed or all data received
    {
      //close connection
      RedFly.socketClose(sock);

      //show http buffer
      http_buf[sizeof(http_buf)-1] = 0;
      debugout(http_buf);
    }
  }
}

das wäre bitter - aber lass uns das Ding erstmal auf ein minimum stutzen und ein bisschen strukturieren - am liebsten durch den exzesiven Einsatz von Methoden :slight_smile:

Ich bastel mal wieder - allerdings hier im blindflug, da ich kein derartiges Shield habe, und poste es dann... dauert allerdings nen Moment

Ich danke dir dafür, aber ich werde erstmal schauen wie ich das Firmware Update drauf gespielt bekomme....

Kein Ding, ich wühl mich solange durch den Sketch

Ich ahbe gerade mal fix den Reset-Button aufs Shield gelötet (was blieb mir anderes übrig) und jetzt läuft das init wieder

So ich denke die aktuelle php Ausgabe zeigt einen Zugriff des WLAN Shields.
Okay, also ich denke es muss was mit dem HOSTNAMEN zu tun haben, da muss der Link anders angegeben werden.

Cool... woran lag es?
Beim durchwühlen des Codes und der Dokumentation der API ist mir aufgefallen, dass der DNS-Request einen Pointer für ip brauch, um darin die IP des Hostnames zu speichern - bei deinem Sketch wird "server[]" benutzt. allerdings bin ich nicht firm genuig um zu wissen, ob das array beim Request überschrieben wird - da müssten uns die Pointer-Profis Udo und Uwe helfen.

so, hab jetzt mal etwa 90% des Codes dokumentiert und außerdem den Request auf GET umgestellt - versuch mal ob es so funktioniert - wenn ja, sollte man im Log einen GET-Request erkennen...

#include <RedFly.h>

// IP Einstellungen
byte ip[]        = { 192,168,  1,138 }; // IP Adresse des Shields
byte netmask[]   = { 255,255,255,  0 }; // Subnetzmaske
byte gateway[]   = { 192,168,  1,  1 }; // Gateway IP
byte dnsserver[] = { 192,168,  1,  1 }; // DNS-Server IP



byte serverIP[] = {0,0,0,0}; // früher mal server[] - ich hab spaßhalber mal Nullen eingesetzt, da ich hoffe dass es nach dem Aufruf von getip() überschrieben wird.

#define HOSTNAME "mwsystec.de"  // Hostname zu dem verbunden werden soll



uint8_t http=0xFF;   //socket handle, HTTP-Fehler
uint16_t http_len=0; //receive len
char http_buf[512];  //Receive-Buffer

//serial format: 9600 Baud, 8N2
void debugout(char *s)  { RedFly.disable(); Serial.print(s);   RedFly.enable(); }
void debugoutln(char *s){ RedFly.disable(); Serial.println(s); RedFly.enable(); }

void setup()
{
  uint8_t ret;
  ret = RedFly.init(); // Redfly initialisieren
  if(ret) // Falls Redfly einen Fehler verursacht, bekommt "ret" einen Rückgabewert
  {
    debugoutln("INIT ERR"); //there are problems with the communication between the Arduino and the RedFly
  }
  
  else
  {
    //Nach Netzwerken scannen
    RedFly.scan();

    //dem Netzwerk beitreten
    ret = RedFly.join("******", "1*****", INFRASTRUCTURE);
	
    if(ret)
    {
      debugoutln("JOIN ERR");
      for(;;); //do nothing forevermore
    }
    else
    {
	  // Redfly IP-Konfiguration einstellen, begin(1) benutzt DHCP, andernfalls die jeweilige Konfiguration	
      ret = RedFly.begin(ip, dnsserver, gateway, netmask);
	  
      if(ret) // Eventuellen Fehler abfangen
      {
        debugoutln("BEGIN ERR");
        RedFly.disconnect();
        for(;;); //Endlosschleife
      }
      else
      {
        if(RedFly.getip(HOSTNAME, serverIP) == 0) //DNSname von HOSTNAME auflösen und in serverIP speichern,
        {
          http = RedFly.socketConnect(PROTO_TCP, serverIP, 80); // Verbindung zum Server per IP aufbauen
          if(http == 0xFF)
          {
            debugoutln("SOCKET ERR");
            RedFly.disconnect();
            for(;;); //do nothing forevermore
          }
          else
          {
            //HTTP Request senden...
            RedFly.socketSendPGM(http, PSTR("GET / HTTP/1.1\r\nHost: "HOSTNAME"/redfly.php?Test=HalloWelt\r\n\r\n")); // HalloWelt per GET (vormals Post) an redfly.php übergeben
          }
        }
        else
        {
          debugoutln("DNS ERR");
          RedFly.disconnect();
          for(;;); //do nothing forevermore
        }
      }
    }
  }
}


void loop()
{
  uint8_t sock, buf[32];
  uint16_t rd, len;
  //Serial.println("Ausgabe");
  if(http == 0xFF) //no socket open
  {
    return;
  }

  sock = 0xFF; //0xFF = return data from all open sockets
  rd = RedFly.socketRead(&sock, &len, buf, sizeof(buf));
  if(sock == http)
  {
    if((rd != 0) && (rd != 0xFFFF))
    {
      if((http_len+rd) > sizeof(http_buf))
      {
        rd = sizeof(http_buf)-http_len;
      }
      memcpy(&http_buf[http_len], buf, rd);
      http_len += rd;
    }

    if((rd == 0xFFFF) || (len == 0)) //connection closed or all data received
    {
      //close connection
      RedFly.socketClose(sock);

      //show http buffer
      http_buf[sizeof(http_buf)-1] = 0;
      debugout(http_buf);
    }
  }
}

Okay,ich dank dir für deine Hilfe, aber bei mir wird jetzt nicht mehr viel passieren. Ich bin tierisch müde. Vielen Dank für deine Hilfe und eine gute nacht.
mfg
Balli
p.s. dein sketch teste ich noch und gebe ein feedback

hab noch einen DNS-Fehler gefunden: Hostname MUSS abc.de und nicht http://abc.de sein, habs im Code ausgebessert - ich mach jetzt auch feierabend, war ein langer Tag - kannst ja morgen mal das Ergebnis berichten

immer noch dns-fehler, habe aber gesehen das noch http dabei ist, werde ich morgen entfernen und testen. Gute Nacht

Edit:
ohne http geht es jetzt!Schau mir gleich mal deine Auswertungs Php an.

Edit2:
ich vermute den Fehler fast hier:

 RedFly.socketSendPGM(http, PSTR("GET / HTTP/1.1\r\nHost: "HOSTNAME"/redfly.php?Test=HalloWelt\r\n\r\n")); // HalloWelt per GET (vormals Post) an redfly.php übergeben

Ich denke es wird lediglich der Host aufgerufen

Hi Marcus,
ich denke ich habe den Fehler gefunden:
es muss heißen:

RedFly.socketSendPGM(http, PSTR("GET http://"HOSTNAME"/redfly.php?Test=HalloWelt HTTP/1.1\r\nHost: "HOSTNAME"/redfly.php?Test=HalloWelt\r\n\r\n")); // HalloWelt per GET (vormals Post) an redfly.php übergeben

Bei der zweiten Hälfte scheint er nur was abzuholen, der eigentliche Request muss direkt an das Get gebunden werden.

Moin Balli,

Normalerweise sollte ein Request folgendermaßen aussehen:

GET /test.html HTTP/1.1
Host: www.example.net

In unserem konkreten Fall also:

RedFly.socketSendPGM(http, PSTR("GET /redfly.php?Test=HalloWelt HTTP/1.1\r\n Host: "HOSTNAME"\r\n\r\n"));

hab ich gestern abend nicht mehr gesehen, aber anscheinend funktionieren ja beide Varianten

Okay super, ich werde mich heute Nachmittag noch ein wenig intensiver damit beschäftigen. Möchte ja das der Request nur ausgeführt wird, wenn ein Ereignis im Loop auftritt. Und dann muss ich noch die Kommunikation zwischen Laptop (per php Skript) und Arduino hinbekommen... Aber Schritt für Schritt ich bin dir auf jeden Fall unendlich Dankbar