To jest stara wersja strony!
MQTT na ESP32
Deklaracje
#include "Arduino.h" #include <WiFi.h> #include <PubSubClient.h> const String Device_ID = "11"; // ID urządzenia [String] const String myHostname = "ssh_device_" + Device_ID; String Mqtt_Server = "adres_serwera"; // MQTT broker address int Mqtt_Port = numer_portu; // MQTT broker port String Mqtt_User = "nazwa_uzytkownika"; // MQTT broker username String Mqtt_Password = "haslo"; // MQTT broker user password // const int Mqtt_Buffer_Size = 512; // powiększenie rozmiaru bufora publikowania PubSubClient mqttClient(wifiClient); void callback(char*, byte*, unsigned int); void connectMqtt();
Połączenie podczas uruchomienia
void setup() { connectWiFi(); connectMqtt(); }
Ponowne łączenie w przypadku rozłączenia
void loop() { if (WiFi.status() != WL_CONNECTED) { connectWiFi(); } if (!mqttClient.connected()) { connectMqtt(); } mqttClient.loop(); vTaskDelay(pdMS_TO_TICKS(10)); }
Funkcja łączenia
void connectMqtt() { digitalWrite(BUILT_LED, LOW); int hostnameLenght = myHostname.length() + 1; char myMqttName[hostnameLenght]; myHostname.toCharArray(myMqttName, hostnameLenght); mqttClient.setServer(Mqtt_Server.c_str(), Mqtt_Port); mqttClient.setCallback(callback); // mqttClient.setBufferSize(Mqtt_Buffer_Size); // powiększenie rozmiaru bufora publikowania while (!mqttClient.connected() and apiGetSuccess) { vTaskDelay(pdMS_TO_TICKS(500)); digitalWrite(BUILT_LED, HIGH); Serial.println("Connecting to MQTT..."); //willMessage: String json = "{\"device\":{\"id\":" + Device_ID + ",\"name\":\"" + myHostname + "\",\"type\":\"" + ESP.getChipModel() + "\",\"online\":false}}"; if (mqttClient.connect(myMqttName, Mqtt_User.c_str(), Mqtt_Password.c_str(), "will_message_topic", 1, true, json.c_str())) { Serial.println("Connected to MQTT"); mqttClient.subscribe("adres_kanalu"); // subskrypcja } else { Serial.print("MQTT Client Failed with state "); Serial.println(mqttClient.state()); if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi disconnected!"); break; } vTaskDelay(pdMS_TO_TICKS(500)); digitalWrite(BUILT_LED, LOW); } } digitalWrite(BUILT_LED, HIGH); }
Funkcja odbierania wiadomości
void callback(char* topic, byte* payload, unsigned int length) { char *token; const char *delimiter ="/"; String splitTopic[4] = {}; token = strtok(topic, delimiter); int i = 0; while (token != NULL) { splitTopic[i] = token; i++; token=strtok(NULL, delimiter); } if (splitTopic[0] == "lvl_1" and splitTopic[1] == "lvl_2" and splitTopic[2] == "lvl_3") // kanał odebranej wiadomości { ... } }
Publikowanie wiadomości
Proste
mqttClient.publish("topic", "message");
Sprawdzające rozmiar wiadomości
String topic = "topic"); int pub = mqttClient.publish(topic.c_str(), "message", true); if (!pub) { Serial.println("MQTT publish fail!"); Serial.println("json size: " + String("message".length()) + " bajts"); Serial.println("message buffor: " + String(Mqtt_Buffer_Size)); }
Kody błędów połączenia
| -4 | MQTT_CONNECTION_TIMEOUT | the server didn't respond within the keepalive time |
|---|---|---|
| -3 | MQTT_CONNECTION_LOST | the network connection was broken |
| -2 | MQTT_CONNECT_FAILED | the network connection failed |
| -1 | MQTT_DISCONNECTED | the client is disconnected cleanly |
| 0 | MQTT_CONNECTED | the client is connected |
| 1 | MQTT_CONNECT_BAD_PROTOCOL | the server doesn't support the requested version of MQTT |
| 2 | MQTT_CONNECT_BAD_CLIENT_ID | the server rejected the client identifier |
| 3 | MQTT_CONNECT_UNAVAILABLE | the server was unable to accept the connection |
| 4 | MQTT_CONNECT_BAD_CREDENTIALS | the username/password were rejected |
| 5 | MQTT_CONNECT_UNAUTHORIZED | the client was not authorized to connect |