MQTT'de istemci-sunucu bağlantı kurulumu ile ilgili karışıklık


19

Spesifikasyonlara göre , her zaman bir sunucu ile bağlantı kurması gereken istemcidir.

Müşteri:

MQTT kullanan bir program veya cihaz. İstemci her zaman Sunucuya Ağ Bağlantısı kurar . Bu olabilir

  • Diğer İstemcilerin ilgilenebileceği Uygulama İletileri yayımlayın.

  • Almakla ilgilendiği Uygulama Mesajlarını istemek için abone olun.

  • Uygulama İletileri isteğini kaldırmak için abonelikten çıkın.

  • Sunucu ile bağlantısını kesin.

Bu istemci bir Uygulama İletisine abone olursa, sunucunun bu iletileri bu istemciye iletmesi gerekir.

Sunucu:

Uygulama İletileri yayınlayan İstemciler ile Abonelik yapmış İstemciler arasında aracı görevi gören bir program veya aygıt. Bir sunucu

  • İstemcilerden Ağ Bağlantılarını Kabul Eder.

  • Müşteriler tarafından yayınlanan Uygulama Mesajlarını kabul eder.

  • İstemcilerin Abone Olma ve Abonelikten Çıkma isteklerini işler.

  • İstemci Abonelikleri ile eşleşen Uygulama Mesajlarını iletir .

Bu, bir istemci abone olursa, çoğu zaman veri akışı olmamasına rağmen abonelik geçerliyken sunucuya bağlı kaldığı anlamına mı gelir?

Bu sonuca geliyorum, çünkü abonelik sonrasında istemci bağlantısı kesilirse, sunucu bağlantı kurması gereken istemci olduğu için iletiyi iletemez. Ama ne zaman yeniden kurulacağını bilemez.

Yanıtlar:


11

Bu, bir Müşteri abone olursa, çoğu zaman veri akışı olmamasına rağmen abonelik geçerliyken sunucuya bağlı kaldığı anlamına mı gelir?

Evet, bağlantı kurulduktan sonra istemci iletileri bekler, ancak aynı zamanda tutma değerine bağlı olarak sunucuya düzenli olarak PING iletileri gönderir. Sunucu tarafından bir PING mesajı alınmazsa, bağlantınız kesilebilir.

İstemci abonelikten sonra bağlantıyı keserse, sunucu iletiyi iletmesi gereken İstemci olduğu için iletiyi iletemez.

İstemcinin bağlantısı kesilirse, evet, ileti almaz, ancak MQTT'de bu sorunu gideren özellikler vardır.

İstemci sunucuya 'Oturumu temizle' bayrağı false olarak ayarlanmışsa bağlanırsa, sunucu bu istemci kimliğinin aboneliğini hatırlar. İstemci yeniden bağlandığında, sunucu hatırlayacağından yeniden abone olması gerekmez.

Ayrıca, QoS Seviye 1 veya 2 kullanarak abone olabilirsiniz. Bu QoS Seviyeleri ile Sunucu mesajları depolayacak ve istemciyi göndermeden önce yeniden bağlanmasını bekleyecektir. Bu şekilde, istemci bağlantıyı kesip yeniden bağlasa bile, yayınlanan tüm iletileri almaya devam eder.

Bu sitede MQTT protokolünü açıklayan bazı iyi kaynaklar bulunmaktadır.


9

Bu, bir Müşteri abone olursa, çoğu zaman veri akışı olmamasına rağmen abonelik geçerliyken sunucuya bağlı kaldığı anlamına mı gelir?

Evet, müşteriniz iletileri bekleyecek.

... İstemcinin abonelikten sonra bağlantısı kesilirse, sunucu iletileri iletemez

Bağlantı kesmeyi yönetmelisiniz (özellikle pille çalışan cihazlarda). Bu, MQTT'nin " son vasiyetname ve vasiyetname " özelliği kullanılarak yapılabilir: bir cihazın bağlantısı kesildiğinde son mesaj gönderir.


1

Bağlantı ve oturumu farklılaştırmalısınız.

Her şey oturum tarafından tanımlanır. Aracıya ilk kez MQTT bağlantısı yetkilendirildiğinde, aracı bu bağlantı için genellikle istemci kimliği bağlantı parametresini temel alarak oturum oluşturur.

Bağlantı sırasında MQTT 3.1.1 protokolünde (şu anda çoğu istemci / aracıda varsayılan olarak) clean = true veya clean = false flag belirtebilirsiniz. Clean = true ise, aracı otomatik olarak yeni oturum oluşturur ve bağlantı kesildiğinde / kapatıldığında oturumu kapatır. Clean = false ise, aracı bağlantıyı kesecek olsa bile oturumu sürdürecek ve olayları (bir tür oturum depolamasına) gönderecektir. Bu, clean = false oturumuna izin veriyorsa ve bu oturumun maksimum ttl değerinin ne olduğu konusunda aracıların uygulanmasına bağlıdır.

MQTT 5.0 protokolünde (çok yeni, ancak perspektif) oturum ttl'sini istemci tarafından belirtmek veya hatta bağlantı kurulduktan sonra değiştirmek mümkündür. Bu, kararsız WAN bağlantıları (çoğunlukla IoT) veya tanımladığınız gibi durum bilgisi olan bağlantılar için son derece yararlıdır.

AFAIK şu anda istemci perspektifinden MQTT 5.0 protokolü gmqtt ile python ve mqtt.js ile javascript kullanılabilir .

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.