Add encryption via ESP-NOW
This commit is contained in:
@@ -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)
|
||||
@@ -0,0 +1,6 @@
|
||||
#define CHANNEL 11
|
||||
|
||||
extern bool powerRemotePressed;
|
||||
extern bool resetRemotePressed;
|
||||
|
||||
void wifiSetup();
|
||||
+29
-65
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user