В предишната статия разгледахме стъпките за инсталиране на MQTT брокер. Нека сега да тестваме сървъра при реални условия.
Ще използвам демото, в което измерихме температурата с DS18B20. Но вместо да показваме резултата на локален екран, ще изпратим информацията използвайки MQTT брокер.
Отново свързваме:
- Пин 1 (левият) на
DS18B20сGNDнаNodeMCU; - Пин 2 (средният) на
DS18B20сD3наNodeMCU; - Пин 3 (десният) на
DS18B20с3v3наNodeMCU; - Нужен е резистор от
4.7kΩдо5kΩмежду Пин 2 и Пин 3.

Инсталираме библиотеката PubSubClient

Няма да правя демо, което използва некриптирана връзка. Направо ще започнем със SSL без проверка.
Ето го и кода:
#include "OneWire.h"
#include "DallasTemperature.h"
#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "PubSubClient.h"
// SSID и парола на домашната ви мрежа
const char *ssid = "TechPotWin";
const char *password = "techpotpass";
const char* mqtt_server = "techpot.w-lab.win";
const int mqtt_port = 8883;
const char* mqtt_user = "techpotwin";
const char* mqtt_pass = "techpotpass";
float previousTemperatureC = 0;
unsigned int secondsCounter = 0;
// пин, на който е свързан DS18B20 на ESP8266 - D3
OneWire oneWire(D3);
DallasTemperature sensors(&oneWire);
BearSSL::WiFiClientSecure ClientSecure;
PubSubClient mqttClient(ClientSecure);
void setup() {
Serial.begin(115200);
// задаваме режим клиент на WiFi
WiFi.mode(WIFI_STA);
// задаваме SSID и парола за свързване
WiFi.begin(ssid, password);
// стартираме библиотеката за сензори
sensors.begin();
// не проверяваме валидността на сертификата
ClientSecure.setInsecure();
// намаляваме размера на буфера, за да спестим памет (не е съвместимо със всички сървъри)
ClientSecure.setBufferSizes(512, 512);
// задаваме хост и порт на MQTT клиента
mqttClient.setServer(mqtt_server, mqtt_port);
}
void loop() {
// проверяваме дали WiFi е свързан
if (WiFi.status() == WL_CONNECTED) {
// проверяваме дали сме свързани с MQTT
if (!mqttClient.connected()) {
// извеждаме съобщение
Serial.println("Свързване с MQTT");
// свързваме се с MQTT
if (mqttClient.connect("TempSensor", mqtt_user, mqtt_pass)) {
// извеждаме съобщение
Serial.println("Успешно свързване с MQTT");
} else {
// извеждаме съобщение
Serial.println("Невъзможно свързване с MQTT");
}
}
// проверяваме дали сме свързани с MQTT
if (mqttClient.connected()) {
// правим заявка към температурния сензор
sensors.requestTemperatures();
// присвояваме температурата
float temperatureC = sensors.getTempCByIndex(0);
// извеждаме температурата в серийния монитор
Serial.println(temperatureC);
// увеличаваме брояча на секунди
secondsCounter++;
// проверяваме дали разликата в температурата е повече от 0.1 градуса или са изтекли 10 минути от предишното изпращане на данни
if ((temperatureC > previousTemperatureC + 0.1) || (temperatureC < previousTemperatureC - 0.1) || (secondsCounter == 600)) {
// зануляваме брояча на секунди
secondsCounter = 0;
// изпращаме текущата температура посредством MQTT
// първият параметър е тема (topic), вторият е стойността, третрият е задържане (retain)
mqttClient.publish("Temperature", String(temperatureC).c_str(), true);
// записваме температура като предишна
previousTemperatureC = temperatureC;
}
// обслужваме процесите на MQTT
mqttClient.loop();
}
}
// пауза една секунда
delay(1000);
}
Как работи кода в loop – проверяваме дали има връзка с WiFi и MQTT. При успех прочитаме температурата от DS18B20 и извеждаме на серийния монитор. Ако температурата се различава с повече от 0.1 градуса от предишната комуникация с MQTT или са изтекли повече от 600 секунди (10 минути) тогава изпращаме данните с температурата през MQTT с опция задържане (retain).


Какво означава опция задържане?
Обикновено MQTT брокерът работи като една голяма разклонителна кутия. Ако получи сигнал 123 с етикет abc, то той ще изпрати сигнал 123 на всички абонирани за етикет abc, които в момента са на линия. Но ако някой нов абонат се присъедини след получаването на сигнала, той няма да получи нищо, докато нашето устройство не изпрати нов сигнал. Задържане (retain) казва на MQTT брокера, да запомни нашият сигнал, за да го предаде на новоприсъединилите се клиенти.
