Python ile Kendi İnternet Hız Monitörünüzü Yapma: Grafikli, Renkli ve Gerçek Zamanlı

Kutay Utku
17 dk okuma

İnternet hızınız yavaş mı? Arka planda hangi program ne kadar bant genişliği kullanıyor? İndirme ve yükleme hızlarınız gerçekten internet sağlayıcınızın vaat ettiği kadar mı? Bu soruları soran milyonlarca kullanıcı, cevap bulmak için genellikle speedtest.net gibi sitelere başvurur. Ancak bu siteler sadece anlık bir ölçüm yapar ve size sürekli izleme imkânı sunmaz.

Peki ya kendi ağ izleme aracınızı yazsanız? Hem ücretsiz, hem tamamen sizin kontrolünüzde, hem de istediğiniz özellikleri ekleyebileceğiniz bir araç. İşte bu yazıda tam olarak bunu yapacağız.

Python programlama dilini kullanarak sıfırdan bir download ve upload hız monitörü geliştireceğiz. Bu araç size anlık hızları, grafiksel gösterimi, istatistikleri ve çok daha fazlasını renkli bir terminal arayüzünde sunacak.

Hazır mısınız? Hadi başlayalım.

İÇİNDEKİLER

  1. Python ile Ağ İzleme Neden Mantıklı?
  2. Gerekli Kütüphaneler ve Kurulum
  3. Temel Kavramlar: Download, Upload, Bant Genişliği
  4. psutil Kütüphanesi ile Ağ Verisi Okuma
  5. curses ile Terminal Arayüzü Oluşturma
  6. Grafiksel Gösterim: Blok Grafik Nasıl Çizilir?
  7. Renk Sistemi ve Uyarı Mekanizması
  8. Kodun Tamamı ve Açıklaması
  9. Programı Çalıştırma ve Kullanım
  10. Geliştirme Fikirleri
  11. Sık Karşılaşılan Sorunlar ve Çözümleri
  12. Sonuç
  1. PYTHON İLE AĞ İZLEME NEDEN MANTIKLI?

Piyasada onlarca ağ izleme programı bulunuyor. Wireshark, NetBalancer, GlassWire gibi araçlar oldukça güçlüdür. Peki neden Python ile kendiniz yazasınız ki?

  • Tamamen ücretsiz: Ticari ağ izleme araçları aylık abonelik ücretleri alabilir. Python ve kullandığımız kütüphaneler tamamen ücretsizdir.
  • Tam kontrol: Neyin izlendiğini, nasıl gösterildiğini ve hangi verilerin saklandığını tamamen siz belirlersiniz.
  • Öğrenme fırsatı: Ağ programlaması, terminal arayüzü tasarımı ve veri görselleştirme gibi konuları pratik olarak öğrenirsiniz.
  • Özelleştirilebilir: Kendi ihtiyaçlarınıza göre kolayca değiştirebilirsiniz. Alarm eklemek, log dosyasına kaydetmek veya e-posta göndermek gibi özellikler ekleyebilirsiniz.
  • Hafif: Büyük uygulamalar yüklemeden sadece birkaç Python dosyasıyla çalışır.
  • Gizlilik: Verileriniz üçüncü taraf sunuculara gönderilmez, tamamen yerel çalışır.
  1. GEREKLİ KÜTÜPHANELER VE KURULUM

Bu projeyi çalıştırmak için iki ana kütüphaneye ihtiyacınız var:

  1. psutil — Sistem ve ağ bilgilerini okuyan güçlü bir kütüphane
  2. windows-curses — Terminal ekranını sabit ve renkli tutan kütüphane (sadece Windows için)

Adım 1: Python Kurulumu

Öncelikle bilgisayarınızda Python kurulu olmalıdır. Eğer kurulu değilse python.org adresinden indirin. Kurulum sırasında dikkat etmeniz gereken tek şey şudur: “Add Python to PATH” seçeneğini mutlaka işaretleyin. Bu seçenek işaretli olmazsa Python komutlarını terminalden çalıştıramazsınız.

Kurulumu doğrulamak için:

CMD veya PowerShell açın ve şunu yazın:
python –version

Python 3.x.x gibi bir çıktı görüyorsanız kurulum başarılıdır.

Adım 2: Kütüphaneleri Kurma

CMD veya PowerShell’i yönetici olarak açın ve şu komutu çalıştırın:

python -m pip install psutil windows-curses

Bu komut iki kütüphaneyi de aynı anda kurar. Kurulum birkaç saniye sürer.

Kurulumu doğrulamak için:
python -m pip list

Listede psutil ve windows-curses görünüyorsa her şey hazır demektir.

  1. TEMEL KAVRAMLAR: DOWNLOAD, UPLOAD, BANT GENİŞLİĞİ

Koda geçmeden önce bazı temel kavramları açıklayalım:

Download (İndirme) Nedir?
Download, internetten bilgisayarınıza veri gelişini ifade eder. Bir web sayfası açtığınızda, YouTube’dan video izlediğinizde veya bir dosya indirdiğinizde download kullanırsınız. İnternet paketlerinin çoğu download hızına odaklanır çünkü kullanıcılar genellikle daha çok veri alır.

Upload (Yükleme) Nedir?
Upload, bilgisayarınızdan internete veri gönderiminizi ifade eder. E-posta gönderdiğinizde, bulut depolama servisine dosya yüklediğinizde veya video konferans yaptığınızda upload kullanırsınız. Asimetrik internet bağlantılarında upload hızı genellikle download hızından düşüktür.

Bant Genişliği Nedir?
Bant genişliği, internet bağlantınızın maksimum veri transfer kapasitesidir. Örneğin 100 Mb/s bant genişliği, teorik olarak saniyede 100 Megabit veri taşıyabileceğiniz anlamına gelir. Ancak gerçek hızlar her zaman bu değerin altında kalır.

Bit ve Byte Farkı:
İnternet hız testlerinde genellikle Mb/s (Megabit/saniye) kullanılır.
Dosya boyutlarında ise MB (Megabyte) kullanılır.
1 Byte = 8 Bit olduğundan, 100 Mb/s bağlantı teorik olarak yaklaşık 12.5 MB/s indirme hızı sağlar.

Bizim aracımız Byte cinsinden ölçüm yapar ve Mb olarak gösterir.

  1. PSUTIL KÜTÜPHANESİ İLE AĞ VERİSİ OKUMA

psutil (Process and System Utilities), Python’un en güçlü sistem izleme kütüphanelerinden biridir. CPU, RAM, disk, ağ ve süreç bilgilerini okuyabilir.

Ağ verilerini okumak için net_io_counters() fonksiyonunu kullanıyoruz:

import psutil

veri = psutil.net_io_counters()
print(f"Alınan byte: {veri.bytes_recv}")
print(f"Gönderilen byte: {veri.bytes_sent}")
print(f"Alınan paket: {veri.packets_recv}")
print(f"Gönderilen paket: {veri.packets_sent}")

Bu fonksiyon sistem açıldığından beri toplam transfer edilen veri miktarını döndürür. Anlık hızı hesaplamak için iki ölçüm arasındaki farkı kullanırız:

import psutil, time

olcum1 = psutil.net_io_counters()
time.sleep(1)
olcum2 = psutil.net_io_counters()

download_hizi = olcum2.bytes_recv - olcum1.bytes_recv
upload_hizi = olcum2.bytes_sent - olcum1.bytes_sent

print(f"Download: {download_hizi} byte/s")
print(f"Upload: {upload_hizi} byte/s")

Bu çok basit ama etkili bir yöntemdir. 1 saniye ara ile iki ölçüm alır, farkı hesaplarız. Bu bize saniyedeki byte miktarını verir.

psutil’in Diğer Yetenekleri:

  • psutil.cpu_percent() — CPU kullanım yüzdesi
  • psutil.virtual_memory() — RAM kullanımı
  • psutil.disk_io_counters() — Disk okuma/yazma hızı
  • psutil.net_connections() — Aktif ağ bağlantıları
  • psutil.net_if_stats() — Ağ arayüzü istatistikleri
  1. CURSES İLE TERMİNAL ARAYÜZİ OLUŞTURMA

Normalde Python’da print() kullanarak ekrana yazdırırsınız. Ancak bu yöntemde her yeni veri bir öncekinin altına eklenir ve ekran sürekli aşağı kayar. Gerçek zamanlı izleme için ekranın sabit kalması gerekir.

İşte burada curses kütüphanesi devreye girer.

curses Nedir?
curses, terminal ekranını tam kontrol etmenizi sağlayan bir kütüphanedir. Ekranın herhangi bir satır ve sütununa yazabilir, renk ekleyebilir ve ekranı temizleyip yeniden çizebilirsiniz. Bu sayede ekran hiç kaymaz ve içerik yerli yerinde güncellenir.

Windows’ta curses:
Python’un standart curses kütüphanesi Windows’ta çalışmaz. Bu nedenle windows-curses paketini kuruyoruz. Bu paket standart curses ile birebir uyumludur, sadece kurulum aşamasında farklılık gösterir.

Temel curses Kullanımı:

import curses

def main(stdscr):
curses.curs_set(0) # İmleci gizle
stdscr.clear() # Ekranı temizle
stdscr.addstr(0, 0, "Merhaba!") # Satır 0, sütun 0'a yaz
stdscr.refresh() # Ekranı güncelle
stdscr.getch() # Tuş bekle
curses.wrapper(main)

Renk Sistemi:

import curses

def main(stdscr):
curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, -1) # Yeşil metin
curses.init_pair(2, curses.COLOR_RED, -1) # Kırmızı metin
curses.init_pair(3, curses.COLOR_YELLOW, -1) # Sarı metin

stdscr.addstr(0, 0, "Bu yeşil!", curses.color_pair(1))
stdscr.addstr(1, 0, "Bu kırmızı!", curses.color_pair(2))
stdscr.addstr(2, 0, "Bu sarı!", curses.color_pair(3))
stdscr.refresh()
stdscr.getch()

curses.wrapper(main)
curses.wrapper() fonksiyonu, programı güvenli bir ortamda çalıştırır. Program hata verse bile terminali düzgün şekilde eski haline getirir.
  1. GRAFİKSEL GÖSTERİM: BLOK GRAFİK NASIL ÇİZİLİR?

Aracımızın en görsel özelliği, son 50 saniyelik download ve upload verilerini blok grafik olarak göstermesidir. Peki bu grafik nasıl çiziliyor?

Temel Mantık:
Her saniye bir ölçüm alıyoruz ve bu değerleri bir deque (çift uçlu kuyruk) içinde saklıyoruz. deque’nin maxlen özelliği sayesinde en eski değer otomatik olarak siliniyor ve hep son 50 saniye gösteriliyor.

from collections import deque
dl_gecmis = deque(maxlen=50)

Grafik Çizimi:
Her değer için maksimum değere göre bir oran hesaplıyoruz. Bu oranı grafik yüksekliğiyle çarparak kaç blok çizileceğini buluyoruz:

def grafik_ciz(stdscr, baslangic_row, baslangic_col, veriler, genislik, yukseklik, renk):
max_val = max(veriler) if max(veriler) > 0 else 1
for x, val in enumerate(list(veriler)[-genislik:]):
bar = int((val / max_val) * yukseklik)
for y in range(yukseklik):
ekran_row = baslangic_row + (yukseklik - 1 - y)
ekran_col = baslangic_col + x
if y < bar:
stdscr.addstr(ekran_row, ekran_col, "▌", curses.color_pair(renk))
else:
stdscr.addstr(ekran_row, ekran_col, " ")

Y Ekseni Etiketleri:
Grafiğin soluna maksimum değere göre oransal etiketler ekliyoruz. Bu sayede grafiği okumak çok daha kolay hale geliyor.

X Ekseni:
Grafiğin altına “└───Simdi▶” şeklinde bir eksen çiziyoruz. Bu, grafiğin soldan sağa doğru okunduğunu ve en sağdaki değerin şu anki değer olduğunu gösteriyor.

  1. RENK SİSTEMİ VE UYARI MEKANİZMASI

Aracımız akıllı bir renk sistemi kullanıyor. Bu sistem, hızın ne kadar yüksek olduğuna göre otomatik olarak renk değiştiriyor:

Download/Upload Hızı için Renk Sistemi:

  • Yeşil (Normal): 0 – 1 Mb/s arası — Düşük trafik, her şey normal
  • Sarı (Dikkat): 1 – 10 Mb/s arası — Yüksek trafik, dikkat edin
  • Kırmızı (Kritik): 10 Mb/s üzeri — Çok yüksek trafik

Bu renk kodlaması sayesinde tek bakışta sistemin durumunu anlayabilirsiniz. Kırmızı gördüğünüzde bir şeylerin yoğun veri indirdiğini veya yüklediğini anlarsınız.

Renk kodu Python’da şöyle uygulanıyor:

dl_renk = 2 if dl < 110241024 else (3 if dl < 1010241024 else 4)

Bu tek satır kod şunu yapıyor:

  • 1 MB/s’den küçükse renk 2 (Yeşil)
  • 1-10 MB/s arasıysa renk 3 (Sarı)
  • 10 MB/s’den büyükse renk 4 (Kırmızı)
  1. KODUN TAMAMI VE AÇIKLAMASI

İşte aracın tam kaynak kodu. Bu kodu download_upload.py adıyla kaydedin:

import psutil
import time
import curses
from datetime import datetime
from collections import deque

GECMIS = 50

def bytes_to_human(n):
    if n < 1024:
        return f"{n:.0f} b"
    elif n < 1024 * 1024:
        return f"{n/1024:.1f} Kb"
    elif n < 1024 * 1024 * 1024:
        return f"{n/1024/1024:.2f} Mb"
    else:
        return f"{n/1024/1024/1024:.2f} Gb"

def hiz_cubugu(val, max_val, genislik=20):
    if max_val == 0:
        dolu = 0
    else:
        dolu = int((val / max_val) * genislik)
    dolu = min(dolu, genislik)
    return "█" * dolu + "░" * (genislik - dolu)

def grafik_ciz(stdscr, baslangic_row, baslangic_col, veriler, genislik, yukseklik, renk):
    if not veriler:
        return
    max_val = max(veriler) if max(veriler) > 0 else 1
    satirlar = list(veriler)[-genislik:]
    for x, val in enumerate(satirlar):
        bar = int((val / max_val) * yukseklik)
        for y in range(yukseklik):
            ekran_row = baslangic_row + (yukseklik - 1 - y)
            ekran_col = baslangic_col + x
            try:
                if y < bar:
                    stdscr.addstr(ekran_row, ekran_col, "▌", curses.color_pair(renk) | curses.A_BOLD)
                else:
                    stdscr.addstr(ekran_row, ekran_col, " ", curses.color_pair(5))
            except:
                pass

def draw(stdscr):
    curses.start_color()
    curses.use_default_colors()
    curses.init_pair(1, curses.COLOR_CYAN,    -1)
    curses.init_pair(2, curses.COLOR_GREEN,   -1)
    curses.init_pair(3, curses.COLOR_YELLOW,  -1)
    curses.init_pair(4, curses.COLOR_RED,     -1)
    curses.init_pair(5, curses.COLOR_WHITE,   -1)
    curses.init_pair(6, curses.COLOR_MAGENTA, -1)
    curses.init_pair(7, curses.COLOR_BLUE,    -1)
    curses.curs_set(0)
    stdscr.nodelay(True)

    dl_gecmis = deque(maxlen=GECMIS)
    ul_gecmis = deque(maxlen=GECMIS)

    toplam_dl = 0
    toplam_ul = 0
    max_dl    = 1
    max_ul    = 1
    baslangic = time.time()
    net1      = psutil.net_io_counters()

    while True:
        time.sleep(1)
        net2 = psutil.net_io_counters()
        dl   = net2.bytes_recv - net1.bytes_recv
        ul   = net2.bytes_sent - net1.bytes_sent
        net1 = net2

        dl_gecmis.append(dl)
        ul_gecmis.append(ul)
        toplam_dl += dl
        toplam_ul += ul
        if dl > max_dl: max_dl = dl
        if ul > max_ul: max_ul = ul

        gecen   = int(time.time() - baslangic)
        ort_dl  = toplam_dl // max(1, gecen)
        ort_ul  = toplam_ul // max(1, gecen)

        stdscr.erase()
        h, w = stdscr.getmaxyx()
        row  = 0

        def yaz(metin, renk=5, bold=False, col=0):
            nonlocal row
            if row >= h - 1:
                return
            attr = curses.color_pair(renk)
            if bold:
                attr |= curses.A_BOLD
            try:
                stdscr.addstr(row, col, str(metin)[:w-1-col], attr)
            except:
                pass
            row += 1

        def bos():
            yaz("")

        def baslik_cizgi():
            yaz("╔" + "═" * (min(w-2, 76)) + "╗", 1, bold=True)

        def alt_cizgi():
            yaz("╚" + "═" * (min(w-2, 76)) + "╝", 1, bold=True)

        def orta_cizgi():
            yaz("╠" + "═" * (min(w-2, 76)) + "╣", 1, bold=True)

        def ince_cizgi():
            yaz("  " + "─" * (min(w-4, 74)), 1)

        # ══ BASLIK ══
        baslik_cizgi()
        baslik = f"  ▶  DOWNLOAD / UPLOAD IZLEYICI  ◀     {datetime.now().strftime('%d.%m.%Y   %H:%M:%S')}"
        yaz(baslik, 1, bold=True)
        orta_cizgi()

        # ══ ANLIK HIZ ══
        dl_renk = 2 if dl < 1*1024*1024 else (3 if dl < 10*1024*1024 else 4)
        ul_renk = 2 if ul < 1*1024*1024 else (3 if ul < 10*1024*1024 else 4)

        yaz(f"  📥 DOWNLOAD   {bytes_to_human(dl):>10}/s    [{hiz_cubugu(dl, max_dl, 25)}]    Maks: {bytes_to_human(max_dl)}/s", dl_renk, bold=True)
        yaz(f"  📤 UPLOAD     {bytes_to_human(ul):>10}/s    [{hiz_cubugu(ul, max_ul, 25)}]    Maks: {bytes_to_human(max_ul)}/s", ul_renk, bold=True)
        ince_cizgi()

        # ══ ISTATISTIK ══
        dakika = gecen // 60
        saniye = gecen % 60
        yaz(f"  ⏱  Calisma Suresi    :  {dakika} dakika  {saniye} saniye", 5)
        yaz(f"  ⬇  Toplam Alinan     :  {bytes_to_human(toplam_dl)}", 2)
        yaz(f"  ⬆  Toplam Gonderilen :  {bytes_to_human(toplam_ul)}", 3)
        yaz(f"  ∅  Ort. Download     :  {bytes_to_human(ort_dl)}/s", 2)
        yaz(f"  ∅  Ort. Upload       :  {bytes_to_human(ort_ul)}/s", 3)
        orta_cizgi()

        # ══ GRAFiKLER ══
        grafik_y   = 8
        grafik_x   = min(GECMIS, w - 30)
        sol_bosluk = 4

        # Download grafigi baslik
        yaz(f"  📊 DOWNLOAD GRAFiGi  (Son {grafik_x} saniye)", 2, bold=True)

        # Y ekseni etiketleri + grafik
        dl_grafik_row = row
        for i in range(grafik_y):
            try:
                oran  = 1 - (i / (grafik_y - 1))
                etiket = bytes_to_human(max_dl * oran)
                stdscr.addstr(row + i, 0, f"{etiket:>10}", curses.color_pair(2))
            except:
                pass

        grafik_ciz(stdscr, dl_grafik_row, sol_bosluk + 10, dl_gecmis, grafik_x, grafik_y, 2)
        row += grafik_y

        # X ekseni
        try:
            stdscr.addstr(row, sol_bosluk + 10, "└" + "─" * grafik_x, curses.color_pair(1))
            stdscr.addstr(row, sol_bosluk + 10 + grafik_x - 6, "Simdi▶", curses.color_pair(1))
        except:
            pass
        row += 1
        bos()

        # Upload grafigi baslik
        yaz(f"  📊 UPLOAD GRAFiGi  (Son {grafik_x} saniye)", 3, bold=True)

        ul_grafik_row = row
        for i in range(grafik_y):
            try:
                oran  = 1 - (i / (grafik_y - 1))
                etiket = bytes_to_human(max_ul * oran)
                stdscr.addstr(row + i, 0, f"{etiket:>10}", curses.color_pair(3))
            except:
                pass

        grafik_ciz(stdscr, ul_grafik_row, sol_bosluk + 10, ul_gecmis, grafik_x, grafik_y, 3)
        row += grafik_y

        try:
            stdscr.addstr(row, sol_bosluk + 10, "└" + "─" * grafik_x, curses.color_pair(1))
            stdscr.addstr(row, sol_bosluk + 10 + grafik_x - 6, "Simdi▶", curses.color_pair(1))
        except:
            pass
        row += 1

        # Alt bilgi
        bos()
        alt_cizgi()
        yaz("  [Q] Cikis   |   Her saniye guncellenir   |   Yesil=Normal  Sari=Yuksek  Kirmizi=Cok Yuksek", 3)
        alt_cizgi()

        stdscr.refresh()

        key = stdscr.getch()
        if key in [ord('q'), ord('Q')]:
            break

def main():
    try:
        curses.wrapper(draw)
    except KeyboardInterrupt:
        pass
    print("\nKapatildi.")

if __name__ == "__main__":
    main()
  1. KODUN BÖLÜM BÖLÜM AÇIKLAMASI
  • bytes_to_human() fonksiyonu
    • Ham byte değerini okunabilir hale çevirir
    • 1024’ten küçükse “b” (bit), 1024’ten büyükse “Kb”, 1 milyondan büyükse “Mb” olarak gösterir
    • Örnek: 1.572.864 → 1.50 Mb
  • hiz_cubugu() fonksiyonu
    • Anlık hızı maksimum hıza oranlar ve dolum çubuğu oluşturur
    • Dolup kısım için █ karakteri, boş kısım için ░ karakteri kullanır
    • Örnek çıktı: [████████░░░░░░░░░░░░░░░░░]
  • grafik_ciz() fonksiyonu
    • Son 50 saniyelik veriyi dikey blok grafik olarak çizer
    • Her değer için maksimuma göre oran hesaplar
    • ▌ karakteri ile ince ve şık bloklar oluşturur
    • Ekran sınırlarını aşmamak için try/except kullanır
  • draw() fonksiyonu
    • Ana döngüyü içerir, her saniye çalışır
    • Renk çiftlerini tanımlar (yeşil, sarı, kırmızı, cyan, magenta)
    • Net io counters ile anlık hız ölçer
    • deque yapısıyla son 50 saniyeyi hafızada tutar
    • Toplam, ortalama ve maksimum değerleri hesaplar
    • Ekranı erase() ile temizler ve yeniden çizer
  • main() fonksiyonu
    • curses.wrapper() ile programı güvenli başlatır
    • Ctrl+C veya Q tuşuyla düzgün kapatmayı sağlar
  1. PROGRAMI ÇALIŞTIRMA VE KULLANIM

Kurulum ve çalıştırma adımları:

  1. Python’u kurun — python.org’dan indirin, PATH seçeneğini işaretleyin
  2. Kütüphaneleri kurun:
    • python -m pip install psutil windows-curses
  3. Kodu kaydedin — download_upload.py olarak kaydedin
  4. Çalıştırın:
    • CMD veya PowerShell’i yönetici olarak açın
    • python download_upload.py yazın
  5. Çıkmak için Q tuşuna basın

Ekranda Neler Görürsünüz?

Üst bölüm — Başlık ve tarih/saat bilgisi
İkinci bölüm — Anlık download ve upload hızları + dolum çubuğu
Üçüncü bölüm — İstatistikler (toplam, ortalama, maksimum, süre)
Dördüncü bölüm — Download blok grafiği (yeşil, Y ve X ekseniyle)
Beşinci bölüm — Upload blok grafiği (sarı, Y ve X ekseniyle)
Alt bölüm — Kısayol bilgisi ve renk kılavuzu

  1. SIK KARŞILAŞILAN SORUNLAR VE ÇÖZÜMLERİ
  1. “ModuleNotFoundError: No module named ‘_curses'” hatası
    • windows-curses paketi kurulmamış veya Python sürümüyle uyumsuz
    • Çözüm: python -m pip install windows-curses komutunu çalıştırın
    • Hâlâ olmazsa Python’u güncelleyin
  2. “pip tanınmıyor” hatası
    • Python PATH’e eklenmemiş
    • Çözüm: pip yerine python -m pip kullanın
    • Ya da Python’u kaldırıp “Add to PATH” seçeneğiyle yeniden kurun
  3. Ekran bozuk görünüyor veya karakterler yanlış
    • Terminal penceresi çok küçük olabilir
    • Çözüm: Terminal penceresini büyütün veya tam ekran yapın
    • Yazı tipini “Consolas” veya “Courier New” olarak değiştirin
  4. Hız her zaman 0 gösteriyor
    • Ağ arayüzü yanlış seçilmiş olabilir
    • Çözüm: psutil.net_io_counters(pernic=True) ile tüm arayüzleri listeleyin
  5. Program çok yavaş veya donuyor
    • Nadiren gerçekleşir ama psutil bazen yavaş yanıt verebilir
    • Çözüm: time.sleep(1) değerini 2’ye çıkarın
  1. GELİŞTİRME FİKİRLERİ

Bu aracı daha da güçlü hale getirmek için şu özellikler eklenebilir:

  • Hız alarmı: Belirli bir hızın üzerine çıkıldığında sesli veya görsel uyarı
  • Log dosyası: Tüm hız verilerini CSV dosyasına kaydetme, Excel’de analiz
  • Ağ arayüzü seçimi: Ethernet veya Wi-Fi’yi ayrı ayrı izleme
  • Program bazlı izleme: Hangi programın ne kadar bant genişliği kullandığını gösterme
  • Günlük rapor: Gün sonunda toplam kullanımı e-posta ile gönderme
  • Web arayüzü: Flask ile tarayıcıdan erişilebilen grafiksel arayüz
  • Disk hızı: İnternet hızına ek olarak disk okuma/yazma hızını da gösterme
  • Ping izleme: Ağ gecikmesini (ping) de ölçüp gösterme
  • Bildirim: Windows bildirim sistemi ile uyarı gönderme
  • Çoklu grafik: Download ve upload’ı aynı grafikte farklı renklerle gösterme

SONUÇ

Python ile kendi download/upload izleme aracınızı yazmak hem eğlenceli hem de öğreticidir. Bu proje sayesinde:

  • psutil ile sistem kaynaklarını nasıl okuyacağınızı öğrendiniz
  • curses ile terminal tabanlı arayüz nasıl oluşturulur gördünüz
  • Gerçek zamanlı veri görselleştirmenin temellerini kavradınız
  • Renk sistemi ve uyarı mekanizması nasıl tasarlanır öğrendiniz
  • deque ile kayan pencere (sliding window) mantığını anladınız

Bu araç, sadece bir başlangıç noktasıdır. Kendi ihtiyaçlarınıza göre özelleştirebilir, yeni özellikler ekleyebilir ve tamamen kendinize özgü bir sistem izleme aracı haline getirebilirsiniz.

Kodu indirin, çalıştırın ve internetinizin gerçek yüzünü görün. Belki de arka planda fark etmediğiniz bir şeyler olduğunu keşfedeceksiniz.

İyi kodlamalar!

💬 Yorum Bırak