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, 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:
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
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.
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:
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:
Ve soldaki satıra da şu kodu yazın:
Bu kodu yazdıktan sonra, sağdaki satırda "Hello, World" mesajının belirdiğini göreceksiniz.
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:
Arduino ve ESP kartları
İş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:
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:
Koddaki belli başlı yerleri sırayla tanıyalım:
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:
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:
Ya da en iyisi, Raspberry Pi gibi bir cihaza Node Red kurup, hem röleleri kontrol edebilir hem de sıcaklığı gözlemleyebilirsiniz:
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.
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, 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'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
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.
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.
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 datest
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.
Arduino ve ESP kartları
İş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 - knolleary/pubsubclient: A client library for the Arduino Ethernet Shield that provides support for MQTT.
A client library for the Arduino Ethernet Shield that provides support for MQTT. - knolleary/pubsubclient
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:
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 - ibrahimcahit/ESP8266-MQTT: ESP8266 based IoT applications
ESP8266 based IoT applications . Contribute to ibrahimcahit/ESP8266-MQTT development by creating an account on GitHub.
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] = '\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.
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:
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:
Ya da en iyisi, Raspberry Pi gibi bir cihaza Node Red kurup, hem röleleri kontrol edebilir hem de sıcaklığı gözlemleyebilirsiniz:
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.