Added: website

This commit is contained in:
TheJoKlLa 2023-02-08 19:23:47 +01:00
parent d7c1288946
commit 7f5395a882
4 changed files with 356 additions and 154 deletions

View File

@ -21,3 +21,4 @@ lib_deps =
uipethernet/UIPEthernet@^2.0.12 uipethernet/UIPEthernet@^2.0.12
bblanchon/ArduinoJson@^6.19.4 bblanchon/ArduinoJson@^6.19.4
mbed-feb11/Crypto@0.0.0+sha.f04410cef037 mbed-feb11/Crypto@0.0.0+sha.f04410cef037
ottowinter/ESPAsyncWebServer-esphome@^3.0.0

View File

@ -1,183 +1,63 @@
#include <Arduino.h>
#include <ArduinoLog.h>
#include "config.h"
#include "pins.h"
#include "nfc.h"
#include "otaproxy.h"
#include "helpers.h"
#include "Desfire.h"
#include "display.h"
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <ESP8266WebServer.h> #include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "website.h" #include "website.h"
WiFiClient espClient; const char* ssid = "FabReader";
//Config_Data config; AsyncWebServer server(80);
PubSubClient* mqtt; String template_index(const String& var)
NFC* nfc;
OTAProxy* ota;
Display* display;
unsigned long otatimeout = 3000;
unsigned long lastotatime;
void setup_wifi()
{ {
delay(10); if(var == "STYLE")
Serial.println("Connecting Wifi ..."); {
return String(WEBSITE_CSS);
WiFi.mode(WIFI_STA);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
} }
else
randomSeed(micros());
Serial.println("WiFi connected");
}
void reconnect()
{
while (!mqtt->connected())
{ {
String clientId = "FabReader_"; return String();
clientId += String(FABREADERID);
Serial.println("Connecting MQTT ...");
bool connected = false;
if(MQTT_USERNAME == "")
{
connected = mqtt->connect(clientId.c_str());
}
else
{
connected = mqtt->connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD);
}
if (connected)
{
Serial.println("MQTT connected");
char id[6] = "00000";
sprintf(id, "%05d", FABREADERID);
mqtt->publish("fabreader", id);
char topic_requestOTA[] = "fabreader/00000/requestOTA";
sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", FABREADERID);
mqtt->subscribe(topic_requestOTA);
char topic_stopOTA[] = "fabreader/00000/stopOTA";
sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", FABREADERID);
mqtt->subscribe(topic_stopOTA);
char topic_display[] = "fabreader/00000/display/#";
sprintf(topic_display, "fabreader/%05d/display/#", FABREADERID);
mqtt->subscribe(topic_display);
display->writeTitle("Connected");
display->writeInfo("");
}
else
{
display->writeTitle("Reconnect");
display->writeInfo("MQTT");
Serial.print("failed, rc=");
Serial.print(mqtt->state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
} }
} }
void callback(char* topic, byte* payload, unsigned int length) String template_saved(const String& var)
{ {
Serial.println("Receive Message"); if(var == "STYLE")
Serial.println(topic); {
if(ota->hasActiveOTA()) return String(WEBSITE_CSS);
{ }
ota->continueOTA(topic, payload, length); else
{
return String();
} }
display->updateByMQTT(topic, payload, length);
} }
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("\n\n\n"); Serial.print("\n\n\n");
Serial.println("Booting ...");
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_ETH_SPI_SS, OUTPUT);
digitalWrite(PIN_ETH_SPI_SS, HIGH);
display = new Display(PIN_SDA, PIN_SCL, FABREADERID); WiFi.mode(WIFI_AP);
display->clearReaderInfo(); WiFi.softAP(ssid);
display->writeInfo("Start NFC ..."); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
Serial.println("Connecting NFC ...");
nfc = new NFC(PIN_RFID_SPI_SS, PIN_RFID_RST);
if(!(nfc->rfid->PCD_PerformSelfTest()))
{ {
Serial.println("NFC Test failed"); request->send_P(200, "text/html", WEBSITE_INDEX, template_index);
} });
Serial.println("NFC connected");
display->writeInfo("Start WIFI ..."); server.on("/update_config", HTTP_POST, [](AsyncWebServerRequest *request)
setup_wifi(); {
if(request->hasParam("wlan_ssid", true))
{
Serial.print("WLAN_SSID set\n");
}
request->send_P(200, "text/html", WEBSITE_SAVED, template_saved);
});
display->writeInfo("Start MQTT ..."); server.begin();
mqtt = new PubSubClient(espClient); Serial.print("Server started\n");
mqtt->setServer(MQTT_BROKER, 1883);
mqtt->setCallback(callback);
display->writeInfo("Start OTA ...");
ota = new OTAProxy(mqtt, nfc, FABREADERID);
} }
void loop() void loop()
{ {
if (!mqtt->connected())
{
reconnect();
}
mqtt->loop();
if(!ota->hasActiveOTA())
{
if(nfc->checkforCard())
{
Serial.println("Card detected");
if(nfc->connecttoCard())
{
Serial.println("Card connected");
lastotatime = millis();
display->createReaderInfo("Run OTA");
ota->startOTA();
}
else
{
display->createReaderInfo("Retry Card");
}
}
}
if(ota->hasActiveOTA())
{
if(millis() - lastotatime > otatimeout)
{
ota->cancelOTA();
display->clearReaderInfo();
}
}
} }

View File

@ -0,0 +1,183 @@
#include <Arduino.h>
#include <ArduinoLog.h>
#include "config.h"
#include "pins.h"
#include "nfc.h"
#include "otaproxy.h"
#include "helpers.h"
#include "Desfire.h"
#include "display.h"
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "website.h"
WiFiClient espClient;
//Config_Data config;
PubSubClient* mqtt;
NFC* nfc;
OTAProxy* ota;
Display* display;
unsigned long otatimeout = 3000;
unsigned long lastotatime;
void setup_wifi()
{
delay(10);
Serial.println("Connecting Wifi ...");
WiFi.mode(WIFI_STA);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
randomSeed(micros());
Serial.println("WiFi connected");
}
void reconnect()
{
while (!mqtt->connected())
{
String clientId = "FabReader_";
clientId += String(FABREADERID);
Serial.println("Connecting MQTT ...");
bool connected = false;
if(MQTT_USERNAME == "")
{
connected = mqtt->connect(clientId.c_str());
}
else
{
connected = mqtt->connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD);
}
if (connected)
{
Serial.println("MQTT connected");
char id[6] = "00000";
sprintf(id, "%05d", FABREADERID);
mqtt->publish("fabreader", id);
char topic_requestOTA[] = "fabreader/00000/requestOTA";
sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", FABREADERID);
mqtt->subscribe(topic_requestOTA);
char topic_stopOTA[] = "fabreader/00000/stopOTA";
sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", FABREADERID);
mqtt->subscribe(topic_stopOTA);
char topic_display[] = "fabreader/00000/display/#";
sprintf(topic_display, "fabreader/%05d/display/#", FABREADERID);
mqtt->subscribe(topic_display);
display->writeTitle("Connected");
display->writeInfo("");
}
else
{
display->writeTitle("Reconnect");
display->writeInfo("MQTT");
Serial.print("failed, rc=");
Serial.print(mqtt->state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length)
{
Serial.println("Receive Message");
Serial.println(topic);
if(ota->hasActiveOTA())
{
ota->continueOTA(topic, payload, length);
}
display->updateByMQTT(topic, payload, length);
}
void setup()
{
Serial.begin(115200);
Serial.print("\n\n\n");
Serial.println("Booting ...");
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_ETH_SPI_SS, OUTPUT);
digitalWrite(PIN_ETH_SPI_SS, HIGH);
display = new Display(PIN_SDA, PIN_SCL, FABREADERID);
display->clearReaderInfo();
display->writeInfo("Start NFC ...");
Serial.println("Connecting NFC ...");
nfc = new NFC(PIN_RFID_SPI_SS, PIN_RFID_RST);
if(!(nfc->rfid->PCD_PerformSelfTest()))
{
Serial.println("NFC Test failed");
}
Serial.println("NFC connected");
display->writeInfo("Start WIFI ...");
setup_wifi();
display->writeInfo("Start MQTT ...");
mqtt = new PubSubClient(espClient);
mqtt->setServer(MQTT_BROKER, 1883);
mqtt->setCallback(callback);
display->writeInfo("Start OTA ...");
ota = new OTAProxy(mqtt, nfc, FABREADERID);
}
void loop()
{
if (!mqtt->connected())
{
reconnect();
}
mqtt->loop();
if(!ota->hasActiveOTA())
{
if(nfc->checkforCard())
{
Serial.println("Card detected");
if(nfc->connecttoCard())
{
Serial.println("Card connected");
lastotatime = millis();
display->createReaderInfo("Run OTA");
ota->startOTA();
}
else
{
display->createReaderInfo("Retry Card");
}
}
}
if(ota->hasActiveOTA())
{
if(millis() - lastotatime > otatimeout)
{
ota->cancelOTA();
display->clearReaderInfo();
}
}
}

View File

@ -0,0 +1,138 @@
#ifndef WEBSITE_H
#define WEBSITE_H
const char WEBSITE_INDEX[] = ""
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
" <meta charset=\"utf-8\">\n"
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
" <title>FabReader</title>\n"
" <style>\n"
" %STYLE%\n"
" </style>\n"
"</head>\n"
"<body>\n"
" <div id=\"header\">\n"
" <!--<img id=\"header_logo\" src=\"/logo.svg\"/>-->\n"
" <h1 id=\"header_title\">FabReader</h1>\n"
" </div>\n"
" <h2 class=\"title\">Configuration</h2>\n"
" <form action=\"/update_config\" method=\"POST\" target=\"_self\">\n"
" <h3 class=\"subtitle\">WLAN</h3>\n"
" <div class=\"config\"><p class=\"config_title\">SSID: </p><input type=\"text\" name=\"wlan_ssid\" class=\"config_content\" value=\"%WLAN_SSID%\"/></div>\n"
" <div class=\"config\"><p class=\"config_title\">PSK: </p><input type=\"password\" name=\"wlan_psk\" class=\"config_content\" value=\"%WLAN_PSK%\"/></div>\n"
" \n"
" <h3 class=\"subtitle\">MQTT</h3>\n"
" <div class=\"config\"><p class=\"config_title\">Host: </p><input type=\"text\" name=\"mqtt_host\" class=\"config_content\" value=\"%MQTT_HOST%\"/></div>\n"
" <div class=\"config\"><p class=\"config_title\">Port: </p><input type=\"number\" name=\"mqtt_port\" class=\"config_content\" value=\"%MQTT_PORT%\"/></div>\n"
" <div class=\"config\"><p class=\"config_title\">User: </p><input type=\"text\" name=\"mqtt_user\" class=\"config_content\" value=\"%MQTT_CREDENTIALS_USER%\"/></div>\n"
" <div class=\"config\"><p class=\"config_title\">Password: </p><input type=\"password\" name=\"mqtt_password\" class=\"config_content\" value=\"%MQTT_CREDENTIALS_PASSWORD%\"/></div>\n"
" \n"
" <h3 class=\"subtitle\">FabAccess</h3>\n"
" <div class=\"config\"><p class=\"config_title\">FabReaderID: </p><input type=\"number\" name=\"fabaccess_fabreaderid\" class=\"config_content\" value=\"%FABACCESS_FABREADERID%\"/></div>\n"
"\n"
" <button id=\"update_button\" type=\"submit\">Update Configuration</button>\n"
" </form>\n"
"</body>\n"
"</html>";
const char* WEBSITE_CSS = ""
"body\n"
"{\n"
" float: none;\n"
" margin: 0px;\n"
" font-family: sans-serif\n"
"}\n"
"\n"
"#header\n"
"{\n"
" display: table;\n"
" background-color: #3c474d;\n"
" width: calc(100% - 20px);\n"
" padding: 10px;\n"
"}\n"
"\n"
"#header_title\n"
"{\n"
" display: table-cell;\n"
" vertical-align: middle;\n"
" color: #00d4aa;\n"
" text-align: start;\n"
" padding-right: 50px;\n"
" padding-left: 20px;\n"
"}\n"
"\n"
"#header_logo\n"
"{\n"
" display: table-cell;\n"
" height: 50px;\n"
" width: 50px;\n"
"}\n"
"\n"
".title\n"
"{\n"
" padding-left: 10px;\n"
"}\n"
"\n"
".subtitle\n"
"{\n"
" padding-left: 30px;\n"
" margin-bottom: 5px;\n"
"\n"
" font-weight: lighter;\n"
"}\n"
"\n"
".config\n"
"{\n"
" display: table;\n"
" padding-left: 40px;\n"
"}\n"
"\n"
".config_title\n"
"{\n"
" display: table-cell;\n"
" min-width: 120px;\n"
"}\n"
"\n"
".config_content\n"
"{\n"
" display: table-cell;\n"
" margin-left: 10px;\n"
" min-width: 150px;\n"
"}\n"
"\n"
"#update_button\n"
"{\n"
" margin-top: 20px;\n"
" margin-left: 30px;\n"
" font-weight: bold;\n"
" min-width: 300px;\n"
" min-height: 30px;\n"
"}"
".download_link\n"
"{\n"
" padding-left: 30px;\n"
"}\n";
const char WEBSITE_SAVED[] = ""
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
" <meta charset=\"utf-8\">\n"
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
" <title>FabReader</title>\n"
" <style>\n"
" %STYLE%\n"
" </style>\n"
"</head>\n"
"<body>\n"
" <div id=\"header\">\n"
" <!--<img id=\"header_logo\" src=\"/logo.svg\"/>-->\n"
" <h1 id=\"header_title\">FabReader</h1>\n"
" </div>\n"
" <h2 class=\"title\">Updated</h2>\n"
" <p class=\"subtitle\">Configuration is updated.</p>\n"
" <p class=\"download_link\"><a href=\"/\">Go Back</a></p>\n"
" </body>\n"
"</html>";
#endif