Tüm Yazılar

ESP32-S3 ile iPhone Bildirimlerini BLE Üzerinden Okumak

Telefonunuza gelen bir WhatsApp mesajını, kaçırdığınız aramayı ya da bir SMS'i telefonunuzun ekranına hiç bakmadan, avucunuzdaki küçük bir geliştirme kartından okuyabilmek kulağa hoş geliyor, değil mi? Akıllı saatlerin ve taşınabilir bildirim ekranlarının arkasında yatan mantık tam olarak bu. Ben de bu mantığı en yalın haliyle kendi elimle kurmak istedim ve ESP32-S3 kullanarak bir iPhone'un bildirimlerini Bluetooth Low Energy (BLE) üzerinden okuyan bir prototip geliştirdim.

Bu yazıda; neyi, neden ve nasıl yaptığımı, karşılaştığım noktaları ve seri monitörde gördüğüm gerçek çıktıları paylaşacağım.

Problem: iOS Neden "Kapalı Bir Kutu"?

Android tarafında bildirimlere erişmek görece kolaydır. Ancak iOS, güvenlik politikaları nedeniyle dış cihazlarla veri paylaşımını çok sınırlı tutar. Bir harici cihazın iPhone'daki bildirimlere ulaşabilmesi için Apple'ın kendi sunduğu resmi yolu kullanması gerekir: Apple Notification Center Service (ANCS).

ANCS, iOS cihazındaki bildirimlerin BLE üzerinden harici cihazlara aktarılmasını sağlayan özel bir Bluetooth servisidir. Akıllı saatlerin telefonunuza dokunmadan bildirimleri gösterebilmesinin sırrı budur. Yani doğru kapıyı çalarsanız, iPhone bildirimleri size kendisi veriyor.

BLE ve ANCS Mimarisi Kısaca

BLE haberleşmesi iki temel rol üzerine kuruludur:

  • Peripheral (çevresel): Veriyi sağlayan cihaz.
  • Central (merkez): Tarama yapıp bağlantıyı kuran cihaz.

Bu projede ilginç bir şekilde iPhone peripheral, ESP32-S3 ise central/client olarak çalışıyor. Yani bağlantıyı ESP32 kuruyor, veriyi iPhone sağlıyor.

Veri alışverişi GATT (Generic Attribute Profile) yapısı üzerinden, servisler ve karakteristikler aracılığıyla yürüyor. ANCS servisinin üç temel karakteristiği var ve projenin kalbi tam olarak bunlar:

  • Notification Source: Yeni bir bildirim geldiğini haber verir (uygulama kimliği, kategori, durum bilgisi).
  • Control Point: Bildirimle ilgili detayları (başlık, mesaj içeriği, uygulama adı) talep etmenizi sağlar.
  • Data Source: Talep ettiğiniz detaylı verilerin geri döndüğü karakteristiktir.

Kısacası akış şöyle işliyor: Notification Source "bir bildirim var" der → ESP32 Control Point üzerinden "detayları ver" der → Data Source detayları geri gönderir.

Kullandığım Donanım ve Yazılım

Donanım tarafı oldukça sade:

  • ESP32-S3 N16R8 geliştirme kartı (BLE haberleşmesini yapan ana kart)
  • iPhone (bildirim kaynağı)
  • USB-UART arayüzü (seri haberleşme ve debug için)

Yazılım tarafında ise:

  • ESP-IDF v5.5.4 (Espressif'in resmi geliştirme framework'ü)
  • C programlama dili
  • FreeRTOS (görev yönetimi)
  • BLE Stack (Bluetooth haberleşmesi)

Önemli bir tercih: Sıfırdan bir BLE protokolü yazmak yerine, Espressif'in resmi olarak sunduğu ble_ancs örneğini temel aldım. Böylece servis keşfi, eşleşme, karakteristik bulma ve bildirim özniteliklerini ayrıştırma gibi kritik işlemleri güvenilir bir zemin üzerine kurmuş oldum. Tekerleği yeniden icat etmeye gerek yok; asıl iş, örneği anlayıp doğru kartta çalıştırmak.

Kurulum ve Derleme

Projeyi ESP-IDF ile derleyip karta yüklemek için kullandığım komutlar şunlardı:

idf.py set-target esp32s3
idf.py build
idf.py -p COM5 flash monitor

set-target esp32s3 ile hedef platformu belirledim, build ile projeyi derledim, flash monitor ile de hem karta yükleyip hem de aynı anda seri monitörden logları izlemeye başladım. Flashlama sırasında bootloader, partition table ve uygulama binary dosyalarının karta yazıldığını doğruladım; ardından cihaz yeniden başlayıp BLE altyapısını ayağa kaldırdı.

Çalışırken Loglarda Ne Gördüm?

Cihaz başladıktan sonra loglarda sırasıyla şu satırların geçmesi, işlerin yolunda gittiğinin habercisiydi:

advertising start success
pair status = success
ESP_GATTC_SEARCH_CMPL_EVT

Bunların ardından Apple'a ait Control Point, Notification Source ve Data Source karakteristiklerinin bulunduğunu açıkça görebildim. Bu da BLE bağlantısının kurulduğunu ve ANCS servis keşfinin başarıyla tamamlandığını gösteriyordu.

Gerçek Bildirimler Geldiğinde

İşin en keyifli kısmı, telefonuma gelen bildirimlerin karttan tek tek düşmesini izlemekti. Önce bir SMS test ettim; logda uygulama kimliğinin com.apple.MobileSMS, türün SMS, başlığın gönderen adı, içeriğin ise düz metin olarak geldiğini gördüm.

Ardından WhatsApp'ı denedim; bu sefer uygulama kimliği net.whatsapp.WhatsApp, başlık gönderen kişi, mesaj alanı da WhatsApp içeriği olarak yansıdı. Bu, sistemin tek bir uygulamaya özgü olmadığını, ANCS üzerinden farklı uygulamaların bildirimlerini ayırt edebildiğini kanıtlıyordu.

Seri monitörden aldığım gerçek çıktılardan bazıları:

Identifier: com.apple.mobilephone
Title: H*** M***
Message: Cevapsız Arama
Date: 20260415T103550

Identifier: com.apple.MobileSMS
Title: A*** E*** Y***
Message: Aaa
Date: 20260415T105127

Identifier: net.whatsapp.WhatsApp
Title: S***
Message: Belli olmuyo
Date: 20260415T103412

Cevapsız aramadan SMS'e, WhatsApp mesajından diğer uygulamalara kadar her bir bildirimin uygulama kimliği, başlığı, mesajı ve zaman damgasıyla birlikte düzgünce ayrıştırıldığını görmek, prototipin gerçekten çalıştığının en net kanıtıydı.

Sonuç

Bu çalışmada, iPhone'dan gelen bildirimlerin ESP32-S3 ile gerçek zamanlı olarak okunabildiğini deneysel olarak gösterdim. Sistem; BLE eşleşmesi, ANCS servis keşfi, bildirim alma ve içerik ayrıştırma adımlarını başarıyla tamamladı. Uzun süreli testlerde bağlantıda kopma yaşanmaması da düşük güç tüketimli, sürekli çalışan bir yapı için umut vericiydi.

Ortaya çıkan bu prototip, düşük maliyetli donanımla gerçek zamanlı bildirim aktarımının mümkün olduğunu ve ESP32 platformunun gömülü sistemler alanındaki potansiyelini gösteriyor.

Sırada Ne Var?

Bu bir bitiş değil, bir başlangıç. İlerleyen aşamalarda planladıklarım:

  • Nextion ekran entegrasyonu ile bildirimleri fiziksel bir ekranda göstermek
  • Aynı ekranda hava durumu ve notlar gibi küçük uygulamalar çalıştırmak
  • Bildirimleri bir web servisine aktarıp veri tabanında saklamak
  • Belirli uygulamalara göre bildirim filtreleme
  • Türkçe karakter desteğini iyileştirmek
  • Düşük güç optimizasyonlarını artırmak

Hedef, bu prototipi zamanla kendi kendine yeten, küçük bir "taşınabilir bildirim ekranına" dönüştürmek.