Files
smart-domofon/src/mqtt.ino
Nikolay Vasilchuk d1d6df5e91 Mqtt retained fix
2019-04-26 13:10:22 +03:00

90 lines
2.0 KiB
C++

#include "inc/include.h"
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void mqttSendCommand(const char *msg) {
mqttClient.publish(MQTT_TOPIC_OUT, msg);
DEBUG_F("[MQTT] Message sent: %s\n", msg);
}
void mqttSendStatus(const char *msg) {
mqttClient.publish(MQTT_TOPIC_STATUS, msg, true);
DEBUG_F("[MQTT] Status sent: %s\n", msg);
}
void onMqttMsgReceived(char* topic, byte* payload, unsigned int len) {
if (len != 1) {
char* command = (char*)malloc(len + 2);
memcpy(command, payload, len);
command[len] = '\0';
DEBUG_F("[MQTT] Message received [%u]: %s\n", len, command);
return;
}
char cmd = (char)payload[0];
DEBUG_F("[MQTT] Command received: %c\n", cmd);
switch (cmd) {
case MSG_IN_OPEN:
action = OPEN;
break;
case MSG_IN_REJECT:
action = REJECT;
break;
case MSG_IN_PING:
mqttSendStatus(MSG_STATUS_READY);
break;
default:
DEBUG_LN("[MQTT] Unknown command");
break;
}
}
void mqttConnect() {
DEBUG_F("[MQTT] (Re)connecting to server on %s...\n", MQTT_SERVER_ADDR);
for (int i = 0; !mqttClient.connected(); i++) {
// Если не получилось за 5 попыток - перезагружаемся
if (i >= 5) {
ESP.restart();
return;
}
if (!mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER_NAME, MQTT_USER_PASSWORD, MQTT_TOPIC_STATUS, 0, 1, MSG_STATUS_LAST_WILL)) {
// Ждем 2 секунды
DEBUG_F(".");
ledBlink(PIN_LED_GREEN, 8);
}
}
DEBUG_LN("\n[MQTT] Done");
mqttSendStatus(MSG_STATUS_READY);
mqttClient.subscribe(MQTT_TOPIC_IN);
setStateIdle();
DEBUG_LN("[MQTT] Current state: IDLE");
}
void mqttStop() {
mqttClient.disconnect();
ledOff();
}
void mqttSetup() {
mqttClient.setServer(MQTT_SERVER_ADDR, MQTT_SERVER_PORT);
mqttClient.setCallback(onMqttMsgReceived);
mqttConnect();
}
void mqttLoop() {
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
}