#include <WiFi.h>
#include <HTTPClient.h>
#include "mbedtls/md.h"
#include <time.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverName = "https://<seu-api-id>.execute-api.<região>.amazonaws.com/<stage>/button-press";
const char* secretKey = "SUA_CHAVE_SECRETA"; // Deve ser a mesma chave da Lambda
const int buttonPin = 4; // GPIO para o botão de pânico
const int ledPin = 2; // LED de confirmação (embutido no ESP32)
bool lastButtonState = HIGH;
// Configuração de NTP para obter a hora atual
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -3 * 3600; // Horário de Brasília
const int daylightOffset_sec = 0;
// Função para gerar assinatura HMAC
String generateHMAC(String payload) {
unsigned char hmacResult[32];
mbedtls_md_context_t ctx;
const mbedtls_md_info_t* info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
mbedtls_md_init(&ctx);
mbedtls_md_setup(&ctx, info, 1);
mbedtls_md_hmac_starts(&ctx, (const unsigned char*)secretKey, strlen(secretKey));
mbedtls_md_hmac_update(&ctx, (const unsigned char*)payload.c_str(), payload.length());
mbedtls_md_hmac_finish(&ctx, hmacResult);
mbedtls_md_free(&ctx);
String hmacHex = "";
for (int i = 0; i < 32; i++) {
if (hmacResult[i] < 16) hmacHex += "0";
hmacHex += String(hmacResult[i], HEX);
}
return hmacHex;
}
// Função para obter o horário atual via NTP
String getCurrentTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return "Erro ao obter horário";
}
char timeString[25];
strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);
return String(timeString);
}
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
// Conectar ao Wi-Fi
connectToWiFi();
// Configurar NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
bool buttonState = digitalRead(buttonPin);
if (lastButtonState == HIGH && buttonState == LOW) {
Serial.println("Botão de pânico pressionado!");
String currentTime = getCurrentTime();
String jsonPayload = "{\"device\":\"ESP32\",\"button_pressed\":true,\"timestamp\":\"" + currentTime + "\"}";
String hmacSignature = generateHMAC(jsonPayload);
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type", "application/json");
http.addHeader("X-Signature", hmacSignature);
int httpResponseCode = http.POST(jsonPayload);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Resposta da AWS: " + response);
digitalWrite(ledPin, HIGH); // Acender LED para confirmação
delay(1000); // Mantém o LED aceso por 1 segundo
digitalWrite(ledPin, LOW);
} else {
Serial.print("Erro na requisição: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi desconectado. Tentando reconectar...");
connectToWiFi();
}
}
lastButtonState = buttonState;
delay(50); // Debounce do botão
}
// Função para conectar/reconectar ao Wi-Fi
void connectToWiFi() {
WiFi.begin(ssid, password);
Serial.print("Conectando ao WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
}