You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.0 KiB
180 lines
5.0 KiB
/* WiFi
|
|
*
|
|
* Arduino ESP32 mDNS responder sample
|
|
*/
|
|
|
|
#include "Arduino.h"
|
|
|
|
#include <WiFi.h>
|
|
#include <WiFiMulti.h>
|
|
#include <ESPmDNS.h>
|
|
#include <WiFiClient.h>
|
|
#include <Preferences.h>
|
|
|
|
// ToDo: check if https://github.com/me-no-dev/ESPAsyncWebServer/ becomes available
|
|
// libwebsockets got ESP32 support in v2.2 !
|
|
|
|
#include "soundboard.h"
|
|
#include "hardware.h"
|
|
#include "sound.h"
|
|
|
|
#include "wifi.h"
|
|
|
|
using namespace std;
|
|
|
|
Wifi::Wifi() {
|
|
this->server = WiFiServer(80);
|
|
}
|
|
|
|
void Wifi::init() {
|
|
WiFiMulti wifiMulti;
|
|
|
|
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
|
|
|
|
Serial.println("Connecting Wifi");
|
|
if(wifiMulti.run() == WL_CONNECTED) {
|
|
Serial.println("");
|
|
Serial.println("WiFi connected");
|
|
Serial.println("IP address: ");
|
|
Serial.println(WiFi.localIP());
|
|
}
|
|
|
|
/* // Wait for connection
|
|
for (int i=0; i<20 && WiFi.status() != WL_CONNECTED; i++) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
*/
|
|
|
|
// Set up mDNS responder:
|
|
// - first argument is the domain name, in this example
|
|
// the fully-qualified domain name is "esp8266.local"
|
|
// - second argument is the IP address to advertise
|
|
// we send our IP address on the WiFi network
|
|
if (!MDNS.begin("soundboard")) {
|
|
Serial.println("Error setting up MDNS responder!");
|
|
} else {
|
|
Serial.println("mDNS responder started");
|
|
}
|
|
|
|
// Start TCP (HTTP) server
|
|
server.begin();
|
|
Serial.println("TCP server started");
|
|
|
|
// Add service to MDNS-SD
|
|
MDNS.addService("http", "tcp", 80);
|
|
}
|
|
|
|
void Wifi::init_softap() {
|
|
// WiFi wifi;
|
|
// wifi.softAP("soundboard");
|
|
}
|
|
|
|
/* never used */ /*
|
|
void Wifi::readPreferences() {
|
|
Preferences preferences;
|
|
preferences.begin("sb_wifi", false); // namespace limited to 15 chars!
|
|
for(uint8_t i=0; true; i++) {
|
|
char key[8];
|
|
sprintf(key, "ssid%d", i);
|
|
String ssid = preferences.getString(key); // max 31
|
|
sprintf(key, "pass%d", i);
|
|
String password = preferences.getString(key); // max 63
|
|
}
|
|
preferences.end();
|
|
} */
|
|
|
|
size_t Wifi::getStoredPassword(const char* ssid, char* value) {
|
|
Preferences preferences;
|
|
preferences.begin("sb_wifi-pwd", false);
|
|
size_t len = preferences.getString(ssid, value, 64);
|
|
preferences.end();
|
|
return len;
|
|
}
|
|
|
|
size_t Wifi::setStoredPassword(const char* ssid, char* value) {
|
|
Preferences preferences;
|
|
preferences.begin("sb_wifi-pwd", false);
|
|
size_t len = preferences.putString(ssid, value);
|
|
preferences.end();
|
|
return len;
|
|
}
|
|
|
|
void Wifi::loop() {
|
|
// Check if a client has connected
|
|
WiFiClient client = server.available();
|
|
if (!client) {
|
|
return;
|
|
}
|
|
Serial.println("");
|
|
Serial.println("New client");
|
|
|
|
// Wait for data from client to become available
|
|
while(client.connected() && !client.available()){
|
|
delay(1);
|
|
}
|
|
|
|
// Read the first line of HTTP request
|
|
String req = client.readStringUntil('\r');
|
|
|
|
// First line of HTTP request looks like "GET /path HTTP/1.1"
|
|
// Retrieve the "/path" part by finding the spaces
|
|
int addr_start = req.indexOf(' ');
|
|
int addr_end = req.indexOf(' ', addr_start + 1);
|
|
if (addr_start == -1 || addr_end == -1) {
|
|
Serial.print("Invalid request: ");
|
|
Serial.println(req);
|
|
return;
|
|
}
|
|
req = req.substring(addr_start + 1, addr_end);
|
|
Serial.print("Request: ");
|
|
Serial.println(req);
|
|
client.flush();
|
|
|
|
String s;
|
|
if (req == "/") {
|
|
IPAddress ip = WiFi.localIP();
|
|
String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
|
|
s = "HTTP/1.1 200 OK\r\n"
|
|
"Content-Type: text/html\r\n"
|
|
"\r\n"
|
|
"<!DOCTYPE HTML>\r\n"
|
|
"<html>\r\n";
|
|
s += "<h1>Hello from ESP32 at " + ipStr + "</h1>\r\n";
|
|
s += "<p><a href=\"sound/1\"><button>1</button></a>"
|
|
"<a href=\"sound/2\"><button>2</button></a>"
|
|
"<a href=\"sound/3\"><button>3</button></a></p>"
|
|
"<p><a href=\"sound/4\"><button>4</button></a>"
|
|
"<a href=\"sound/5\"><button>5</button></a>"
|
|
"<a href=\"sound/6\"><button>6</button></a></p>"
|
|
"<p><a href=\"sound/7\"><button>7</button></a>"
|
|
"<a href=\"sound/8\"><button>8</button></a>"
|
|
"<a href=\"sound/9\"><button>9</button></a></p>"
|
|
"</html>\r\n"
|
|
"\r\n";
|
|
Serial.println("Sending 200");
|
|
} else if (req == "/test") {
|
|
Serial.println("/test");
|
|
s = "HTTP/1.1 200 OK\r\n\r\n";
|
|
} else if (req.startsWith("/sound/")) {
|
|
Serial.print("/sound/");
|
|
int n = req.substring(7).toInt();
|
|
Serial.println(n);
|
|
if (0<=n<=9) {
|
|
Sound* sound = Sound::getInstance();
|
|
char filename[25];
|
|
sprintf(filename, "/T%d.wav", n);
|
|
if (sound != NULL) sound->play(filename);
|
|
}
|
|
s = "HTTP/1.1 200 OK\r\n\r\n";
|
|
} else {
|
|
s = "HTTP/1.1 404 Not Found\r\n\r\n";
|
|
Serial.println("Sending 404");
|
|
}
|
|
client.print(s);
|
|
|
|
Serial.println("Done with client");
|
|
}
|
|
|
|
void Wifi::end() {
|
|
}
|
|
|