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:
- 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.
- 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.
- 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.
- 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
offlinewill kaydedin ve bağlandıktan sonra retained bironlineyayı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
- Takip cihazı başına benzersiz kimlik bilgileri ve client ID, 8883'te TLS.
- Her konumda cihaz zaman damgası; kesintilerden sonra gruplama.
- Uyarlanabilir raporlama aralığı.
- Last Will ile retained durum.
- Komutlar için kalıcı oturumlar ve message expiry.
- Topic adlarında kişisel veri yok.
- 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.



