Tüm yazılar

ESP8266 ve Firebase ile Bilgisayarı Uzaktan Açma (Wake-on-LAN Rehberi)

ESP8266 ve Firebase ile Bilgisayarı Uzaktan Açma (Wake-on-LAN Rehberi)

Evden çıktınız ve masaüstü bilgisayarınızdaki bir dosyaya ihtiyacınız oldu. Ya da ofisteyken evdeki güçlü makinede uzun sürecek bir işi başlatmak istiyorsunuz. Uzaktan masaüstü uygulamaları bu iş için var, ama hepsinin ortak bir şartı var: bilgisayarın açık olması. Bilgisayar kapalıysa elinizdeki en gelişmiş uzaktan erişim aracı bile işe yaramaz.

Bu yazıda, bu sorunu çözmek için geliştirdiğim açık kaynak projeyi adım adım anlatıyorum: yaklaşık 3 dolarlık bir ESP8266 kartı, ücretsiz Firebase Realtime Database ve küçük bir Python ajanıyla, bilgisayarınızı dünyanın her yerinden açabilir, donanım durumunu izleyebilir, AnyDesk bağlantısı başlatabilir ve işiniz bitince kapatabilirsiniz. Üstelik modeminizde port yönlendirmesi yapmanıza ya da sabit IP almanıza gerek kalmadan.

Projenin tüm kodları MIT lisansıyla GitHub'da: github.com/n1xrain/iot-remote-pc-control

Bu yazıda neler var?

  1. Wake-on-LAN nedir, bilgisayarı nasıl “uyandırır”?
  2. Neden port yönlendirme yerine bulut kullandım?
  3. Sistem mimarisi: üç parça, tek bir JSON ağacı
  4. ESP8266 tarafı: kod nasıl çalışıyor?
  5. Python ajanı: telemetri, AnyDesk ve hız testi
  6. Kurulum adımları
  7. iPhone'dan tek dokunuşla kontrol
  8. Sık karşılaşılan sorunlar ve çözümleri
  9. Güvenlik: bu sistemi kurarken nelere dikkat etmeli?
  10. Maliyet, enerji tüketimi ve sık sorulan sorular

1) Wake-on-LAN nedir?

Wake-on-LAN (WOL), kapalı ya da uyku modundaki bir bilgisayarı ağ üzerinden gönderilen özel bir paketle açmayı sağlayan, 1990'lardan beri kullanılan bir standarttır. Bilgisayar kapatıldığında ağ kartı tamamen kapanmaz; düşük güçle beklemeye devam eder ve tek bir şeyi dinler: kendi MAC adresini taşıyan “sihirli paketi” (magic packet).

Sihirli paketin yapısı şaşırtıcı derecede basittir:

  • Önce 6 bayt boyunca FF değeri gelir (FF FF FF FF FF FF).
  • Ardından hedef bilgisayarın 6 baytlık MAC adresi 16 kez art arda yazılır.
  • Toplam 102 baytlık bu veri genellikle UDP ile 9 numaralı porta, ağın yayın (broadcast) adresine gönderilir.
Wake-on-LAN sihirli paketinin yapısı: 6 bayt FF ve 16 kez tekrarlanan MAC adresi
Sihirli paket: 6 × FF ve ardından 16 kez tekrarlanan MAC adresi, toplam 102 bayt.

Ağ kartı bu deseni gördüğü anda anakarta “güç ver” sinyali gönderir ve bilgisayar, sanki güç düğmesine basılmış gibi açılır.

Buradaki kritik nokta şu: sihirli paket bir yayın paketidir ve yalnızca aynı yerel ağ içinde dolaşır. Yani internetten doğrudan evdeki bilgisayarınıza WOL paketi gönderemezsiniz. Paketi, evdeki ağın içinden biri göndermelidir. Bu projede o “biri”, 7/24 açık duran ESP8266 kartıdır.

2) Neden port yönlendirme yerine bulut?

İnternette bu sorunun klasik çözümü, modemde UDP 9 portunu yerel ağın yayın adresine yönlendirmek ve dışarıdan bu porta paket göndermektir. Kâğıt üzerinde basit görünse de pratikte birçok sorun çıkarır:

KonuPort yönlendirmeBu projedeki yaklaşım
Dinamik IPEv IP'niz değiştikçe DDNS gerekirIP'nin önemi yok
CGNATÇoğu fiber/mobil hatta hiç çalışmazEtkilenmez
Modem desteğiBirçok modem yayın adresine yönlendirmeye izin vermezModemde ayar yok
GüvenlikDışarıya açık bir port bırakırTüm bağlantılar içeriden dışarıya
Ek özelliklerSadece açmaAçma, kapatma, izleme, uzaktan masaüstü

Bu projede hiçbir cihaz dışarıdan bağlantı kabul etmez. ESP8266 da, bilgisayardaki Python ajanı da, telefon da yalnızca buluta bağlanır. Firebase burada bir “ilan panosu” görevi görür: telefon panoya bir not bırakır, evdeki cihazlar düzenli aralıklarla panoya bakıp kendilerine ait bir not varsa uygular.

3) Sistem mimarisi

ESP8266, Firebase Realtime Database ve Python ajanından oluşan uzaktan bilgisayar yönetimi mimarisi
Üç bağımsız parça, Firebase üzerindeki tek bir JSON ağacı üzerinden haberleşir.

Sistem üç bağımsız parçadan oluşur ve bu parçalar birbirini doğrudan görmez:

  1. İstemci (telefon ya da web): Firebase'deki ilgili değişkeni değiştirir. Örneğin bilgisayarı açmak için wake_status değerini true yapar.
  2. ESP8266 (evdeki ağda): 1,5 saniyede bir wake_status değerini okur. Değer true olduğunda yerel ağa sihirli paketi yayınlar ve değeri tekrar false yapar.
  3. Python ajanı (bilgisayarda): Bilgisayar açılınca otomatik başlar, 3 saniyede bir veritabanını okur; kapatma, AnyDesk, Steam, hız testi ve telemetri komutlarını uygular, sonuçları yine Firebase'e yazar.

Bu tasarımın güzel tarafı, her parçanın tek bir işi olması. ESP8266 yalnızca uyandırır; bilgisayar açıldıktan sonraki her şeyle Python ajanı ilgilenir.

“Tek seferlik tetikleyici” deseni

Komutların hepsi aynı mantıkla çalışır: istemci bir komut anahtarını true yapar, komutu işleyen taraf işi bitirince anahtarı false'a çeker. Böylece aynı komut iki kez çalışmaz ve veritabanına bakarak bir komutun işlenip işlenmediğini anlamak mümkün olur. Veritabanının başlangıç hali şöyledir:

{
  "wake_status": false,
  "shutdown_status": false,
  "fetch_stats_cmd": false,
  "speedtest_cmd": false,
  "anydesk_open_cmd": false,
  "anydesk_kill_cmd": false,
  "anydesk_id": "Kapali",
  "pc_is_online": false,
  "speedtest_result": "",
  "pc_stats": { "01_CPU": "", "02_GPU": "", "03_RAM": "" }
}

4) ESP8266 tarafı

NodeMCU V3 LoLin ESP8266 geliştirme kartı
NodeMCU V3 (LoLin): ek devre ya da lehim gerektirmez, USB ile prize takmak yeterlidir.

Donanım olarak bir NodeMCU V3 (ESP8266, ESP-12E) kartı kullanıyorum. 2,4 GHz Wi-Fi'ye bağlanır, Micro-USB ile beslenir ve yaklaşık 70 mA akım çeker. Herhangi bir telefon şarj adaptörüne takıp unutabilirsiniz.

Kodun kalbi loop() fonksiyonudur:

void loop() {
  if (Firebase.ready()) {
    if (Firebase.getBool(fbdo, "/wake_status")) {
      bool currentStatus = fbdo.boolData();

      if (currentStatus == true && lastStatus == false) {
        WOL.sendMagicPacket(MAC_ADDRESS);
        lastStatus = true;
        Firebase.setBool(fbdo, "/wake_status", false);
      }
      else if (currentStatus == false && lastStatus == true) {
        lastStatus = false;
      }
    }
  }
  delay(1500);
}

Dikkat edilmesi gereken birkaç ayrıntı:

  • WiFi.mode(WIFI_STA): ESP8266 varsayılan olarak kendi şifresiz Wi-Fi ağını da yayınlayabilir. Bu satır kartı yalnızca istemci moduna alır; dışarıya ağ yaymaz, evdeki ağa sessizce bağlanır.
  • WOL.setRepeat(3, 100): UDP paketleri teslim garantisi vermez. Sihirli paket 100 ms arayla 3 kez gönderilir; biri kaybolsa bile diğerleri hedefe ulaşır.
  • calculateBroadcastAddress(): Yayın adresi, kartın IP adresi ve alt ağ maskesinden otomatik hesaplanır. 192.168.1.x ya da 192.168.0.x gibi ağ ayrıntılarını elle yazmanız gerekmez.
  • Kenar algılama (lastStatus): Paket yalnızca değer false'tan true'ya döndüğü anda gönderilir. Firebase'e yazma işlemi gecikse bile aynı komut iki kez işlenmez.

5) Python ajanı

Bilgisayar tarafında çalışan ajan tek bir Python dosyasından oluşur ve tek dış bağımlılığı psutil'dir. Firebase'e resmi SDK yerine doğrudan REST API üzerinden, Python'un standart urllib modülüyle bağlanır. Her 3 saniyede bir veritabanının tamamını okur, yapılacak değişiklikleri bir sözlükte toplar ve tek bir PATCH isteğiyle geri yazar.

if db_data.get("anydesk_open_cmd") == True:
    updates["anydesk_open_cmd"] = False
    os.system(f'start "" "{anydesk_path}"')
    time.sleep(2)
    ad_id = subprocess.check_output(f'"{anydesk_path}" --get-id', shell=True)
    updates["anydesk_id"] = ad_id.decode("utf-8").strip()

Ajanın yapabildikleri:

  • Telemetri: CPU kullanımı ve frekansı, RAM, C: ve E: disklerinin doluluk oranı, NVIDIA ekran kartının kullanım ve sıcaklık değeri (nvidia-smi ile) ve 1 saniyelik ölçümle anlık indirme/yükleme hızı.
  • AnyDesk: Uygulamayı başlatır, --get-id parametresiyle bağlantı numarasını okur ve Firebase'e yazar. Telefonda bu numarayı görüp doğrudan bağlanabilirsiniz.
  • Hız testi: Cloudflare'in hız testi uç noktalarına küçük bir istekle ping, 50 MB indirme ve 5 MB yükleme ölçümü yapar. Ayrı bir iş parçacığında (thread) çalıştığı için ajanın diğer komutlara yanıt vermesini engellemez.
  • Uygulama yönetimi: Steam'i başlatma ve gerektiğinde taskkill ile kapatma.
  • Kapatma: Durum alanlarını sıfırladıktan sonra bilgisayarı 5 saniye içinde kapatır.

Neden .pyw? Windows'ta .pyw uzantılı dosyalar konsol penceresi açmadan çalışır. Ajan arka planda görünmez çalıştığı için oyun oynarken ya da çalışırken karşınıza siyah bir pencere çıkmaz. Konsol olmadığında bazı kütüphaneler çıktı yazmaya çalışırken hata verebildiği için dosyanın başında standart çıktılar boş bir hedefe yönlendirilir.

6) Kurulum adımları

Adım 1: Firebase

  1. Firebase konsolunda yeni bir proje oluşturun ve Realtime Database'i etkinleştirin.
  2. Repodaki firebase/database-schema.json dosyasını veritabanına içe aktarın (Realtime Database → ⋮ → Import JSON).
  3. Projenin API anahtarını ve veritabanı adresini not edin.

Adım 2: Bilgisayarda Wake-on-LAN'ı açın

  • BIOS/UEFI: “Wake on LAN”, “Power On by PCI-E” ya da “Resume by LAN” seçeneğini etkinleştirin. Varsa ErP / EuP enerji tasarrufu ayarını kapatın; bu ayar kapalıyken ağ kartının gücünü tamamen keser.
  • Aygıt Yöneticisi: Ağ bağdaştırıcısı → Özellikler → Güç Yönetimi sekmesinde “Bu aygıtın bilgisayarı uyandırmasına izin ver” seçeneğini işaretleyin. Gelişmiş sekmesindeki “Wake on Magic Packet” özelliğini “Etkin” yapın.
  • Hızlı Başlatma: Denetim Masası → Güç Seçenekleri → “Güç düğmelerinin yapacaklarını seçin” bölümünden Hızlı başlatmayı kapatın. Bu özellik açıkken bilgisayar tam kapanmadığı için WOL çoğu zaman çalışmaz.
  • Bilgisayarın MAC adresini öğrenmek için komut isteminde ipconfig /all yazın ve kablolu ağ bağdaştırıcısının “Fiziksel Adres” değerini not edin.

Adım 3: ESP8266

  1. Arduino IDE'ye ESP8266 kart paketini ve FirebaseESP8266 (Mobizt) ile WakeOnLan kütüphanelerini kurun.
  2. wol_listener.ino dosyasının başındaki Wi-Fi adı, Wi-Fi şifresi, API anahtarı, veritabanı adresi ve MAC adresi alanlarını doldurun.
  3. Kodu karta yükleyin ve kartı evdeki bir USB adaptörüne takın.

Adım 4: Python ajanı

  1. Python 3 kurulu değilse kurun ve bağımlılığı yükleyin: pip install -r agent/requirements.txt
  2. kapatma_dinleyici.pyw dosyasındaki DB_URL alanına veritabanı adresinizi yazın.
  3. Dosyayı Windows başlangıç klasörüne kopyalayın: Win + R → shell:startup

AnyDesk ile bağlanmak istiyorsanız AnyDesk'te Katılımsız Erişim'i (Unattended Access) açıp güçlü bir şifre belirleyin. Bu sayede bağlanırken bilgisayar başında birinin onay vermesi gerekmez.

7) iPhone'dan tek dokunuşla kontrol

Ayrı bir uygulama yazmadan, iPhone'daki Kestirmeler (Shortcuts) uygulamasıyla bu sistemi rahatça kontrol edebilirsiniz. Firebase Realtime Database her anahtar için bir REST adresi sunduğu için, bilgisayarı açmak tek bir istekten ibarettir:

URL'nin İçeriğini Al
  URL    : https://PROJE-ADINIZ.firebaseio.com/wake_status.json
  Yöntem : PUT
  Gövde  : true

Aynı şekilde pc_stats.json adresine GET isteği atıp gelen değerleri bir bildirimde ya da ana ekran widget'ında gösterebilirsiniz. Örneğin “PC'yi aç”, “Durum”, “AnyDesk'i aç” ve “Kapat” adlarıyla dört kestirme oluşturup ana ekrana eklerseniz, bilgisayarınızı tek dokunuşla yönetebilirsiniz.

8) Sık karşılaşılan sorunlar

Bilgisayar açılmıyor

  • Kablolu bağlantı kullanın. Wake-on-LAN, bilgisayar tamamen kapalıyken neredeyse her zaman yalnızca Ethernet kartıyla çalışır. Wi-Fi kartıyla uyandırma (WoWLAN) çoğu masaüstü sistemde desteklenmez.
  • Hızlı Başlatma'nın kapalı olduğundan ve BIOS'taki ErP ayarının WOL'u engellemediğinden emin olun.
  • Bilgisayarı kapattıktan sonra ağ kartının ışığı tamamen sönüyorsa kart beklemede güç almıyordur; sorun büyük olasılıkla BIOS ayarlarındadır.
  • MAC adresini kablosuz değil, kablolu bağdaştırıcıdan aldığınızı kontrol edin.

ESP8266 ağa bağlanmıyor

  • ESP8266 yalnızca 2,4 GHz ağları destekler. Modeminiz iki bandı aynı adla yayınlıyorsa 2,4 GHz için ayrı bir ağ adı tanımlamak sorunu genellikle çözer.
  • Arduino IDE'nin seri monitörünü 115200 baud hızında açıp bağlantı aşamalarını izleyin.

Komutlar gecikmeli işleniyor

Bu normaldir: ESP8266 1,5 saniyede, Python ajanı 3 saniyede bir veritabanını okur. Bir komutun işlenmesi en fazla birkaç saniye sürer. Daha hızlı tepki istiyorsanız aralıkları kısaltabilirsiniz; ancak Firebase'in ücretsiz planındaki indirme kotasını da göz önünde bulundurun.

9) Güvenlik

Bu sistem, bilgisayarınızı açma, kapatma ve uzaktan masaüstü bağlantısı başlatma yetkisini buluta taşıyor. Bu yüzden kurulumda şu noktalar önemli:

  • Firebase'i test modunda bırakmayın. Test modundaki kurallar, veritabanı adresinizi bilen herkesin okuma ve yazma yapabilmesi demektir. Kalıcı kullanımda Firebase Authentication ekleyip kuralları yalnızca kimliği doğrulanmış kullanıcılara açın.
  • AnyDesk katılımsız erişim şifreniz güçlü olsun. Bu şifre, bilgisayarınıza onaysız tam erişimin tek kapısıdır.
  • Gizli bilgileri paylaşmayın. Wi-Fi şifresi, API anahtarı, veritabanı adresi ve MAC adresi kişisel bilgilerdir. Repodaki dosyalar bilerek yer tutucu değerlerle gelir; kendi değerlerinizi girdiğiniz dosyaları herkese açık bir yere yüklemeyin.
  • Yalnızca kendi cihazlarınızda kullanın. Bu araç, sahibi olduğunuz bilgisayarları yönetmek için tasarlandı.

10) Maliyet ve enerji tüketimi

Projenin toplam donanım maliyeti, NodeMCU kartının fiyatı olan yaklaşık 3 dolardır. Firebase'in ücretsiz Spark planı bu kullanım için fazlasıyla yeterlidir.

ESP8266'nın enerji tüketimi de ihmal edilebilir düzeydedir. 5 V'ta yaklaşık 70 mA, yani 0,35 W güç çeker. 7/24 açık kaldığında bu, yılda yaklaşık 3 kWh eder (0,35 W × 8.760 saat). Bu da bir masaüstü bilgisayarı uzaktan erişim için sürekli açık bırakmanın tükettiği enerjinin çok küçük bir kısmıdır.

Sık sorulan sorular

ESP8266 yerine ESP32 kullanabilir miyim?

Evet. Mantık birebir aynıdır; yalnızca kütüphane ve kart ayarlarını ESP32'ye göre değiştirmeniz gerekir. ESP32 daha güçlüdür ama bu iş için ESP8266 fazlasıyla yeterlidir ve daha ucuzdur.

Bilgisayar uyku modundaysa da çalışır mı?

Evet. Uyku (S3) ve hazırda bekletme (S4) durumlarında WOL genellikle tam kapalı duruma göre daha da sorunsuz çalışır.

Mac ya da Linux'ta çalışır mı?

Uyandırma kısmı işletim sisteminden bağımsızdır; ağ kartı ve BIOS desteklediği sürece çalışır. Python ajanı ise şu an Windows'a özel komutlar (tasklist, shutdown, AnyDesk yolu) kullanıyor. Bu komutları ilgili işletim sisteminin karşılıklarıyla değiştirerek uyarlamak mümkün.

Bunun için illa Firebase mi gerekiyor?

Hayır. Firebase burada yalnızca bir ileti panosu görevi görüyor. Aynı mimari MQTT sunucusu, Supabase ya da kendi yazacağınız küçük bir API ile de kurulabilir. Firebase'i ücretsiz planı, kolay REST API'si ve ESP8266 için hazır kütüphanesi olduğu için seçtim.

Sonraki adımlar

Projeyi geliştirmeye devam ediyorum. Yol haritasında üç başlık var:

  • Kestirmeler yerine Flutter ile geliştirilmiş, iOS ve Android'de çalışan özel bir kontrol paneli uygulaması,
  • Firebase Authentication ile kural tabanlı erişim kontrolü,
  • Tek panelden birden fazla bilgisayarı yönetme desteği.

Kodların tamamına, kurulum dosyalarına ve komut listesine GitHub reposundan ulaşabilirsiniz. Hata bildirimleri ve geliştirme önerileri için issue açabilir ya da iletişim sayfasından bana yazabilirsiniz.

#esp8266 #wake on lan #firebase #iot #python #nodemcu #uzaktan erişim
Tüm yazılar