Node-RED

Node-RED Worldmap: MQTT ile GPS Cihazlarını Takip Etme

MQTT GPS mesajlarını node-red-contrib-web-worldmap ile hareket eden işaretçilere dönüştürün. Bir araç simülatörü, eşleme function'ı, eski veri yönetimi, rotalar ve haritayı Dashboard 2.0'a gömme ipuçları içerir.

MQTT GPS verileriyle bir şehir haritası üzerinde hareket eden, yön bilgisi içeren araç işaretçilerini gösteren Node-RED worldmap
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

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.name benzersiz kimliktir. Aynı adla yeni bir konum göndermek mevcut işaretçiyi taşır.
  • msg.payload.lat ve msg.payload.lon ondalı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:

  1. 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.
  2. Last Will and Testament kullanma. Her cihaz .../fleet/<vehicle>/status üzerinde offline gibi retained bir will mesajı ayarlar. Bağlantısı koparsa broker will mesajını yayınlar ve ikinci bir mqtt in node'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

  1. İşaretçi yok. Mesajların geldiğini bir debug node'uyla doğrulayın; name, lat ve lon alanlarının var olduğunu ve dize değil sayı olduğunu kontrol edin.
  2. İş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.
  3. Tüm araçlar tek bir işaretçiyi paylaşıyor. Her mesajın name değeri aynı. Bunu topic'ten veya bir cihaz kimliğinden türetin.
  4. Harita boş gri. Tarayıcı karo sunucusuna ulaşamıyor; internet erişimini veya proxy ayarlarını kontrol edin.
  5. Simgeler dönmüyor. Yalnızca yönlü simgeler bearing değerini dikkate alır; car gibi bir araç simgesine geçin.
  6. 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.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

8 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.