Pages: [1] 2 3 4   Go Down
Author Topic: Redfly - PHP Request starten  (Read 3551 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Forum,
mit meinem RedFly Wlan-Shield bekomme ich eine WLAN - Verbindung hin, aber leider schaffe ich es nicht eine PHP-Seite auf meinem Server aufzurufen, könnte eventuell mal jemand über den sketch drüber schauen?! Oder mir gegebenfalls sagen, wo ich eine wirklich brauchbare Hilfe finde? Die Beispiele zum RedFly finde ich nicht so toll, weil sie schlecht kommentiert sind (aus meiner Sicht), so funktioniert bei mir das Client-Socket Beispiel traumhaft, aber das einfache Client-Beispiel gar nicht.
mfg und vielen Dank
Balli
Code:

/*
  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,  0,100 }; //ip from dns server
byte server[]    = {  85, 25,245, 16 }; //ip from www.watterott.net (server)
#define HOSTNAME "www.hemitheconyx-caudicinctus.de"  //host  /php/db.php?password=timundsarah

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("SSID", "MeinPasswort", INFRASTRUCTURE);
    if(ret)
    {
      debugoutln("JOIN ERR");
      for(;;); //do nothing forevermore
    }
    else
    {
      //set ip config
       ret = RedFly.begin(); //DHCP
      // ret = RedFly.begin(1 or 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("GET / HTTP/1.1\r\nHost: "HOSTNAME"/php/db.php?wert=beispiel\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;

  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);
    }
  }
}
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

was mir sofort auffällt: bei der Suibnetzmaske bist du mit dem DNS-Server ins falsche Netz gerutscht... hab allerdings noch nicht gekuckt ob du überhaupt per DNS anfragst.

EDIT
Jupp - Tust du - kann nicht gehen , da er so den namen nicht auflösen kann.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
vielen dank für die Antwort.
Ich möchte eigentlich komplett auf DNS verzichten. Ist es möglich im Loop abzufragen ob das Gerät im WLAN ist und dann den Request abzuschicken?

Und könntest du/ihr mir eventuell erklären was hier im einzelnen passiert? Den rest verstehe ich wohl..
Code:
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("GET / HTTP/1.1\r\nHost: "HOSTNAME"/php/db.php?wert=beispiel\r\n\r\n"));
          }
        }
        else
        {
          debugoutln("DNS ERR");
          RedFly.disconnect();
          for(;;); //do nothing forevermore
        }
      }
    }
  }
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich kanns ja mal versuchen... kann nen moment dauern, hab noch nie mit dem Shield gearbeitet.
Auf DNS würde ich wenn möglich auch verzichten, allerdings wird es in diesem konkreten Fall nicht funktionieren, da die Website die du abfragen möchtest (www.hemitheconyx-caudicinctus.de) nicht die einzige auf diesem Webserver sein wird, oder? Im normalfall wird soetwas vom Webserver über VirtualHosts gelöst - die wiederum über DNS gesteuert werden.


EDIT:

Code:

      if(ret) // WENN redfly.begin() fehlgeschlagen ist
      {
        debugoutln("BEGIN ERR"); //Debugmessage ausgeben
        RedFly.disconnect(); // Redfly ausklinken
        for(;;); //do nothing forevermore //endlosschleife starten
      }
      else  // andernfalls
      {
        if(RedFly.getip(HOSTNAME, server) == 0) //get ip  //// Wenn er den Namen auflösen kann
        {
          http = RedFly.socketConnect(PROTO_TCP, server, 80); //start connection to server on port 80
          if(http == 0xFF) // wenn socketconnect rückgabewert 255 hat (wahrscheinlich ein Errorhandler)
          {
            debugoutln("SOCKET ERR");  // Debugausgabe und das selbe wie beim Fehler oben
            RedFly.disconnect();
            for(;;); //do nothing forevermore
          }
          else // andernfalls
          {
            //send HTTP request
            RedFly.socketSendPGM(http, PSTR("GET / HTTP/1.1\r\nHost: "HOSTNAME"/php/db.php?wert=beispiel\r\n\r\n")); // GET Request senden
          }
        }
        else // Falls er den Namen nicht auflösen kann (Falscher DNS-Server, Falschgeschriebener Hostname, ungültiger Hostname etc)
        {
          debugoutln("DNS ERR"); // Das selbe wie bei den Fehlern oben machen
          RedFly.disconnect();
          for(;;); //do nothing forevermore
        }
      }
    }
  }


EDIT2 MEthode init in begin() geändert
« Last Edit: May 11, 2012, 02:34:15 pm by Marcus W » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

okay dann beschäfftige ich mich mal mit DNS und danke dir sehr
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

habs fertig, schaus dir durch, und wenn du noch fragen hast, frag nach  smiley-mr-green
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

okay super. prinzipiell, würde es mir eigentlich reichen, wenn ich lediglich eine wlan-Verbindung aufbauen würde, anscheinend muss ich das aber mit dns etc gleich verbinden oder?
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kommt darauf an, was du tun willst - wen du nur im Lan arbeitest, reicht prinzipiell IP, wenn du ins Internet willst, benötigst du (meistens) DNS
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann muss ich mir wohl oder übel eine kostenlose DNS suchen.
Also was ich machen möchte:

-über das Intranet  Leds an und ausschalten (Browser - eigene Php kommuniziert mit dem Arduino), da gibt es hier einen netten Thread den ich mal testen will
-als Client Daten in meine Datenbank aufm Webserver spielen
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fürs intranet brauchst du kein DNS - außer wenn du vom internet darauf zugreifen willst - da tut es dann aber z-B- Dyndns.
Um auf die Website zuzugreifen bzw die Datenbank funktioniert der interne DNS-Stack des Redfly doch genau wie er soll - du musst lediglich den richtigen DNS-Server einstellen - in deinem Netz 192.168.0.0/24 ein Server im allla 192.168.0.100 oder ähnlichem - im Normalfall der reicht da der Router (Gateway), da er einen DNS-Server eingebaut hat.
« Last Edit: May 11, 2012, 02:57:09 pm by Marcus W » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muss ich da erst einen im Router einstellen?Naja ich schau mir mal die ipconfig und die Router Settings an. Danke schön
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nimm bei der variable DNS den selben wert wie bei Gateway und alles ist in Butter. Falls du keinen diskreten (eigenständigen) DNS-Server betreibst. Dein Internetrouter (fritzbox, easybox, speedport etc pp) ist im normalfall sowohl gateway als auch dns-server
« Last Edit: May 11, 2012, 03:04:43 pm by Marcus W » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay, super danke für die Antwort. Nun muss/möchte ich diesen Request noch an einer Stelle im Loop ausführen.
Anmerkung:
Gehe ich richtig in der Annahme davon aus, dass im Setup() alles vorm/während des Starts ausgeführt wird und im loop() das eigentlich Programm (auf Basis der Konfiguration im setup teil)?
« Last Edit: May 11, 2012, 03:07:22 pm by Ballibum » Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die setup wird nur einmalig beim start ausgeführt - wenn alles durch ist, springt er in die loop - die eine Endlosschleife ist
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay, dann habe ich das richtig verstanden.
Logged

Pages: [1] 2 3 4   Go Up
Jump to: