Yönetilen MQTT Bulutu

MQTT ile Araç Takibi: Topic'ler, Payload'lar ve Canlı Filo Haritası

Kesintili hücresel bağlantılarda çalışan MQTT ile araç takibi kurun: topic tasarımı, kompakt GPS payload'ları, keep alive ayarı, çevrimdışı tespiti ve canlı bir web haritası.

Hücresel ağ üzerinden bir bulut broker'a GPS konumu gönderen teslimat minibüslerini ve canlı bir filo haritasını gösteren MQTT ile araç takibi illüstrasyonu
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

MQTT ile araç takibi iyi çalışır, çünkü protokol tam olarak bu tür bir bağlantı için tasarlanmıştır: güvenilmez ve ücretlendirilen ağlar üzerinden sık sık küçük mesajlar gönderen küçük cihazlar. Bu rehberde bir filo için topic yapısı tasarlayacak, kompakt GPS payload'ları seçecek, hücresel takip cihazları için keep alive ve oturumları ayarlayacak, çevrimdışı araçları tespit edecek ve ConnectMQ'daki MQTT aboneliklerinden doğrudan güncellenen canlı bir tarayıcı haritası oluşturacaksınız.

MQTT Neden Filo Telematiğine Uyar

Bir minibüsteki hücresel takip cihazı ömrünü baz istasyonu değiştirerek, tünellere girerek ve otoparklarda kapsama alanını kaybederek geçirir. Her yeniden bağlanma zamana, güce ve veriye mal olur. MQTT birkaç şekilde yardımcı olur:

  • Konum başına yeni bir HTTP isteği yerine tek bir kalıcı bağlantı; böylece başlıklar ve el sıkışmalar bir kez ödenir.
  • Mesaj başına küçük sabit ek yük; her kilobaytın faturalandığı durumlarda bu önemlidir.
  • Keep alive ve Last Will, bir araç sessizleştiğinde sunucuya net bir sinyal verir.
  • Kalıcı oturumlarla QoS 1, kısa süreliğine kapsama alanını kaybeden bir araca komutların ulaşmasını sağlar.
  • Abonelikler üzerinden fan-out: aynı konum, takip cihazı fazladan bir şey yapmadan bir sevk haritasını, bir geofencing servisini ve bir geçmiş yazıcısını besler.

Teslimat garantilerini hatırlamak için MQTT QoS seviyeleri yazısına bakın.

Araç Takibi İçin Topic Tasarımı

İnsanların veriyi sorgulama biçimine uyan bir hiyerarşiyle başlayın: önce filo, sonra araç, sonra veri türü.

fleet/{fleetId}/vehicle/{vehicleId}/position     canlı GPS konumları
fleet/{fleetId}/vehicle/{vehicleId}/status       çevrimiçi/çevrimdışı (retained)
fleet/{fleetId}/vehicle/{vehicleId}/event        kontak, sert fren, kapı açık
fleet/{fleetId}/vehicle/{vehicleId}/diag         akü voltajı, sinyal kalitesi
fleet/{fleetId}/vehicle/{vehicleId}/cmd          takip cihazına komutlar

Bu yapı bir sevk haritasının fleet/north/vehicle/+/position, bir uyarı servisinin fleet/+/vehicle/+/event ve bir operasyon dashboard'unun fleet/+/vehicle/+/status konusuna abone olmasını sağlar. Tanımlayıcıları kısa ve sabit tutun: boşluklu tam bir plaka yerine v0142 gibi bir araç ID'si. Sürücü adı gibi kişisel olarak tanımlayıcı bilgileri topic adlarına koymaktan kaçının.

Payload Tasarımı

Konum mesajları trafiğinizin büyük kısmını oluşturur, bu yüzden özeni hak ederler.

Alan Anahtar Örnek Notlar
Zaman damgası t 1792137600 Sunucunun alma zamanı değil, GNSS zamanından Unix saniyesi
Enlem la 41.01224 5 ondalık basamak yaklaşık bir metredir
Boylam lo 28.97601 Aynı hassasiyet
Hız s 48 km/sa, tamsayı
Yön h 270 Derece, tamsayı
Konum kalitesi q 3 0 = yok, 2 = 2D, 3 = 3D
Uydu sayısı n 9 Hatalı konumları filtrelemek için faydalı

Ortaya çıkan payload yaklaşık 90 bayttır:

{"t":1792137600,"la":41.01224,"lo":28.97601,"s":48,"h":270,"q":3,"n":9}

Pratik kurallar:

  1. Cihaz zaman damgasını her zaman ekleyin. Bir kapsama boşluğunda tamponlanan mesajlar geç ulaşır; harita ve geçmiş, konum zamanına göre sıralanmalıdır.
  2. Tamponlarken gruplayın. Bir tünelden sonra yüzlerce ayrı mesaj yerine tamponlanmış konumların bir dizisini içeren tek bir mesaj yayımlayın.
  3. Uyarlanabilir raporlayın. Hareket hâlindeyken her 5 ila 15 saniyede bir, park hâlindeyken birkaç dakikada bir ve önemli yön değişikliklerinde hemen.
  4. Hatalı konumları cihazda eleyin. Konum kalitesi 0 ise konum yayımlamayın.

Hücresel Bağlantılar İçin Keep Alive, Oturumlar ve QoS

  • Keep alive: hücresel ağda 60 ila 120 saniye makul bir başlangıç noktasıdır. Daha kısa değerler kopmaları daha hızlı tespit eder ama modemi uyanık tutar; operatör NAT zaman aşımları da boştaki bağlantıları sessizce sonlandırabilir, bu yüzden NAT eşlemesinin önce sona ereceği kadar uzun değerler seçmeyin.
  • QoS: bir sonraki konumun öncekinin yerini aldığı yüksek frekanslı konumlar için QoS 0 kabul edilebilir; kaybolmaması gereken olaylar ve komutlar için QoS 1 kullanın.
  • Kalıcı oturumlar: kısa bir kesinti sırasında gönderilen komutların yeniden bağlanınca teslim edilmesi için clean start false ve bir session expiry (MQTT 5) ile bağlanın; örneğin 10 ila 30 dakika.
  • Message expiry: "kapıları aç" gibi komutlara bir sona erme süresi koyun; böylece bir saat sonra geri gelen bir araç eski bir talimatı yürütmez.
  • Last Will: durum topic'ine retained bir offline will kaydedin ve bağlandıktan sonra retained bir online yayımlayın.

Python'da Bir Takip Cihazını Simüle Etmek

Donanım gelmeden önce bir aracı simüle edin. Bu betik bir hat boyunca ilerler, bir Last Will kullanır ve paho-mqtt 2.x ile konum yayımlar. Hemen çalıştırabilmeniz için herkese açık broker'ı hedefler; gerçek kullanım için kendi kimlik bilgilerinize ve 8883 portuna geçin.

import json
import math
import time
import uuid

import paho.mqtt.client as mqtt

HOST = "broker.connectmq.com"
PORT = 1883
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:6]}"
VEHICLE = "v0142"
BASE = f"{PREFIX}/fleet/north/vehicle/{VEHICLE}"

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id=f"sim-{VEHICLE}-{uuid.uuid4().hex[:6]}",
                     protocol=mqtt.MQTTv5)
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code, "| topic prefix:", PREFIX)
    client.publish(f"{BASE}/status", "online", qos=1, retain=True)


client.on_connect = on_connect
client.connect(HOST, PORT, keepalive=90)
client.loop_start()

lat, lon, heading = 41.0100, 28.9700, 45.0
try:
    while True:
        lat += 0.0003 * math.cos(math.radians(heading))
        lon += 0.0003 * math.sin(math.radians(heading))
        heading = (heading + 3) % 360
        fix = {"t": int(time.time()), "la": round(lat, 5), "lo": round(lon, 5),
               "s": 42, "h": int(heading), "q": 3, "n": 9}
        client.publish(f"{BASE}/position", json.dumps(fix), qos=0)
        time.sleep(5)
except KeyboardInterrupt:
    client.publish(f"{BASE}/status", "offline", qos=1, retain=True).wait_for_publish()
    client.loop_stop()
    client.disconnect()

Yazdırılan öneki not edin; harita için ona ihtiyacınız olacak. Herkese açık broker istemci başına saniyede 10 mesaja ve 8 topic seviyesine izin verir; dolayısıyla tam topic connectmq/demo/xxxxxx/fleet/north/vehicle/v0142/position (8 seviye) tam sığar. Daha fazla seviye eklerseniz hiyerarşiyi kısaltın. Herkese açık alanın herkes tarafından okunabildiğini unutmayın: yalnızca simüle edilmiş koordinatlar kullanın.

Aboneliklerden Canlı Bir Filo Haritası

Harita, konumlara abone olup işaretçileri hareket ettiren bir tarayıcı MQTT istemcisinden ibarettir. Bu sayfa Secure WebSocket üzerinden MQTT.js ve Leaflet kullanır.

// map.js - sayfanıza Leaflet ve MQTT.js yükleyin ve id'si "map" olan bir kapsayıcı öğe ekleyin
const PREFIX = "connectmq/demo/REPLACE_WITH_PREFIX";
const map = L.map("map").setView([41.01, 28.97], 13);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
  attribution: "OpenStreetMap contributors",
}).addTo(map);

const markers = new Map();
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
  clientId: "fleet-map-" + Math.random().toString(16).slice(2, 10),
  protocolVersion: 5,
});

client.on("connect", () => {
  client.subscribe(`${PREFIX}/fleet/+/vehicle/+/position`);
  client.subscribe(`${PREFIX}/fleet/+/vehicle/+/status`);
});

client.on("message", (topic, payload) => {
  const parts = topic.split("/");
  const vehicleId = parts[parts.length - 2];
  const kind = parts[parts.length - 1];

  if (kind === "position") {
    const fix = JSON.parse(payload.toString());
    let m = markers.get(vehicleId);
    if (!m) {
      m = L.marker([fix.la, fix.lo]).addTo(map).bindTooltip(vehicleId);
      markers.set(vehicleId, m);
    }
    m.setLatLng([fix.la, fix.lo]);
    m.setTooltipContent(`${vehicleId} - ${fix.s} km/h`);
  } else if (kind === "status") {
    const m = markers.get(vehicleId);
    if (m) m.setOpacity(payload.toString() === "online" ? 1 : 0.4);
  }
});

Üretimde haritayı sayfaya ortak bir parola gömmek yerine backend'inizin verdiği kimlik bilgileriyle doğrulayın; aynı anda çok sayıda harita görüntüleyicisi açıksa, bir kez abone olup konumları tarayıcılara sunan küçük bir backend düşünün.

Geçmişi Saklamak ve Geofencing

ConnectMQ bir veritabanı değil, broker'dır; bu yüzden geçmiş ve geofencing sizin kendi MQTT istemcileriniz olarak çalışır. fleet/+/vehicle/+/position konusuna abone olan bir Python veya Node.js servisi PostGIS'li PostgreSQL'e veya bir zaman serisi veritabanına yazabilir; ikinci bir servis de her konumu geofence poligonlarına karşı test edip olay topic'ine yayımlayabilir. Serverless (Paid) veya üstü planlarda $share/geo/fleet/+/vehicle/+/position gibi shared subscription'lar birkaç örneğin yükü bölmesini sağlar. Portalın eşik uyarı kuralları da, örneğin bir diagnostik akü voltajının bir sınırın altına düşmesi gibi basit kontroller için kullanışlıdır.

Cihazda Kapsama Boşluklarını Yönetmek

Takip cihazları ciddi süre kapsama alanı dışında kalır, bu yüzden firmware'in bunun için bir planı olmalıdır. Flaş bellekte veya RAM'de son konumlardan oluşan, beklediğiniz en uzun boşluğa göre boyutlandırılmış bir halka tampon (ring buffer) tutun; örneğin azaltılmış hızda bir saatlik konum. Bağlantı geri geldiğinde canlı harita hemen güncellensin diye önce mevcut konumu yayımlayın, ardından tamponu orijinal zaman damgalarıyla gruplar hâlinde boşaltın. Geçmiş yazan tüketiciler araç ve zaman damgasına göre upsert yapmalıdır; böylece QoS 1 altında iki kez teslim edilen bir grup yinelenen noktalar oluşturmaz.

Üretim Kontrol Listesi

  1. Takip cihazı başına benzersiz kimlik bilgileri ve client ID, 8883'te TLS.
  2. Her konumda cihaz zaman damgası; kesintilerden sonra gruplama.
  3. Uyarlanabilir raporlama aralığı.
  4. Last Will ile retained durum.
  5. Komutlar için kalıcı oturumlar ve message expiry.
  6. Topic adlarında kişisel veri yok.
  7. Tüm filo için jitter'lı yeniden bağlanma backoff'u.

Bir takip cihazının ESP32 tarafı MQTT ile ESP32 GPS takip cihazı yazısında, sürücü veya sevk uygulamaları ise mobil uygulamalar için MQTT yazısında ele alınıyor. Barındırma seçenekleri için bulut MQTT broker rehberine bakın.

Filonuzu ConnectMQ ile Takip Edin

app.connectmq.com adresinde kredi kartı olmadan ücretsiz bir Serverless broker oluşturun, takip cihazlarınızı veya simülatörü TLS üzerinden ona yönlendirin ve konumların canlı topic gezgininde gelişini izleyin. ConnectMQ, filonuz büyüdükçe Serverless (Paid) ve Dedicated planları sunan tam yönetilen bir MQTT servisidir.

Sık Sorulan Sorular

Bir araç takip cihazı konumunu MQTT üzerinden ne sıklıkla yayımlamalı?

Hareket hâlindeyken her 5 ila 15 saniyede bir, park hâlindeyken birkaç dakikada bir yaygın bir başlangıç noktasıdır. Kullanım senaryonuza ve veri paketinize göre ayarlayın.

GPS konumları için hangi QoS'u kullanmalıyım?

Sık gönderilen konumlar için QoS 0 çoğu zaman yeterlidir, çünkü bir sonraki konum öncekinin yerini alır. Ulaşması gereken olaylar ve komutlar için QoS 1 kullanın.

Bir aracın çevrimdışı olduğunu nasıl anlarım?

Aracın durum topic'ine offline değerinde retained bir Last Will kaydedin ve bağlandıktan sonra retained bir online yayımlayın.

ConnectMQ konum geçmişini saklayabilir mi?

Hayır, broker mesajları yönlendirir. Konumları PostGIS'li PostgreSQL gibi bir veritabanına yazmak için kendi abone servisinizi çalıştırın.

İlgili yazılar

BYOC MQTT Broker: Kendi Bulutunuzu Getirin Modeli Açıklandı

BYOC MQTT broker sizin bulut hesabınızda çalışır ama bir sağlayıcı tarafından işletilir. Modelin nasıl işlediğini, sorumluluk paylaşımını ve hesabınızı buna nasıl hazırlayacağınızı öğrenin.

7 dk okuma

Google Cloud IoT Core Alternatifi: Kapanış Sonrası Seçenekler ve Geçiş

Google, Cloud IoT Core'u Ağustos 2023'te kullanımdan kaldırdı. Bu rehber gerçekçi alternatifleri karşılaştırıyor, IoT Core kavramlarını standart MQTT'ye eşliyor ve verileriniz Google Cloud'a akmaya devam ederken cihazlarınızı yönetilen bir broker'a nasıl taşıyacağınızı gösteriyor.

7 dk okuma

Saniyede MQTT Mesaj Sayısı: Verim Nasıl Tahmin Edilir ve Ölçülür

MQTT verim planlaması birkaç formüle ve tek bir dürüst ölçüme dayanır. Saniyedeki gelen ve giden mesaj sayısını nasıl tahmin edeceğinizi, tepe değerleri nasıl hesaba katacağınızı ve sonucu bir broker planına nasıl eşleyeceğinizi öğrenin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.