2026-04-18 14:37:49 +00:00
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "esp_at.h"
|
|
|
|
|
#include "wifi_portal.h"
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
#define ESP_RX_BUF_SIZE 1024
|
|
|
|
|
|
|
|
|
|
static char esp_rx_buf[ESP_RX_BUF_SIZE];
|
|
|
|
|
static volatile uint16_t esp_rx_idx = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern UART_HandleTypeDef huart1; // ESP
|
|
|
|
|
extern UART_HandleTypeDef huart3; // DEBUG
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
static void dbg(const char *s)
|
|
|
|
|
{
|
|
|
|
|
HAL_UART_Transmit(&huart3, (uint8_t *)s, strlen(s), HAL_MAX_DELAY);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
void ESP_RxByte(uint8_t byte)
|
|
|
|
|
{
|
|
|
|
|
if (esp_rx_idx < ESP_RX_BUF_SIZE - 1)
|
|
|
|
|
{
|
|
|
|
|
esp_rx_buf[esp_rx_idx++] = byte;
|
|
|
|
|
esp_rx_buf[esp_rx_idx] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
char* ESP_GetBuffer(void)
|
|
|
|
|
{
|
|
|
|
|
return esp_rx_buf;
|
|
|
|
|
}
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
void ESP_ClearBuffer(void)
|
|
|
|
|
{
|
|
|
|
|
esp_rx_idx = 0;
|
|
|
|
|
esp_rx_buf[0] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
static bool ESP_WaitFor(const char *expect, uint32_t timeout)
|
|
|
|
|
{
|
|
|
|
|
uint32_t start = HAL_GetTick();
|
|
|
|
|
|
|
|
|
|
while ((HAL_GetTick() - start) < timeout)
|
|
|
|
|
{
|
|
|
|
|
if (strstr(esp_rx_buf, expect))
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if (strstr(esp_rx_buf, "ERROR"))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (strstr(esp_rx_buf, "busy"))
|
|
|
|
|
{
|
2026-04-18 16:06:03 +00:00
|
|
|
HAL_Delay(100);
|
2026-04-18 14:37:49 +00:00
|
|
|
ESP_ClearBuffer();
|
|
|
|
|
start = HAL_GetTick();
|
|
|
|
|
}
|
2026-04-18 16:06:03 +00:00
|
|
|
|
|
|
|
|
HAL_Delay(1);
|
2026-04-18 14:37:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
bool ESP_SendCmd(const char *cmd, const char *expect, uint32_t timeout)
|
|
|
|
|
{
|
|
|
|
|
ESP_ClearBuffer();
|
|
|
|
|
|
|
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), HAL_MAX_DELAY);
|
|
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY);
|
|
|
|
|
|
|
|
|
|
dbg(">> ");
|
|
|
|
|
dbg(cmd);
|
|
|
|
|
dbg("\r\n");
|
|
|
|
|
|
|
|
|
|
bool ok = ESP_WaitFor(expect, timeout);
|
|
|
|
|
|
|
|
|
|
dbg("<< ");
|
|
|
|
|
dbg(esp_rx_buf);
|
|
|
|
|
dbg("\r\n");
|
|
|
|
|
HAL_Delay(50); // 🔥 estabiliza ESP
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
bool ESP_EnableMultiConn(void)
|
|
|
|
|
{
|
|
|
|
|
return ESP_SendCmd("AT+CIPMUX=1", "OK", 3000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ESP_StartSoftAP(const char *ssid, const char *pass)
|
|
|
|
|
{
|
|
|
|
|
char cmd[160];
|
|
|
|
|
|
|
|
|
|
if (!ESP_SendCmd("AT+CWMODE=2", "OK", 3000))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
snprintf(cmd, sizeof(cmd),
|
|
|
|
|
"AT+CWSAP=\"%s\",\"%s\",1,3,4",
|
|
|
|
|
ssid, pass);
|
|
|
|
|
|
|
|
|
|
return ESP_SendCmd(cmd, "OK", 5000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ESP_StartServer(uint16_t port)
|
|
|
|
|
{
|
|
|
|
|
char cmd[64];
|
|
|
|
|
snprintf(cmd, sizeof(cmd), "AT+CIPSERVER=1,%u", port);
|
|
|
|
|
return ESP_SendCmd(cmd, "OK", 5000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
bool ESP_SendLinkData(int link_id, const char *data)
|
|
|
|
|
{
|
|
|
|
|
char cmd[64];
|
|
|
|
|
size_t len = strlen(data);
|
|
|
|
|
|
|
|
|
|
ESP_ClearBuffer();
|
|
|
|
|
|
|
|
|
|
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%u", link_id, (unsigned)len);
|
|
|
|
|
|
|
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), HAL_MAX_DELAY);
|
|
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY);
|
|
|
|
|
|
|
|
|
|
if (!ESP_WaitFor(">", 3000))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)data, len, HAL_MAX_DELAY);
|
|
|
|
|
|
|
|
|
|
return ESP_WaitFor("SEND OK", 5000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ESP_HasIPD(void)
|
|
|
|
|
{
|
|
|
|
|
if (strstr(ESP_GetBuffer(), "+IPD"))
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ESP_SendData(const char *data)
|
|
|
|
|
{
|
2026-04-19 21:53:43 +00:00
|
|
|
HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 2000);
|
2026-04-18 14:37:49 +00:00
|
|
|
}
|
|
|
|
|
/*************************************************/
|
|
|
|
|
|
|
|
|
|
bool ESP_CloseLink(int link_id)
|
|
|
|
|
{
|
|
|
|
|
char cmd[32];
|
|
|
|
|
snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d", link_id);
|
|
|
|
|
return ESP_SendCmd(cmd, "OK", 3000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
void ESP_Init(void)
|
|
|
|
|
{
|
2026-04-18 16:06:03 +00:00
|
|
|
// 🔥 manda reset à bruta
|
|
|
|
|
ESP_SendData("AT+RST\r\n");
|
|
|
|
|
|
|
|
|
|
dbg("RESET ESP...\r\n");
|
|
|
|
|
|
|
|
|
|
// 🔥 espera real (não confies no WaitFor)
|
|
|
|
|
HAL_Delay(6000);
|
|
|
|
|
|
|
|
|
|
ESP_ClearBuffer();
|
|
|
|
|
|
|
|
|
|
dbg("ESP PRONTO\r\n");
|
|
|
|
|
|
|
|
|
|
// 🔥 agora sim começa
|
|
|
|
|
if (!ESP_SendCmd("AT", "OK", 3000))
|
|
|
|
|
dbg("AT FAIL\r\n");
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
if (!ESP_SendCmd("ATE0", "OK", 3000))
|
|
|
|
|
dbg("ATE0 FAIL\r\n");
|
|
|
|
|
|
|
|
|
|
if (!ESP_SendCmd("AT+CIPDINFO=1", "OK", 3000))
|
|
|
|
|
dbg("CIPDINFO FAIL\r\n");
|
|
|
|
|
|
|
|
|
|
if (!ESP_SendCmd("AT+CWMODE=2", "OK", 3000))
|
|
|
|
|
dbg("CWMODE FAIL\r\n");
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
if (!ESP_SendCmd("AT+CWSAP=\"STM32\",\"12345678\",1,3,4", "OK", 8000))
|
|
|
|
|
dbg("CWSAP FAIL\r\n");
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
HAL_Delay(3000);
|
2026-04-18 14:37:49 +00:00
|
|
|
|
|
|
|
|
if (!ESP_SendCmd("AT+CIPMUX=1", "OK", 3000))
|
|
|
|
|
dbg("CIPMUX FAIL\r\n");
|
|
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
if (!ESP_SendCmd("AT+CIPSERVER=1,80", "OK", 5000))
|
2026-04-18 14:37:49 +00:00
|
|
|
dbg("CIPSERVER FAIL\r\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
__attribute__((unused))
|
|
|
|
|
static int parse_ipd_link(const char *p)
|
|
|
|
|
{
|
|
|
|
|
int link = -1;
|
|
|
|
|
sscanf(p, "+IPD,%d,", &link);
|
|
|
|
|
return link;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************/
|
|
|
|
|
void ESP_Task(void)
|
|
|
|
|
{
|
2026-04-18 16:06:03 +00:00
|
|
|
char *buf = ESP_GetBuffer();
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
if (!strstr(buf, "GET "))
|
|
|
|
|
return;
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
dbg("HTTP DETECTADO\r\n");
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
// 🔥 ESPERAR O RESTO DO HTTP CHEGAR
|
|
|
|
|
HAL_Delay(200);
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
int link_id = 0;
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
const char *resp =
|
|
|
|
|
"HTTP/1.1 200 OK\r\n"
|
|
|
|
|
"Content-Type: text/html\r\n"
|
|
|
|
|
"Connection: close\r\n"
|
|
|
|
|
"\r\n"
|
|
|
|
|
"<h1>PORTAL XUPA FUNCIONA</h1>";
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
char cmd[64];
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%u",
|
|
|
|
|
link_id, (unsigned)strlen(resp));
|
2026-04-18 14:37:49 +00:00
|
|
|
|
2026-04-18 16:06:03 +00:00
|
|
|
if (ESP_SendCmd(cmd, ">", 3000))
|
|
|
|
|
{
|
|
|
|
|
ESP_SendData(resp);
|
|
|
|
|
ESP_WaitFor("SEND OK", 5000);
|
2026-04-18 14:37:49 +00:00
|
|
|
}
|
2026-04-18 16:06:03 +00:00
|
|
|
|
|
|
|
|
snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d", link_id);
|
|
|
|
|
ESP_SendCmd(cmd, "OK", 3000);
|
|
|
|
|
|
|
|
|
|
ESP_ClearBuffer();
|
2026-04-18 14:37:49 +00:00
|
|
|
}
|