Created
May 11, 2015 16:48
-
-
Save serverwentdown/fba1311037fb5e66df1c to your computer and use it in GitHub Desktop.
RN-XV webserver with WiFlyHQ modified from example sketch to not require physical modifications to a Arduino + Wireless SD + RN-XV setup. (i.e. no shorting pin 8&0 and 9&1)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* WiFlyHQ Example httpserver.ino | |
* | |
* This sketch implements a simple Web server that waits for requests | |
* and serves up a small form asking for a username, then when the | |
* client posts that form the server sends a greeting page with the | |
* user's name and an analog reading. | |
* | |
* This sketch is released to the public domain. | |
* | |
*/ | |
/* Notes: | |
* Uses chunked message bodies to work around a problem where | |
* the WiFly will not handle the close() of a client initiated | |
* TCP connection. It fails to send the FIN to the client. | |
* (WiFly RN-XV Firmware version 2.32). | |
*/ | |
/* Work around a bug with PROGMEM and PSTR where the compiler always | |
* generates warnings. | |
*/ | |
#undef PROGMEM | |
#define PROGMEM __attribute__(( section(".progmem.data") )) | |
#undef PSTR | |
#define PSTR(s) (__extension__({static prog_char __c[] PROGMEM = (s); &__c[0];})) | |
#include <WiFlyHQ.h> | |
//#include <SoftwareSerial.h> | |
//SoftwareSerial wifiSerial(8,9); | |
//#include <AltSoftSerial.h> | |
//AltSoftSerial wifiSerial(8,9); | |
WiFly wifly; | |
/* Change these to match your WiFi network */ | |
const char mySSID[] = "Chua$Family"; | |
const char myPassword[] = "chua2680"; | |
void sendIndex(); | |
void sendGreeting(char *name); | |
void send404(); | |
char buf[80]; | |
void setup() | |
{ | |
//Serial.begin(115200); | |
Serial.begin(9600); | |
Serial.println(F("Starting")); | |
Serial.print(F("Free memory: ")); | |
Serial.println(wifly.getFreeMemory(),DEC); | |
//wifiSerial.begin(9600); | |
//if (!wifly.begin(&wifiSerial, &Serial)) { | |
if (!wifly.begin(&Serial, NULL)) { | |
Serial.println(F("Failed to start wifly")); | |
wifly.terminal(); | |
} | |
/* Join wifi network if not already associated */ | |
if (!wifly.isAssociated()) { | |
/* Setup the WiFly to connect to a wifi network */ | |
Serial.println(F("Joining network")); | |
wifly.setSSID(mySSID); | |
wifly.setPassphrase(myPassword); | |
wifly.enableDHCP(); | |
wifly.save(); | |
if (wifly.join()) { | |
Serial.println(F("Joined wifi network")); | |
} else { | |
Serial.println(F("Failed to join wifi network")); | |
wifly.terminal(); | |
} | |
} else { | |
Serial.println(F("Already joined network")); | |
} | |
wifly.setBroadcastInterval(0); // Turn off UPD broadcast | |
//wifly.terminal(); | |
Serial.print(F("MAC: ")); | |
Serial.println(wifly.getMAC(buf, sizeof(buf))); | |
Serial.print(F("IP: ")); | |
Serial.println(wifly.getIP(buf, sizeof(buf))); | |
wifly.setDeviceID("Wifly-WebServer"); | |
if (wifly.isConnected()) { | |
Serial.println(F("Old connection active. Closing")); | |
wifly.close(); | |
} | |
wifly.setProtocol(WIFLY_PROTOCOL_TCP); | |
if (wifly.getPort() != 80) { | |
wifly.setPort(80); | |
/* local port does not take effect until the WiFly has rebooted (2.32) */ | |
wifly.save(); | |
Serial.println(F("Set port to 80, rebooting to make it work")); | |
wifly.reboot(); | |
delay(3000); | |
} | |
Serial.println(F("Ready")); | |
} | |
void loop() | |
{ | |
if (wifly.available() > 0) { | |
/* See if there is a request */ | |
if (wifly.gets(buf, sizeof(buf))) { | |
if (strncmp_P(buf, PSTR("GET / "), 6) == 0) { | |
/* GET request */ | |
//Serial.println(F("Got GET request")); | |
while (wifly.gets(buf, sizeof(buf)) > 0) { | |
/* Skip rest of request */ | |
} | |
sendIndex(); | |
//Serial.println(F("Sent index page")); | |
} else if (strncmp_P(buf, PSTR("POST"), 4) == 0) { | |
/* Form POST */ | |
char username[16]; | |
//Serial.println(F("Got POST")); | |
/* Get posted field value */ | |
if (wifly.match(F("user="))) { | |
wifly.gets(username, sizeof(username)); | |
wifly.flushRx(); // discard rest of input | |
sendGreeting(username); | |
//Serial.println(F("Sent greeting page")); | |
} | |
} else { | |
/* Unexpected request */ | |
//Serial.print(F("Unexpected: ")); | |
//Serial.println(buf); | |
wifly.flushRx(); // discard rest of input | |
//Serial.println(F("Sending 404")); | |
send404(); | |
} | |
} | |
} | |
} | |
/** Send an index HTML page with an input box for a username */ | |
void sendIndex() | |
{ | |
/* Send the header direclty with print */ | |
wifly.println(F("HTTP/1.1 200 OK")); | |
wifly.println(F("Content-Type: text/html")); | |
wifly.println(F("Transfer-Encoding: chunked")); | |
wifly.println(); | |
/* Send the body using the chunked protocol so the client knows when | |
* the message is finished. | |
* Note: we're not simply doing a close() because in version 2.32 | |
* firmware the close() does not work for client TCP streams. | |
*/ | |
wifly.sendChunkln(F("<html>")); | |
wifly.sendChunkln(F("<title>WiFly HTTP Server Example</title>")); | |
wifly.sendChunkln(F("<h1>")); | |
wifly.sendChunkln(F("<p>Hello</p>")); | |
wifly.sendChunkln(F("</h1>")); | |
wifly.sendChunkln(F("<form name=\"input\" action=\"/\" method=\"post\">")); | |
wifly.sendChunkln(F("Username:")); | |
wifly.sendChunkln(F("<input type=\"text\" name=\"user\" />")); | |
wifly.sendChunkln(F("<input type=\"submit\" value=\"Submit\" />")); | |
wifly.sendChunkln(F("</form>")); | |
wifly.sendChunkln(F("</html>")); | |
wifly.sendChunkln(); | |
} | |
/** Send a greeting HTML page with the user's name and an analog reading */ | |
void sendGreeting(char *name) | |
{ | |
/* Send the header directly with print */ | |
wifly.println(F("HTTP/1.1 200 OK")); | |
wifly.println(F("Content-Type: text/html")); | |
wifly.println(F("Transfer-Encoding: chunked")); | |
wifly.println(); | |
/* Send the body using the chunked protocol so the client knows when | |
* the message is finished. | |
*/ | |
wifly.sendChunkln(F("<html>")); | |
wifly.sendChunkln(F("<title>WiFly HTTP Server Example</title>")); | |
/* No newlines on the next parts */ | |
wifly.sendChunk(F("<h1><p>Hello ")); | |
wifly.sendChunk(name); | |
/* Finish the paragraph and heading */ | |
wifly.sendChunkln(F("</p></h1>")); | |
/* Include a reading from Analog pin 0 */ | |
snprintf_P(buf, sizeof(buf), PSTR("<p>Analog0=%d</p>"), analogRead(A0)); | |
wifly.sendChunkln(buf); | |
wifly.sendChunkln(F("</html>")); | |
wifly.sendChunkln(); | |
} | |
/** Send a 404 error */ | |
void send404() | |
{ | |
wifly.println(F("HTTP/1.1 404 Not Found")); | |
wifly.println(F("Content-Type: text/html")); | |
wifly.println(F("Transfer-Encoding: chunked")); | |
wifly.println(); | |
wifly.sendChunkln(F("<html><head>")); | |
wifly.sendChunkln(F("<title>404 Not Found</title>")); | |
wifly.sendChunkln(F("</head><body>")); | |
wifly.sendChunkln(F("<h1>Not Found</h1>")); | |
wifly.sendChunkln(F("<hr>")); | |
wifly.sendChunkln(F("</body></html>")); | |
wifly.sendChunkln(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment