Finished web socket communication

This commit is contained in:
2026-08-09 08:43:20 -06:00
parent 8c53ba5298
commit b782867c69
4 changed files with 99 additions and 59 deletions
+2 -2
View File
@@ -12,8 +12,8 @@
platform = espressif32 platform = espressif32
board = esp32dev board = esp32dev
framework = arduino framework = arduino
;lib_deps = lib_deps =
;; esp32async/ESPAsyncWebServer@^3.12.0 WebSockets
; upload via OTA ; upload via OTA
upload_protocol = espota upload_protocol = espota
+1 -1
View File
@@ -1,3 +1,3 @@
// Contains configuration constants: // Contains configuration constants:
#define FIRMWARE_VERSION "1.0.2" #define FIRMWARE_VERSION "1.0.3"
+87 -53
View File
@@ -4,7 +4,8 @@ WebService::WebService(DashboardState& state)
: :
Service("Web", 10), Service("Web", 10),
dashboardState(state), dashboardState(state),
server(80) server(80),
webSocket(81)
{ {
} }
@@ -65,31 +66,35 @@ h1 {
</style> </style>
<script> <script>
function updateUptime() {
fetch('/uptime') let socket;
.then(response => response.text())
.then(data => { function connectWebSocket() {
document.getElementById("uptime").innerHTML = data; socket = new WebSocket(
}); "ws://" + window.location.hostname + ":81/"
);
socket.onopen = function() {
console.log("WebSocket connected");
};
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
document.getElementById("uptime").innerHTML = data.uptime;
document.getElementById("firmware_version").innerHTML = data.version;
};
socket.onclose = function() {
console.log("WebSocket disconnected");
setTimeout(connectWebSocket, 2000);
};
} }
setInterval(updateUptime, 1000); window.onload = connectWebSocket;
window.onload = updateUptime;
</script> </script>
<script>
function getVersion() {
fetch('/version')
.then(response => response.text())
.then(data => {
document.getElementById("firmware_version").innerHTML = data;
});
}
window.onload = getVersion;
</script>
</head> </head>
<body> <body>
@@ -105,18 +110,22 @@ Firmware Version: <div id="firmware_version">Loading...</div>
</html> </html>
)rawliteral"; )rawliteral";
void WebService::broadcastState()
{
String json = "{";
// server.send(200, "text/html", html); json += "\"uptime\":\"";
// } json += dashboardState.uptime;
// json += "\",";
// void handleUptime() {
// server.send(200, "text/plain", formatUptime()); json += "\"version\":\"";
// } json += dashboardState.firmwareVersion;
// json += "\"";
// void handleVersion() {
// server.send(200, "text/plain", FIRMWARE_VERSION); json += "}";
// }
// webSocket.broadcastTXT(json);
}
void WebService::begin() { void WebService::begin() {
// Root path // Root path
@@ -128,34 +137,59 @@ void WebService::begin() {
); );
}); });
// Version path
server.on("/version", [this](){
server.send(
200,
"text/plain",
dashboardState.firmwareVersion
);
});
// Uptime path
server.on("/uptime", [this]() {
server.send(
200,
"text/plain",
dashboardState.uptime
);
});
server.begin(); server.begin();
webSocket.begin();
// Manage web socket connections
webSocket.onEvent(
[this](uint8_t clientNum,
WStype_t type,
uint8_t *payload,
size_t length)
{
if (type == WStype_TEXT) {
handleWebSocketMessage(
clientNum,
payload,
length
);
}
if (type == WStype_CONNECTED) {
Serial.println("WebSocket client connected");
broadcastState();
}
}
);
Serial.println("Web server started"); Serial.println("Web server started");
} }
void WebService::handleWebSocketMessage(uint8_t clientNum, uint8_t *payload, size_t length) {
Serial.println("Client number: " + clientNum);
Serial.println("Sent a message of length: " + length);
Serial.print("Saying: ");
for (int ii = 0; ii < length; ii ++) {
Serial.print(payload[ii]);
}
Serial.print("\n\n\n");
}
void WebService::update() void WebService::update()
{ {
dashboardState.update(); dashboardState.update();
server.handleClient(); server.handleClient();
webSocket.loop();
// Brodcase updates once per second
static unsigned long lastUpdate = 0;
if (millis() - lastUpdate >= 1000)
{
lastUpdate = millis();
broadcastState();
}
} }
+8 -2
View File
@@ -1,9 +1,11 @@
#pragma once #pragma once
#include "service.h"
#include "../core/dashboard_state.h"
#include <WebServer.h> #include <WebServer.h>
#include <WebSocketsServer.h>
#include "service.h"
#include "../core/dashboard_state.h"
class WebService : public Service { class WebService : public Service {
@@ -17,5 +19,9 @@ public:
private: private:
WebServer server; WebServer server;
WebSocketsServer webSocket;
DashboardState dashboardState; DashboardState dashboardState;
void handleWebSocketMessage(uint8_t clientNum, uint8_t *payload, size_t length);
void broadcastState();
}; };