IoT Otomasyon

MQTT ile Akıllı Otopark IoT: Park Yeri Sensörleri, Doluluk Sayımları ve Canlı Müsaitlik Haritası

IoT ile akıllı otopark için pratik bir yol haritası: park yeri sensörlerini seçin, MQTT topic'lerini tasarlayın, bölge başına boş yerleri toplayın ve güvenli WebSocket üzerinden canlı bir tarayıcı haritası çalıştırın.

Bir otoparktaki park yeri sensörlerinin doluluk bilgisini canlı müsaitlik haritasına yayınladığı akıllı otopark IoT diyagramı
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

Akıllı otopark IoT sistemleri, sürücülere daha tur atmaya başlamadan boş yerlerin nerede olduğunu, işletmecilere de otoparklarının gerçekte nasıl kullanıldığını söyler. Bu makale eksiksiz bir tasarımı adım adım ele alıyor: park yeri sensörlerini seçmek, MQTT topic'lerini yapılandırmak, bölge başına boş yerleri toplamak ve bir araç ayrıldığı anda güncellenen canlı bir tarayıcı haritası çalıştırmak.

Akıllı Bir Otopark Sisteminin Yapması Gerekenler

Pazarlama dilini bir kenara bırakırsanız, bir park yönlendirme sisteminin dört görevi vardır:

  1. Her park yerinin dolu olup olmadığını algılamak.
  2. Bu durum değişikliklerini sahadan arka uca güvenilir biçimde taşımak.
  3. Tek tek park yerlerini insanların önemsediği sayılara dönüştürmek: kat, bölge ve otopark başına boş yer.
  4. Sonucu tabelalarda, uygulamalarda ve haritalarda neredeyse gerçek zamanlı olarak göstermek.

MQTT, taşıma ve gösterim katmanlarına doğal olarak uyar. Her park yeri retained bir durum topic'idir, toplayıcılar wildcard ile abone olur ve tarayıcılar canlı güncellemeler için WebSocket üzerinden abone olur. Makalenin geri kalanı veriyi asfalttan ekrana kadar izliyor.

Park Yeri Sensörlerini Seçmek

Sensör tipi Nasıl çalışır Güçlü yanları Dikkat edilmesi gerekenler
Manyetometre (zemine gömülü veya yüzeye monte disk) Aracın Dünya'nın manyetik alanında yarattığı değişimi algılar Uzun pil ömrü, ışık ve hava koşullarından etkilenmez Komşu park yerlerinden girişim, kalibrasyon gerekir
Radar (manyetometreyle birlikte) Aracın alt yüzeyinden kısa menzilli yansıma Tek başına manyetometreye göre daha az yanlış pozitif Daha yüksek maliyet ve güç tüketimi
Ultrasonik (tavana monte) Aracın tavanına olan mesafeyi ölçer Basit, kapalı otoparklarda yaygın, çoğunlukla LED göstergeli Şebeke gücü ve kapalı alana montaj gerekir
Görüntü modelli kamera Tek kamera birçok park yerini kapsar Park yeri başına düşük maliyet, plaka okuyabilir Gizlilik kuralları, aydınlatma, uçta işleme

Açık otoparklar ve yol kenarı park yerleri için LoRaWAN veya NB-IoT üzerinde çalışan, pille beslenen manyetometre ya da radar diskleri olağan tercihtir. Kapalı otoparklarda ise genellikle yerel bir gateway'e sahip kablolu bir hat üzerinde tavan ultrasonik sensörleri kullanılır. Kamera sistemleri video değil sonuç yayınlar: uç cihaz algılamayı çalıştırır ve her park yeri için yalnızca occupied veya free yayınlar.

Broker'a Bağlantı Yolları

Sensörlerin broker'a nasıl ulaştığı, mimariyi sensör tipinden daha fazla belirler:

  • LoRaWAN: sensörler gateway'lerle konuşur, gateway'ler veriyi The Things Stack veya ChirpStack gibi bir ağ sunucusuna iletir ve ağ sunucusu ya da küçük bir köprü servisi çözümlenmiş veriyi broker'ınıza yayınlar. Yüzlerce park yeri tek bir MQTT bağlantısına dönüşür. Köprüleme adımı için MQTT ile The Things Network yazımıza bakın.
  • NB-IoT veya LTE-M: her sensör doğrudan MQTT üzerinden bağlanabilir ya da operatörün platformu üzerinden raporlayabilir; siz de bunu köprülersiniz.
  • Kablolu hat ve gateway: kapalı alandaki bir gateway ultrasonik sensörleri sorgular ve değişiklikleri yayınlar.
  • Uç kamera: küçük bir bilgisayar algılamayı çalıştırır ve park yeri başına sonuçları yayınlar.

Gateway yaklaşımı maliyetin ötesinde de caziptir. Bağlantı sayısını düşük tutar; böylece küçük bir broker planı bile büyük bir otoparkı kaldırır ve park yeri durumu uygulamalarınıza ulaştığında hâlâ temiz bir MQTT topic'idir.

Akıllı Otopark IoT için Topic Tasarımı

Fiziksel yerleşimi yansıtan bir hiyerarşi, her sorguyu bir wildcard'a dönüştürür:

parking/<site>/<level>/<bay>/state          retained: {"occupied":true,"ts":1760600000}
parking/<site>/<level>/<bay>/battery        retained: 3.41
parking/<site>/<level>/summary              retained: {"free":37,"total":120}
parking/<site>/summary                      retained: {"free":112,"total":420}
parking/<site>/<level>/<bay>/availability   retained online/offline (gateway-reported)
  • parking/central/+/+/state, merkez otoparktaki tüm park yerleridir.
  • parking/+/summary, her sahanın ana sayısıdır; şehir genelindeki bir tabelanın ihtiyacı olan tek şey de budur.

Hem park yeri durumlarını hem de özetleri retained tutmak, yeni bir uygulamanın veya tabelanın bağlanır bağlanmaz doğru sayıları göstermesini sağlar. Payload'a bir zaman damgası ekleyin; çünkü bir gündür raporlamayan bir park yeri "boş" değil, "bilinmiyor" durumundadır.

Kat Başına Boş Yerleri Toplamak

Bir toplayıcı tüm park yeri durumlarına abone olur, bunları bellekte tutar ve bir şey değiştiğinde özetleri yeniden yayınlar. Bu Python sürümü paho-mqtt 2.x ve herkese açık test broker'ını kullanır:

import json
import time
from collections import defaultdict
import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/p3v6z8"         # kendi rastgele önekiniz
SITE = "central"
STALE_AFTER = 6 * 3600                    # rapor gelmeyen saniye sayısı = bilinmiyor
bays = {}                                 # (level, bay) -> {"occupied": bool, "ts": float}

def publish_summaries(client):
    now = time.time()
    per_level = defaultdict(lambda: {"free": 0, "occupied": 0, "unknown": 0, "total": 0})
    for (level, _), s in bays.items():
        bucket = per_level[level]
        bucket["total"] += 1
        if now - s["ts"] > STALE_AFTER:
            bucket["unknown"] += 1
        elif s["occupied"]:
            bucket["occupied"] += 1
        else:
            bucket["free"] += 1
    site = {"free": 0, "occupied": 0, "unknown": 0, "total": 0}
    for level, b in per_level.items():
        client.publish(f"{PREFIX}/parking/{SITE}/{level}/summary", json.dumps(b), qos=1, retain=True)
        for k in site:
            site[k] += b[k]
    client.publish(f"{PREFIX}/parking/{SITE}/summary", json.dumps(site), qos=1, retain=True)

def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(f"{PREFIX}/parking/{SITE}/+/+/state", qos=1)

def on_message(client, userdata, msg):
    parts = msg.topic.split("/")
    level, bay = parts[-3], parts[-2]
    try:
        data = json.loads(msg.payload)
        bays[(level, bay)] = {"occupied": bool(data["occupied"]), "ts": float(data.get("ts", time.time()))}
    except (ValueError, KeyError):
        return
    publish_summaries(client)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="parking-agg-p3v6z8")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()

Terminalden birkaç park yerini simüle edin:

P=connectmq/demo/p3v6z8/parking/central
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-p3v6z8 -r -q 1 -t $P/l1/b001/state -m "{\"occupied\":true,\"ts\":$(date +%s)}"
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-p3v6z8 -r -q 1 -t $P/l1/b002/state -m "{\"occupied\":false,\"ts\":$(date +%s)}"
mosquitto_sub -h broker.connectmq.com -p 1883 -i view-p3v6z8 -t "$P/+/summary" -t "$P/summary" -v

Demo önekinin seviye eklediğine dikkat edin: yukarıdaki park yeri durum topic'i sekiz seviye derinliğindedir; bu, herkese açık broker'ın izin verdiği üst sınırdır. Özel bir broker'da öneki kaldırır ve doğrudan parking/ ile başlarsınız.

Büyük bir kurulumda her değişiklikte her özeti yayınlamak israftır. Güncellemeleri bir iki saniyede bir toplu gönderin; tek bir toplayıcı yetmezse, ücretli bir plandaki MQTT 5 paylaşımlı abonelikleri (shared subscriptions) yükü birden fazla örnek arasında bölmenizi sağlar.

Canlı Müsaitlik Haritası

Tarayıcı güvenli WebSocket üzerinden bağlanır ve yalnızca özetlere ya da ayrıntılı bir kat görünümü için park yeri durumlarına abone olur. MQTT.js ile:

import mqtt from "mqtt";

const PREFIX = "connectmq/demo/p3v6z8/parking/central";
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
  clientId: "parking-map-" + Math.random().toString(16).slice(2, 8),
  protocolVersion: 5,
});

client.on("connect", () => {
  client.subscribe(`${PREFIX}/+/summary`, { qos: 1 });
  client.subscribe(`${PREFIX}/l1/+/state`, { qos: 0 });
});

client.on("message", (topic, payload) => {
  const data = JSON.parse(payload.toString());
  const parts = topic.split("/");
  if (topic.endsWith("/summary")) {
    const level = parts[parts.length - 2];
    const el = document.querySelector(`[data-level="${level}"] .free`);
    if (el) el.textContent = `${data.free} free of ${data.total}`;
  } else {
    const bay = parts[parts.length - 2];
    const cell = document.querySelector(`[data-bay="${bay}"]`);
    if (cell) cell.className = data.occupied ? "bay occupied" : "bay free";
  }
});

Leaflet gibi bir harita kütüphanesinde aynı işleyici, saha başına bir işaretçinin rengini değiştirir. Özetler retained olduğu için harita, sayfa yüklendiği anda güncel tabloyu çizer. WebSocket üzerinden MQTT rehberimiz tarayıcı bağlantı ayrıntılarını ve kimlik bilgisi yönetimini ele alıyor; bu önemlidir: herkese açık bir web sayfası, park yeri topic'lerine yayın yapabilen kimlik bilgilerini asla barındırmamalıdır.

Kurulum Kontrol Listesi

  1. Sensörleri ortama göre seçin: açık alanda diskler, kapalı alanda ultrasonik, gizlilik kurallarının izin verdiği yerlerde kameralar.
  2. Bağlantı sayısını düşük tutmak için LoRaWAN veya kablolu ağları gateway'ler üzerinden köprüleyin.
  3. Park yeri durumlarını ve özetleri retained tutun; zaman damgası ekleyin.
  4. Sessiz kalan sensörleri bilinmiyor olarak değerlendirin ve düşük pilde uyarı verin.
  5. Herkese açık harita istemcilerine asla yayın yapabilen kimlik bilgileri göndermeyin; özetleri bunun yerine kendi arka ucunuz üzerinden sunun.
  6. Gateway'ler için 8883, tarayıcılar için 8084 portunda TLS kullanın.
  7. Doluluk analitiği için durum değişikliklerini ayrı bir abone ile bir veritabanına kaydedin.

Otopark Kurulumlarında Sık Yapılan Hatalar

Komşu park yeri girişimi. Büyük bir kamyonet yandaki park yerinin manyetometresini etkileyebilir. Sensörleri kurulumdan sonra kalibre edin ve sıkışık yerleşimlerde manyetometre ile radarı birleştiren üniteleri tercih edin.

Hayalet doluluk. Kar, birikmiş su veya düşmüş metal bir nesne, bir park yerinin günlerce dolu görünmesine neden olabilir. Alışılmadık derecede uzun süre durum değiştirmeyen park yerlerini işaretleyin ve gözden geçirin.

Saat kayması. Zaman damgaları sensörlerden geliyorsa, kayan bir saat taze veriyi bayat gösterir. Mesajları varışta gateway'in veya ağ sunucusunun damgalamasına izin verin.

Özetlerin gereğinden fazla yayınlanması. Yüzlerce tabela ve uygulamanın her tek park yeri değişikliğinde bir özet alması bant genişliğini boşa harcar. Özetleri hız sınırına tabi tutun ve yalnızca sayılar gerçekten değiştiğinde yayınlayın.

Tek Bir Otoparkın Ötesine Ölçeklemek

Birkaç saha parking/<site>/... altında yayın yapmaya başladığında, şehir genelindeki bir yönlendirme tabelası yalnızca parking/+/summary topic'ine abone olur. Bu, otopark, aydınlatma ve hava kalitesinin tek bir broker'ı paylaşıp ayrı alt ağaçlarda kaldığı daha geniş akıllı şehir IoT mimarisinde kullanılan mesajlaşma modelinin aynısıdır. Sıcaklığa duyarlı lojistik de soğuk zincir izleme yazısında anlatıldığı gibi benzer bir filo modeli kullanır.

Broker'ı kendiniz çalıştırmak, sürücülerin her gün güvendiği bir sistem için yama, sertifika ve izleme yükü demektir. ConnectMQ gibi bir yönetilen MQTT broker TLS'i, WebSocket uç noktalarını ve bağlantı yönetimini üstlenir; portaldeki canlı topic gezgini de park yeri durumlarının gelişini izlemenizi sağlar. Barındırma modellerini karşılaştırıyorsanız bulut MQTT broker yaklaşımına dair genel bakışımız yardımcı olur; IoT otomasyon rehberi de ilgili projeleri bir araya getiriyor.

Akıllı Otopark Pilotunuzu ConnectMQ'da Başlatın

Bir katı birkaç sensör ve bir gateway ile pilot olarak kurun, ConnectMQ'ya yayın yapın ve canlı haritayı bir test ekranına yansıtın. app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun; park yeri sayısı arttıkça ücretli veya dedicated bir plana geçin.

Sık Sorulan Sorular

Akıllı bir otopark sistemi kaç MQTT bağlantısına ihtiyaç duyar?

Genellikle park yeri sayısından çok daha azına. LoRaWAN ağ sunucuları ve kapalı alan gateway'leri birçok sensör adına tek bir bağlantı üzerinden yayın yapar; bu nedenle bağlantı sayısı park yerleriyle değil, gateway'ler ve uygulamalarla ölçeklenir.

Açık otopark yerleri için en iyi sensör hangisidir?

Pille çalışan manyetometre diskleri, ideal olarak yanlış okumaları azaltmak için radarla birleştirilmiş hâlde, açık alanda yaygın tercihtir; çünkü hava koşullarına dayanır ve tek pille yıllarca çalışır.

Herkese açık haritanın kötüye kullanılmasını nasıl önlerim?

Veriyi kendi arka ucunuz üzerinden iletin; örneğin özetlere abone olup bunları sayfaya ileten küçük bir sunucu kullanın. Park yeri veya özet topic'lerine yayın yapabilecek kimlik bilgilerini herkese açık bir sayfaya asla gömmeyin.

Park yeri sensörleri yerine kamera kullanabilir miyim?

Evet. Bir uç cihaz algılamayı çalıştırır ve asla video değil, yalnızca park yeri başına doluluk bilgisini yayınlar; bu da bant genişliğini düşük tutar ve gizlilik uyumluluğuna yardımcı olur.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

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