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
/*
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);
}
}
}
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.
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..
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:
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
}
}
}
}
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?
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
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.
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
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)?
irgendwie klappt es leider immer noch nicht...kann ich irgendwie testen ob die seite aufgerufen wurde?mein webhoster bietet leider keine webstatistik an