- Co to jest MQTT?
- Instalowanie Brokera Mosquitto MQTT na Raspberry Pi
- Testowanie brokera Raspberry Pi Mosquitto
- Schemat obwodu
- Kod i wyjaśnienie
MQTT to protokół używany do wysyłania i odbierania wiadomości przez Internet. Wcześniej używaliśmy tego protokołu w liczniku Iot Electricity i Raspberry Pi Alexa do publikowania danych w Internecie. W tym samouczku dowiemy się więcej o MQTT i terminach z nim związanych. Tutaj użyjemy Raspberry Pi jako lokalnego brokera MQTT i będziemy sterować diodą LED podłączoną do NodeMCU ESP12E za pośrednictwem pulpitu aplikacji MQTT. Czujnik DHT11 jest również podłączony do NodeMCU, więc otrzymujemy odczyt temperatury i wilgotności na desce rozdzielczej MQTT, ponownie używając Raspberry Pi jako lokalnego brokera MQTT.
Zacznijmy więc od zaniżenia MQTT i terminów z nim związanych.
Co to jest MQTT?
MQTT to skrót od Message Queue Telemetry Transport, który został zaprojektowany przez IBM. Ten protokół jest prosty i lekki, służy do wysyłania i odbierania wiadomości przez Internet i jest przeznaczony dla urządzeń o niskim wykorzystaniu przepustowości. Obecnie protokół ten jest często używany w urządzeniach IoT do wysyłania i odbierania danych z czujników. Ponadto w systemach automatyki domowej opartych na IoT ten protokół może być łatwo używany bez wykorzystywania dużej ilości danych internetowych.
Istnieje kilka terminów, które są często używane w MQTT:
- Subskrybuj i publikuj
- Wiadomość
- Temat
- Pośrednik
1. Subskrybuj i publikuj: Subskrybuj oznacza pobieranie danych z innego urządzenia, a publikowanie oznacza wysyłanie danych do innego urządzenia.
Gdy urządzenie1 wysyła dane do urządzenia2, wtedy jest znane jako Wydawca, a drugie jako Abonent i odwrotnie.
2. Wiadomość: Wiadomości to informacje, które wysyłamy i otrzymujemy. Może to być dane lub polecenie dowolnego typu. Na przykład, jeśli publikujemy dane o temperaturze w chmurze, wówczas te dane o temperaturze są znane jako wiadomość.
3. Temat: W ten sposób zgłaszasz zainteresowanie wiadomościami przychodzącymi lub określasz, gdzie chcesz opublikować wiadomość. Tematy są reprezentowane za pomocą ciągów znaków oddzielonych ukośnikiem. Dane są publikowane w tematach przy użyciu MQTT, a następnie urządzenie MQTT subskrybuje temat, aby uzyskać dane.
4. Broker MQTT: Ta rzecz jest odpowiedzialna za odbieranie wszystkich wiadomości od wydawców, filtrowanie wiadomości, a następnie publikowanie ich subskrybentom, którzy są nimi zainteresowani.
Gdy ten broker jest hostowany w chmurze, nazywa się go chmurą MQTT. Istnieje wiele usług MQTT opartych na chmurze, takich jak Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure itp. MQTT może być również używany z popularną chmurą Amazon AWS, co wyjaśniliśmy w samouczku Getting Started with Amazon AWS.
Możemy stworzyć własnego brokera MQTT przy użyciu Raspberry Pi. Będzie to lokalny broker MQTT, tzn. Możesz wysyłać i odbierać dane w swojej sieci lokalnej tylko nie z dowolnego miejsca. Więc tutaj zainstalujemy brokera Mosquitto MQTT w Raspberry Pi, aby był lokalnym brokerem MQTT i wyślemy dane o temperaturze z NodeMCU do aplikacji dashboard MQTT. Będziemy również sterować diodą LED podłączoną do NodeMCU za pomocą brokera.
Instalowanie Brokera Mosquitto MQTT na Raspberry Pi
Otwórz terminal w swoim Raspberry pi i wpisz następujące polecenia, aby zainstalować brokera
sudo apt update sudo apt install -y mosquitto mosquitto-clients
Poczekaj na zakończenie instalacji. Teraz, aby uruchomić brokera przy starcie raspberry pi, wpisz następujące polecenie
sudo systemctl włącz mosquitto.service
To wszystko, jesteśmy gotowi do uruchomienia naszego brokera MQTT. Aby sprawdzić, czy jest poprawnie zainstalowany, wprowadź następujące polecenie
mosquitto -v
Ta komenda poda wersję Twojego brokera MQTT. Powinien mieć wartość 1.4.x lub nowszą.
Testowanie brokera Raspberry Pi Mosquitto
1. Uruchom brokera Mosquitto w tle za pomocą poniższego polecenia
mosquitto -d
2. Teraz zasubskrybujemy temat w exampleTopic, używając następującego polecenia
mosquitto_sub -d -t przykładTemat
3. Teraz opublikujemy wiadomość do exampleTopic
mosquitto_pub -d -t przykładTemat -m "Witaj, świecie!"
Otrzymasz Hello world! Wiadomość w terminalu abonenckim.
Teraz czas na kontrolę i pobieranie danych z innego urządzenia, w naszym przypadku używamy aplikacji dashboard NodeMCU i MQTT .
- Najpierw będziemy sterować diodą LED, wysyłając polecenie za pomocą aplikacji, więc w tym przypadku NodeMCU zachowuje się jak subskrybent, a aplikacja jako wydawca.
- Wtedy ESP12E ma również podłączony czujnik DHT11 i wysyła ten odczyt temperatury do aplikacji Mobile MQTT, więc w tym przypadku abonentem będzie mobile a wydawcą NodeMCU. Aby przekazać te wiadomości w odpowiednich tematach, używany jest broker Mosquitto MQTT.
Schemat obwodu
Podłączyć obwód, jak pokazano na schemacie. Tutaj DHT11 jest używany do odczytów temperatury, ale można również użyć czujnika temperatury LM35. Czujnik DHT11 wykorzystaliśmy już w wielu naszych projektach, w tym w NodeMCU do budowy stacji pogodowej.
Zacznijmy pisać kod dla NodeMCU do subskrybowania i publikowania danych.
Kod i wyjaśnienie
Tutaj użyjemy szablonu biblioteki Adafruit MQTT i zmienimy wymagane rzeczy w kodzie. Ten sam kod można wykorzystać do publikowania i subskrybowania danych w chmurze Adafruit IO, zmieniając tylko kilka rzeczy.W tym celu pobierz bibliotekę Adafruit MQTT z Sketch -> Include Library -> Manage Libraries. Wyszukaj Adafruit MQTT i zainstaluj go. Po zainstalowaniu biblioteki. Przejdź do przykładów -> Biblioteka mqtt Adafruit -> mqtt_esp8266
Następnie edytuj ten kod zgodnie z naszym adresem IP Raspberry Pi i danymi uwierzytelniającymi Wi-Fi.
Uwzględnij wszystkie biblioteki dla ESP8266WIFI i Adafruit MQTT .
#zawierać
Następnie zdefiniuj SSID i hasło do swojej sieci Wi-Fi, z której chcesz połączyć ESP-12e. Upewnij się, że RPi i NodeMCU łączą się z tą samą siecią.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Ta sekcja definiuje serwer Adafruit, w tym przypadku adres IP twojego Raspberry Pi i port serwera.
# zdefiniować AIO_SERVER "adres IP twojego Pi" # zdefiniować AIO_SERVERPORT 1883
Poniższe pola pozostaną puste, ponieważ nie korzystamy z chmury Adafruit.
# zdefiniować AIO_USERNAME "" # zdefiniować AIO_KEY ""
Następnie utwórz klasę ESP8266 WiFiClient, aby połączyć się z serwerem MQTT.
Klient WiFiClient;
Skonfiguruj klasę klienta MQTT, przekazując klienta WiFi i serwer MQTT oraz dane logowania.
Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Skonfiguruj kanał o nazwie „Temperatura”, aby opublikować temperaturę.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
Skonfiguruj kanał o nazwie „led1”, aby subskrybować zmiany.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
W funkcji konfiguracji deklarujemy PIN NodeMCU, na którym chcesz uzyskać wyjście. Następnie podłącz NodeMCU do punktu dostępu Wi-Fi.
void setup () { Serial.begin (115200); opóźnienie (10); pinMode (LED, WYJŚCIE); Serial.println (F ("Demo Adafruit MQTT")); // Połącz się z punktem dostępu WiFi. Serial.println (); Serial.println (); Serial.print ("Łączenie z"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. … … Skonfiguruj subskrypcję MQTT dla źródła LED. mqtt.subscribe (& led1); }
W funkcji pętli upewnimy się, że połączenie z serwerem MQTT jest aktywne za pomocą MQTT_connect (); funkcjonować.
void loop () { MQTT_connect ();
Teraz zasubskrybuj kanał 'led' i pobierz ciąg od brokera MQTT i przekonwertuj ten ciąg na liczbę za pomocą atoi (); funkcja i zapisz ten numer do pinu LED za pomocą digitalWrite (); funkcjonować.
Subskrypcja Adafruit_MQTT_Subscribe *; while ((subskrypcja = mqtt.readSubscription (20000))) { if (subskrypcja == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
Teraz pobierz temperaturę w zmiennej i opublikuj tę wartość za pomocą funkcji Temperature.publish (t) .
float t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("OK!")); }
Pełny kod z filmem demonstracyjnym znajduje się na końcu tego samouczka. Prześlij kod na płytę NodeMCU i otwórz aplikację pulpitu nawigacyjnego MQTT, którą pobrałeś na smartfon.
Możesz także sterować GPIO Raspberry Pi z dowolnego miejsca na świecie za pomocą chmury MQTT, takiej jak Adafruit IO, MQTT.IO itp., Czego nauczymy się w następnym samouczku.