Her Proxus Uç Birim (Edge) Gateway'i bir gömülü MQTT broker içerir. Bu sayede Mosquitto veya EMQX gibi harici broker altyapısına gerek kalmaz. Edge mimarisi hakkında daha fazla bilgi için Durumsuz Uç Birim (Edge) Mimarisi bölümüne bakın.
MQTT Broker Ne Yapar?
Gömülü broker, cihazlarınız ile Proxus platformu arasında çift yönlü veri geçidi görevi görür:
📥 Giriş (Cihaz → Gateway)
Yerel ağdaki cihazlar telemetri verisini Gateway'e yayınlar:
- Cihaz, benzersiz Device Token ile
gateway-ip:1883adresine bağlanır - Cihaz,
telemetrykonusuna JSON payload gönderir - Gateway veriyi ayrıştırır, doğrular ve Veri Akış Hattı'na yönlendirir
Cihaz
PLC / IoT Sensör
MQTT Broker
Proxus Gateway
Veri Hattı
Ayrıştır & Doğrula
📤 Çıkış (Gateway → Birleşik İsim Alanı)
Gateway veriyi ISA-95 uyumlu konulara otomatik yeniden yayınlar:
- Veri, metrik bazlı telemetri mesajlarına dönüştürülür
- Cihaz durumu ve lastSeen zaman damgaları yayınlanır
- İsteğe bağlı özet mesaj tüm metrikleri toplar
- Harici sistemler (SCADA, MES, Analytics) bu konulara abone olabilir
Veri Hattı
İşlenmiş Veri
MQTT Broker
UNS Yayıncısı
UNS Tüketicileri
SCADA / MES / Analytics
Temel Faydalar
Sıfır Harici Bağımlılık
Mosquitto, EMQX veya başka broker kurmanıza gerek yok.
Token Tabanlı Kimlik Doğrulama
Her cihaz güvenli bağlantı için benzersiz token alır.
UNS Hazır
ISA-95 konu hiyerarşisi ile Birleşik İsim Alanı'na otomatik yayın.
Güvenlik için Güvenlik ve Erişim Kontrolü bölümüne bakın.
Konfigürasyon
MQTT broker, Proxus-config.toml içinde yapılandırılır:
Tüm ayarların listesi ve environment override'ları için Konfigürasyon Referansı bölümüne bakın.
Temel Ayarlar
[MQTTBroker]
MQTTBrokerPort = 1883
MasterToken = "your-master-token"
AllowAnonymous = false | Ayar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
| MQTTBrokerPort | int | 1883 | MQTT bağlantıları için TCP portu |
| MasterToken | string | - | Geliştirme için paylaşımlı token |
| AllowAnonymous | bool | false | Kimlik doğrulamayı kapatır |
Birleşik İsim Alanı Ayarları
[UNS]
# Payload formatı: "JSON" veya "SparkplugB"
UNSPayloadFormat = "JSON"
# SparkplugB özel ayarları
UNSGroupId = "ProxusGroup"
UNSEdgeNodeId = "ProxusEdge_MachineName"
# MQTT broker'da retain mesajları
UNSRetainMessages = true | Ayar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
| UNSPayloadFormat | string | JSON | Payload formatı: JSON veya SparkplugB |
| UNSGroupId | string | ProxusGroup | SparkplugB grup kimliği |
| UNSEdgeNodeId | string | auto | SparkplugB uç birim (edge) düğüm kimliği |
| UNSRetainMessages | bool | true | Her topic için son mesajı tutar |
Performans Optimizasyonları
[UNS.Optimizations]
# İnce payload, metrik başına context bilgisini çıkarır
TelemetryThinPayload = true
# Özet mesajlarda ISA-95 context'i ekle
SummaryIncludeContext = true
# Throttle aralıkları (ms, 0 = sınırsız)
SummaryIntervalMs = 5000
LastSeenIntervalMs = 5000
# Status sadece değişince yayınlansın
StatusOnChangeOnly = true
# Değer değişmedikçe özet yayınlama (hash tabanlı)
SummaryOnlyOnChange = false | Ayar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
| TelemetryThinPayload | bool | true | Metrik mesajından context çıkar |
| SummaryIncludeContext | bool | true | Özet mesajda ISA-95 context ekle |
| SummaryIntervalMs | int | 5000 | Özet yayınlama aralığı (ms) |
| LastSeenIntervalMs | int | 5000 | LastSeen yayınlama aralığı (ms) |
| StatusOnChangeOnly | bool | true | Durum sadece değişince yayınlansın |
| SummaryOnlyOnChange | bool | false | Metrik hash değiştiğinde özeti yayınla |
Kimlik Doğrulama Yöntemleri
Cihaz Token'ı (Önerilen)
Proxus'ta tanımlanan her cihaz için benzersiz Device Token üretilir. MQTT bağlantısında kullanıcı adı olarak bu token'ı kullanın. Daha fazla bilgi için Cihaz Ekle bölümüne bakın.
Host: gateway-ip:1883
Username: device-token
Password: (gerekli değil) Master Token
Geliştirme veya test için MasterToken kullanılabilir.
Anonymous
AllowAnonymous = true ise cihazlar kimlik bilgisi olmadan bağlanabilir. Sadece izole ağlarda kullanın. Güvenlik için Güvenlik ve Erişim Kontrolü bölümüne bakın.
Telemetri Yayınlama
Topic Sözleşmesi
Cihazlar telemetriyi şu topic'lere yayınlayabilir:
telemetrytelemetry/<herhangi-bir-alt-topic>
Payload Sözleşmesi
Cihazlar JSON payload gönderir. Parser düz, iç içe ve dizi yapıları kabul eder.
Örnek (düz):
{
"Temperature": 72.5,
"Pressure": 14.7,
"Status": "Running"
} Örnek (iç içe, nokta notasyonu ile flatten):
{
"line": {
"motor": {
"rpm": 1450
}
}
} Oluşan anahtar: line.motor.rpm
Örnek (dizi, index notasyonu ile flatten):
{
"temperatures": [22.1, 22.8]
} Oluşan anahtarlar: temperatures[0], temperatures[1]
Örnek (unit içeren metrik nesnesi):
{
"temperature": {
"value": 25.5,
"unit": "degC"
}
} Farklı Dillerde Yayınlama Örnekleri
import mqtt from "mqtt";
const client = mqtt.connect("mqtt://gateway-ip:1883", {
username: "device-token"
});
client.on("connect", () => {
const payload = JSON.stringify({
Temperature: 72.5,
Pressure: 14.7,
Status: "Running"
});
client.publish("telemetry", payload, { qos: 0 }, (err) => {
if (err) console.error("Publish failed:", err.message);
});
}); import json
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.username_pw_set("device-token", "")
client.connect("gateway-ip", 1883, 60)
payload = json.dumps({
"Temperature": 72.5,
"Pressure": 14.7,
"Status": "Running"
})
result = client.publish("telemetry", payload, qos=0)
if result.rc != mqtt.MQTT_ERR_SUCCESS:
print(f"Publish failed: {result.rc}")
client.disconnect() using MQTTnet;
using MQTTnet.Client;
var factory = new MqttClientFactory();
var client = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("gateway-ip", 1883)
.WithCredentials("device-token", string.Empty)
.Build();
await client.ConnectAsync(options);
var payload = """
{
"Temperature": 72.5,
"Pressure": 14.7,
"Status": "Running"
}
""";
var message = new MqttApplicationMessageBuilder()
.WithTopic("telemetry")
.WithPayload(payload)
.WithAtMostOnceQoS()
.Build();
await client.PublishAsync(message);
await client.DisconnectAsync(); Gateway otomatik olarak:
- JSON payload'ı ayrıştırır
- Kimliği doğrulanan cihazla ilişkilendirir
- Veri hattına yönlendirir
- Birleşik İsim Alanı konularına yayınlar (etkinse)
JSON UNS yayınında unit metrik bazında isteğe bağlıdır:
- Metrik birime sahipse mesajda
"unit": "<değer>"yer alır. - Unit boşsa
unitalanı hiç yazılmaz (boş string olarak gönderilmez).
Birleşik İsim Alanı Yayını
Broker veriyi ISA-95 uyumlu konulara kategori ayrımıyla yayınlar. Detaylar için Birleşik İsim Alanı bölümüne bakın.
Telemetri Konuları
Metrik değerleri ve cihaz özeti:
v1/{enterprise}/{site}/{area}/{processCell}/{equipmentModule}/{deviceName}/telemetry/{metric}
v1/{enterprise}/{site}/{area}/{processCell}/{equipmentModule}/{deviceName}/telemetry/_summary Metrik bazlı JSON payload örneği (unit ile):
{
"ts": "2026-03-02T12:00:00.000Z",
"value": 12.5,
"dataType": "Double",
"unit": "bar",
"quality": "Good",
"source": "Proxus"
} Unit boşsa aynı payload unit alanı olmadan yayınlanır.
_summary mesajında da aynı kural geçerlidir:
metrics.<tag>.unityalnızca unit boş değilse bulunur.
UNSPayloadFormat = "SparkplugB" olduğunda unit bilgisi metric properties içinde Unit alanına eşlenir. Unit property anahtarı her zaman bulunur; unit tanımlı değilse değeri boş olabilir.
Durum Konuları
Cihaz durumu ve son görülme zamanları (retained):
v1/{enterprise}/{site}/{area}/{processCell}/{equipmentModule}/{deviceName}/state/_status
v1/{enterprise}/{site}/{area}/{processCell}/{equipmentModule}/{deviceName}/state/_lastSeen Durum mesajları yaşam döngüsünde reason alanı taşıyabilir:
- Offline (
Client disconnected) - Offline (
Device removed) - Timeout (
Device timeout)
SparkplugB Desteği
UNSPayloadFormat = "SparkplugB" ise SparkplugB kodlaması kullanılır:
spBv1.0/{GroupId}/DDATA/{EdgeNodeId}/{DeviceId} Ingest Hata Sözleşmesi
Telemetri ayrıştırma başarısız olursa broker publish'i şu şekilde reddeder:
- PUBACK reason code:
PayloadFormatInvalid - Reason string: parser hata detayı
Yaygın nedenler:
- Geçersiz JSON sözdizimi
- Telemetry topic'ine JSON olmayan payload gönderilmesi
Runtime Davranış Notları
- Port fallback: Konfigüre edilen
MQTTBrokerPortdoluysa broker uygun bir boş portta başlar ve uyarı logu yazar. - Topic fallback: Gerekli ISA-95 metadata eksikse UNS publish atlanır.
- EquipmentModule fallback: Boş veya geçersiz EquipmentModule, stabil topic path için
_noneolarak normalize edilir.
Sağlık İzleme
MQTT broker, bağlı cihazları izler ve şunları takip eder:
- Son Görülme (Last Seen): Son mesaj zamanı
- Bağlantı Durumu: Online/Offline
- Mesaj Hızı: Dakikadaki mesaj sayısı
Veri göndermeyi kesen cihazlar otomatik olarak offline olarak işaretlenir. Ayrıntı için Sistem Logları bölümüne bakın.