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:
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:
MQTT ve Mosquitto kısmını bitirdiğimize göre, işin Arduino ve ESP8266 kısmına geçebiliriz.
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:
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:
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:
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şimdir.
Başka bir rehberde görüşmek üzere.
Comments
Post a Comment