Endüstriyel IoT

Hücresel ve Uydu Bağlantılarında Petrol ve Gaz Uzaktan İzleme İçin MQTT

Kuyu başları, boru hatları ve tank bataryaları için MQTT'yi hücresel ve uydu bağlantıları üzerinden kullanma; pahalı ve kesintili bağlantılara göre ayarlanmış keep alive, oturum, QoS ve report-by-exception ayarlarıyla.

Petrol ve gazda MQTT izlemeyi gösteren, güneş enerjili bir RTU ile uydu bağlantısı üzerinden bulut broker'a veri gönderen uzak bir kuyu başı
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

Petrol ve gazda MQTT kurulumları, fiber altyapıdan uzakta bulunan kuyu başlarını, boru hatlarını, kompresör istasyonlarını ve tank bataryalarını izlemenin standart bir yolu haline geldi. Report-by-exception modeli, küçük paketleri ve güvenilmez bağlantılara toleransı, hücresel ve uydu omurga bağlantılarının gerçekleriyle örtüşür. Bu rehberde MQTT ile uzaktan izleme mimarisinin nasıl kurulacağını, pahalı bağlantılarda hangi keep alive, oturum ve QoS ayarlarının işe yaradığını ve önemli olayları kaybetmeden bant genişliğini düşük tutan bir edge yayıncısının nasıl oluşturulacağını öğreneceksiniz.

Uzak Petrol ve Gaz Varlıkları Neden MQTT'ye Uygun?

Upstream ve midstream varlıklar, geleneksel sorgulamayı zahmetli hale getiren bir dizi kısıtı paylaşır:

  • Pahalı veya sınırlı bant genişliği. Uydu ve bazı hücresel planlar bayt başına ücretlendirilir veya sıkı veri kotalarına sahiptir. Değişmeyen değerleri birkaç saniyede bir sorgulamak para israfıdır.
  • Yüksek gecikme. Sabit yörüngeli (geostationary) uydu gidiş-dönüş süreleri uzundur; bu yüzden yüzlerce sahayı sırayla sorgulayan bir master çok yavaş tarama döngüleriyle karşılaşır.
  • Kesintili bağlantı. Hava koşulları, enerji ve kapsama sorunları, telemetri sisteminin alarmları kaybetmeden atlatması gereken kesintilere yol açar.
  • Enerji bütçeleri. Güneş enerjili RTU'lar ve gateway'ler radyonun mümkün olduğunca boşta kalmasını ister.
  • Güvenlik açıklığı. Uzak sahalara fiziksel olarak erişilebilir ve bunlar genel ağlar üzerinden bağlanır.

MQTT bunlara doğrudan çözüm sunar. Saha cihazları tek bir giden TLS bağlantısı açıp onu korur, yalnızca anlamlı değişiklikleri yayınlar ve veriyi SCADA'ya, historian'lara ve analitik araçlarına dağıtma işini broker'a bırakır. SCADA sistemlerinde MQTT rehberi sorgulamadan bu geçişi daha ayrıntılı açıklıyor.

Referans Mimari

Tipik bir petrol ve gaz MQTT mimarisinin dört katmanı vardır:

  1. Saha enstrümanları ve kontrolörler. Akış bilgisayarları, basınç ve sıcaklık transmitterleri, tank seviye radarları, pompa kontrolörleri, ESD sistemleri; genellikle yerelde Modbus veya bir üretici protokolü konuşurlar.
  2. Edge gateway veya RTU. Yerel cihazları okur, ölü bantlar uygular, değerlere zaman damgası ekler, kesintiler sırasında tamponlar ve MQTT yayınlar. SCADA uyumluluğu için çoğu zaman Sparkplug B kullanılır.
  3. Omurga bağlantısı (backhaul). Hücresel (LTE, LTE-M), lisanslı veya lisanssız radyo ya da uydu (sabit yörüngeli veya alçak yörüngeli).
  4. Broker ve tüketiciler. SCADA host'ları, historian'lar, üretim muhasebesi ve kaçak tespit sistemlerinin abone olduğu merkezi bir broker.

Güvenlik fonksiyonlarını yerelde tutun. Acil durdurma ve basınç koruması asla bağlantıya veya broker'a bağımlı olmamalıdır; MQTT yalnızca izleme verilerini ve onaylandığı durumlarda denetleyici (supervisory) komutları taşır.

MQTT'yi Hücresel ve Uydu Bağlantıları İçin Ayarlamak

Çoğu MQTT kütüphanesinin varsayılan ayarları bir LAN varsayar. Uzak bağlantılarda birkaç parametre, güvenilir bir sistem ile gürültülü ve pahalı bir sistem arasındaki farkı belirler.

Ayar LAN varsayılanı Uzak bağlantı önerisi Neden
Keep alive 60 sn 60 ila 300 sn, ancak operatörün NAT boşta zaman aşımının altında Her PINGREQ bayt harcar; çok uzun olursa NAT, TCP oturumunu sessizce düşürür
Oturum Clean session Kalıcı oturum (MQTT 5: clean start false ve session expiry) Abonelikler ve kuyruktaki QoS 1 mesajları kısa kesintilerden sağ çıkar
Telemetri için QoS 0 veya 1 Olaylar ve alarmlar için 1, bir sonraki örneğin yerini aldığı yüksek hızlı değerler için 0 Teslimat garantilerini onay ek yüküyle dengeler
Message expiry (MQTT 5) Yok Komutlarda ve kısa ömürlü verilerde ayarlayın Uzun bir kesintiden sonra bayat bir ayar noktasının uygulanmasını önler
Payload formatı Ayrıntılı JSON Kısa anahtarlı kompakt JSON veya Sparkplug B Protobuf Ölçülü (metered) bağlantılarda baytlar önemlidir
Yayın stratejisi Sabit aralık Report by exception ve yavaş bir heartbeat Çoğu değer nadiren değişir
Yeniden bağlanma bekleme süresi Anında Jitter ile üstel (exponential) Ağ genelindeki bir kesintiden sonra yeniden bağlanma fırtınalarını önler

Keep alive ve NAT zaman aşımları

Hücresel operatörler cihazları, boşta kalan TCP akışlarını operatörün belirlediği bir süreden sonra düşüren carrier-grade NAT arkasına yerleştirir. Keep alive süreniz bundan uzunsa bağlantı sessizce kopar ve cihaz bunu ancak bir sonraki yayını başarısız olduğunda fark eder. Bunu ölçün: 120 saniyeyle başlayın, broker bağlantı günlüğünde açıklanamayan yeniden bağlanmaları izleyin ve bunlar durana kadar süreyi kısaltın. Uydu bağlantılarında client'ın ping zaman aşımını seçerken uzun gidiş-dönüş sürelerini de hesaba katın.

Kuyu başı verileri için report by exception

Yüzde 0,1 kayan bir tubing basıncının bir uyduyu aşmasına gerek yoktur. Ölü bantları tag başına enstrüman doğruluğuna ve operasyonel önemine göre belirleyin, dijital durumları ve alarmları her değişiklikte yayınlayın ve yaşam kanıtı olarak 15 ila 60 dakikada bir tam yenileme gönderin. Report-by-exception rehberi ölü bant seçimini, MQTT için store-and-forward yazısı da kesintiler boyunca verinin nasıl tamponlanıp yeniden oynatılacağını açıklıyor.

Örnek: Bant Genişliğine Duyarlı Bir Edge Yayıncısı

Bu Python yayıncısı; kalıcı oturumlu MQTT 5, kısa JSON anahtarları, tag başına ölü bantlar, bir heartbeat, düşük değerli verilerde message expiry ve üstel yeniden bağlanma bekleme süresi kullanır. read_instruments() fonksiyonunu kendi Modbus veya akış bilgisayarı okumalarınızla değiştirin.

import json
import random
import time
import uuid

import paho.mqtt.client as mqtt
from paho.mqtt.packettypes import PacketTypes
from paho.mqtt.properties import Properties

# Laboratuvar için herkese açık test broker'ı: herkes tarafından okunabilir, bu yüzden yalnızca simüle edilmiş veri kullanın.
BROKER, PORT, USE_TLS = "broker.connectmq.com", 1883, False
USERNAME, PASSWORD = None, None                     # üretim: "YOUR_USERNAME", "YOUR_PASSWORD"
CLIENT_ID = f"wellpad-{uuid.uuid4().hex[:8]}"       # üretim: "YOUR_CLIENT_ID"
BASE = f"connectmq/demo/{uuid.uuid4().hex[:6]}/basin1/pad12/well3"

KEEPALIVE = 120
HEARTBEAT = 900                                     # 15 dakikada bir tam yenileme
DEADBANDS = {"tp": 2.0, "cp": 2.0, "ft": 0.5, "lv": 0.02}   # psi, psi, degF, m


def read_instruments():
    """Simulated values; replace with real Modbus or flow computer reads."""
    return {
        "tp": round(850 + random.uniform(-3, 3), 1),    # tubing basıncı, psi
        "cp": round(420 + random.uniform(-3, 3), 1),    # casing basıncı, psi
        "ft": round(96 + random.uniform(-1, 1), 1),     # akış hattı sıcaklığı, degF
        "lv": round(2.41 + random.uniform(-0.03, 0.03), 3),  # tank seviyesi, m
        "esd": False,                                   # ESD devreye girdi mi
    }


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code, "session present:", flags.session_present)
    client.publish(f"{BASE}/st", "online", qos=1, retain=True)


def on_disconnect(client, userdata, flags, reason_code, properties):
    print("Disconnected:", reason_code)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID,
                     protocol=mqtt.MQTTv5)
if USERNAME:
    client.username_pw_set(USERNAME, PASSWORD)
if USE_TLS:
    client.tls_set()
client.will_set(f"{BASE}/st", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=5, max_delay=300)   # üstel bekleme süresi
client.on_connect = on_connect
client.on_disconnect = on_disconnect

connect_props = Properties(PacketTypes.CONNECT)
connect_props.SessionExpiryInterval = 1800          # oturumu 30 dakika koru
client.connect(BROKER, PORT, keepalive=KEEPALIVE, clean_start=False,
               properties=connect_props)
client.loop_start()

expiring = Properties(PacketTypes.PUBLISH)
expiring.MessageExpiryInterval = 3600               # 1 saatten eski analog değerler işe yaramaz

last, last_full = {}, 0.0
print("Publishing under", BASE)

while True:
    values = read_instruments()
    now = time.time()
    full = now - last_full >= HEARTBEAT
    changed = {}
    for key, value in values.items():
        if isinstance(value, bool):
            if full or value != last.get(key):
                # alarmlar ve durumlar: QoS 1, kendi topic'i, süre sonu yok
                client.publish(f"{BASE}/alm/{key}", json.dumps(value), qos=1, retain=True)
                last[key] = value
        elif full or key not in last or abs(value - last[key]) >= DEADBANDS[key]:
            changed[key] = value
            last[key] = value
    if changed:
        changed["t"] = int(now)                     # epoch saniyesi: kısa ve net
        client.publish(f"{BASE}/v", json.dumps(changed, separators=(",", ":")),
                       qos=1, properties=expiring)
    if full:
        last_full = now
    time.sleep(10)

Değişen değerleri içeren bir mesaj {"tp":853.4,"t":1792139421} gibi görünür; her taramada tam bir anlık görüntü yerine onlarca bayt. Masanızdan izleyin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i wellpad-watch-01 \
  -t 'connectmq/demo/+/basin1/#' -v

Ücretsiz herkese açık MQTT broker oturumları 30 dakikaya kadar tutar; bu da yukarıdaki session expiry ile örtüşür. Bunu gerçek kesinti profilinize göre ayarlayacağınız yer ise kendi planınızdaki üretim broker'larıdır.

Uzak Sahalar İçin Güvenlik

Uzak sahalar, tesis sahasındaki ekipmanın maruz kalmadığı şekillerde açıktadır. En azından şu kontrolleri uygulayın:

  1. Genel bir ağ üzerindeki her bağlantı için sertifika doğrulaması etkin, 8883 portunda TLS.
  2. Saha başına benzersiz bir kullanıcı adı, parola ve client ID; böylece çalınan bir gateway tek başına iptal edilebilir.
  3. Yalnızca giden bağlantı; hücresel modemde veya uydu terminalinde gelen port yok.
  4. Varsayılan olarak salt okunur. Choke değişiklikleri gibi uzaktan komutlar onay iş akışları, kilitlemeler ve message expiry gerektirir.
  5. Sıkılaştırılmış gateway'ler: kullanılmayan servisler kapalı, mümkünse secure boot ve fiziksel kurcalamaya karşı koruma.
  6. Bağlantı sorunlarının yanı sıra kurcalamaya da işaret edebilecek beklenmedik bağlantı kopmalarında alarm.

Broker'ı Çalıştırmak

Merkezi broker en önemli paylaşılan bileşendir ve her sahadan erişilebilir olmalıdır. ConnectMQ; MQTT 3.1.1 ve 5.0, TLS, session expiry ve message expiry ile client başına kimlik bilgileri içeren tam yönetilen bir MQTT servisi sunar. Portalı canlı bir topic gezgini, sahaları ve varlıkları gruplayan bir ISA-95 cihazlar görünümü ve örneğin tank seviyesi veya casing basıncı için eşik tabanlı alarm kurallarını, incelemeye yönelik bir alarm günlüğüyle birlikte içerir. Sparkplug B kullanan edge gateway'lerin verileri çözülebilir ve Sparkplug konuşmayan tüketiciler için okunabilir ISA-95 topic'lerine yeniden yayınlanabilir. Daha büyük filolar için ücretli ve dedicated planlar bağlantı sayılarını ve mesaj boyutlarını artırır; BYOC ise yönetilen broker'ı kendi bulut hesabınıza yerleştirir.

Bağlantı seçenekleri ve modem davranışı hakkında daha fazlası için hücresel üzerinden MQTT, daha geniş mimari için MQTT ile endüstriyel IoT rehberine bakın.

Uzak Varlıkları ConnectMQ ile İzleyin

Bir kuyu sahası (well pad) veya bir kompresör istasyonuyla başlayın. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, bir edge gateway'i TLS ile bağlayın ve bir basınç veya seviye için ilk eşik alarmınızı kurun. Pilot kendini kanıtladığında aynı ConnectMQ bulut MQTT broker üzerinde ölçeklendirin.

Sık Sorulan Sorular

MQTT uydu bağlantıları üzerinden çalışır mı?

Evet. MQTT'nin kalıcı bağlantıları, küçük başlıkları ve report-by-exception yayını yüksek gecikmeli uydu bağlantılarına uygundur. Keep alive'ı ayarlayın, kalıcı oturumlar kullanın ve payload'ları kompakt tutun.

Hücresel bağlantıda hangi keep alive değerini kullanmalıyım?

Yaklaşık 120 saniyeyle başlayın ve operatörün NAT boşta zaman aşımının altında tutun. Açıklanamayan yeniden bağlanmalar görürseniz kısaltın.

Petrol ve gaz telemetrisi için Sparkplug B mi yoksa JSON mu daha iyi?

Sparkplug B daha kompakttır ve SCADA host'larıyla iyi entegre olur. Kısa anahtarlı JSON'u incelemek daha kolaydır ve payload'lar küçük, değişiklikler seyrek olduğunda gayet iyi çalışır.

Kapatma komutları MQTT üzerinden gönderilmeli mi?

Hayır. Güvenlik fonksiyonları yerelde ve ağdan bağımsız kalmalıdır. MQTT izleme için ve uygun güvenlik önlemleriyle denetleyici komutlar için uygundur.

İlgili yazılar

CODESYS MQTT Client: PLC Değişkenlerini Bir Broker'a Yayınlama

CODESYS IIoT MQTT Client kütüphanesini PLC değişkenlerini JSON olarak yayınlayacak şekilde yapılandırın, broker.connectmq.com üzerinde doğrulayın, ardından kimlik bilgileri ve TLS içeren özel bir broker'a geçin.

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.