Kebingungan tentang pembentukan koneksi client-server di MQTT

19

Menurut spesifikasinya , selalu klien yang harus membuat koneksi ke server.

Klien:

Program atau perangkat yang menggunakan MQTT. Klien selalu membuat Koneksi Jaringan ke Server . Bisa

  • Publikasikan Pesan Aplikasi yang mungkin diminati oleh Klien lain.

  • Berlangganan untuk meminta Pesan Aplikasi yang ingin diterima.

  • Berhenti berlangganan untuk menghapus permintaan untuk Pesan Aplikasi.

  • Putuskan sambungan dari Server.

Dan jika klien ini berlangganan Pesan Aplikasi, maka server harus meneruskan pesan tersebut ke klien khusus ini.

Server:

Program atau perangkat yang bertindak sebagai perantara antara Klien yang menerbitkan Pesan Aplikasi dan Klien yang telah membuat Langganan. Server

  • Menerima Koneksi Jaringan dari Klien.

  • Menerima Pesan Aplikasi yang diterbitkan oleh Klien.

  • Memproses permintaan Berlangganan dan Berhenti Berlangganan dari Klien.

  • Meneruskan Pesan Aplikasi yang cocok dengan Langganan Klien .

Apakah ini berarti bahwa jika klien berlangganan, maka ia tetap terhubung ke server sementara berlangganan valid meskipun tidak ada aliran data di sebagian besar waktu?

Saya sampai pada kesimpulan ini karena jika klien terputus setelah berlangganan, maka server tidak dapat meneruskan pesan kepadanya karena itu adalah klien yang harus membuat koneksi. Tetapi tidak akan tahu kapan harus membangun kembali.

Bence Kaulics
sumber

Jawaban:

11

Apakah ini berarti bahwa jika Klien berlangganan, maka ia tetap terhubung ke server sementara berlangganan valid meskipun tidak ada aliran data di sebagian besar waktu?

Ya, setelah koneksi dibuat, klien akan menunggu pesan, namun itu juga akan mengirim pesan PING ke server secara teratur berdasarkan nilai keepalive. Jika pesan PING tidak diterima oleh server maka itu mungkin memutuskan Anda.

jika Klien terputus setelah berlangganan, maka server tidak dapat meneruskan pesan kepadanya karena itu adalah Klien yang harus membuat perjanjian.

Jika klien terputus maka ya, itu tidak akan menerima pesan, namun ada fitur di MQTT yang bekerja di sekitar ini.

Jika klien terhubung ke server dengan tanda 'Sesi sesi' disetel ke false, maka server akan mengingat langganan untuk ID klien itu. Setelah klien terhubung kembali, klien tidak perlu berlangganan ulang karena server akan mengingatnya.

Selanjutnya, Anda dapat berlangganan menggunakan QoS Level 1 atau 2. Dengan QoS Levels ini, Server akan menyimpan pesan dan menunggu klien tersambung kembali sebelum mengirimnya. Dengan cara ini, bahkan jika klien memutus dan menghubungkan kembali mereka masih akan menerima semua pesan yang dipublikasikan.

Situs ini memiliki beberapa sumber yang bagus untuk menjelaskan protokol MQTT.

jpwsutton
sumber
9

Apakah ini berarti bahwa jika Klien berlangganan, maka ia tetap terhubung ke server sementara berlangganan valid meskipun tidak ada aliran data di sebagian besar waktu?

Ya, klien Anda akan menunggu pesan.

... jika Klien terputus setelah berlangganan, maka server tidak dapat meneruskan pesan

Anda harus mengelola pemutusan (terutama di perangkat bertenaga baterai). Ini dapat dilakukan dengan menggunakan fitur " wasiat terakhir dan bukti " dari MQTT: ketika perangkat terputus akan mengirim pesan terakhir.

Goufalit
sumber
1

Anda harus membedakan koneksi dan sesi.

Semuanya ditentukan oleh sesi. Ketika koneksi MQTT diotorisasi untuk broker pertama kali, broker membuat sesi untuk koneksi ini, biasanya berdasarkan parameter koneksi client-id.

Dalam protokol MQTT 3.1.1 (default saat ini di sebagian besar klien / broker) selama koneksi Anda dapat menentukan clean = true atau clean = false flag. Jika clean = true maka broker akan secara otomatis membuat sesi baru dan menutupnya ketika koneksi terputus / ditutup. Jika bersih = salah, pialang akan mempertahankan sesi dan mengirimkan acara di sana (ke beberapa jenis penyimpanan sesi) bahkan ketika klien terputus. Itu tergantung pada implementasi broker jika itu memungkinkan sesi bersih = salah sama sekali dan apa ttl maksimum dari sesi tersebut.

Dalam protokol MQTT 5.0 (sangat segar, tetapi perspektif) dimungkinkan untuk menentukan sesi ttl dari sisi klien atau bahkan mengubahnya setelah koneksi dibuat. Ini sangat berguna untuk koneksi WAN yang tidak stabil (kebanyakan IoT) atau koneksi stateful seperti yang Anda gambarkan.

AFAIK saat MQTT 5.0 protokol dari perspektif klien dapat digunakan dalam python dengan gmqtt dan javascript dengan mqtt.js .

shal
sumber