From 6341475d586f41ab3ef5d1f5defe384107f5bf42 Mon Sep 17 00:00:00 2001 From: Cyril Danilevski <cydanil@gmail.com> Date: Wed, 7 Feb 2024 19:57:08 +0100 Subject: [PATCH] Add basic web server --- icbm.ino | 19 ++++++++++++++----- rest.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ rest.hpp | 8 ++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 rest.cpp create mode 100644 rest.hpp diff --git a/icbm.ino b/icbm.ino index 18805c1..d806173 100644 --- a/icbm.ino +++ b/icbm.ino @@ -1,6 +1,7 @@ #include <WiFiUdp.h> #include <SNMP.h> #include "esp32_ethernet.hpp" +#include "rest.hpp" WiFiUDP udp; SNMP::Manager snmp; @@ -232,6 +233,7 @@ extern bool eth_connected; void setup() { Serial.begin(115200); + connectNetwork(); // SNMP snmp.begin(&udp); @@ -242,6 +244,9 @@ void setup() { delay(100); } + initializeRoutes(); + Serial.println("Started REST server"); + start = millis(); // MPOD SNMP::Message *message = mpod.setup(); @@ -255,10 +260,7 @@ enum { OFF, }; -void loop() { - // Manager loop function must be called to process incoming messages - snmp.loop(); - // Serial +void serial_loop() { if (Serial.available()) { uint8_t output = NONE; // Read command from serial @@ -280,12 +282,19 @@ void loop() { delete message; } } - // Send a request every second +} + +void loop() { + // Manager loop function must be called to process incoming messages + restServer.handleClient(); + serial_loop(); + if (millis() - start >= 1000) { start = millis(); // Create message to query MPOD and send it SNMP::Message* message = mpod.read(); snmp.send(message, IPAddress(10, 42, 0, 1), SNMP::PORT::SNMP); delete message; + Serial.print("."); } } diff --git a/rest.cpp b/rest.cpp new file mode 100644 index 0000000..8758637 --- /dev/null +++ b/rest.cpp @@ -0,0 +1,52 @@ +#include "rest.hpp" + +WebServer restServer(80); + +void initializeRoutes() { + restServer.on("/idn", identify); + restServer.onNotFound(notFound); + + restServer.begin(); + Serial.println("REST Server Started"); +} + + +void identify() { + int seconds = millis() / 1000; + int hours = seconds / 3600; + int minutes = (seconds / 60) % 60; + seconds = seconds % 60; + + String message = "{\n"; + + message += "\"version\":\""; + message += "0.1"; // TODO: Get from Git + message += "\",\n"; + + message += "\"uptime\": \""; + message += String(hours); + message += ":"; + message += String(minutes); + message += ":"; + message += String(seconds); + message += "\""; + + message += "\n}"; + + restServer.send(200, "text/json", message); +} + +void notFound() { + String message = "File Not Found\n\n"; + message += "URI: "; + message += restServer.uri(); + message += "\nMethod: "; + message += (restServer.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += restServer.args(); + message += "\n"; + for (uint8_t i = 0; i < restServer.args(); i++) { + message += " " + restServer.argName(i) + ": " + restServer.arg(i) + "\n"; + } + restServer.send(404, "text/plain", message); +} diff --git a/rest.hpp b/rest.hpp new file mode 100644 index 0000000..bb098d6 --- /dev/null +++ b/rest.hpp @@ -0,0 +1,8 @@ +#pragma once +#include <WebServer.h> + +extern WebServer restServer; + +void initializeRoutes(); +void identify(); +void notFound(); -- GitLab