Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda Node.js'in güncel bir LTS (Long Term Support) sürümünün yüklü olduğundan emin olun. Geliştirme ortamınızın hazır olması için terminal üzerinden gerekli paketleri kuracağız.
- Node.js (v20 veya üzeri önerilir)
- npm veya yarn paket yöneticisi
- Modern bir tarayıcı (Chrome veya Firefox, Geolocation API desteği için)
- Temel Express.js bilgisi
Proje klasörünüzü oluşturun ve gerekli bağımlılıkları yüklemek için aşağıdaki komutları sırasıyla çalıştırın:
mkdir konum-takip-uygulamasi
cd konum-takip-uygulamasi
npm init -y
npm install express socket.io
Bu komutlar, projenizin temelini atacak olan package.json dosyasını oluşturur ve sunucu taraflı iletişim için gerekli kütüphaneleri projenize dahil eder.
Sunucu Tarafında Socket.io Kurulumu
Sunucu tarafında, HTTP isteklerini karşılayan bir Express sunucusu ve bu sunucu üzerinde çalışan bir Socket.io örneği oluşturmamız gerekiyor. Socket.io, WebSocket protokolünü temel alarak bağlantı koptuğunda otomatik yeniden bağlanma gibi gelişmiş özellikler sunar.
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
io.on('connection', (socket) => {
console.log('Bir kullanıcı bağlandı: ' + socket.id);
socket.on('konum-gonder', (data) => {
// Gelen konum verisini diğer tüm kullanıcılara yayınla
socket.broadcast.emit('konum-guncelle', {
id: socket.id,
...data
});
});
socket.on('disconnect', () => {
console.log('Kullanıcı ayrıldı');
});
});
server.listen(3000, () => {
console.log('Sunucu 3000 portunda çalışıyor.');
});
Yukarıdaki kod, sunucunun gelen konum verilerini dinlemesini ve bağlı olan diğer tüm istemcilere bu veriyi "yayınlamasını" (broadcast) sağlar. Bu sayede bir kullanıcının hareketi, diğerlerinin ekranında anlık olarak güncellenir.
İstemci Tarafında Konum Verisi Alma
Tarayıcıların sunduğu navigator.geolocation API'si, kullanıcının enlem ve boylam bilgilerine erişmemizi sağlar. Bu veriyi sürekli olarak sunucuya göndermek için watchPosition metodunu kullanacağız.
const socket = io();
if (navigator.geolocation) {
navigator.geolocation.watchPosition((position) => {
const { latitude, longitude } = position.coords;
socket.emit('konum-gonder', { latitude, longitude });
}, (error) => {
console.error('Konum alınamadı:', error);
}, {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
});
}
Buradaki enableHighAccuracy: true parametresi, mümkün olan en hassas GPS verisini almak için önemlidir. Ancak bu modun pil tüketimini artırabileceğini unutmayın.
Veri Akışı ve Güvenlik Uyarıları
Gerçek zamanlı uygulamalarda veri güvenliği, özellikle konum gibi hassas veriler söz konusu olduğunda hayati önem taşır. İstemciden gelen verilerin doğrulanması ve yetkilendirme süreçleri ihmal edilmemelidir.
Güvenlik Uyarısı: Üretim ortamında (production) mutlaka HTTPS protokolünü kullanın. Aksi takdirde, Geolocation API tarayıcılar tarafından güvenlik gerekçesiyle engellenebilir. Ayrıca, sunucuya gelen konum verilerini doğrulamadan veritabanına kaydetmeyin; XSS ve veri manipülasyonuna karşı gelen verileri mutlaka sanitize edin.
Aşağıdaki tablo, farklı senaryolarda kullanabileceğiniz yöntemleri özetlemektedir:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Socket.io | Düşük gecikme, çift yönlü | Sunucu kaynak tüketimi |
| HTTP Polling | Basit yapı | Yüksek gecikme, gereksiz trafik |
Harita Entegrasyonu ve Görselleştirme
Konum verilerini sadece koordinat olarak tutmak yerine, kullanıcıya göstermek için Leaflet.js gibi hafif bir harita kütüphanesi kullanabilirsiniz. Sunucudan gelen konum-guncelle olayını dinleyerek harita üzerindeki işaretçiyi (marker) güncelleyebilirsiniz.
socket.on('konum-guncelle', (data) => {
const { id, latitude, longitude } = data;
// Harita üzerinde ilgili ID'ye sahip marker'ı güncelle
if (markers[id]) {
markers[id].setLatLng([latitude, longitude]);
} else {
markers[id] = L.marker([latitude, longitude]).addTo(map);
}
});
Bu kod bloğu, her kullanıcı için benzersiz bir marker oluşturur ve konum değiştikçe bu marker'ın pozisyonunu dinamik olarak günceller.
Sıkça Sorulan Sorular
Socket.io yerine neden doğrudan WebSocket kullanmıyoruz?
Socket.io, WebSocket protokolü üzerine inşa edilmiştir ancak bağlantı kesintilerinde otomatik yeniden bağlanma, oda (room) desteği ve farklı tarayıcılar için yedekleme (fallback) mekanizmaları sunduğu için çok daha kararlıdır.
Konum verisi ne kadar sıklıkla gönderilmeli?
Kullanıcı hareket hızına bağlı olarak watchPosition ayarlarını optimize etmelisiniz. Çok sık gönderim, sunucuda performans darboğazına yol açabilir.
Bu uygulama ölçeklenebilir mi?
Evet, ancak binlerce kullanıcıya çıktığınızda Socket.io'nun "Redis Adapter" özelliğini kullanarak sunucular arası senkronizasyon sağlamanız gerekecektir.
GPS verisi neden bazen hatalı geliyor?
GPS sinyalleri kapalı alanlarda zayıflar. Bu durumda tarayıcı, Wi-Fi veya baz istasyonu bazlı konumlandırmaya geçer, bu da sapmalara neden olabilir.
Üretim ortamında dikkat edilmesi gereken en önemli şey nedir?
Kesinlikle HTTPS kullanmak ve sunucu tarafında gelen verilerin tip kontrolünü (validation) yapmaktır.
Geofencing Mantığı ile Konum Tabanlı Tetikleyiciler Oluşturma
Canlı konum takibi uygulamanızı bir üst seviyeye taşımak için "Geofencing" (coğrafi çit) mekanizmasını entegre edebilirsiniz. Bu özellik, bir kullanıcının önceden tanımlanmış bir koordinat kümesine veya yarıçapa girip girmediğini sunucu tarafında kontrol etmenizi sağlar. Örneğin, bir kurye teslimat noktasına yaklaştığında otomatik bir bildirim tetikleyebilirsiniz.
Geofencing hesaplamaları için geolib kütüphanesi oldukça verimlidir. Aşağıdaki örnekte, kullanıcının belirli bir merkez noktasına 50 metre mesafede olup olmadığını kontrol eden bir yapı kuruyoruz:
// Sunucu tarafında geofencing kontrolü
const geolib = require('geolib');
const targetLocation = { latitude: 41.0082, longitude: 28.9784 }; // Hedef nokta
const radius = 50; // Metre cinsinden
socket.on('send-location', (data) => {
const isInside = geolib.isPointWithinRadius(
{ latitude: data.latitude, longitude: data.longitude },
targetLocation,
radius
);
if (isInside) {
socket.emit('geofence-alert', { message: 'Hedef noktaya ulaştınız!' });
}
});
Performans Optimizasyonu ve Veri Yükü Yönetimi
Canlı konum takibi uygulamalarında en büyük darboğaz, her saniye gönderilen yüksek miktardaki veri paketidir. Çok sayıda aktif kullanıcı olduğunda, sunucunun CPU kullanımı hızla artabilir. Performansı optimize etmek için şu stratejileri uygulamanız önerilir:
- Throttling (Kısıtlama): İstemci tarafında
navigator.geolocation.watchPositionfonksiyonunu kullanırken, veriyi her milisaniyede değil, belirli aralıklarla (örneğin 3-5 saniyede bir) gönderin. - Delta Güncellemeleri: Sadece konum değiştiğinde veri gönderin. Eğer kullanıcı hareket etmiyorsa, gereksiz paket gönderimini engelleyin.
- Binary Veri Transferi: JSON yerine
Protocol Buffersgibi daha hafif veri formatları kullanarak ağ trafiğini azaltın.
Aşağıdaki kod örneği, istemci tarafında konum verisinin gönderim sıklığını nasıl kontrol edebileceğinizi gösterir:
let lastSentTime = 0;
const interval = 3000; // 3 saniye
navigator.geolocation.watchPosition((position) => {
const now = Date.now();
if (now - lastSentTime > interval) {
socket.emit('send-location', {
latitude: position.coords.latitude,
longitude: position.coords.longitude
});
lastSentTime = now;
}
}, (error) => {
console.error("Konum hatası:", error);
}, {
enableHighAccuracy: true,
maximumAge: 10000,
timeout: 5000
});
Üretim Ortamında Hata Ayıklama ve İzleme
Canlı bir uygulamada konum verisinin kesilmesi veya hatalı gelmesi kaçınılmazdır. Bu durumları yönetmek için socket.io'nun bağlantı kopma olaylarını (disconnect) ve hata yakalama mekanizmalarını kullanmalısınız. Ayrıca, kullanıcıların GPS sinyallerinin zayıf olduğu durumlarda "offline" modunu tetikleyerek kullanıcıya bilgi vermeniz kullanıcı deneyimini iyileştirir.
İpucu: Sunucu tarafında socket.io-redis adaptörünü kullanarak, uygulamanızı birden fazla sunucuya (horizontal scaling) yayabilir ve yükü dengeleyebilirsiniz.
Sonuç
Node.js ve Socket.io kullanarak canlı konum takip uygulaması geliştirmek, gerçek zamanlı web teknolojilerini anlamak için mükemmel bir projedir. Bu rehberde, sunucu kurulumundan istemci tarafında konum verisi almaya ve bu veriyi harita üzerinde görselleştirmeye kadar tüm süreci ele aldık. Bir sonraki adım olarak, kullanıcıların belirli bir alana girip çıkmasını takip eden "Geofencing" mantığını uygulayarak projenizi daha profesyonel bir seviyeye taşıyabilirsiniz.
Yasal Sorumluluk Reddi: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Konum verisi gibi kişisel verilerin işlenmesi, KVKK (Kişisel Verilerin Korunması Kanunu) ve ilgili yerel mevzuatlara tabidir. Uygulamanızda kullanıcı rızası almayı ve verileri güvenli bir şekilde depolamayı unutmayınız.


Yorumlar (0)
Yorum Yaz