İçeriğe geç

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ı:

github.com

knolleary/pubsubclient

A client library for the Arduino Ethernet Shield that provides support for MQTT. – knolleary/pubsubclient
github.com github.com


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:

github.com

ibrahimcahit/ESP8266-MQTT

ESP8266 based IoT applications . Contribute to ibrahimcahit/ESP8266-MQTT development by creating an account on GitHub.
github.com github.com


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] = '';
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şimdir.

Başka bir rehberde görüşmek üzere.

Tarih:Uncategorized