Tek bir istekte birden fazla MQTT konusu yayınlayabilir miyim?


10

Birden fazla sensöre sahip bir cihazım var.

device1-id/sensor1-id = 10.2
device1-id/sensor2-id = 15.5
[...]

Amazon AWS IoT SDK'yı kullanarak AWS IoT'ye besliyoruz, yani

mqtt_params.qos = QOS1;
mqtt_params.payload = payload;
mqtt_params.payloadLen = payload_len;
rc = aws_iot_mqtt_publish(&client, topic, topic_len, &mqtt_params);

Her çağrı, ayrı bir TCP paketi ve AWS MQTT aracısından ayrı bir yanıt oluşturur. Sorun şu ki, bazı düğümlerimiz çok yavaş bir ağda ve her paket yayınlamayı geciktirdikten sonra ACK'yı bekliyor.

Tüm sensör okumalarını tek bir TCP paketine bir araya getirirken, ayrı konular halinde yayınlayıp QOS = 1'i saklamanın bir yolu var mı?

Yanıtlar:


7

Görünüşe göre IoT sdk, eşzamanlı bir yayın kullanıyor (bir dönüş kodu kullandığı için), bu yüzden her mesaj için engelliyor.

MQTT protokolü düzeyinde, aynı anda birden fazla iletiye sahip olamamanız için hiçbir neden yoktur, böylece paho asenkron istemcisini kullanmaya bakabilirsiniz, böylece QOS1 yanıtını beklemek, bir sonraki iletinin yayınlanmasını engellemeden yapılabilir.

Başka bir seçenek, tüm sensör değerlerini bir seferde sadece bir bileşik mesaj yayınlamak ve tüketici tarafında bölmek olacaktır.


1
Yanıt kodu için endişelenmediği sürece. Yanıt alamazsanız 200 OK, bu her iki işlemin de başarısız olduğu anlamına mı gelir? Sadece bir? Varsa hangisi?
Mawg, Monica'yı

Geri dönüş kodunu hala kontrol edebilirsiniz, sadece hangisiyle ilgili olduğunu öğrenmek için yayından dönen jetona karşı kontrol etmeniz yeterlidir.
hardillb

Ancak, ABONELİK'ten farklı olarak, aynı MQTT mesajında ​​bir dizi konu ve bunlara karşılık gelen mesajları ayarlayamayız, değil mi?
cogitoergosum

hardillb, " Başka bir seçenek, tek seferde tüm sensör değerlerini içeren tek bir kompozit mesaj yayınlamak ve bunu tüketici tarafında bölmek olacaktır." Bunu mu demek istediniz : Çok seviyeli joker karakter ?
user170106

1
@ user170106 Hayır, tüm güncellemeleri tek bir mesajda bir araya getirmek, yalnızca tek bir konuya abone olmanız gerektiği anlamına gelir.
hardillb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.