/* ESP32 MQTT Subscriber / Logger
Subscribes to sensors/telemetry and logs received payloads to Serial
*/
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
const char* mqtt_server = "test.mosquitto.org";
const uint16_t mqtt_port = 1883;
WiFiClient espClient;
PubSubClient mqtt(espClient);
void setup_wifi() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("Connecting to WiFi ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
if (millis() - start > 10000) {
Serial.println("\nStill trying to connect WiFi in sim (Wokwi may auto-connect). Continuing...");
break;
}
}
Serial.println("");
Serial.print("WiFi IP: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("[RECV] topic: ");
Serial.println(topic);
// print payload preview (first 400 chars)
unsigned int previewLen = min(length, 400u);
String s = "";
for (unsigned int i = 0; i < previewLen; i++) s += (char)payload[i];
Serial.printf("payload_len=%u preview=\"%s\"\n", length, s.c_str());
// simple detection: look for the words "password" or "username"
String payloadStr = "";
for (unsigned int i=0;i<length;i++) payloadStr += (char)payload[i];
if (payloadStr.indexOf("password") >= 0 || payloadStr.indexOf("username") >= 0) {
Serial.println("!!! SUSPICIOUS: possible credential leak detected !!!");
}
}
void reconnect() {
while (!mqtt.connected()) {
Serial.print("Connecting to MQTT...");
if (mqtt.connect("esp32_subscriber_sim")) {
Serial.println("connected");
mqtt.subscribe("sensors/telemetry");
Serial.println("Subscribed to sensors/telemetry");
} else {
Serial.print("failed, rc=");
Serial.print(mqtt.state());
Serial.println(" try again in 2s");
delay(2000);
}
}
}
void setup() {
setup_wifi();
mqtt.setServer(mqtt_server, mqtt_port);
mqtt.setCallback(callback);
}
void loop() {
if (!mqtt.connected()) reconnect();
mqtt.loop();
delay(10);
}