Esp32 İle Asenkron Olarak Çalışan Web Server Projesi
Esp32 Kartının Kurulumu
Bilgisayarınızda halihazırda kurulu bir Arduino IDE’si olduğunu varsayıyorum. Ancak projede kullanacağımız ESP32, IDE’nin standart kurulumunda gelmiyor o yüzden bazı ek işlemler yapmamız gerekecek.
Arduino IDE’sini açıp Dosya>Tercihler menüsünden Ek Devre Kartları Yöneticisi URL’leri kısmına aşağıdaki adresi ekleyelim: https://dl.espressif.com/dl/package_esp32_index.json
Daha sonra Araçlar>Kart>Kart Yöneticisi kısmından Esp32 kartını bulup kuralım.
Projeye Giriş
Projeye başlamadan önce senkron, asenkron gibi kavramları websocket’in ne olduğundan bahsetmek istiyorum.
Senkron Nedir ?
Kelime anlamı eşzamanlı olan senkron kelimesi yazılımda birtakım işlemlerin sıra ile yapılmasıdır.Basit bir analoji yapmak gerekirse bir fatura ödeme merkezindesiniz ve faturanızı ödemek için kuyruğa girdiniz. Sizin önünüzde fatura ödemek isteyen kişilerin faturaları ödenmeden sizin faturanız ödenmez. İşte bu şekilde işlemleri sıralı bir şekilde yapılmasına senkron programlama denir.
Asenkron Nedir ?
Kelime anlamı “Aynı zamanda veya birlikte meydana gelmeyen” olan asenkron kelimesi yazılımda yürütülen işlemlerin uzun sürmesinden dolayı yürütülmesi gereken diğer işlemlerin beklemeden çalışmasına devam edebilmesini sağlar. Senkronu açıklarken yaptığım gibi basit bir analoji yapmam gerekirse mutfakta iki çeşit yemek pişiriyorsunuz ve birini yapmaya başladınız. Elinizdeki yemek kaynarken diğer yemeğe başlamak için elinizdeki yemeğin bitmesini beklemezsiniz. İşte bu duruma asenkron programlama denir.
Websocket Nedir ?
WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan bir bilgisayar iletişim protokolüdür. WebSocket protokolü, sunucuya ve sunucudan gerçek zamanlı veri aktarımını sağlayarak, tarayıcı ile web sunucusu arasında etkileşimi sağlamaktadır. Bu, sunucunun istemci istemeden tarayıcıya içerik gönderebileceği ve bağlantıyı açık tutarak istediği zaman mesaj alabilmesini veya gönderebilmesini sağlayan standart bir yöntem ile sağlanmaktadır.Bizim bu projemizde ise web sayfası yenilenmeden kart üzerindeki ledi açıp kapatabilmemizi sağlanıyor.
Neden Websocket ?
Yeni bir istek HTTP protokolündeki kuralların tekrar edilmesine ve fazla trafik kullanımına neden olur.Trafik kullanımı ve HTTP protokolüyle gerçek zamanlı uygulamaların yönetilmesi maliyetli ve zor olduğundan dolayı websocket kullanılır.
Proje içerisinde kullanacağımız kütüphaneler Esp32 kartımızın ağa bağlanmasını ve üzerinde bir web sayfasını asenkron çalıştırmasını sağlayacak.
Proje içerisinde kullanılan kütüphanelerin linkleri:
- AsyncTCP.h
- ESPAsyncWebServer.h
- Wifi.h kütüphanesi Arduino IDE’si içerisinde halihazırda mevcut.
Ssid ve password kısmına bulunduğunuz ortamdaki ağın adını ve parolasını giriniz. Esp32 üzerindeki led GPIO2 pinine bağlı olduğu için led isminde değişkeni bu pine atadık.
Progmem anahtar sözcüğü normalde Esp32’nin Sram’ine kaydetmesi gerekirken Flash hafızasına kaydetmesini sağlar. Esp32’nin Flash hafızası 4MB’dır.
NotFound fonksiyonu sayfa bulunamadığında 404 hata kodunu ve sayfa bulunamadı mesajını gönderecek.
AsyncWebServer sınıfından server adlı bir nesne oluşturduk ve parametre olarak 80 verdik. Girilen parametre portu temsil ediyor.
Bu kod bloğunda sırasıyla;
- Seri haberleşmeyi başlattık ve baudrate hızını 115200 olarak ayarladık.
- Wifi modunu STA olarak ayarladık. STA İstasyon modudur. Esp32’yi erişim noktası tarafından kurulan bir WiFi ağına bağlamak için kullanılır.
- Begin metodu ile parametresi girilen wifi ağına bağlanır.
- İf bloğu wifi ağına bağlanıp bağlanmadığını kontrol ediyor. Ağa bağlanmadıysa seri monitöre “Wifi agina Baglanmadi!” yazdırır. Eğer bağlandıysa esp32’nin sunmuş olduğu web sayfasının linkini seri monitöre yazdırır.
Led adlı değişkenin bulunduğu pine(GPIO2) çıkış verdik ve başlangıçtaki durumunu kapalı olarak belirledik.
Gelen isteğe karşılık web sayfasını istemciye gönderir.
Gelen “/ac” isteğine karşılık ledi açık konuma getirir ve istemciye “ac sinyali gonderildi.” mesajını iletir.
Gelen “/kapat” isteğine karşılık ledi kapalı konuma getirir ve istemciye “kapat sinyali gonderildi.” mesajını iletir.
Bu kod bloğunda sırasıyla:
- Eğer sayfa bulunamadıysa onNotFound metodu çalıştırılacak.
- begin metodu web serverı başlatır.