Rehber MQTT Nedir? - MQTT protokolü ile ESP8266'yı kontrol etme

Arduino ve MQTT - MQTT protokolü ile ESP8266'yı kontrol etme

IoT, hayatımızda her geçen gün daha fazla yer ediniyor. Akıllı, birbirleriyle iletişimde olan cihazların sayısı artıyor. İki cihaz arası iletişim, IoT'nin en önemli çalışma alanlarından biri. İletişimin güçlü ama sisteme çok yük bindirmeyecek biçimde olması, güvenli ancak karmaşık olmaması çok önemli. Bunun yanında kullanılacak iletişim sisteminin, uygulanabilirliği de önemli.

MQTT Nedir?

mqtt-logo.jpg


MQTT, iki cihaz arasındaki iletişimi baz alan, açık kaynaklı, OASIS ve ISO standardına bağlı hafif, Publish (Yayınlama) ve Subscribe (Abone olma) mantığına sahip ağ protokolüdür. MQTT, genellikle TCP / IP üzerinden çalışır; ancak, düzenli, kayıpsız, çift yönlü bağlantılar sağlayan herhangi bir ağ protokolü de MQTT'yi destekleyebilir.

MQTT, hafifliği, basitliği ve entegrasyonunun kolay olması sebebiyle, ağır ya da hafif birçok IoT uygulamaında, projesinde kullanılır. Hafifliği ve basitliği nedeniyle, Arduino tabanlı kartlarla yapılan IoT projelerinde de kullanımı yaygındır.

MQTT'nin üç ana ayağı vardır:
  • Publisher (Yayımlayıcı): Mesaj gönderen cihaza verilen isim
  • Broker (Aracı): MQTT sunucusunun karşılığı, MQTT Broker'ıdır. Broker, herhangi bir Publish/ Subscribe işleminin merkezinde yer alır. Uygulamaya bağlı olarak, bir Broker aynı anda, kendisine bağlı milyonlarca MQTT istemcisini işleyebilir.
  • Subscriber (Alıcı): Mesaj alan cihaza verilen isimdir.
MQTT_Schema_EN.jpg


MQTT'de mesajlar, Topic denilen kanallar üzerinden iletilir. Publisher, MQTT Broker'ı üzerinde bir Topic açar ve mesajını gönderir. Subscriber ise o Topic'e abone olur ve mesajları alır. Bu bağlamda MQTT sistemini, posta sistemine benzetebiliriz.

MQTT sisteminde, gönderilen veriler tutulmaz. Broker, Publisher'dan gelen veriyi, Subscriber veriyi aldığını doğruluyana kadar tutar ve siler. Bu bağlamda veritabanı özelliği yoktur. Bir publisher, bir mesajı aynı anda ancak tek bir Topic'e gönderebilir. Fakat bir Subscriber, aynı anda birden çok Topic'e abona olup, mesajları alabilir.

MQTT neredeyse tamamen Publish/Subscirbe mantığı üzerinden çalışmaktadır. MQTT Broker'ı, herkese açık olabileceği gibi, sertifikasyon ile de korunabilir, bu bağlamda güçlü bir korumaya sahiptir.

Biz, bu projede MQTT Broker'ı olarak Mosquitto'yu kullanacağız.

Eclipse Mosquitto

mosquitto-text-side-28.jpg


MQTT'için birçok boker seçeneği vardır. İnternet üzerinde, basit Arduino projelerinizi çalıştırmak için birçok Broker bulabileceğiniz gibi, iş temelli projelerinizde, AWS IoT sistemini de kullanabilirsiniz.

Bu projede, oldukça popüler olan ve Loca Ağ'da çalışan Mosquitto MQTT Broker'ı kullanacağız. Mosquitto, Eclipse tarafından piyasaya sunulmuş, açık kaynaklı bir MQTT Broker'ıdır. Local Ağ'ınızda çalıştırmak için oldukça idealdir.

Mosquitto'nun kurulumu oldukça kolaydır. Mosquitto'nun sitesinden kolayca indirilebilir. Şu an 2.0 sürümü var ancak bu sürüm, Windows 10'da, lokal Ağ'da bulunan IP adreslerini göremiyor. Bu nedenle 1.5.8 sürümünü kullanabiliriz. Bu sürüm, benim 2019 yazından beri kullandığım sürüm ve herhangi bir eksikliği bulunmuyor.

Mosquitto'yu indirmek için bu bağlantıyı tıklayın

Kurulumu çalıştırın ve kurulum yeri olarak direkt C dizinini seçin, zira Mosquitto klasörü ile çok işimiz olacak.

mosquitto_1.PNG


Kurduktan sonra sistemi yeniden başlatın, Broker arkaplanda çalışmaya başlamış olacak. Eğer çalışmadıysa, şu komutu Yönetici olarak başlattığınız CMD'ye girin:

net start mosquitto

Bu komut, Broker'ı arkaplanda çalıştıracaktır. Artık ilk denememizi yapabiliriz. Mosquitto'nun ana dizininden iki tane komut satırı açın. Sağdaki komut satırına şu kodu yazın:

mosquitto_sub -h localhost -t #

Ve soldaki satıra da şu kodu yazın:

mosquitto_pub -h localhost -t test -m "Hello, World"

Bu kodu yazdıktan sonra, sağdaki satırda "Hello, World" mesajının belirdiğini göreceksiniz.

mosquitto_ornek.gif


Buraya kadar ne yaptık?

Komut satırına farklı farklı kelimeler yazdık ve kafanız karışmış olabilir. Bunları sizin için açıklayayım:

  • mosquitto_pub: Bu, ilgili komut satırından Publish (Yayınlama) işleminin yapılacağını belirtir. Bir bakıma Publisher mı Subscriber mı olduğumuzu belirler.
  • mosquitto_pub: Bu, ilgili komut satırından Subscribe (Abone Olma) işleminin yapılacağını belirtir.
  • -h: Bu kısım, hostun yani MQTT Broker'ının hangi adreste kayıtlı olduğunu belirtir. -h localhost dediğimizde, MQTT Broker'ının bu bilgisayarda çalıştığını belirtir. Eğer Broker, local Ağ'daki başka bir bilgisayarda çalışıyor olsaydı (Örn: 192.168.1.33), o zaman şu şekilde yazmamız gerekirdi: -h 192.168.1.33
  • -t: Bu kısım, hangi Topic'te işlem yapacağımızı belirtir. -t test dediğimiz zaman, mesajımızı test adlı Topic'e gönderiyoruz ya da test adlı Topic'e abone oluyoruz.
  • -m: Bu kısım, sadece Publish (Yayınlama) işleminde kullanılır. Göndereceğimiz mesajı belirtir. Mesaj, bir String olabileceği gibi, JSON formatında da olabilir, ki oturmuş sistemlerdeki yaygın format JSON'dur.
  • -t ve # kullanımı: Hatırlarsanız, MQTT'den bahsederken, Subscriber'ın aynı anda birden çok Topic'i dinleyebileceğinden bashetmiştik. işte # sembolü, Broker üzerinden bulunan tüm Topic'leri dinlememizi sağlar.
MQTT ve Mosquitto kısmını bitirdiğimize göre, işin Arduino ve ESP8266 kısmına geçebiliriz.

Arduino ve ESP kartları

Ej7iEXFXkAYEUkM.jpg


İşin Arduino tarafı, aşinaysanız daha basit. MQTT'nin temelinde basit ve hafif bir teknoloji olduğundan bashetmiştik. Bu, Arduino gibi basit cihazlar için MQTT'yi, IoT uygulamalarında oldukça ideal kılıyor. Günümüzde Arduino tabanlı ve internete bağlanabilen, IoT için üretilmiş pek çok geliştirme kartı var. Bunlardan en popülerleri ESP 32 ve ESP 8266 platformları.

Bu iki platformunda Arduino içinde, MQTT ile kullanılmasını sağlayan kütüphaneler var. Bunlardan en popüleri ve düzgünü PubSub Client. PubSub Client, ESP8266 paketinin içinde hazır olarak gelebiliyor ancak gelmediği zamanlarda, indirmek çok kolay.

PubSub Client Proje Sayfası:


Bu projede temel amacım, ESP8266'nın pinlerine bağlı röleleri kontrol etmekti. Bu nedenle röleler üzerine bir örnek vereceğim. ESP8266'nın D2 pinine bir adet 5V röle bağladım:

20201224_214716.jpg


PubSub Client kütüphanesini kurduktan ve ESP8266'nın bağlantılarını yaptıktan sonra, kodlama kısmına geçebiliriz artık.

MQTT kodları için kendi oluşturduğum bir GitHub Repo'su bulunuyor. Burada hem veri gönderme, hem de veri alma üzerine örnekler var. Sıcaklık değerlerini gönderebilir ya da rölelerinizi kontrol edebilirsiniz:


Bu Repo'daki tek röle için hazırladığım kodu kullanacağım:

C-like:
// Open-Source ESP8266 code created by Ibrahim Cahit Ozdemir
//
// https://github.com/ibrahimcahit

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

int relay_pin = D2;

// Update with your Wi-Fi
const char* ssid = "update_with_your_ssid";
const char* password = "update_with_your_password";

// Enter your localy running MQTT brokers IP address
IPAddress mqtt_server(000, 000, 0, 00);


WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
String relay;
String strTopic;
String strPayload;

void setup_wifi() {

  delay(10);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';
  strTopic = String((char*)topic);

  // you can change topic with whatever you want.
  if(strTopic == "ESP8266"){
   
    relay = String((char*)payload);
   
    if(relay == "relay_on")  {
      Serial.println("Opening Relay...");
      digitalWrite(relay_pin, HIGH);
    }
   
    if(relay == "relay_off") {
      Serial.println("Closing Relay...");
      digitalWrite(relay_pin, LOW);
    }
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
     
      // you can change topic with whatever you want.
      client.subscribe("ESP8266");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
  client.publish("ESP8266", "NodeMCU Connected!");
}

void setup() {
  pinMode(relay_pin, OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Koddaki belli başlı yerleri sırayla tanıyalım:

  • IPAddress mqtt_server(000, 000, 0, 00); Buraya, MQTT Broker'ımızın local Ağ'da bulunduğu cihazın IP adresini girmemiz gerek Örneğin: IPAddress mqtt_server(192, 168, 1, 33);
  • void callback bu kısımda, Subscribe olunan Topic'ten gelen mesajları kontrol ediyoruz Rölemizi bu kısımda kontrol ediyoruz.
  • client.publish("ESP8266", "NodeMCU Connected!"); Bu kısım, MQTT'deki belirttiğimiz Topic'e bir hoşgeldim mesajı gönderiyor. client.publish("<TOPIC>", "<MESSAGE>"); syntax'i ile bağlı olduğunuz Broker'da istediğiniz Topic'e istediğiniz mesajı gönderebilirsiniz.
Projenin çalışırkenki halini göstermek için bir GIF hazırladım. GIF'te sağda Publish komut satırı, solda Subscribe komut satırı ve altta Arduino IDE'nin seri port ekranı var. Arduino'nun röleleri açıp kapatırken seri porttan da mesaj göndermesini sağladım. Bu sayede çalışıp çalışmadığını görebiliriz:

relay_demo_a.gif


Bu noktada ilk MQTT uygulamamızı yapmış olduk. Bu altyapıyı kullanarak kendi IoT ağınızı kurabilirsiniz.

Ancak ESP8266 ve MQTT ile yapabileceklerinizin sınırı yok. Mesela,

İki kart arasında, sıcaklık bilgisini MQTT ile birinden diğerine gönderip, I2C ile LCD'ye yazdırabilirsiniz:

EMQOftQXsAANQ5G.jpg


Daha da iyisi, ESP8266 ile okuduğunuz sıcaklık değerlerini, InfluxDB veritabanına gönderip, Grafana gibi tarayıcı tabanlı bir izleme sistemiyle takip edebilirsiniz:

EOLITthX0AEcfRm.jpg


EMAAvzrWwAAhexG.jpg


Ya da en iyisi, Raspberry Pi gibi bir cihaza Node Red kurup, hem röleleri kontrol edebilir hem de sıcaklığı gözlemleyebilirsiniz:

ERyGUJiW4AAvJqT.jpg


EOLITthWsAokEuT.jpg


EOLITtfW4AI6NNG.jpg


Tabii ki bunlar hep, işin gelişmiş boyutları. MQTT ile IoT üzerine yapabileceklerinizin sınırı yok.

MQTT, IoT uygulamalarında kullanmak için oldukça ideal ve basit bir altyapıdır. Basit cihazların, sensörlerin ve anahtarların birbirleriyle iletişim halinde olması için kullanılabilir. MQTT sayesinde, kendi evinizde, iş yerinizde basit ve güvenli lokal IoT ağınızı kurabilirsiniz.

Umarım bu rehber hoşunuza gitmiştir, takıldığınız yerlerde yardımcı olabilmiştir. Rehber hakkındaki görüş ve yorumlarınız benim için önemli. Ayrıca benzer projeler yaptıysanız da bilmek isterim.

Görüş ve önerilerinizi belirtmeyi unutmayın. :)

Başka bir rehberde görüşmek üzere.
 
Muhtemelen ESP8266'yı kontrol etmek bu rehberi hazırlamaktan daha kolay olmuştur. Elinize sağlık. ^_^

Biraz öyle oldu. Aslında uzun zamandır üzerinde çalıştığım bir konuydu, hatta evede Raspberry Pi üzerinde çalışan bir MQTT Broker'ım da var, AWS IoT ağına bağlı. :)

Abi muhteşemsin yine.

Teşekkürler. :D
 
1608837467373.png

Hocam, yanlış anlamadıysam eğer; üstteki yazılan komutun işlevi ile alttaki resimde bulunan ve tarayıcının URL kısmına yazılan komutun işlevi aynı mı?
1608837570443.png


Ayrıca rehber için teşekkürler :)
 
Eki Görüntüle 799118
Hocam, yanlış anlamadıysam eğer; üstteki yazılan komutun işlevi ile alttaki resimde bulunan ve tarayıcının URL kısmına yazılan komutun işlevi aynı mı?
Eki Görüntüle 799121

Ayrıca rehber için teşekkürler :)

Aslında değil. Yani şöyle ki: ikisi de röleyi açıp kapatmaya yarıyor. Ancak MQTT'de, ESP8266 Wi-Fİ ağına bağlı ve başka bir sunucuyu dinliyor.

relay_on URL mantığında ise sunucu direkt cihaz üzerinde kurulu. Sunucu mantıkları da farklı tabii. :)

MQTT Broker'ı, AWS IoT gibi bir ağa bağlayıp, Broker'ın diğer ucunu da Alexa gibi bir asistana bağlayınca, ortaya şöyle bir sonuç çıkıyor:

Bonus olsun. :)

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Hocam muhteşem ötesi rehber olmuş. Şahsen bende Raspberry Pi kullanıyorum. Node-Red uygulamasına yeni başladım. Sadece switch ile röle açıp kapatıyordum. Bu MQTT olayını çok merak ediyordum. Çok teşekkürler.
 
@Alpaslan64 bir sonraki rehber Node Red'e değinmeyi düşünüyorum. MQTT ile kullanırken IoT cihazları kontrol etmek için olmazsa olmaz, Node-Red. :)

Hocam forumda motor sürücü vb parçalar hakkında rehber var mı?
Ardunio parçaları hakkında tanıtım rehberi yapmayı düşünüyorum ama.
Nedir, ne işe yarar gibi.
 

Geri
Yukarı