Node-RED worldmap node'u, bir MQTT GPS mesaj akışını birkaç dakika içinde etkileşimli bir harita üzerinde hareket eden işaretçilere dönüştürür. Bu rehberde üç aracı simüle edecek, JSON konumlarını yön ve renk bilgisiyle worldmap işaretçilerine dönüştürecek, veri göndermeyi bırakan cihazları işaretleyecek ve rotaları çizeceksiniz. Sonunda gerçek GPS donanımına yönlendirebileceğiniz çalışan, canlı bir takip sisteminiz olacak.
Node-RED Worldmap Node'u Nasıl Çalışır
node-red-contrib-web-worldmap paketi, http://<node-red-host>:1880/worldmap adresinde Leaflet tabanlı bir harita sunan bir worldmap node'u ekler. Node'a gönderdiğiniz her mesaj bir nesneyi tanımlar:
msg.payload.namebenzersiz kimliktir. Aynı adla yeni bir konum göndermek mevcut işaretçiyi taşır.msg.payload.latvemsg.payload.lonondalık derece cinsinden konumdur.- İsteğe bağlı özellikler görünümü ve davranışı kontrol eder.
| Özellik | Örnek | Etki |
|---|---|---|
icon |
car, bus, fa-truck |
Yerleşik araç simgeleri veya bir Font Awesome simgesi |
iconColor |
green, #d33 |
İşaretçi rengi (destekleyen simgeler için) |
bearing |
87 |
Yönlü simgeleri gidiş yönüne döndürür |
label |
"Van 2" |
İşaretçinin yanında kalıcı metin |
layer |
"Vans" |
İşaretçileri açılıp kapatılabilen bir katmanda gruplar |
ttl |
300 |
Bu kadar saniye güncelleme olmazsa işaretçiyi kaldırır |
deleted |
true |
İşaretçiyi hemen kaldırır |
| diğer herhangi bir anahtar | speed: 42 |
İşaretçinin açılır penceresinde gösterilir |
Ek her özellik açılır pencerede yer aldığından, ek yapılandırma olmadan sensör değerlerini, sürücü adlarını veya pil seviyelerini aktarabilirsiniz. Komutlar da aynı node'u kullanır: { "lat": 41.01, "lon": 28.97, "zoom": 12 } gibi bir msg.payload.command içeren mesaj haritayı kaydırır ve yakınlaştırır.
Worldmap Node'unu Kurun
Editörde Manage palette → Install bölümünü açın ve node-red-contrib-web-worldmap aratın. Ya da komut satırından kurun:
cd ~/.node-red
npm install node-red-contrib-web-worldmap
# ardından Node-RED'i yeniden başlatın
Harita, karoları çevrimiçi karo sunucularından indirir; bu nedenle haritayı görüntüleyen tarayıcının internet erişimine ihtiyacı vardır. Node-RED ve MQTT'de yeniyseniz önce Node-RED MQTT rehberi kurulumu ve broker yapılandırmasını ele alır.
MQTT ile GPS Cihazlarını Simüle Edin
Her araç bir JSON konumunu kendi topic'ine yayınlar: connectmq/demo/a7f3k2/fleet/<vehicle>/gps. Araç kimliğini yalnızca payload'a değil topic'e de koymak, subscriber'ların tek bir aracı seçmesine veya hepsi için bir + wildcard'ı kullanmasına olanak tanır. Bu betik üç aracı bir şehir merkezi etrafında döngüler halinde hareket ettirir ve ücretsiz herkese açık MQTT broker olan broker.connectmq.com adresine yayın yapar. a7f3k2 yerine kendi rastgele dizenizi kullanın; herkese açık broker'daki konumları herkes görebilir, bu yüzden orada yalnızca simüle edilmiş veri kullanın.
# pip install "paho-mqtt>=2.0"
import json
import math
import random
import time
import uuid
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/a7f3k2/fleet"
CENTER_LAT, CENTER_LON = 41.0082, 28.9784
vehicles = {
"van1": {"angle": 0.0, "radius": 0.020, "speed": 0.010},
"van2": {"angle": 2.0, "radius": 0.030, "speed": 0.007},
"truck1": {"angle": 4.0, "radius": 0.045, "speed": 0.005},
}
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=f"gps-sim-{uuid.uuid4().hex[:8]}")
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
try:
while True:
for vid, v in vehicles.items():
v["angle"] += v["speed"] * random.uniform(0.8, 1.2)
lat = CENTER_LAT + v["radius"] * math.sin(v["angle"])
lon = CENTER_LON + v["radius"] * 1.3 * math.cos(v["angle"])
# Yön çembere teğettir, kuzeyden saat yönünde derece cinsinden
dlat = math.cos(v["angle"])
dlon = -1.3 * math.sin(v["angle"])
heading = (math.degrees(math.atan2(dlon, dlat)) + 360) % 360
payload = {
"lat": round(lat, 6),
"lon": round(lon, 6),
"heading": round(heading),
"speed": round(random.uniform(25, 55), 1),
"ts": int(time.time() * 1000),
}
client.publish(f"{PREFIX}/{vid}/gps", json.dumps(payload), qos=0)
time.sleep(3)
except KeyboardInterrupt:
pass
finally:
client.loop_stop()
client.disconnect()
Sık gönderilen konumlar için QoS 0 makul bir seçimdir: bir güncelleme kaybolursa bir sonraki birkaç saniye sonra gelir. Geofence alarmları gibi kaçırmamanız gereken olaylar için QoS 1 kullanın. MQTT ile araç takibi rehberi filolar için topic ve payload tasarımını daha ayrıntılı tartışır ve ESP32 GPS takip cihazı rehberi cihaz tarafını gerçek donanımla gösterir.
Node-RED Worldmap Akışını Oluşturun
Adım 1: Tüm araçlara abone olun
broker.connectmq.com:1883 adresine ve benzersiz bir client ID'ye yönlendirilmiş bir broker yapılandırmasıyla bir mqtt in node'u ekleyin. Topic'i connectmq/demo/a7f3k2/fleet/+/gps, çıktıyı da "a parsed JSON object" olarak ayarlayın.
Adım 2: MQTT payload'larını işaretçilere eşleyin
mqtt in node'u ile bir worldmap node'u arasına bir function node'u ekleyin:
// Function node "gps to worldmap marker"
const p = msg.payload;
const lat = Number(p.lat);
const lon = Number(p.lon);
// Eksik veya imkânsız koordinatları (ve klasik 0,0 "fix yok" değerini) reddet
if (!Number.isFinite(lat) || !Number.isFinite(lon) ||
Math.abs(lat) > 90 || Math.abs(lon) > 180 || (lat === 0 && lon === 0)) {
return null;
}
// connectmq/demo/a7f3k2/fleet/van1/gps -> van1
const id = msg.topic.split("/")[4];
const isTruck = id.startsWith("truck");
const speed = Number(p.speed) || 0;
msg.payload = {
name: id,
lat: lat,
lon: lon,
bearing: Number(p.heading) || 0,
icon: isTruck ? "fa-truck" : "car",
iconColor: speed > 50 ? "orange" : "green",
layer: isTruck ? "Trucks" : "Vans",
label: id,
speed: speed + " km/h",
lastSeen: new Date(p.ts || Date.now()).toLocaleTimeString(),
ttl: 120
};
return msg;
Deploy edin, ardından http://localhost:1880/worldmap adresini açın. Üç işaretçi görünür ve her üç saniyede bir hareket eder. Açılır pencerede hızı ve son görülme zamanını görmek için birine tıklayın. Bir araç yayını bırakırsa, ttl nedeniyle işaretçisi iki dakika sonra kaybolur.
Adım 3: Başlangıçta haritayı ortalayın
1 saniye sonra bir kez inject edecek şekilde ayarlanmış, {"command": {"lat": 41.0082, "lon": 28.9784, "zoom": 12}} JSON payload'una sahip bir inject node'u ekleyin ve onu aynı worldmap node'una bağlayın. Komutların geldikleri anda uygulandığını unutmayın; daha sonra bağlanan bir tarayıcı, komutu bağlantı anında yeniden göndermediğiniz sürece varsayılan görünümle başlar. worldmap in node'u bunun için kullanabileceğiniz bir bağlantı olayı üretir.
Adım 4: Rotaları çizin
Paket ayrıca bir worldmap tracks node'u içerir. Bunu function node'unuz ile worldmap node'u arasına yerleştirin ve tutulacak nokta sayısını, örneğin 50, ayarlayın. Hareket eden her işaretçinin arkasına bir çizgi ekler; bu da rotaları ve döngüleri bir bakışta belirgin kılar.
Eski ve Çevrimdışı Cihazları Yönetme
İşaretçileri ttl ile kaldırmak basittir, ancak çoğu zaman işaretçiyi tutup verisinin eski olduğunu göstermeyi tercih edersiniz. İki desen iyi çalışır:
- Yaşa göre renklendirme. Her aracın son mesajını flow context'te tutun, her 30 saniyede bir inject çalıştırın ve zaman damgası bir eşikten eskiyse her aracı
iconColor: "grey"ile yeniden gönderin. - Last Will and Testament kullanma. Her cihaz
.../fleet/<vehicle>/statusüzerindeofflinegibi retained bir will mesajı ayarlar. Bağlantısı koparsa broker will mesajını yayınlar ve ikinci birmqtt innode'u işaretçiyi günceller. Retained durum, yeni başlatılan bir Node-RED'in hangi araçların çevrimdışı olduğunu hemen bilmesini sağlar.
İkisini birleştirmek operatörlere net bir tablo sunar: hareket eden yeşil işaretçiler sağlıklıdır, gri olanlar gecikmiştir ve çevrimdışı olarak işaretlenenler bağlantılarını kaybetmiştir. Bu durum mesajlarını yönlendirmek Node-RED switch node için iyi bir iştir.
Haritayı Dashboard 2.0'a Gömme
Worldmap'in kendi sayfası vardır, ancak onu bir panonun içinde de gösterebilirsiniz. Dashboard 2.0'da şablonu /worldmap adresine yönlendirilmiş, gruba göre boyutlandırılmış bir iframe içeren bir ui-template widget'ı ekleyin. Bu, haritayı tek bir ekranda göstergelerin ve uyarıların yanında tutar. Dashboard 2.0 rehberi grupları ve yerleşimi açıklar.
Sorun Giderme Kontrol Listesi
- İşaretçi yok. Mesajların geldiğini bir debug node'uyla doğrulayın;
name,latvelonalanlarının var olduğunu ve dize değil sayı olduğunu kontrol edin. - İşaretçiler Gine Körfezi'ne zıplıyor. Bu, tipik bir "GPS fix yok" çıktısı olan 0,0 konumudur. Yukarıdaki function bunu filtreler.
- Tüm araçlar tek bir işaretçiyi paylaşıyor. Her mesajın
namedeğeri aynı. Bunu topic'ten veya bir cihaz kimliğinden türetin. - Harita boş gri. Tarayıcı karo sunucusuna ulaşamıyor; internet erişimini veya proxy ayarlarını kontrol edin.
- Simgeler dönmüyor. Yalnızca yönlü simgeler
bearingdeğerini dikkate alır;cargibi bir araç simgesine geçin. - Konumlar gerçeğin gerisinde kalıyor. Cihazın yayın aralığını ve keep-alive ayarlarını kontrol edin ve canlı haritalar için QoS 2 ile eski konumları kuyruğa almaktan kaçının.
GPS Takibini Üretime Taşıma
Konum verileri birçok bağlamda kişisel veridir; bu nedenle üretimde asla herkese açık bir broker üzerinden taşınmamalıdır. Cihazları ve Node-RED'i port 8883'te TLS ve cihaz başına kimlik bilgileri olan özel bir broker'a taşıyın. ConnectMQ ile portal her broker için bir kullanıcı adı, parola ve client ID üretir ve bir IP'den tekrarlanan başarısız girişler o IP'nin engellenmesine yol açar; bu da sahadaki cihazlarda kimlik bilgisi tahmin etmeye karşı yardımcı olur. Hücresel bağlantı kullanan cihazlar yalnızca giden yönde bağlandıkları için sabit bir genel endpoint'e sahip barındırılan bir MQTT broker'dan yararlanır. Önce barındırma seçeneklerini karşılaştırmak istiyorsanız bir MQTT broker'ın ne yaptığını ve broker'ların kimlik doğrulama ve limitler açısından nasıl farklılaştığını okuyun.
Cihazlarınızı ConnectMQ ile Takip Edin
app.connectmq.com adresinde kaydolun ve kredi kartı gerektirmeyen ücretsiz Serverless planıyla başlayın. Bir broker oluşturun, kimlik bilgilerini takip cihazlarınıza yükleyin, Node-RED yapılandırma node'unu TLS ile port 8883'e yönlendirin; worldmap'iniz özel, şifreli bir veri akışıyla canlı olur. ConnectMQ canlı topic gezgini, her aracın GPS topic'inin güncellendiğini doğrulamanın hızlı bir yoludur.
Sık Sorulan Sorular
Node-RED worldmap hangi URL'yi kullanır?
Harita varsayılan olarak http://<node-red-host>:1880/worldmap adresinde sunulur. Yol, worldmap node ayarlarından değiştirilebilir.
Yeni bir işaretçi oluşturmak yerine mevcut olanı nasıl taşırım?
Aynı name ile yeni bir mesaj gönderin. Worldmap node'u name değerini işaretçinin kimliği olarak kabul eder ve konumunu ve özelliklerini günceller.
Bir aracı haritadan nasıl kaldırırım?
Aracın name değeri ve deleted: true içeren bir mesaj gönderin ya da güncellemeler durduğunda işaretçilerin otomatik olarak kaybolması için ttl ayarlayın.
Worldmap GPS konumu dışında veri gösterebilir mi?
Evet. Payload'daki hız, pil veya sıcaklık gibi ek özellikler işaretçinin açılır penceresinde görünür ve layer özelliği işaretçileri türe göre gruplamanıza olanak tanır.



