ESP32 ve Pico ile MQTT Uygulaması

Merhaba,

Bu konuda ESP32, Raspberry Pi Pico W ve bilgisayar kullanarak bir MQTT ağ oluşturacağız. Bu konudaki amaç aslında ağ katmanın üzerindeki haberleşme protokolünün donanımdan bağımsız olduğunu göstermek ve bu sırada da farklı cihazlar arasında kablosuz haberleşmek. ESP32 ve Pico’ yu programlamak için Arduino kullanacağız. Bu sebeple ikisi için kullanacağımz yazılım neredeyse aynı olacak. Bilgisayar tarafında ise MQTT-Explorer kullanarak verileri gönüntüleyeceğiz ve cihazlara veri göndereceğiz. Böylece ESP32 ve Pico’ nun gönderdiği verileri bilgisayardan görüntüleyebileceğiz ve bilgisayardan ESP32 ve Pico’ yu kontrol edebileceğiz.

MQTT protokolünün ne olduğuna bağlantıdaki yazımızdan ulaşabilirsiniz. Daha detaylı anlatım için MQTT’ nin kendi sayfasında verilen içerikleri inceleybilirsiniz. Bu protokol aslında bir çok nesnenin ortak bir bağlantı noktasına bağlanıp, belilenen isimlerde yayın yapması ve bu isimlerdeki yayınların dinlenmesi üzerine kuruludur. Bağlanılan ortak bağlantı noktasının ismi “Broker“, yayın yapılırken kullanılan isme “topic” adı verilir. Belirlenen topic isimlerinde yayın yapılma işlemine “publish“, bu yayını dinleme işlemine ise “subscribe” denir. Aslında MQTT üzerinde veri gönderme ve alma işlemleri basit olarak şu şekilde gerçekleşiyor. Bir cihaz veri bir topic ismi ile veri göndermek istediği zaman, Broker bu isimli bir yayın noktası oluşturup gelen verileri oraya yönlendir. O yayın noktasını dinleyen cihazlar veriyi görüntüleyebilirler. Yani her cihaz veriyi Broker’ a gönderir. Broker üzerinden diğer cihazlara veri iletilir. Bu yapının nasıl çalıştığını kullanacağımız online Broker olan “Shiftr.io” üzerinde de görsel olarak görüntüleyeceğiz. shiftr.io Broker’ ını daha önce kullanmıştık. Ancak o zamandan beri servis güncellenmiş ve bağlantı için bazı ayarlar gerekli. Hızlı deneme için public bağlantı da mevcut. Yani isterseniz birazdan anlatacağım üyelik ve instance oluşturma işlemlerini atlayarak public bağlantı bilgilerini kullanarak da shiftr.io servisini deneyebilirsiniz. Public bağlantı için gerekli bilgiler şunlardır. Bu bağlantı public olduğundan herkesin erişimine açıktır. Yani herhangi bir kişi bu ağ a bağlanıp bağlantıdan da görebileceğiniz gibi tüm topicleri dinleyebilir ya da tüm topiclere veri gönderebilir. Bu sebeple deneme amacı dışında kullanmanızı tavsiye etmiyorum.

#define mqtt_server "public.cloud.shiftr.io"

#define cloud_username "public"
#define cloud_password "public"

Üstteki verilen bağlantıda açılan sayfada sağ üstteki “Sign Up” butonuna basarak bir üyelik oluşturabilirsiniz. Üyelik sırasında herhangi bir ödeme yapmadan üyelik oluşturabilirsiniz. Oluşturduğunuz üyelik ile giriş yaptığınızda ana sayfada “Deploy Instance” butonu çıkacaktır. Bu butona basarak yeni bir instance oluşturacağız. Açılan pencerede aşağıdaki gibi bir ekran göreceksiniz. Kırmızı ile işaretli kısmı seçerek herhangi bir ödeme yapmadan 100 bağlantı ve saniyede 5000 mesaja kadar ücretsiz bir şekilde kullanabiliyoruz. Sarı ile işaretli kısımda instance’ a bir isim verip bağlantı için benzersiz olacak bir isim belirleyeceğiz.

Instance oluşturulduktan sonra dashboard’ a giriş yapmalıyız. Hesaba giriş yaptığımızda ana ekranda oluşturduğumuz instance görünecektir. Instace ismine tıklayarak cloud arayüzüne erişebiliriz. Arayüze giriş yaptığımızda yeşil bir arka plan üzerinde instace dashboard’ ımız görüntülenecektir. Bu dashboard’ ın sağ alt kısmındaki ayarlar butonuna basarak ayarları açabiliriz.

Yukarıdaki resimde verilen ayarlar butonuna basarak aşağıdaki resimde verilen ayarlar penceresini açabilirsiniz. Bu ekranda farklı ayarlar mevcuttur. Sekmeleri gezerek bakabilirsiniz. Bizim ilgilendişiğimiz kısım yeşil ile işaretli “Tokens” sekmesi altında bulunmaktadır. Tokens sekmesine kırmızı ile işaretli “Create Token” butonuna basarak oluşturduğumuz instance’ a erişmek için anahtar oluşturacağız. Token’ i oluşturuken erişim yetkisi ayarlayabilirsiniz. Bizim için şu an çok önemli olmadığından “Full Access” ayarlayabilriz. Bağlantı anahtarı olarak kullanacağımız token, shiftr.io tarafından rasgele üretilmekte ve Secret olarak gözükmektedir. En alttaki resimde verilen mavi ile işaretli alanda “username:password” olarak kullanıcı adı ve oluşturulan şifre verilmektedir.

Broker olarak size önerdiğim web sitesini kullanmak zorunda değilsiniz. Kendi bilgisayarınıza ya da Raspberry Pi gibi cihazlara MQTT Broker kurmanız mümkündür. Ancak bu şekilde oluşturacağınız MQTT ağa, dış ağlardan erişebilmek için statik ağ, port yönlendirme ya da VPN servisleri gibi ek işlemlere ihtiyaç duyacaksınız. Bu servis online bir servis olduğundan rahatlıkla bağlanıp kullanabilirsiniz. Ücretli ve ücretsiz olarak private ağ oluşturmanıza izin veriliyor. Böylece sizin bağlantı bilgilerinizi bilmeyen kişiler ağınızdaki verileri görüntüleyemezler. Özetle uygulanmasının kolay ve güzel yapılmış ağ görüntüleme arayüzü sebebi ile bu konuda Shiftr.io kullanmayı tercih ettim. Başka Broker kullanmak isterseniz de çok fazla değişiklik yapmanız gerekmemektedir.

Şimdi kuracağımız senaryoyu belirleyelim. ESP32 ve Pico W’ ye bağlanan birer LED ve birer potansiyometre olsun. Bilgisayar üzerindeki bir uygulama ile de ağa bağlanıp sensörlerden gelen verileri okuyalım ve cihazlara bağlanan LED’ leri kontrol edelim. Bilgisayarda kullanacağımız uygulama MQTT Explorer isimli açık kaynaklı bir uygulama olup uygulamaya bağlantıdan ulaşabilirsiniz. Yapacağımız uygulama için gerekli bağlantı şeması aşağıdaki gibidir.

Proje senaryomuz basit olduğu için bağlantı şemamız da son derece basit. Proje yazılımı da benzer şekilde çok karmaşık olmayacaktır. Başta da belirttiğim gibi iki cihaz için de kullanıacak yazılım aynı olacaktır. Bu sebeple tek yazılım dosyası üzerinden anlatacağım. Sadece yazılımın başındaki cihaz ismi tanımlaması ilgili cihaza yüklenirken değiştirilmelidir. Böylece sorunsuz şekilde kullanabilirsiniz. Bu değişikliği aşağıdaki kısımda yapabilirsiniz.

#define ssid "WIFI_SSID"
#define password "WIFI_PASS"
#define mqtt_server "INSTANCE_NAME.cloud.shiftr.io"

#define device_name "pico-dev"
#define cloud_username "USERNAME"
#define cloud_password "PASSWORD"

Tanımlamaları yaptıktan sonra gerekli ayarlamaları yapmalıyız. Ayarlamaları setup fonksiyonu içerisinde gerçekleştirebiliriz. “setup” fonksiyonu içerisinde bir Wi-Fi ağına bağlanmalı ve sonrasında MQTT Broker ile bağlantı için gerekli işlemleri gerçekleştirmeliyiz.

void setup() {
  //  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  pinMode(POT_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
}

“setup_wifi” fonksiyonun içerisinde üst kısımda ayarlarını yaptığımız Wi-Fi ağına bağlantı gerçekleştirilip IP adresi gösteriliyor. “client” ise MQTT Broker ile bağlantıyı yapmak için gerekli bilgileri tutan sınıf. “setServer” fonsiyonu bağlantı adresini ve bağlantı portunu belirlediğimiz fonksiyondur. SSL bağlantı kullanmayacağımız 1883 portu üzerinden bağlantı yapacağız. “setCallback” fonksiyonu ise subscribe edilen topic’ lerden gelen verileri alacağımız callback fonksionunu belirlemede kullanacağız. Bu callback fonksiyonun içerisini de şu şekilde oluşturabiliriz.

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  if (strcmp(ledTopic, topic) == 0)
  {

    // Switch on the LED if an 1 was received as first character
    if ((char)payload[0] == '1') {
      digitalWrite(LED_PIN, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      // but actually the LED is on; this is because
      // it is active low on the ESP-01)
    } else {
      digitalWrite(LED_PIN, LOW);  // Turn the LED off by making the voltage HIGH
    }
  }

}

Yukarıda verilen callback fonksiyonu içerisinde ilk olarak gelen verinin gönderdiliği topic topic adı ve gelen veriyi yazdırdık. Daha sonrasında gönderilen topic adı eğer LED topic adı ile aynı ise gelen veriyi LED durumunu değiştirmek için kullandık. Konunun asıl amacı farklı cihazlar ile aynı yazılımı kullanarak haberleşme yapmak olduğu için bu kısımdaki işlemi basit tutmaya çalıştım. Bu kısımdan sonra MQTT server’ a bağlantıyı başlattığımız fonksiyonu tanımlayalım.

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(device_name, cloud_username, cloud_password)) {
      Serial.println("connected");
      // ... and resubscribe
      client.subscribe(ledTopic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Bu fonksiyon sadece bağlantıyı sağlamıyor aynı zamanda bağlantının kesilmesi durumunda belirli zaman aralıklarında tekrar bağlanmayı deniyor. O sebeple biraz uzun görünebilir ancak biraz dikkat edilerek rahatlıkla anlaşılabilir. Fonksiyon içerisinde öncelikle MQTT client bağlı mı diye kontrol edip eğer bağlı değilse 5 saniye aralıklar ile tekrar bağlanmayı deniyoruz. Bağlantı sağlanınca ise artık bağlantı denenmiyor. Son olarak da loop fonksiyonun içerisine bakalım. Bu fonksiyonda belirli zaman aralıklarında veri göndereceğiz ve MQTT bağlantı durumunu kontrol ederek eğer bağlantı kesilmişse tekrar MQTT Broker ile bağlantıyı gerçekleştireceğiz.

void loop() {
  adcVal = analogRead(POT_PIN);

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

  unsigned long now = millis();
  if (now - lastMsg > 10000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "{\"cnt\": %d, \"adcVal\": %d}", value, adcVal);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish(potTopic, msg);
  }
}

Yazılım kısmı bittikten sonra MQTT explorer uygulamasına bakalım. Bu uygulama başta da belirttiğimiz gibi açık kaynaklı bir uygulama ve oldukça kullanışlı bir uygulama. Bu uygulamayı shiftr.io Broker’ ına bağlayıp MQTT ağında gönderilen tüm verileri görüntülüyebiliriz. MQTT Explorer uygulamasında herhangi bir Broker’ a bağlanmak için aşağıdaki ayarları yapmalıyız. Eğer kendi Broker’ ımız bir kullanıcı adı ve şifre gerektirmiyorsa turuncu ve mavi ile işaretli kısımları boş bırakmalıyız. Ancak kullandığımız shiftr.io Broker’ ında yetkilendirme mevcut. Bu sebeple turuncu ve mavi işaretli kısımlara shfitr.io üzerinden aldığımız kullanıcı bilgilerini bu kısımlara girmeliyiz. Son olarak da save connect diyerek MQTT ağına bağlanabiliriz.

Bağlandıktan sonra Broker üzerinden geçen tüm verileri arayüzün sol kısmında görünecektir. Göndermek istediğiniz veriler için ekranın sağ kısmını kullanacağız. Buradaki “Publish” kısmına veri göndermek istediğiniz topic in adını yazmalısınız. Sağ alttaki kısma ise göndermek istediğiniz veriyi yazmalısınız. Yani Publish kısmına “/pico-dev/led1” yazıp alttaki kısma 1 yazıp “Publish” butonuna basarsanız Pico’ daki LED’ in yandığını görebilirsiniz.

Bu konuda anlatacaklarımız bu kadardı. Umarım yardımcı olabilmişimdir. Konunun tamamına bağlantıdan ulaşabilirsiniz.

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir