Offline
Full Member
Karma: 0
Posts: 200
|
 |
« on: May 11, 2012, 01:02:54 pm » |
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); } } }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #1 on: May 11, 2012, 01:18:45 pm » |
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
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #2 on: May 11, 2012, 02:14:48 pm » |
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.. 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
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #3 on: May 11, 2012, 02:24:57 pm » |
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 } } } }
EDIT2 MEthode init in begin() geändert
|
|
|
|
« Last Edit: May 11, 2012, 02:34:15 pm by Marcus W »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #4 on: May 11, 2012, 02:25:55 pm » |
okay dann beschäfftige ich mich mal mit DNS und danke dir sehr
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #5 on: May 11, 2012, 02:32:07 pm » |
habs fertig, schaus dir durch, und wenn du noch fragen hast, frag nach 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #6 on: May 11, 2012, 02:40:39 pm » |
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
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #7 on: May 11, 2012, 02:43:25 pm » |
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
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #8 on: May 11, 2012, 02:47:31 pm » |
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
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #9 on: May 11, 2012, 02:53:30 pm » |
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
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #10 on: May 11, 2012, 02:57:14 pm » |
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
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #11 on: May 11, 2012, 03:03:08 pm » |
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
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #12 on: May 11, 2012, 03:04:29 pm » |
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
God Member
Karma: 8
Posts: 623
42
|
 |
« Reply #13 on: May 11, 2012, 03:16:04 pm » |
Die setup wird nur einmalig beim start ausgeführt - wenn alles durch ist, springt er in die loop - die eine Endlosschleife ist
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 200
|
 |
« Reply #14 on: May 11, 2012, 03:20:41 pm » |
Okay, dann habe ich das richtig verstanden.
|
|
|
|
|
Logged
|
|
|
|
|
|