From e33a4374d2abccd1e5a26d91d16f6f8d7b922b4d Mon Sep 17 00:00:00 2001 From: my Date: Thu, 10 Sep 2026 16:09:54 +0200 Subject: [PATCH] Mesh relay --- src/chat-relay/EvilChatMesh-Relay.cpp | 104 ++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/chat-relay/EvilChatMesh-Relay.cpp diff --git a/src/chat-relay/EvilChatMesh-Relay.cpp b/src/chat-relay/EvilChatMesh-Relay.cpp new file mode 100644 index 0000000..8f1a980 --- /dev/null +++ b/src/chat-relay/EvilChatMesh-Relay.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#define MAX_HISTORY 32 +#define MSG_LEN 100 + +struct MeshMessage { + char id[9]; + char from[16]; + char body[MSG_LEN]; +}; + +char seenMessageIds[MAX_HISTORY][19]; +int seenIndex = 0; + +uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + +bool hasSeenId(const char* id) { + for (int i = 0; i < MAX_HISTORY; i++) { + if (strncmp(seenMessageIds[i], id, 8) == 0) { + return true; + } + } + return false; +} + +void rememberId(const char* id) { + strncpy(seenMessageIds[seenIndex], id, 8); + seenMessageIds[seenIndex][8] = '\0'; + seenIndex = (seenIndex + 1) % MAX_HISTORY; +} + +uint16_t crc16(const uint8_t* data, size_t length) { + uint16_t crc = 0xFFFF; + for (size_t i = 0; i < length; i++) { + crc ^= ((uint16_t)data[i] << 8); + for (int j = 0; j < 8; j++) { + crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1); + } + } + return crc; +} + +void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *incomingData, int len) { + if (len != sizeof(MeshMessage) + sizeof(uint16_t)) { + return; + } + + uint16_t receivedCrc; + memcpy(&receivedCrc, incomingData + sizeof(MeshMessage), sizeof(uint16_t)); + uint16_t computedCrc = crc16(incomingData, sizeof(MeshMessage)); + if (receivedCrc != computedCrc) { + // Le message est corrompu + return; + } + + MeshMessage msg; + memcpy(&msg, incomingData, sizeof(MeshMessage)); + + if (hasSeenId(msg.id)) return; + rememberId(msg.id); + + esp_now_send(broadcastAddress, incomingData, len); + + if (strcmp(msg.body, "PING") != 0) { + Serial.print("Relayed message from "); + Serial.print(msg.from); + Serial.print(": "); + Serial.println(msg.body); + } +} + + +void setup() { + Serial.begin(115200); + Serial.println("Initialisation du relais ESP-NOW"); + + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + + if (esp_now_init() != ESP_OK) { + Serial.println("Erreur lors de l'initialisation d'ESP-NOW"); + return; + } + + esp_now_register_recv_cb(onDataRecv); + + // Ajout du peer de broadcast + esp_now_peer_info_t peerInfo = {}; + memcpy(peerInfo.peer_addr, broadcastAddress, 6); + peerInfo.channel = 1; + peerInfo.encrypt = false; + if (!esp_now_is_peer_exist(peerInfo.peer_addr)) { + if (esp_now_add_peer(&peerInfo) != ESP_OK) { + Serial.println("Erreur lors de l'ajout du peer broadcast"); + } + } +} + +void loop() { + delay(10); +} \ No newline at end of file