#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define WIFI_SSID "wifi_uma"
#define WIFI_PASSWORD "wifi_uma"
#define WIFI_CHANNEL 6
volatile int barrier_state = 0;
volatile bool open_barrier = false;
TaskHandle_t HandleTask1; // Handle de la tarea 1
const char *MQTT_BROKER_ADRESS = "server_uma";
const uint16_t MQTT_PORT = 1883;
const char *MQTT_CLIENT_NAME = "ejercicio5_NLC";
const char *MQTT_USER = "eii_user";
const char *MQTT_PASS = "eii_pswd";
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void ConnectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void InitMqtt() {
mqttClient.setServer(MQTT_BROKER_ADRESS, MQTT_PORT);
mqttClient.setCallback(OnMqttReceived);
}
void ConnectMqtt() {
while (!mqttClient.connected()) {
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME, MQTT_USER, MQTT_PASS)) {
mqttClient.subscribe("/bar_eii_open");
Serial.println("Subscribed to topic");
} else {
Serial.print("Failed, rc=");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void HandleMqtt() {
if (!mqttClient.connected()) {
ConnectMqtt();
}
mqttClient.loop();
}
void TaskMqtt(void *parameter) {
TickType_t xLastWakeTime;
const TickType_t xPeriod = pdMS_TO_TICKS(1000); //1000/1000=1Hz
xLastWakeTime = xTaskGetTickCount();
while (1) {
HandleMqtt();
char buffer[10];
sprintf(buffer, "%d", barrier_state);
mqttClient.publish("/bar_eii_state", buffer);
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
void OnMqttReceived(char *topic, byte *payload, unsigned int length) {
Serial.print("Received on ");
Serial.print(topic);
Serial.print(": ");
String message = "";
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (strcmp(topic, "/bar_eii_open") == 0) {
if (message == "O") {
open_barrier = true;
}else{
Serial.println("Payload incorrecto");
}
}
}
void setup(void) {
Serial.begin(115200);
ConnectWiFi();
InitMqtt();
xTaskCreatePinnedToCore(
TaskMqtt, //Nombre de la función
"Gestiona el sistema de comunicaciones basado en MQTT", //Descripción de la tarea
4096, //Memoria asignada a la tarea(bytes)
NULL, //Parámetros de entrada(none)
2, //Prioridad de la tarea
&HandleTask1, //Nombre de la tarea
0); //Núcleo al cual va asignado la tarea
}
void loop() {
delay(10);
}