En son güncellendiği tarih: 30 May 2020
Merhaba arkadaşlar. Bu yazıda Mobil'de IoT ve Endüstri 4.0 haberleşme altyapısı nasıl çalışıyor, bu konuyu ele alacağız. Malum, IoT ve Endüstri 4.0 konuları son yıllarda çokça konuşulmaya başladı. Bunun temel sebepleri; internet altyapısının gittikçe yaygınlaşması ve dolayısıyla tüm cihazlar arasındaki data alışverişinin çok daha kolay hale gelmesi. Data alışverişi bu kadar kolaylaşınca akıllı ev sistemleri, akıllı şehirler, akıllı fabrikalar (endüstri 4.0 dediğimiz olay) gibi yeni sektörler doğmaya başladı. Bu sektörler için sunulan projelerde, farklı amaçlar için geliştirilmiş donanımların birbiriyle sürekli ya da belli aralıklarla iletişim kurması gerekiyor. Ve bu işin bir ayağında da mobil uygulamalar bulunuyor. (Özellikle akıllı ev sistemlerinde mobil uygulamalar oldukça popüler durumda.)
Odaklanacağımız ana konu, yukarıda bahsettiğimiz projelerde kullanılan haberleşme altyapısı: MQTT. MQTT için kısaca, makineden makineye gerçekleşen bir haberleşme protokolüdür diyebiliriz. Buradaki makineden kastımız cep telefonu, laptop, hareket/sıcaklık/nem vb sensörler, endüstriyel makinalar, özel tasarlarlanmış elektronik kartlar gibi çeşitli donanımlar olabilir. Tüm bu donanımların birbiriyle iletişim kurma ihtiyacını karşılamak için günümüzde en doğru tercih MQTT protokolüdür.
MQTT ve HTTP protokolünün özelliklerini kıyaslayacak olursak aşağıdaki gibi bir tablo sunabiliriz: (En sevdiğim 3 özelliği mimarisi, mesaj boyutu ve veri dağıtım yapısı...:)
Ufuk Bağc
Aşağıdaki grafikte de temel ve basit bir MQTT mimarisi görebiliriz:
Yukarıdaki mimaride neler olup bittiğini inceleyelim. Haberleşme trafiğini kontrol eden yapıya “MQTT-Broker” deniyor. Herhangi bir makina bu Broker'a bağlanıp istediği herhangi bir datayı yayınlayabiliyor (publish). Yayınlama işlemini yaparken, yayınladığı datanın neyle ilgili olduğunu gösteren bir “topic” bilgisi belirtmesi gerekiyor. (“Topic”ler başka makinalar tarafından dinlenebilmektedir (subscribe)). Belirli bir “topic”ten data yayınlama işlemi yapıldığında, o “topic”i dinleyen (subscribe olan) başka bir makina varsa, yayınlanan data mili saniyeler içerisinde dinleyen makinaya ulaşıyor.
Yukarıdaki senaryoyu bir de gerçekçi isimlerle tekrar edelim. “kitchen/sensors/temperature” adında bir topic belirlediğimizi varsayalım. Cep telefonumuz “kitchen/sensors/temperature” topic'ine subscribe olmuş olsun. Mutfağımızdaki sıcaklık sensörü de ölçtüğü sıcaklık değerlerini “kitchen/sensors/temperature” topic’inde yayınlasın (publish). Her yayınlama işleminden sonra, yayınlanan data mili saniyeler içerisinde cep telefonuna ulaşacaktır. (Ölçümlere göre, MQTT’nin iletişim hızı HTTP’den 93 kat daha hızlıdır.)
Şimdi işi biraz daha heyecanlı hale getirip gerçek bir broker’a bağlanalım. Bunun için MQTT Explorer programını kullanabiliriz. (Thomas Nordquist adında bir arkadaş yazmış bu programı ve ücretisiz yayınlamış. Bence çok da güzel yapmış. Kendisine teşekkürler :) (Brokerın yapısını ve fonksiyonlarını görmek için şimdilik bilgisayar üzerinden bağlanıyoruz. Yazının devamında mobil uygulama üzerinden de bağlanacağız.) MQTT Explorer programını açtığımızda bir connection ekranı karşımıza geliyor. Aşağıdaki bilgiler ile herkese açık olan bir test broker’ına bağlanabiliriz:
Bağlantı kurduktan sonra aşağıdaki gibi bir ekran çıkıyor karşımıza. Ekranın solunda gördüklerimizin herbiri birer topic. Bu topiclerin bazılarının yanıp sönme efekti yaptığını göreceksiniz. Her yanıp sönme, o topicten yeni bir data yayınlandığı anlamına gelmekte. Aşağıdaki ekranda topiklerden birini seçmiş durumdayım. Seçtiğim Topic’in tam adını ekranın sağ üstündeki Topic alanında görebiliyorum. Bu topic’ten hangi datanın yayınlandığını Topic alanının altındaki Value alanında görebiliyorum. Value alanının altındaki Publish alanından da istediğim herhangi bir topic için data yayınlayabiliyorum. Burada data yayınlarken kullanılan QoS ve Retain parametreleri var. Yazıyı uzatmamak için bu parametreleri es geçiyorum şimdilik. (Anlamlarını araştırmanızı öneririm.)
ı
Artık bu broker'a bir iOS (swift) uygulaması ile bağlanalım ve broker üzerinde çeşitli işlemler yapalım. Bağlantı için Moscapsule pod'unu kullanabiliriz. (Github linkini de paylaşalım: https://github.com/flightonary/Moscapsule )
"Mqtt" adında bir class açıp, Mqtt ile ilgili tüm işlemlerimizi bu class'ın içerisinde yapabiliriz. Aşağıdaki "StartMQTT" fonksiyonunda MQTT broker'ına bağlanma işlemini yaptık. Burada dikkatinizi çekeceğim 3 nokta olacak:
1-) MQTTConfig class'ındaki "keepAlive" parametresi... Bu parametre MQTT bağlantısının, hiç bir işlem yapılmadığı takdirde kaç saniye açık kalacağını belirtiyor. Mesela "keepAlive"ı 60 saniye olarak belirlerseniz, 60 saniye boyunca herhangi bir data yayınlama ya da data okuma işlemi yapılmadığı takdirde bağlantı otomatik olarak kapanacaktır. (Bu parametreye dikkat etmezsek, "yaa bu bağlantı neden kopuyor?" diye bir süre uğraşabiliriz. :)
2-) Dikkatimi çeken diğer bir konu da aşağıda 19. satırda kullandığım "MQTT.new Connection" komutu... Bu komut bağlantı sağlıyor fakat, senkron çalışmıyor. Bağlantının gerçekten kurulabilmesi için kısa bir süre beklememiz gerekiyor. (Mesela 22. ve 26. satırda yazdırdığım log'lara baktığımda ilkini "false", ikincisini "true" olarak görüyorum.)
3-) "DoBroadCast" metodu ile oluşturacağımız yapı... (Bu metodun nasıl çalıştığını yazının devamında daha detaylı görebilirsiniz.)
Yukarıdaki fonksiyonu kullanarak MQTT-Broker bağlantısını sağladıktan sonra, artık erişmek istediğimiz topic'lere subscribe (abone) olabiliriz. Bunun için de aşağıdaki gibi bir "subscribeToTopic" metodu yazabiliriz. Herhangi bir topic için data yayını yapmak istersek de aşağıdaki "publishMessageToTopic" fonksiyonunu kullanabiliriz.
Şimdi şöyle bir senaryo düşünelim: 2 farklı topic'e subscribe (abone) olacağız ve bu farklı topic'ler üzerinden yayınlanan dataları uygulamamızda farklı yerlerde kullanacağız. Bu senaryoyu yönetebilmek için aşağıdaki gibi bir yapı kullanabiliriz:
Yukarıdaki yapının ana görevi, subscribe (abone) olduğumuz topic'lere gelen dataları, projenin neresinde kullanmak istiyorsak oraya aktarmak. Bunu yapabilmek için de NotificationCenter yapısını kullandık. Önce topic'in hangi topic olduğuna bakıyoruz, sonrasında da o topic için kullanmak istediğimiz Notification'ı tetikliyoruz. Böylelikle MQTT üzerinden yayınlanan dataları projemizin her yerinde kullanabilir hale geliyoruz.
Basit bir demo yapalım. 2 tane topic'imiz olsun: "mobiler/kitchen/temperature" ve "mobiler/bedroom/temperature". Bu topic'ler üzerinden data yayınlayabileceğimiz, yapılan yayınları okuyabileceğimiz bir ekran yazalım. (Tasarıma pek vakit ayıramadığım için, oldukça basit bir arayüz çıkacak karşımıza :).
Yukarıdaki topic'lere istersek MQTT Explorer üzerinden data yayınlayabiliriz. İstersek de mobil uygulamamız üzerinden data yayınlayabiliriz. (Yayına başlamadan önce, yayınlayacağımız dataları uygulamada okuyabilmek için, uygulama ekranının üst tarafındaki "Subscribe to Topics" butonuna basmamız gerekiyor). MQTT Explorer üzerinden bir deneme yapalım: Publish bölümündeki Topic alanına "mobiler/bedroom/temperature" yazıyorum, Publish butonunun altındaki alana yayınlamak istediğim datayı yazıyorum ve Publish butonuna tıklıyorum. Aynı işlemi "mobiler/kitchen/temperature" topic'i için de yapıyorum.
Yukarıdaki publish işlemlerini yaptıktan sonra, bu dataların uygulamamızın arayüzüne geldiğini aşağıdaki gibi görebilirsiniz. (Publish işlemlerini, mobil uygulamamızın arayüzünden de yapabilirsiniz. Ekrandaki datalar güncellenecektir.)
Yukarıdaki çalışma MQTT'deki temel fonksiyonlara odaklanan bir demo oldu. Çok daha kapsamlı projeler geliştirilebilir tabiki. Umarım başlangıç için faydalı bir yazı olmuştur. Mobil uygulamanın kodlarını github'tan indirebilirsiniz. (Github linki sayfanın en altındadır.) Ayrıca demo'nun videosuna aşağıdan erişebilirsiniz. Bu konuda proje yapacak arkadaşlara "QoS" ve "Retain" kavramlarını mutlaka araştırmalarını öneririm. Sormak istedikleriniz olursa email@example.com adresinden de bana ulaşabilirsiniz. Hepinize kolaylıklar :)