Raspberry Pi Zero W ve ESP8266 ile sıfırdan IoT ağı kurulumu - MQTT ve NodeRED

Geçmişte burada hem ESP8266 hem de IoT ve MQTT üzerine birçok konu açtım. Artık bunu hem bir adım daha ileri taşımak istedim, hem de piyasada yaygın olarak bulunan bir kartla, Raspberry Pi Zero W ile birleştirmek istedim.

Önceden MQTT'ye şu konu ile giriş yapmıştım:


20210327_172215.jpg


Esasında, IoT ağlarının sonlarında yani cihazların veri toplayacağı ya da aldıkları verilerle bir işi gerçekleştirecekleri noktalarda, ESP8266 veya ESP32 gibi ucuz, işlem gücü düşük ama az güç tüketen, sadece üstüne yazılan kodu yapabilen minik kartlar ya da bu işlemcilere dayanan sistemler kullanıyoruz.

Ancak tüm bu kartların ya da sistemlerin, veri akışlarının, yönetiminin ve güvenliğinin bir noktada toplanması gerekiyor. Burada da artık bir mikroişlemciye değil, bir işletim sistemi çalıştırabilecek gerçek bir işlemciye ihtiyaç duyuyoruz. İşte bu noktada, fiyatıyla uygun, boyutuyla küçük ama özellikleriyle ve özellikle CLI tabanlı Raspian'daki performansıyla, Raspberry Pi Zero W yardımımıza koşuyor.

Tüm bu minik IoT cihazları ve veri akışını Raspberry Pi'a bağlayarak, hem bir bilgisayar ya da bilmediğimiz 3. Parti bir sistem kullanmaktan kurtuluyoruz, hem de sistemi daha güvenli hale getirmiş oluyoruz.

Headless RasPi Zero W kurulumu

20210330_204500.jpg


İlk başta, Raspberry Pi Zero'yu CLI tabanlı Raspian ile hazır hale getirmemiz lazım. Bunun için en az 32 GB'lık, hızlı bir MicroSD karta da ihtiyacımız olacak. SD kartımızı da hazır ettikten sonra bilgisayarımıza takalım ve Raspian'ın hazırlanma kısmına geçelim.

Burada RasPi Imager kullanılabilir. Ancak ben hala SD kartı oluşturmak için eski yöntemleri kullanmayı öneriyorum.

İlk önce Raspberry'nin sitesine gidelim ve RaspianOS Lite'ı indirelim:


1.PNG


Bu arkada inerken BalenaEtcher ISO yazma aracını indirelim ve hazır edelim:


Aracı indirip kurduktan ve ISO dosyası da indikten sonra, BalenaEtcher'i kullanarak ISO dosyasını SD karta yazalım. Dikkat, kartta ne var ne yok yok olacak.

Yazma işlemi bittiktek sonra sistem, "Kart okunamıyor, formatlayın" hatası verebilir. Dikkate almayın, kartı çıkartıp yeninden takın. Çünkü işimiz bitmedi.

Bu bölüme "Headless" dediğimi fark etmişsinizdir. Zira Pi Zero'yu öyle bir ayarlayacağız ki, monitör ya da klavye/fare takmamıza gerek kalmayacak. Öyleki, Wi-Fi şifresini girmemize bile gerek yok. SD Kart'ı takıp, gücü verip, SSH ile bağlanıp kullanmaya başlayacağız.

Bunun için oluşturduğumuz SD Kart'taki Boot klasörüne iki tane dosya atmamız lazım.

RaspianOS'un yeni sürümleri ile beraber, SSH varsayılan olarak kapalı geliyor. Bunu açmak için, isminde sadece SSH yazacak, içi boş ve uzantısı olmayan bir dosyayı, SD Kart'ın Boot bölümüne atmamız gerek.

Yeni bir metin belgesi oluşturun, içine bir boşluk bırakın ve kaydedin. kaydederken .txt olarak kaydetmemeye dikkat edin. İsmi sadece SSH olmalı, uzantısı olmamalı.

Koymamız gereken bir dosya ise, Wi-Fi bilgilerinin olacağı dosya. Yukarıda da bahsettiğim gibi, Pi Zero'yu hiçbir klavye fare bağlamadan kuracağız. SSH ile bağlanabilmek için, Pi Zero'nun bir ağa bağlanabilir olması gerek.

Bunun için aşağıdaki text dosyasını indirin. (Kodu yapıştırmama Technopat sistemi izin vermedi) Aşağıdaki kısımları kendi bilgilerinizle değiştirin

  • ssid
  • psk
Daha sonra bu dosyayı, "wpa_supplicant.conf.txt" yerine "wpa_supplicant.conf" olarak kaydedin. Kaydederken dosyaya uzantı vermemeye dikkat edin, .txt gibi uzantılara sahip olmamalı. Tavsiye olarak Notepad++ kullanın.

Sonrasında bu dosyayı da Boot klasörüne atın. Artık tamam, Pi Zero'yu kullanmaya geçebiliriz! (Pi Zero üzerinde küçük bileşenler içeriyor, bu nedenle böyle bir kasa almak isteyebilirsiniz)

20210401_130017.jpg


PuTTY ile Pi Zero'ya bağlanma, NodeRED ve MQTT kurulumu

PuTTY, Windows için yapılmış, ücretsiz bir SSH Client'ı. Buradan indirip kurabilirsiniz:


Kurup açtıktan sonra karşınıza bir adres barı ve port barı çıkacak. adres barına raspberrypi yazıp bağlan tuşuna tıklayın.

2.PNG


Bağlandıktan sonra sizden parola ve kullanıcı adı isteyecek:
  • Kullanıcı adı: pi
  • Şifre: raspberry
Bu bilgileri de girip, Pi Zero'ya erişimimizi sağladığımıza göre, artık gerekli uygulamaları kurabiliriz.

3.PNG


MQTT kurulumu

Önceki yazımı okuduysanız, IoT ağlarında cihazlar arası iletişimde MQTT'yi tercih ettiğimi görmüşsünüzdür. Özellikle local ağlarda MQTT, kolay ve esnek bir kullanım avantajı sağlıyor. Burada MQTT'yi bilgisayar yerine Raspberry Pi'a taşıyoruz, bu sayede Raspberry Pi evdeki tüm cihazlar için hem broker hem de gateway görevi görecek.


Bu kodla MQTT'yi kurun:

[CODE highlight="4"]sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mosquitto mosquitto-clients[/CODE]

Bu kodu yazarken sadece mosquitto değil, mosquittoyla beraber mosquitto-clients'ı da yazmayı unutmayın.

Kurulum sonrası, bu kodla moqsuitto broker'ımızı çalıştırabiliriz:

[CODE highlight="1"]sudo systemctl enable mosquitto
[/CODE]

Ayrıca bu kodla mosquitto'nun durumunu görebiliriz:

[CODE highlight="1"]systemctl status mosquitto.service
[/CODE]

Son olarak bu kodla mosquittonun başlangıçta otomatik çalışmasını sağlayabilirsiniz:

[CODE highlight="1"]sudo systemctl disable mosquitto[/CODE]

Mosquitto'yu bitirdik. Sırada NodeRED var. :)

NodeRED kurulumu

NodeRED bizim IoT ağımızın bel kemiği oluşturuyor. Gelen trafikleri kontrol etmenin yanında, bir kanaldan gelen trafiği başka bir kanala göndermeye de yarıyor. Özellikle gelen verileri ayıklama, filtreleme ve gelen veri türüne göre ayrıştırma konusunda çok başarılı. Tarayıcı tabanlı bir GUI'ye sahip olması, sürükle bırak mantığına dayalı olması ise basit ve kolay bir kullanım deneyimi sunuyor.


Kurmak için bu kodu girelim: (Kodu bu siteden aldım ama Techopat yapıştırmama izin vermiyor, kopyalamak için bu linkten faydalanabilirsiniz: Running on Raspberry Pi : Node-RED)

10.PNG


Kurulum sonrası NodeRED otomatik olarak başlayacaktır. NodeRED'in Pi Zero güç alır almaz çalışmaya başlaması için şu kodu yazın:

[CODE highlight="1"]sudo systemctl enable nodered.service
[/CODE]

Tüm işlemcler sonrası, şu adrese giderek NodeRED'e uzaktan erişebilirsiniz:

http://raspberrypi:1880/

Karşınız böyle bir ekran çıkacak:

4.PNG


Sol taraftan MQTT in nodeunu seçin ve alana bırakın:

5.PNG


Node'a iki kere tıklayın ve ayarları aşağıdaki gibi doldurun:

6.PNG


Kalem singesine tıklayın ve çıkan kısımları da bu şekilde doldurun:

7.PNG


Kaydettiğinizde bu şekilde olmalı. Soldan debug nodeu da ekleyebilirsiniz:

8.PNG


Her şeyi tamamladığınızda, sol üstten Deploy tuşuna basın. Artık IoT ağımız kullanıma hazır.

ESP8266 kurulumu

ESP8266 tarafında basit, iki röle kontrol eden bir düzenek kurdum.

photo_2021-04-17_22-39-41.jpg


Paylaştığım kodda, Pi Zero'nun IP adresini ve Wi-Fi bilgilerinizi kendinize göre güncelleyin ve yükleyin:

Kod:
// Open-Source ESP8266 code created by Ibrahim Cahit Ozdemir
//
// https://github.com/ibrahimcahit

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

int relay_1_pin = D6;
int relay_2_pin = D7;

// Update with your Wi-Fi
const char* ssid = "<ssid>";
const char* password = "<passwd>";

// 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 == "general"){

    relay = String((char*)payload);

    if(relay == "relay_1_on")  {
      Serial.println("Opening Relay...");
      digitalWrite(relay_1_pin, HIGH);
    }

    if(relay == "relay_2_on")  {
      Serial.println("Opening Relay...");
      digitalWrite(relay_2_pin, HIGH);
    }

    if(relay == "relay_1_off") {
      Serial.println("Closing Relay...");
      digitalWrite(relay_1_pin, LOW);
    }

    if(relay == "relay_2_off") {
      Serial.println("Closing Relay...");
      digitalWrite(relay_2_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("general");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
  client.publish("general", "NodeMCU Connected!");
}

void setup() {
  pinMode(relay_1_pin, OUTPUT);
  pinMode(relay_2_pin, OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

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

Ağ kontrolü

Raspberry Pi'ı PuTTY'de açın ve şu kodları yazın:

  • Röle 1 için
    • Açma: mosquitto_pub -t general -m 'relay_1_on'
    • Kapama: mosquitto_pub -t general -m 'relay_1_off'
  • Röle 2 için
    • Açma: mosquitto_pub -t general -m 'relay_2_on'
    • Kapama: mosquitto_pub -t general -m 'relay_2_off'
Bu kodların sonunda, NodeRED'de debug kısmında şu çıktıları görüyorsanız, sistem açlışıyor demektir:

9.PNG


Bu rehberimiz de burada sonlanıyor. Ben, çok ilkel bir örnek ile noktaladım ancak NodeRED ile yapabileceklerinizin sınırı yok. Özellikle evinizde kullanacağınız aygıtlar için, Pi Zero çok çok kullanışlı hale geliyor.

Okuduğunu için teşekkürler, başka bir rehberde görüşmek üzere. :)

Pi Zero'ya sahip olduğunu bildiğim için @SypeR 'ı etiketliyorum. :)

photo_2021-03-27_22-31-08.jpg
 
Son düzenleme:
Harika bir rehber. Bende geçen sene biraz NodeRed ile ilgilenmiştim ama fazla bilgim olmadığı için pek bir şey yapamamıştım. Sağ olsun İbrahim hocam rehberleri hazırlıyor. Bizde buradan faydalanıyoruz. Emeğinize sağlık.
 
@356463 ve @Alpaslan64 teşekkürler. Vaktim olsa daha da fazla rehber yazacağım ancak çok kısıtlı vaktim var. Bu rehberin duyurusunu iki hafta önce Profil Mesajı olarak yapmıştım. Ancak yetiştirmek bugüne nasip oldu.

Yine müsait oldukça buralara rehberler atmaya çalışacağım. :)
 
@356463 ve @Alpaslan64 teşekkürler. Vaktim olsa daha da fazla rehber yazacağım ancak çok kısıtlı vaktim var. Bu rehberin duyurusunu iki hafta önce Profil Mesajı olarak yapmıştım. Ancak yetiştirmek bugüne nasip oldu.

Yine müsait oldukça buralara rehberler atmaya çalışacağım. :)
Diğer rehberleri sabırsızlıkla bekliyor olacağım. Allah kolaylık versin, iyi çalışmalar, hayırlı geceler.
 
Son olarak bu kodla mosquittonun başlangıçta otomatik çalışmasını sağlayabilirsiniz:
Hocam yanlış bilmiyorsam systemctl disable ilgili servisi başlangıçtan kaldırmaya yarıyordu. Başlangıca eklemek için systemctl enable komutunu kullanıyor olmamız gerekiyor diye hatırlıyorum.

Pi Zero'ya sahip olduğunu bildiğim için @SypeR 'ı etiketliyorum. :)
Ayrıca etiket için teşekkür ederim. Ben Pi Zero'yu RFID bitirme projem için kullansam da MQTT ölçeklendirmeye yönelik maliyet düşürme odaklı bir modül olarak gözümde canlandı şuan. MQTT ile RFID entegrasyonu başarılabilir mi bir araştırayım. Mayıs ayı sonu gelmeden eğer bitirme tezime ekleyebilirsem, burada da bir MQTT rehberi benden gelir belki, belli mi olur? :)
 
Ayrıca etiket için teşekkür ederim. Ben Pi Zero'yu RFID bitirme projem için kullansam da MQTT ölçeklendirmeye yönelik maliyet düşürme odaklı bir modül olarak gözümde canlandı şuan. MQTT ile RFID entegrasyonu başarılabilir mi bir araştırayım. Mayıs ayı sonu gelmeden eğer bitirme tezime ekleyebilirsem, burada da bir MQTT rehberi benden gelir belki, belli mi olur? :)

MQTT çok çok ilginç bir protokol. Basit, gerçekten çok çok basit. Bunun yanında sertifikasyon düzeyine kadar koruma bile sağlıyor. SSL kurup (native desteği var) tüm ağı maksimum düzeyde güvenlikle yönetebiliyorsunuz. :)
 

Yeni konular

Geri
Yukarı