stm32-project/Core/Src/wifi_portal.c
2026-04-18 15:37:49 +01:00

105 lines
2.3 KiB
C

/*
* wifi_portal.c
*
* Created on: 09/04/2026
* Author: carec
*/
#include "wifi_portal.h"
#include "esp_at.h"
#include "http_pages.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
static char saved_ssid[33];
static char saved_pass[65];
static void url_decode(char *dst, const char *src, int maxlen)
{
int i = 0;
while (*src && i < (maxlen - 1)) {
if (*src == '+') {
dst[i++] = ' ';
src++;
} else if (*src == '%' && src[1] && src[2]) {
char hex[3] = {src[1], src[2], 0};
dst[i++] = (char)strtol(hex, NULL, 16);
src += 3;
} else {
dst[i++] = *src++;
}
}
dst[i] = 0;
}
static int get_query_param(const char *req, const char *name, char *out, int outlen)
{
const char *q = strchr(req, '?');
if (!q) return 0;
char key[32];
snprintf(key, sizeof(key), "%s=", name);
const char *p = strstr(q, key);
if (!p) return 0;
p += strlen(key);
const char *end = strchr(p, '&');
int len = end ? (end - p) : strcspn(p, " ");
char tmp[128];
if (len >= (int)sizeof(tmp)) len = sizeof(tmp) - 1;
memcpy(tmp, p, len);
tmp[len] = 0;
url_decode(out, tmp, outlen);
return 1;
}
static void save_credentials(const char *ssid, const char *pass)
{
strncpy(saved_ssid, ssid, sizeof(saved_ssid) - 1);
strncpy(saved_pass, pass, sizeof(saved_pass) - 1);
// aqui metes EEPROM / FLASH / NVS emulador / o que quiseres
// por agora fica em RAM
}
void WIFI_PORTAL_Init(void)
{
saved_ssid[0] = 0;
saved_pass[0] = 0;
}
void WIFI_PORTAL_HandleHttp(int link_id, const char *req)
{
if (strncmp(req, "GET / ", 6) == 0) {
ESP_SendLinkData(link_id, HTTP_Page_Index());
ESP_CloseLink(link_id);
return;
}
if (strncmp(req, "GET /save?", 10) == 0) {
char ssid[33] = {0};
char pass[65] = {0};
get_query_param(req, "ssid", ssid, sizeof(ssid));
get_query_param(req, "pass", pass, sizeof(pass));
if (ssid[0]) {
save_credentials(ssid, pass);
}
ESP_SendLinkData(link_id, HTTP_Page_Saved());
ESP_CloseLink(link_id);
return;
}
ESP_SendLinkData(link_id, HTTP_Page_404());
ESP_CloseLink(link_id);
}