Add encryption via ESP-NOW

This commit is contained in:
Riyyi
2025-09-12 22:27:55 +02:00
parent 8f4823586f
commit 224f22f23d
10 changed files with 310 additions and 157 deletions
View File
+99
View File
@@ -0,0 +1,99 @@
#include <cstdint>
#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
#include <esp_wifi.h>
#include "connect.h"
#include "secrets.h"
uint8_t client_mac[6] = CLIENT_MAC;
uint8_t server_mac[6] = SERVER_MAC;
bool powerRemotePressed = false;
bool resetRemotePressed = false;
// -----------------------------------------
void wifiSetupEncryption();
void onDataSent(const uint8_t* mac_addr, esp_now_send_status_t status)
{
}
void onDataRecv(const uint8_t* mac_addr, const uint8_t* data, int data_len)
{
Serial.print("Received: ");
Serial.write(data, data_len);
Serial.println();
auto msg = String((const char*)data, data_len);
if (msg == "power_pressed") {
powerRemotePressed = true;
}
else if (msg == "power_released") {
powerRemotePressed = false;
}
else if (msg == "reset_pressed") {
resetRemotePressed = true;
}
else if (msg == "reset_released") {
resetRemotePressed = false;
}
else {
return;
}
String reply = msg + "_ack";
esp_now_send(client_mac, (const uint8_t*)reply.c_str(), reply.length());
}
void wifiSetup()
{
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(false);
WiFi.disconnect();
delay(100);
esp_wifi_set_channel(static_cast<uint8_t>(CHANNEL), WIFI_SECOND_CHAN_NONE);
wifiSetupEncryption();
}
void wifiSetupEncryption()
{
esp_now_deinit();
if (esp_now_init() != ESP_OK) {
Serial.println("Failed to init ESP-NOW");
return;
}
if (esp_now_set_pmk((const uint8_t*)PMK) != ESP_OK) {
Serial.println("Failed to set PMK");
return;
}
auto peerInfo = esp_now_peer_info_t {
.channel = static_cast<uint8_t>(CHANNEL),
.encrypt = true,
};
memcpy(peerInfo.peer_addr, client_mac, 6);
memcpy(peerInfo.lmk, LMK, 16);
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
esp_now_register_send_cb(onDataSent);
esp_now_register_recv_cb(onDataRecv);
Serial.println("Configured encryption!");
}
// https://docs.espressif.com/projects/arduino-esp32/en/latest/api/wifi.html
// https://docs.arduino.cc/libraries/wifi/ (old)
+6
View File
@@ -0,0 +1,6 @@
#define CHANNEL 11
extern bool powerRemotePressed;
extern bool resetRemotePressed;
void wifiSetup();
+29 -65
View File
@@ -1,30 +1,21 @@
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include "secrets.h"
// Default gateway = 192.168.4.1
// Default IP address = 192.168.4.2
#define PORT 1234
#define CHANNEL 11
#define HIDDEN true
#define MAX_CONNECTION 1
#include "connect.h"
#define POWER_BUTTON_PIN 10
#define RESET_BUTTON_PIN 2
#define POWER_LED_PIN 3
#define RESET_LED_PIN 1
#define POWER_GATE_PIN 6
#define RESET_GATE_PIN 7
WiFiServer server(PORT, MAX_CONNECTION);
int previousPowerButtonState = HIGH;
int previousResetButtonState = HIGH;
bool powerPressed = false;
bool resetPressed = false;
bool powerButtonPressed = false;
bool resetButtonPressed = false;
void processButtons();
void setPowerPin(bool enable);
@@ -35,6 +26,9 @@ void setup()
Serial.begin(9600);
Serial.setDebugOutput(true);
pinMode(POWER_BUTTON_PIN, INPUT_PULLUP);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
pinMode(POWER_GATE_PIN, OUTPUT);
pinMode(POWER_LED_PIN, OUTPUT);
pinMode(RESET_GATE_PIN, OUTPUT);
@@ -43,85 +37,55 @@ void setup()
delay(3000);
Serial.println("Server booted!");
// Start button server
WiFi.softAP(SSID, PASSWORD, CHANNEL, HIDDEN, MAX_CONNECTION);
Serial.println("AP Started");
server.begin();
wifiSetup();
}
void loop()
{
WiFiClient client = server.available();
if (client) {
Serial.println("Client connected");
delay(20); // used for button debounce
unsigned long start = 0;
while (client.connected()) {
if (client.available()) {
String msg = client.readStringUntil('\n');
Serial.print("Received: ");
Serial.println(msg);
int powerButtonState = digitalRead(POWER_BUTTON_PIN);
int resetButtonState = digitalRead(RESET_BUTTON_PIN);
if (msg == "power_pressed") {
powerPressed = true;
}
else if (msg == "power_released") {
powerPressed = false;
}
else if (msg == "reset_pressed") {
resetPressed = true;
}
else if (msg == "reset_released") {
resetPressed = false;
}
client.print("ACK\n");
Serial.println("Sent ACK");
start = millis();
}
// Kill lingering connections
if (start != 0 && millis() - start > 200) {
Serial.println("Client kill..");
break;
}
processButtons();
}
setPowerPin(false);
setResetPin(false);
client.stop();
Serial.println("Client disconnected");
// Unsupported usecase
if (powerButtonState == LOW && resetButtonState == LOW) {
previousPowerButtonState = HIGH;
previousResetButtonState = HIGH;
powerButtonPressed = false;
resetButtonPressed = false;
return;
}
powerButtonPressed = powerButtonState == LOW;
resetButtonPressed = resetButtonState == LOW;
processButtons();
}
// -----------------------------------------
void processButtons()
{
if (powerPressed && resetPressed) {
if ((powerRemotePressed && resetRemotePressed)
|| (powerButtonPressed && resetButtonPressed)) {
Serial.println("Double input..");
setPowerPin(false);
setResetPin(false);
return;
}
setPowerPin(powerPressed);
setResetPin(resetPressed);
setPowerPin(powerRemotePressed || powerButtonPressed);
setResetPin(resetRemotePressed || resetButtonPressed);
}
void setPowerPin(bool enable)
{
powerPressed = enable;
// digitalWrite(POWER_GATE_PIN, (enable) ? HIGH : LOW);
digitalWrite(POWER_LED_PIN, (enable) ? HIGH : LOW);
}
void setResetPin(bool enable)
{
resetPressed = enable;
// digitalWrite(RESET_GATE_PIN, (enable) ? HIGH : LOW);
digitalWrite(RESET_LED_PIN, (enable) ? HIGH : LOW);
}
+5 -2
View File
@@ -1,4 +1,7 @@
#pragma once
#define SSID "EXAMPLE"
#define PASSWORD "12345678"
#define CLIENT_MAC { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
#define SERVER_MAC { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
#define PMK "MASTERKEY1234567" // ESP_NOW_KEY_LEN = 16
#define LMK "1234567890ABCDEF" // ESP_NOW_KEY_LEN = 16