RFID Implementierung
This commit is contained in:
@@ -4,12 +4,21 @@
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <preferencemanager.h>
|
||||
#include <vector>
|
||||
|
||||
const char *BACKEND_SERVER = "https://ninja.reptilfpv.de";
|
||||
extern String
|
||||
licence; // Declare licence as an external variable defined elsewhere
|
||||
String BACKEND_TOKEN =
|
||||
licence; // Use the licence as the token for authentication
|
||||
|
||||
// Lokale Benutzer-Struktur
|
||||
struct LocalUser {
|
||||
String uid;
|
||||
String name;
|
||||
unsigned long timestamp; // Zeitstempel der Erstellung
|
||||
};
|
||||
|
||||
// Lokale Benutzer-Speicherung (geht bei Neustart verloren)
|
||||
std::vector<LocalUser> localUsers;
|
||||
|
||||
bool backendOnline() {
|
||||
|
||||
@@ -21,8 +30,8 @@ bool backendOnline() {
|
||||
}
|
||||
|
||||
HTTPClient http;
|
||||
http.begin(String(BACKEND_SERVER) + "/v1/private/health");
|
||||
http.addHeader("Authorization", String("Bearer ") + BACKEND_TOKEN);
|
||||
http.begin(String(BACKEND_SERVER) + "/api/v1/private/health");
|
||||
http.addHeader("Authorization", String("Bearer ") + licence);
|
||||
|
||||
int httpCode = http.GET();
|
||||
bool isOnline = (httpCode == HTTP_CODE_OK);
|
||||
@@ -50,42 +59,27 @@ struct UserData {
|
||||
UserData checkUser(const String &uid) {
|
||||
|
||||
UserData userData = {"", "", "", 0, false};
|
||||
String upperUid = uid;
|
||||
upperUid.toUpperCase(); // UID in Großbuchstaben konvertieren
|
||||
|
||||
if (!backendOnline()) {
|
||||
Serial.println("No internet connection, cannot check user.");
|
||||
return userData;
|
||||
}
|
||||
// Lokale Benutzer durchsuchen
|
||||
for (const auto &user : localUsers) {
|
||||
String userUpperUid = user.uid;
|
||||
userUpperUid.toUpperCase();
|
||||
if (userUpperUid == upperUid) {
|
||||
userData.uid = user.uid;
|
||||
userData.firstname = user.name;
|
||||
userData.lastname = ""; // Nicht mehr verwendet
|
||||
userData.alter = 0; // Nicht mehr verwendet
|
||||
userData.exists = true;
|
||||
|
||||
HTTPClient http;
|
||||
http.begin(String(BACKEND_SERVER) + "/v1/private/users/find");
|
||||
http.addHeader("Content-Type", "application/json");
|
||||
http.addHeader("Authorization", String("Bearer ") + BACKEND_TOKEN);
|
||||
|
||||
// Create JSON payload
|
||||
StaticJsonDocument<200> requestDoc;
|
||||
requestDoc["uid"] = uid;
|
||||
String requestBody;
|
||||
serializeJson(requestDoc, requestBody);
|
||||
|
||||
int httpCode = http.POST(requestBody);
|
||||
|
||||
if (httpCode == HTTP_CODE_OK) {
|
||||
String payload = http.getString();
|
||||
StaticJsonDocument<512> responseDoc;
|
||||
DeserializationError error = deserializeJson(responseDoc, payload);
|
||||
|
||||
if (!error) {
|
||||
userData.uid = responseDoc["uid"].as<String>();
|
||||
userData.firstname = responseDoc["firstname"].as<String>();
|
||||
userData.lastname = responseDoc["lastname"].as<String>();
|
||||
userData.alter = responseDoc["alter"] | 0;
|
||||
userData.exists = responseDoc["exists"] | false;
|
||||
Serial.println("Lokaler Benutzer gefunden: " + user.name);
|
||||
return userData;
|
||||
}
|
||||
} else {
|
||||
Serial.printf("User check failed, HTTP code: %d\n", httpCode);
|
||||
}
|
||||
|
||||
http.end();
|
||||
Serial.println("Benutzer mit UID " + uid +
|
||||
" nicht in lokaler Datenbank gefunden");
|
||||
return userData;
|
||||
}
|
||||
|
||||
@@ -100,7 +94,7 @@ JsonDocument getAllLocations() {
|
||||
|
||||
HTTPClient http;
|
||||
http.begin(String(BACKEND_SERVER) + "/v1/private/locations");
|
||||
http.addHeader("Authorization", String("Bearer ") + BACKEND_TOKEN);
|
||||
http.addHeader("Authorization", String("Bearer ") + licence);
|
||||
|
||||
int httpCode = http.GET();
|
||||
|
||||
@@ -124,42 +118,47 @@ JsonDocument getAllLocations() {
|
||||
bool userExists(const String &uid) { return checkUser(uid).exists; }
|
||||
|
||||
// Fügt einen neuen Benutzer in die Datenbank ein
|
||||
bool enterUserData(const String &uid, const String &vorname,
|
||||
const String &nachname, const String &geburtsdatum,
|
||||
int alter) {
|
||||
if (!backendOnline()) {
|
||||
Serial.println("No internet connection, cannot enter user data.");
|
||||
return false;
|
||||
bool enterUserData(const String &uid, const String &name) {
|
||||
String upperUid = uid;
|
||||
upperUid.toUpperCase(); // UID in Großbuchstaben konvertieren
|
||||
|
||||
// Prüfen ob Benutzer bereits existiert
|
||||
for (const auto &user : localUsers) {
|
||||
String userUpperUid = user.uid;
|
||||
userUpperUid.toUpperCase();
|
||||
if (userUpperUid == upperUid) {
|
||||
Serial.println("Benutzer mit UID " + upperUid + " existiert bereits!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
HTTPClient http;
|
||||
http.begin(String(BACKEND_SERVER) + "/v1/private/users/insert");
|
||||
http.addHeader("Content-Type", "application/json");
|
||||
http.addHeader("Authorization", String("Bearer ") + BACKEND_TOKEN);
|
||||
// Neuen Benutzer erstellen
|
||||
LocalUser newUser;
|
||||
newUser.uid = upperUid; // UID in Großbuchstaben speichern
|
||||
newUser.name = name;
|
||||
newUser.timestamp = millis();
|
||||
|
||||
// Create JSON payload
|
||||
StaticJsonDocument<512> requestDoc;
|
||||
requestDoc["uid"] = uid;
|
||||
requestDoc["firstname"] = vorname;
|
||||
requestDoc["lastname"] = nachname;
|
||||
requestDoc["geburtsdatum"] = geburtsdatum;
|
||||
requestDoc["alter"] = alter;
|
||||
// Benutzer zum lokalen Array hinzufügen
|
||||
localUsers.push_back(newUser);
|
||||
|
||||
String requestBody;
|
||||
serializeJson(requestDoc, requestBody);
|
||||
Serial.println("Benutzer lokal gespeichert:");
|
||||
Serial.println("UID: " + upperUid);
|
||||
Serial.println("Name: " + name);
|
||||
Serial.println("Gespeicherte Benutzer: " + String(localUsers.size()));
|
||||
|
||||
int httpCode = http.POST(requestBody);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool success = (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_CREATED);
|
||||
// Gibt alle lokalen Benutzer zurück (für Debugging)
|
||||
String getLocalUsersList() {
|
||||
String result = "Lokale Benutzer (" + String(localUsers.size()) + "):\n";
|
||||
|
||||
if (success) {
|
||||
Serial.println("User data successfully entered into database");
|
||||
} else {
|
||||
Serial.printf("Failed to enter user data, HTTP code: %d\n", httpCode);
|
||||
for (const auto &user : localUsers) {
|
||||
result += "- UID: " + user.uid + ", Name: " + user.name +
|
||||
", Erstellt: " + String(user.timestamp) + "\n";
|
||||
}
|
||||
|
||||
http.end();
|
||||
return success;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Richtet die HTTP-Routen für die Backend-API ein (z.B. Health-Check, User- und
|
||||
@@ -175,14 +174,143 @@ void setupBackendRoutes(AsyncWebServer &server) {
|
||||
});
|
||||
|
||||
server.on("/api/users", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (!backendOnline()) {
|
||||
request->send(503, "application/json",
|
||||
"{\"error\":\"Database not connected\"}");
|
||||
return;
|
||||
// Lokale Benutzer als JSON zurückgeben
|
||||
DynamicJsonDocument doc(2048);
|
||||
JsonArray usersArray = doc.createNestedArray("users");
|
||||
|
||||
for (const auto &user : localUsers) {
|
||||
JsonObject userObj = usersArray.createNestedObject();
|
||||
userObj["uid"] = user.uid;
|
||||
userObj["name"] = user.name;
|
||||
userObj["timestamp"] = user.timestamp;
|
||||
}
|
||||
|
||||
// Handle user retrieval logic here
|
||||
doc["count"] = localUsers.size();
|
||||
|
||||
String response;
|
||||
serializeJson(doc, response);
|
||||
request->send(200, "application/json", response);
|
||||
});
|
||||
|
||||
// Route zum Erstellen eines neuen Benutzers
|
||||
server.on(
|
||||
"/api/users/insert", HTTP_POST,
|
||||
[](AsyncWebServerRequest *request) {
|
||||
Serial.println("API: /api/users/insert aufgerufen");
|
||||
},
|
||||
NULL,
|
||||
[](AsyncWebServerRequest *request, uint8_t *data, size_t len,
|
||||
size_t index, size_t total) {
|
||||
// Diese Funktion wird für den Body aufgerufen
|
||||
static String bodyBuffer = "";
|
||||
|
||||
// Daten anhängen
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
bodyBuffer += (char)data[i];
|
||||
}
|
||||
|
||||
// Wenn alle Daten empfangen wurden
|
||||
if (index + len == total) {
|
||||
Serial.println("Request Body empfangen: '" + bodyBuffer + "'");
|
||||
|
||||
if (bodyBuffer.length() == 0) {
|
||||
Serial.println("FEHLER: Request Body ist leer!");
|
||||
DynamicJsonDocument response(200);
|
||||
response["success"] = false;
|
||||
response["error"] = "Request Body ist leer";
|
||||
String jsonString;
|
||||
serializeJson(response, jsonString);
|
||||
request->send(400, "application/json", jsonString);
|
||||
bodyBuffer = "";
|
||||
return;
|
||||
}
|
||||
|
||||
DynamicJsonDocument doc(512);
|
||||
DeserializationError error = deserializeJson(doc, bodyBuffer);
|
||||
|
||||
if (error) {
|
||||
Serial.println("JSON Parse Error: " + String(error.c_str()));
|
||||
DynamicJsonDocument response(200);
|
||||
response["success"] = false;
|
||||
response["error"] = "Invalid JSON: " + String(error.c_str());
|
||||
String jsonString;
|
||||
serializeJson(response, jsonString);
|
||||
request->send(400, "application/json", jsonString);
|
||||
bodyBuffer = "";
|
||||
return;
|
||||
}
|
||||
|
||||
String uid = doc["uid"].as<String>();
|
||||
String name = doc["name"].as<String>();
|
||||
|
||||
Serial.println("Extrahierte UID: " + uid);
|
||||
Serial.println("Extrahierter Name: " + name);
|
||||
|
||||
if (uid.length() == 0 || name.length() == 0) {
|
||||
DynamicJsonDocument response(200);
|
||||
response["success"] = false;
|
||||
response["error"] = "UID und Name sind erforderlich";
|
||||
String jsonString;
|
||||
serializeJson(response, jsonString);
|
||||
request->send(400, "application/json", jsonString);
|
||||
bodyBuffer = "";
|
||||
return;
|
||||
}
|
||||
|
||||
// Prüfen ob Benutzer bereits existiert
|
||||
bool userExists = false;
|
||||
for (const auto &user : localUsers) {
|
||||
if (user.uid == uid) {
|
||||
userExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (userExists) {
|
||||
DynamicJsonDocument response(200);
|
||||
response["success"] = false;
|
||||
response["error"] = "Benutzer bereits vorhanden";
|
||||
String jsonString;
|
||||
serializeJson(response, jsonString);
|
||||
request->send(409, "application/json", jsonString);
|
||||
bodyBuffer = "";
|
||||
return;
|
||||
}
|
||||
|
||||
// Neuen Benutzer direkt in das Array einfügen
|
||||
LocalUser newUser;
|
||||
newUser.uid = uid;
|
||||
newUser.name = name;
|
||||
newUser.timestamp = millis();
|
||||
|
||||
localUsers.push_back(newUser);
|
||||
|
||||
Serial.println("Benutzer über API eingefügt:");
|
||||
Serial.println("UID: " + uid);
|
||||
Serial.println("Name: " + name);
|
||||
Serial.println("Gespeicherte Benutzer: " + String(localUsers.size()));
|
||||
|
||||
DynamicJsonDocument response(200);
|
||||
response["success"] = true;
|
||||
response["message"] = "Benutzer erfolgreich erstellt";
|
||||
response["uid"] = uid;
|
||||
response["name"] = name;
|
||||
|
||||
String jsonString;
|
||||
serializeJson(response, jsonString);
|
||||
request->send(200, "application/json", jsonString);
|
||||
|
||||
// Buffer zurücksetzen
|
||||
bodyBuffer = "";
|
||||
}
|
||||
});
|
||||
|
||||
// Debug-Route für lokale Benutzer
|
||||
server.on("/api/debug/users", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
String userList = getLocalUsersList();
|
||||
request->send(200, "text/plain", userList);
|
||||
});
|
||||
|
||||
// Location routes /api/location/
|
||||
server.on("/api/location/", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
String result;
|
||||
|
||||
Reference in New Issue
Block a user