Mobil uygulamalar için bir MQTT broker, telefonun cihaz verisini değiştiği anda görmesini ve çok az ek yükle komutları geri göndermesini sağlar. Bu rehber mobil uygulamaların nasıl bağlanması gerektiğini, MQTT'nin ne zaman doğru araç olduğunu ve platform push bildirimlerinin ne zaman doğru araç olduğunu, pil kullanımını nasıl düşük tutacağınızı ve kimlik bilgilerini nasıl güvenle yöneteceğinizi, ConnectMQ'ya karşı çalışan bir örnekle açıklıyor.
Mobil Uygulamalar Neden MQTT Kullanır
Mobil IoT uygulamaları genellikle üç şeye ihtiyaç duyar: canlı durumu göstermek (kapı kilitli mi, tank seviyesi ne), komut göndermek (pompayı çalıştır) ve değişikliklere hızla tepki vermek. Birkaç saniyede bir REST API'yi yoklamak bu üçünü de kötü karşılar: pili ve veriyi israf eder, gecikme ekler ve backend'inize yük bindirir. MQTT, uygulama etkinken tek bir uzun ömürlü bağlantıyı açık tutar ve yalnızca değişeni iletir.
Ortadaki broker uygulamayı cihazlardan ayırır. Telefonun asla bir cihazın IP adresine ihtiyacı olmaz; her iki taraf da bilinen bir uç noktayla konuşur. Bu rolde yeniyseniz önce bir MQTT broker'ın ne yaptığı yazısını okuyun.
Bir Telefondan Bağlantı Seçenekleri
| Taşıma | URL | Ne zaman kullanılır |
|---|---|---|
| TLS üzerinden MQTT | mqtts://broker.connectmq.com:8883 |
TCP destekli bir MQTT kütüphanesine sahip native uygulamalar (Kotlin, Swift, Flutter) |
| Secure WebSocket üzerinden MQTT | wss://broker.connectmq.com:8084/mqtt |
React Native, Ionic, PWA'lar ve webview'lar; 8883'ü engelleyen ağlar |
Her ikisi de şifrelidir ve her ikisi de MQTT 3.1.1 ve 5.0 ile çalışır. WebSocket, JavaScript tabanlı uygulamalarda ve kısıtlayıcı Wi-Fi ağlarında çoğu zaman en az dirençli yoldur; native TLS ise biraz daha verimlidir. Üretimdeki bir uygulamadan asla şifresiz 1883 veya 8083 portlarını kullanmayın. WebSocket üzerinden MQTT rehberi WebSocket taşımasını derinlemesine açıklıyor.
MQTT ve Push Bildirimleri
Bu en önemli tasarım kararıdır ve cevap genellikle "ikisi birden"dir.
| İhtiyaç | MQTT | Platform push (APNs / FCM) |
|---|---|---|
| Uygulama açıkken canlı güncellemeler | Mükemmel | Uygun değil |
| Uygulama kapalıyken uyarılar | Güvenilir değil | Bunun için tasarlanmış |
| Çift yönlü komutlar | Evet | Hayır |
| Arka planda pil maliyeti | Açık tutulursa yüksek | İşletim sistemi yönetir |
| Telefon çevrimdışıyken teslimat | Kalıcı oturum sürdükçe | Platform tarafından kuyruğa alınır |
Mobil işletim sistemleri arka plandaki uygulamaları ve soketlerini askıya alır. Özellikle iOS, bir MQTT bağlantısını arka planda süresiz açık tutmanıza izin vermez. Bu yüzden sağlam mimari şöyledir:
Ön plan: uygulama broker'a bağlanır, kullanıcının görüntülediği cihazlara abone olur ve komutları MQTT üzerinden gönderir.
Arka plan: uygulama bağlantıyı temiz bir şekilde keser. Küçük bir backend servisi broker'daki uyarı topic'lerine abone olur ve önemli bir şey olduğunda platform push bildirimleri gönderir.
Ön plana dönüş: uygulama yeniden bağlanır, retained message'lar mevcut durumu anında teslim eder ve arayüz birkaç an içinde güncellenir.
adımdaki backend aktarıcısı, çalıştırdığınız sıradan bir MQTT istemcisidir; örneğin bir Node.js veya Python servisi. ConnectMQ push bildirimlerini kendisi göndermez ve bu mantığı kendi servisinizde tutmak, hangi olayların bildirime dönüşeceği üzerinde size kontrol sağlar.
Pil ve Veri Konuları
- Yalnızca gerektiğinde bağlanın. Bağlantıyı ilgili ekran göründüğünde açın ve uygulama arka plana geçtiğinde kapatın.
- Dar abone olun.
#yerinehome/42/devices/+/statekonusuna abone olun. Aldığınız her mesaj radyo süresine mal olur. - Durum için retained message kullanın. Uygulama abone olduğunda bilinen son değeri anında alır; böylece asla yoklama yapmanız veya yenileme istemeniz gerekmez.
- Orta düzeyde bir keep alive seçin. 30 ila 60 saniye, ölü bağlantıların hızlı tespiti ile daha az radyo uyanması arasında denge kurar.
- Payload'ları kompakt tutun. Kısa JSON anahtarları veya ikili kodlamalar hücresel bağlantılarda işe yarar.
- Destekleniyorsa MQTT 5 topic alias ve message expiry kullanın. Alias'lar tekrar eden uzun topic adlarını küçültür; message expiry eskimiş komutların geç teslim edilmesini durdurur.
- Yeniden bağlanırken geri çekilin. Mobil ağlar sürekli değişir; üstel backoff pili tüketen sıkı yeniden deneme döngülerini önler.
Çalışan Örnek: MQTT.js ile React Native veya Web
MQTT.js tarayıcılarda ve React Native'de WebSocket üzerinden çalışır. Bu modül bağlanma, abone olma ve uygulama yaşam döngüsü yönetimini kapsar.
import mqtt from "mqtt";
const BROKER_URL = "wss://broker.connectmq.com:8084/mqtt";
export function createDeviceConnection({ clientId, username, password, homeId, onState }) {
const client = mqtt.connect(BROKER_URL, {
clientId,
username,
password,
protocolVersion: 5,
keepalive: 45,
clean: true,
reconnectPeriod: 3000,
connectTimeout: 10000,
});
const stateTopic = `homes/${homeId}/devices/+/state`;
client.on("connect", () => {
client.subscribe(stateTopic, { qos: 1 }, (err) => {
if (err) console.warn("Subscribe failed", err.message);
});
});
client.on("message", (topic, payload) => {
const deviceId = topic.split("/")[3];
try {
onState(deviceId, JSON.parse(payload.toString()));
} catch {
console.warn("Ignoring non-JSON payload on", topic);
}
});
client.on("error", (err) => console.warn("MQTT error", err.message));
return {
sendCommand(deviceId, command) {
client.publish(
`homes/${homeId}/devices/${deviceId}/cmd`,
JSON.stringify(command),
{ qos: 1, properties: { messageExpiryInterval: 30 } }
);
},
pause() {
client.end(false);
},
resume() {
if (!client.connected) client.reconnect();
},
};
}
React Native'de pause() ve resume() fonksiyonlarını bir AppState değişiklik dinleyicisinden çağırın. 30 saniyelik message expiry, bir cihaz çevrimdışıyken kuyruğa alınan bir komutun dakikalar sonra beklenmedik şekilde çalışmayacağı anlamına gelir. Bazı React Native kurulumları bir WebSocket veya Buffer polyfill'i gerektirir; platforma özgü ayrıntılar için React Native MQTT rehberine, Dart ile geliştiriyorsanız Flutter MQTT rehberine bakın.
Hesap olmadan denemek için örneği ücretsiz herkese açık MQTT broker'a yönlendirin, kullanıcı adı ve parolayı çıkarın, boş olmayan benzersiz herhangi bir client ID kullanın ve topic'lerin başına connectmq/demo/m7d2w/homes/... gibi benzersiz bir önek ekleyin. Herkese açık alandaki her şey herkes tarafından okunabilir, bu yüzden yalnızca demolar için kullanın.
Kimlik Bilgilerini Güvenle Yönetmek
Bir mobil uygulama ikili dosyası tersine derlenebilir; bu yüzden içine gömülen her şeyi herkese açık kabul edin.
- Uygulamaya tek bir ortak broker parolası koymayın. Sızarsa her kullanıcının trafiği açığa çıkar ve her kurulumu bozmadan iptal edemezsiniz.
- Backend'inizden kullanıcı veya oturum başına kimlik bilgileri verin. Kullanıcı uygulamanızda oturum açtıktan sonra API'niz o kullanıcının kullanması gereken MQTT kimlik bilgilerini ve client ID'yi döndürür.
- Topic'leri kullanıcıya veya eve göre kapsamlandırın. Topic'leri her kullanıcının verisi kendi önekinin altında olacak şekilde tasarlayın ve hangi komutların kimden kabul edileceğini cihaz ve backend tarafında uygulayın.
- Yenileyin ve iptal edin. Bir kullanıcı oturumu kapattığında veya bir telefon kaybolduğunda kimlik bilgilerini iptal edin.
- Komutları cihazda veya backend'de doğrulayın. Bir komutun meşru bir ekrandan geldiğine asla güvenmeyin.
ConnectMQ client ID'leri verilen kimlik bilgilerine bağlar ve tekrarlanan başarısız girişlerden sonra IP'leri engeller; bu da credential stuffing saldırılarına karşı yardımcı olur. Tam liste için MQTT güvenlik en iyi uygulamaları yazısını okuyun.
Uygulamalar İçin Kapasite Planlaması
Açık olan her uygulama bir bağlantıdır. On cihaz ve elli aktif uygulama kullanıcısı, tepe anında on değil altmış eşzamanlı bağlantı eder. ConnectMQ Serverless (Free) 25'e kadar bağlantıya izin verir; bu da geliştirme ve küçük bir beta için uygundur. Serverless (Paid) QoS 2 ve shared subscription ile 1.000 bağlantıya kadar çıkar; dedicated kümeler daha büyük kitleleri karşılar. Uygulamalar arka planda bağlantıyı kestiği için eşzamanlı bağlantılar genellikle kurulum sayısından çok daha azdır, ancak tahmin etmek yerine gerçek deseninizi ölçün.
Bu planların ardındaki barındırma seçenekleri için bulut MQTT broker rehberine bakın.
Uygulamanızı ConnectMQ'ya Bağlayın
app.connectmq.com adresinde kredi kartı olmadan ücretsiz bir Serverless broker oluşturun, topic'lerinizi tarayıcı içi istemcide test edin ve MQTT.js örneğini yeni uç noktanıza yönlendirin. ConnectMQ, ilk dakikadan itibaren mobil istemcilere hazır TLS ve Secure WebSocket uç noktalarına sahip yönetilen bir MQTT broker'dır.
Sık Sorulan Sorular
Bir mobil uygulama MQTT bağlantısını arka planda açık tutabilir mi?
Güvenilir şekilde tutamaz. Mobil işletim sistemleri arka plandaki soketleri askıya alır; bu yüzden uygulama ön plandayken MQTT'yi, arka plan uyarıları için platform push bildirimlerini kullanın.
Bir mobil uygulama MQTT için WebSocket mi yoksa TCP mi kullanmalı?
JavaScript tabanlı uygulamalar genellikle /mqtt yoluyla 8084 portunda Secure WebSocket kullanır. Native uygulamalar 8883'te TLS kullanabilir; ikisi de şifrelidir.
Uygulama açıldığında mevcut cihaz durumunu nasıl alırım?
Cihazların durumu retained message olarak yayımlamasını sağlayın. Uygulama abone olduğunda broker en son değeri hemen teslim eder.
Broker kimlik bilgilerini bir mobil uygulamaya gömmek güvenli mi?
Hayır. Sızan bir kimlik bilgisinin tek başına iptal edilebilmesi için oturum açıldıktan sonra backend'inizden kullanıcı başına kimlik bilgileri verin.



