Karantina günlerini değerlendirmek için evdeki Raspberry Pi ile bir şeyler yapmaya karar verdim.
Raspberry Pi'den veri alıp bunu PC'deki programda göstermek için çok basit bir örnek:
Raspberry Pi gibi IOT cihazlarla haberleşmek için en yaygın kullanılan protokol MQTT'dir. Daha önce bir çok konu içerisinde ismi geçti. Hatta burada @Fesih ARSLAN, TMS'nin MQTT bileşeni ile yapılmış bir örnek paylaştı. Bu bileşen ücretli olduğu için ben ücretsiz çözüm yolu göstermeye çalışacağım.
MQTT:
MQTT protokolü; TCP/IP bağlantısı ile yayıncı(publisher)-abone(subscriber) yapısında çalışır. Fakat burada hem yayıncı hem de abone istemci(client) durumundadır. MQTT ile gönderilen mesajları yönetmek için bir sunucuya ihtiyaç vardır. Buna da broker denilir. Broker mesajların dağıtımından/adreslenmesinden sorumludur. Aşağıdaki şekilde anlaşılması daha kolay olur sanırım:

Benim örneğimde raspberry publisher, Delphi'de yazacağım program subscriber olacak. Broker'ı da programla aynı PC'ye kuracağım.
Broker yukarıda da bahsettiğim gibi MQTT'nin sunucusu. Bu işi yapan bir çok ücretsiz uygulama bulabilirsiniz. Ben çok yaygın olan mosquitto'yu kullandım. Şu adresten indirebilirsiniz:
https://mosquitto.org/download/
Genelde MQTT kullanımı, IOT'ye bağlı olan sensör(ler)den alınan veriyi yayınlamak(publish) şeklindedir. Ben örneğin basit olması için sensörden veri almak yerine raspberry'nin CPU sıcaklığını mesaj olarak gönderdim.
Raspberry'de kolaylık olsun diye Python kullandım
İşin Python kısmında detaya girmeyip kodları paylaşıyorum:
Yukarıdaki Python kodları; her saniye, cihazın seri numarasını ve CPU sıcaklığını JSON formatında MQTT mesajı olarak belirlediğimiz IP adresine (broker'a) gönderiyor.
Gelelim işin Delphi kısmına
Delphi'de MQTT kullanmak için Github'da bir çok seçenek mevcut. Ben şurayı kullanıyorum:
https://github.com/jamiei/Delphi-TMQTT2
Bunu bilgisayarımıza indirip TMQTT klasörünü Delphi'de Library Path'e eklemeliyiz. Ayrıca bu kütüphane, benim yıllardır kullandığım Synapse adlı bir socket kütüphanesine ihtiyaç duyuyor. Synapse'yi kendi web sayfasından indirebilirsiniz. Ama ben güncel olması bakımından şuradan indirmenizi tavsiye ederim:
https://sourceforge.net/p/synalist/code/...ree/trunk/
İndirdikten sonra klasörü Library Path'e eklemeyi unutmayın.
Gelelim kodlara:
Anlaşılabilir olması için kodları mümkün olduğunca kısa tutmaya çalıştım ve hata kontrolü vs. ile uğraşmadım.
Kısaca açıklamak gerekirse; formumuz gösterilirken TMQTT sınıfından bir örnek oluşturuyoruz ve broker'ın bulundupu IP ve portu parametre olarak veriyoruz. Bir mesaj geldiğinde bileşenin OnPublish olayı tetiklenir. Bu durumda bizim MessageReceived prosedürümüz çalışacak. Hatırlarsanız gönderilen mesaj JSON formatında idi. Bunu parse edip ekranda ilgili yerlere yazıyoruz.
Ekran görüntüsünü aşağıda görebilirsiniz.
Raspberry Pi'den veri alıp bunu PC'deki programda göstermek için çok basit bir örnek:
Raspberry Pi gibi IOT cihazlarla haberleşmek için en yaygın kullanılan protokol MQTT'dir. Daha önce bir çok konu içerisinde ismi geçti. Hatta burada @Fesih ARSLAN, TMS'nin MQTT bileşeni ile yapılmış bir örnek paylaştı. Bu bileşen ücretli olduğu için ben ücretsiz çözüm yolu göstermeye çalışacağım.
MQTT:
MQTT protokolü; TCP/IP bağlantısı ile yayıncı(publisher)-abone(subscriber) yapısında çalışır. Fakat burada hem yayıncı hem de abone istemci(client) durumundadır. MQTT ile gönderilen mesajları yönetmek için bir sunucuya ihtiyaç vardır. Buna da broker denilir. Broker mesajların dağıtımından/adreslenmesinden sorumludur. Aşağıdaki şekilde anlaşılması daha kolay olur sanırım:

Benim örneğimde raspberry publisher, Delphi'de yazacağım program subscriber olacak. Broker'ı da programla aynı PC'ye kuracağım.
Broker yukarıda da bahsettiğim gibi MQTT'nin sunucusu. Bu işi yapan bir çok ücretsiz uygulama bulabilirsiniz. Ben çok yaygın olan mosquitto'yu kullandım. Şu adresten indirebilirsiniz:
https://mosquitto.org/download/
Genelde MQTT kullanımı, IOT'ye bağlı olan sensör(ler)den alınan veriyi yayınlamak(publish) şeklindedir. Ben örneğin basit olması için sensörden veri almak yerine raspberry'nin CPU sıcaklığını mesaj olarak gönderdim.
Raspberry'de kolaylık olsun diye Python kullandım
İşin Python kısmında detaya girmeyip kodları paylaşıyorum:import paho.mqtt.publish as publish
from time import sleep
from json import dumps
from utils import getSerial, getTemperature
while True:
message = {
"serial": getSerial(),
"temp": getTemperature()
}
publish.single("temperature", dumps(message), hostname="192.168.1.17")
sleep(1)
Yukarıdaki Python kodları; her saniye, cihazın seri numarasını ve CPU sıcaklığını JSON formatında MQTT mesajı olarak belirlediğimiz IP adresine (broker'a) gönderiyor.
Gelelim işin Delphi kısmına

Delphi'de MQTT kullanmak için Github'da bir çok seçenek mevcut. Ben şurayı kullanıyorum:
https://github.com/jamiei/Delphi-TMQTT2
Bunu bilgisayarımıza indirip TMQTT klasörünü Delphi'de Library Path'e eklemeliyiz. Ayrıca bu kütüphane, benim yıllardır kullandığım Synapse adlı bir socket kütüphanesine ihtiyaç duyuyor. Synapse'yi kendi web sayfasından indirebilirsiniz. Ama ben güncel olması bakımından şuradan indirmenizi tavsiye ederim:
https://sourceforge.net/p/synalist/code/...ree/trunk/
İndirdikten sonra klasörü Library Path'e eklemeyi unutmayın.
Gelelim kodlara:
procedure TForm1.FormShow(Sender: TObject);
begin
MQTT := TMQTT.Create('127.0.0.1', 1883);
MQTT.OnPublish := MessageReceived;
if MQTT.Connect then
MQTT.Subscribe('temperature', 0);
end;
procedure TForm1.MessageReceived(Sender: TObject; topic, payload: Ansistring);
var
jsonObj: TJSONObject;
begin
try
jsonObj := TJSONObject.ParseJSONValue(payload) as TJSONObject;
lblSerial.Caption := jsonObj.GetValue<string>('serial');
lblTemp.Caption := jsonObj.GetValue<string>('temp');
finally
jsonObj.Free;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MQTT.Disconnect;
MQTT.Free;
end;
Anlaşılabilir olması için kodları mümkün olduğunca kısa tutmaya çalıştım ve hata kontrolü vs. ile uğraşmadım.
Kısaca açıklamak gerekirse; formumuz gösterilirken TMQTT sınıfından bir örnek oluşturuyoruz ve broker'ın bulundupu IP ve portu parametre olarak veriyoruz. Bir mesaj geldiğinde bileşenin OnPublish olayı tetiklenir. Bu durumda bizim MessageReceived prosedürümüz çalışacak. Hatırlarsanız gönderilen mesaj JSON formatında idi. Bunu parse edip ekranda ilgili yerlere yazıyoruz.
Ekran görüntüsünü aşağıda görebilirsiniz.
There's no place like 127.0.0.1



