C# İle Bluetooth Üzerinden Cihaz Kontrolü Nasıl Yapılır?

C# İle Bluetooth Üzerinden Cihaz Kontrolü Nasıl Yapılır?
C# İle Bluetooth Üzerinden Cihaz Kontrolü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bluetooth projelerine başlamadan önce donanım ve yazılım ortamınızın hazır olması gerekir. Windows üzerinde Bluetooth iletişimi için standart Windows Bluetooth API'leri veya üçüncü taraf kütüphaneler kullanılabilir. Modern projelerde 32feet.NET kütüphanesi, klasik Bluetooth (RFCOMM) işlemleri için en kararlı çözümdür.

  • Windows 10 veya 11 yüklü bir bilgisayar.
  • Bluetooth 4.0 veya üzeri destekli bir donanım (Bluetooth adaptörü).
  • Visual Studio 2022 veya daha güncel bir sürüm.
  • NuGet Paket Yöneticisi üzerinden "32feet.NET" paketinin kurulması.

Projenizi oluşturduktan sonra, NuGet konsolunu açarak gerekli paketi şu komutla yükleyin: Install-Package 32feet.NET. Bu paket, Bluetooth cihazlarını tarama ve bağlantı kurma süreçlerini basitleştiren düşük seviyeli bir katman sağlar.

Bluetooth Cihazlarını Tarama ve Listeleme

Bir cihazı kontrol etmeden önce, çevredeki Bluetooth cihazlarını taramalı ve hedef cihazın adresini (MAC adresi) bulmalısınız. Aşağıdaki kod bloğu, çevredeki görünür Bluetooth cihazlarını listeler.


using InTheHand.Net.Sockets;

public void CihazlariTara()
{
    BluetoothClient client = new BluetoothClient();
    var cihazlar = client.DiscoverDevices();

    foreach (var cihaz in cihazlar)
    {
        Console.WriteLine($"Cihaz Adı: {cihaz.DeviceName}, Adres: {cihaz.DeviceAddress}");
    }
}

Bu kod, BluetoothClient sınıfını kullanarak yakın çevredeki cihazları arar. DiscoverDevices() metodu, cihazların MAC adreslerini ve isimlerini içeren bir koleksiyon döndürür. Bu aşamada cihazın "eşleşmiş" olması gerekebilir; eşleşmemiş cihazları bulmak için Windows Ayarlar menüsünden önceden eşleştirme yapmanız önerilir.

Bluetooth Üzerinden Bağlantı Kurma

Cihazın adresini öğrendikten sonra, RFCOMM (Radio Frequency Communication) protokolü üzerinden bir bağlantı kanalı açmanız gerekir. RFCOMM, Bluetooth üzerinden seri port emülasyonu sağlayan bir protokoldür.


using InTheHand.Net;
using InTheHand.Net.Sockets;

public void BaglantiKur(string macAdresi)
{
    BluetoothAddress adres = BluetoothAddress.Parse(macAdresi);
    Guid servisGuid = BluetoothService.SerialPort; // Seri port servisi
    
    using (BluetoothClient client = new BluetoothClient())
    {
        client.Connect(adres, servisGuid);
        Console.WriteLine("Bağlantı başarılı!");
    }
}

Buradaki BluetoothService.SerialPort, çoğu Bluetooth modülünün (HC-05, HC-06 gibi) varsayılan olarak kullandığı seri port profilidir. Bağlantı kurulduğunda, client.GetStream() metodunu kullanarak veri alışverişine başlayabilirsiniz.

Veri Gönderme ve Cihazı Kontrol Etme

Bağlantı sağlandıktan sonra, cihazınıza komutlar göndermek için standart NetworkStream yapısını kullanırız. Örneğin, bir mikrodenetleyiciye (Arduino/ESP32) "AÇ" veya "KAPAT" komutu göndermek oldukça basittir.


public void KomutGonder(BluetoothClient client, string komut)
{
    NetworkStream stream = client.GetStream();
    byte[] veri = System.Text.Encoding.ASCII.GetBytes(komut);
    stream.Write(veri, 0, veri.Length);
    stream.Flush();
}

Bu metot, metin tabanlı komutları byte dizisine dönüştürerek Bluetooth üzerinden cihazın RX (alıcı) pinine iletir. Cihaz tarafında bu veriyi okuyup gerekli aksiyonu (örneğin bir röleyi tetikleme) alacak bir kodun olması gerekir.

Bluetooth Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Klasik Bluetooth (RFCOMM) Yüksek uyumluluk, kolay seri haberleşme Yüksek güç tüketimi
Bluetooth Low Energy (BLE) Düşük güç tüketimi, uzun pil ömrü Daha karmaşık veri yapısı (GATT)

Hata Yönetimi ve Debug İpuçları

Bluetooth bağlantıları doğası gereği kararsız olabilir. Mesafe, engeller veya sinyal parazitleri bağlantının kopmasına neden olabilir. Bu nedenle bağlantı süreçlerini try-catch blokları ile sarmalamak hayati önem taşır.


try 
{
    client.Connect(adres, servisGuid);
}
catch (System.Net.Sockets.SocketException ex)
{
    Console.WriteLine($"Bağlantı hatası: {ex.Message}");
}

Güvenlik Uyarısı: Bluetooth üzerinden gönderilen veriler şifrelenmemiş olabilir. Kritik kontrol verilerini (şifreler, özel komutlar) gönderirken cihaz üzerinde ek bir doğrulama katmanı veya şifreleme algoritması (AES gibi) kullanmanız önerilir. Ayrıca, yetkisiz erişimi engellemek için cihaz eşleştirme modunu yalnızca gerektiğinde açın.

Sıkça Sorulan Sorular

Bluetooth bağlantısı neden sürekli kopuyor?

Bağlantı kopmaları genellikle donanım kaynaklıdır. Cihazın güç beslemesini kontrol edin ve bilgisayar ile cihaz arasındaki mesafenin 10 metreyi geçmediğinden emin olun.

BLE cihazlarını bu yöntemle kontrol edebilir miyim?

Hayır, BLE cihazları için Windows.Devices.Bluetooth kütüphanesini ve GATT (Generic Attribute Profile) yapısını kullanmanız gerekir. Bu rehber klasik RFCOMM içindir.

Cihazım neden "Service Not Found" hatası veriyor?

Hedef cihazınızın seri port profilini desteklemediği anlamına gelir. Cihazınızın Bluetooth modülünün SPP (Serial Port Profile) destekli olduğundan emin olun.

Aynı anda birden fazla cihazı kontrol edebilir miyim?

Evet, her cihaz için ayrı bir BluetoothClient nesnesi oluşturarak paralel bağlantılar kurabilirsiniz, ancak bu durum bilgisayarın Bluetooth adaptörünü zorlayabilir.

C# ile Bluetooth üzerinden dosya transferi yapılabilir mi?

Teknik olarak evet, ancak Bluetooth dosya transferi (OBEX protokolü) için daha karmaşık kütüphaneler veya Windows'un yerel dosya paylaşım servisleri kullanılmalıdır.

Bluetooth Uygulamalarında Performans Optimizasyonu

Bluetooth tabanlı C# uygulamalarında, özellikle sürekli veri akışının olduğu senaryolarda performans darboğazları yaşanabilir. Bağlantı kararlılığını artırmak ve gecikme süresini (latency) düşürmek için aşağıdaki stratejileri uygulamanız önerilir.

Asenkron Veri İşleme

Bluetooth üzerinden veri okuma ve yazma işlemleri, ana iş parçacığını (UI Thread) dondurmamalıdır. async/await yapısını kullanarak verileri arka planda işlemek, uygulamanın donmasını engeller.

public async Task SendCommandAsync(BluetoothClient client, byte[] data)
{
    using (var stream = client.GetStream())
    {
        await stream.WriteAsync(data, 0, data.Length);
        await stream.FlushAsync();
    }
}

Veri Paketleme ve Buffer Yönetimi

Küçük paketler halinde sürekli veri göndermek, Bluetooth protokolünün overhead (ek yük) miktarını artırır. Bunun yerine verileri belirli bir arabellekte (buffer) toplayıp tek seferde göndermek, bant genişliği kullanımını optimize eder.

  • Küçük paketleri birleştirin: 20 baytlık 10 paket yerine, 200 baytlık tek bir paket gönderin.
  • Akış kontrolü: NetworkStream kullanırken ReadTimeout ve WriteTimeout değerlerini donanımınıza göre optimize edin.

İleri Seviye Hata Ayıklama (Debugging) Teknikleri

Bluetooth bağlantı sorunları genellikle donanım ve sürücü katmanında gizlidir. Uygulamanızın neden hata verdiğini anlamak için şu yöntemleri izleyebilirsiniz:

Bluetooth Protokol Analizi

Windows üzerinde "Bluetooth Logger" veya "Wireshark" (nRF Sniffer ile) kullanarak paket seviyesinde inceleme yapabilirsiniz. Eğer cihazınızdan yanıt alamıyorsanız, InTheHand.Net.Sockets kütüphanesinin sağladığı SocketException hata kodlarını detaylıca loglayın.

Hata Kodu Olası Neden Çözüm
10060 Bağlantı Zaman Aşımı Cihazın kapsama alanında olduğunu kontrol edin.
10061 Bağlantı Reddedildi Cihazın eşleşme modunda olduğundan emin olun.

Bağlantı İzleme (Keep-Alive)

Bağlantının kopup kopmadığını anlamak için periyodik olarak "Heartbeat" (kalp atışı) sinyalleri gönderin. Eğer 5 saniye boyunca yanıt gelmiyorsa, bağlantıyı kapatıp yeniden başlatmak, manuel müdahale gerektirmeyen bir "Self-Healing" (kendi kendini onaran) mekanizma oluşturmanızı sağlar.

private async Task StartHeartbeat(BluetoothClient client)
{
    while (client.Connected)
    {
        try {
            byte[] ping = { 0x00 }; // Cihazın desteklediği bir ping komutu
            await client.GetStream().WriteAsync(ping, 0, 1);
        }
        catch {
            // Bağlantı koptu, yeniden bağlanma metodunu tetikle
            break;
        }
        await Task.Delay(5000);
    }
}

Sonuç

C# ile Bluetooth üzerinden cihaz kontrolü, doğru kütüphaneler ve protokol bilgisiyle oldukça verimli bir süreçtir. Bu rehberde, klasik Bluetooth bağlantısının temellerini, cihaz tarama, bağlanma ve veri gönderme adımlarını öğrendiniz. Bir sonraki adım olarak, BLE (Bluetooth Low Energy) protokolünü inceleyerek daha düşük enerji tüketen modern IoT projeleri geliştirebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Bluetooth üzerinden kontrol edilen cihazların güvenliği ve fiziksel sonuçlarından geliştirici sorumludur. Endüstriyel veya hayati önem taşıyan sistemlerde kullanmadan önce profesyonel güvenlik testleri yapılmalıdır.

Bu yazıya tepkinizi paylaşın:
Burak Şahin

Verimlilik ve organizasyon üzerine uzmanlaşmış bir yazarım. Karmaşık görevleri yönetilebilir parçalara bölerek okuyucunun zamanını doğru kullanmasını sağlıyorum.

Yorumlar (0)

Yorum Yaz