To jest stara wersja strony!
MQTT
Deklaracje
#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); 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(), String("ssh/devices/status/" + Device_ID).c_str(), 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(json.length()) + " bajts"); Serial.println("message buffor: " + String(Mqtt_Buffer_Size)); }