ความสับสนเกี่ยวกับการสร้างการเชื่อมต่อลูกค้า - เซิร์ฟเวอร์ใน MQTT


19

ตามข้อกำหนดมันเป็นไคลเอนต์ที่ควรสร้างการเชื่อมต่อกับเซิร์ฟเวอร์เสมอ

ลูกค้า:

โปรแกรมหรืออุปกรณ์ที่ใช้ MQTT ไคลเอนต์สร้างการเชื่อมต่อเครือข่ายไปยังเซิร์ฟเวอร์เสมอ มันสามารถ

  • เผยแพร่ข้อความแอปพลิเคชันที่ลูกค้ารายอื่นอาจสนใจ

  • สมัครสมาชิกเพื่อขอข้อความจากแอปพลิเคชันที่สนใจรับ

  • ยกเลิกการสมัครเพื่อลบคำขอสำหรับข้อความแอปพลิเคชัน

  • ตัดการเชื่อมต่อจากเซิร์ฟเวอร์

และหากลูกค้ารายนี้สมัครรับข้อความแอปพลิเคชันเซิร์ฟเวอร์ควรส่งต่อข้อความเหล่านั้นไปยังลูกค้ารายนี้โดยเฉพาะ

เซิร์ฟเวอร์:

โปรแกรมหรืออุปกรณ์ที่ทำหน้าที่เป็นสื่อกลางระหว่างลูกค้าที่เผยแพร่ข้อความแอปพลิเคชันและลูกค้าที่ได้สมัครสมาชิก เซิร์ฟเวอร์

  • ยอมรับการเชื่อมต่อเครือข่ายจากลูกค้า

  • ยอมรับข้อความแอปพลิเคชันที่เผยแพร่โดยลูกค้า

  • กระบวนการสมัครและยกเลิกการสมัครจากลูกค้า

  • ส่งต่อการประยุกต์ใช้ข้อความที่สมัครรับข้อมูลการแข่งขันไคลเอนต์

นี่หมายความว่าหากลูกค้าสมัครเป็นสมาชิกมันจะยังคงเชื่อมต่อกับเซิร์ฟเวอร์ในขณะที่การสมัครใช้งานถูกต้องแม้ว่าจะไม่มีการไหลของข้อมูลในเวลาส่วนใหญ่?

ฉันมาถึงข้อสรุปนี้เพราะหากลูกค้ายกเลิกการเชื่อมต่อหลังจากการสมัครสมาชิกแล้วเซิร์ฟเวอร์ไม่สามารถส่งต่อข้อความไปยังมันเพราะมันเป็นลูกค้าที่ควรสร้างการเชื่อมต่อ แต่มันจะไม่รู้ว่าจะสร้างใหม่เมื่อไหร่

คำตอบ:


11

นี่หมายความว่าหากลูกค้าสมัครสมาชิกก็จะยังคงเชื่อมต่อกับเซิร์ฟเวอร์ในขณะที่การสมัครสมาชิกนั้นถูกต้องแม้ว่าจะไม่มีการไหลของข้อมูลในเวลาส่วนใหญ่?

ใช่เมื่อทำการเชื่อมต่อแล้วไคลเอนต์จะรอข้อความอย่างไรก็ตามจะส่งข้อความ PING ไปยังเซิร์ฟเวอร์เป็นประจำตามค่า keepalive หากเซิร์ฟเวอร์ไม่ได้รับข้อความ PING ข้อความอาจยกเลิกการเชื่อมต่อคุณ

หากลูกค้ายกเลิกการเชื่อมต่อหลังจากการสมัครสมาชิกเซิร์ฟเวอร์จะไม่สามารถส่งต่อข้อความได้เนื่องจากเป็นลูกค้าที่ควรสร้างการเชื่อมต่อ

หากลูกค้าถูกตัดการเชื่อมต่อแล้วใช่มันจะไม่ได้รับข้อความอย่างไรก็ตามมีคุณสมบัติใน MQTT ที่สามารถแก้ไขได้

หากไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์ด้วยการตั้งค่าสถานะ 'ล้างเซสชัน' เป็นเท็จเซิร์ฟเวอร์จะจดจำการสมัครสมาชิกสำหรับรหัสลูกค้านั้น เมื่อไคลเอนต์เชื่อมต่อใหม่แล้วก็ไม่จำเป็นต้องสมัครใหม่เพราะเซิร์ฟเวอร์จะจำได้

นอกจากนี้คุณสามารถสมัครสมาชิกโดยใช้ QoS ระดับ 1 หรือ 2 ด้วยระดับ QoS เหล่านี้เซิร์ฟเวอร์จะเก็บข้อความและรอให้ไคลเอนต์เชื่อมต่ออีกครั้งก่อนส่งพวกเขา วิธีนี้แม้ว่าลูกค้ายกเลิกการเชื่อมต่อและเชื่อมต่อใหม่พวกเขาจะยังคงได้รับข้อความที่เผยแพร่ทั้งหมด

ไซต์นี้มีแหล่งข้อมูลที่ดีอธิบายโปรโตคอล MQTT


9

นี่หมายความว่าหากลูกค้าสมัครสมาชิกก็จะยังคงเชื่อมต่อกับเซิร์ฟเวอร์ในขณะที่การสมัครสมาชิกนั้นถูกต้องแม้ว่าจะไม่มีการไหลของข้อมูลในเวลาส่วนใหญ่?

ใช่ลูกค้าของคุณจะรอข้อความ

... หากลูกค้ายกเลิกการเชื่อมต่อหลังจากสมัครสมาชิกเซิร์ฟเวอร์จะไม่สามารถส่งต่อข้อความได้

คุณต้องจัดการตัดการเชื่อมต่อ (โดยเฉพาะในอุปกรณ์ที่ใช้แบตเตอรี่) สิ่งนี้สามารถทำได้โดยใช้คุณสมบัติ " พินัยกรรมและพินัยกรรม " ของ MQTT: เมื่ออุปกรณ์ตัดการเชื่อมต่ออุปกรณ์จะส่งข้อความสุดท้าย


1

คุณควรแยกการเชื่อมต่อและเซสชัน

ทุกอย่างถูกกำหนดโดยเซสชั่น เมื่อการเชื่อมต่อ MQTT ได้รับอนุญาตให้นายหน้าครั้งแรกนายหน้าสร้างเซสชั่นสำหรับการเชื่อมต่อนี้มักจะขึ้นอยู่กับพารามิเตอร์การเชื่อมต่อลูกค้ารหัส

ในโปรโตคอล MQTT 3.1.1 (ปัจจุบันเป็นค่าเริ่มต้นในไคลเอนต์ / โบรกเกอร์ส่วนใหญ่) ในระหว่างการเชื่อมต่อคุณสามารถระบุ clean = true หรือ clean = false flag หาก clean = true โบรกเกอร์จะสร้างเซสชันใหม่โดยอัตโนมัติและปิดเมื่อการเชื่อมต่อเสียหาย / ปิด หาก clean = false โบรกเกอร์จะรักษาเซสชันและส่งมอบเหตุการณ์ (ลงในที่เก็บข้อมูลเซสชันบางประเภท) แม้ว่าลูกค้าจะถูกตัดการเชื่อมต่อ มันขึ้นอยู่กับการใช้งานโบรกเกอร์ถ้าอนุญาตให้เซสชันสะอาด = false เลยและอะไรคือจำนวนสูงสุดของเซสชันดังกล่าว

ในโปรโตคอล MQTT 5.0 (ใหม่มาก แต่เป็นเปอร์สเปคทีฟ) คุณสามารถระบุเซสชัน ttl จากฝั่งไคลเอ็นต์หรือเปลี่ยนแปลงได้หลังจากทำการเชื่อมต่อแล้ว สิ่งนี้มีประโยชน์อย่างมากสำหรับการเชื่อมต่อ WAN ที่ไม่เสถียร (IoT ส่วนใหญ่) หรือการเชื่อมต่อที่ไม่เป็นรัฐเหมือนที่คุณอธิบาย

AFAIK ปัจจุบัน MQTT 5.0 โปรโตคอลจากมุมมองของลูกค้าสามารถนำมาใช้ในหลามกับgmqttและจาวาสคริปต์ด้วยmqtt.js

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.