Nhầm lẫn về thiết lập kết nối máy khách-máy chủ trong MQTT


19

Theo thông số kỹ thuật , luôn luôn là khách hàng nên thiết lập kết nối với máy chủ.

Khách hàng:

Một chương trình hoặc thiết bị sử dụng MQTT. Máy khách luôn thiết lập Kết nối mạng với Máy chủ . Nó có thể

  • Xuất bản Tin nhắn ứng dụng mà các Khách hàng khác có thể quan tâm.

  • Đăng ký để yêu cầu Tin nhắn ứng dụng mà nó quan tâm để nhận được.

  • Hủy đăng ký để xóa yêu cầu cho Tin nhắn ứng dụng.

  • Ngắt kết nối với máy chủ.

Và nếu ứng dụng khách này đăng ký một Thông báo ứng dụng, thì máy chủ sẽ chuyển tiếp các tin nhắn đó đến ứng dụng khách cụ thể này.

Máy chủ:

Một chương trình hoặc thiết bị hoạt động như một trung gian giữa các Khách hàng xuất bản Tin nhắn ứng dụng và Khách hàng đã thực hiện Đăng ký. Một máy chủ

  • Chấp nhận kết nối mạng từ khách hàng.

  • Chấp nhận tin nhắn ứng dụng được xuất bản bởi khách hàng.

  • Quy trình Đăng ký và Hủy đăng ký yêu cầu từ Khách hàng.

  • Chuyển tiếp tin nhắn ứng dụng phù hợp với đăng ký của khách hàng .

Điều này có nghĩa là nếu một khách hàng đăng ký, thì nó vẫn được kết nối với máy chủ trong khi đăng ký hợp lệ mặc dù không có luồng dữ liệu trong hầu hết thời gian?

Tôi đi đến kết luận này bởi vì nếu máy khách ngắt kết nối sau khi đăng ký, thì máy chủ không thể chuyển tiếp tin nhắn đến nó vì đó là máy khách sẽ thiết lập kết nối. Nhưng nó sẽ không biết khi nào nên thiết lập lại nó.

Câu trả lời:


11

Điều này có nghĩa là nếu Khách hàng đăng ký, thì nó vẫn được kết nối với máy chủ trong khi đăng ký hợp lệ mặc dù không có luồng dữ liệu trong hầu hết thời gian?

Có, một khi kết nối được thực hiện, máy khách sẽ đợi tin nhắn, tuy nhiên nó cũng sẽ gửi tin nhắn PING đến máy chủ thường xuyên dựa trên giá trị giữ nguyên. Nếu máy chủ không nhận được tin nhắn PING thì nó có thể ngắt kết nối bạn.

nếu Máy khách ngắt kết nối sau khi đăng ký, thì máy chủ không thể chuyển tiếp tin nhắn đến nó bởi vì đó là Máy khách sẽ thiết lập cấu hình.

Nếu máy khách bị ngắt kết nối thì có, nó sẽ không nhận được tin nhắn, tuy nhiên có những tính năng trong MQTT hoạt động xung quanh vấn đề này.

Nếu máy khách kết nối với máy chủ với cờ 'Phiên làm sạch' được đặt thành false, thì máy chủ sẽ ghi nhớ đăng ký cho ID khách hàng đó. Khi máy khách kết nối lại, nó sẽ không cần phải đăng ký lại vì máy chủ sẽ ghi nhớ nó.

Hơn nữa, bạn có thể đăng ký bằng QoS Cấp 1 hoặc 2. Với các Cấp độ QoS này, Máy chủ sẽ lưu trữ thư và đợi máy khách kết nối lại trước khi gửi chúng. Bằng cách này, ngay cả khi máy khách ngắt kết nối và kết nối lại, chúng vẫn sẽ nhận được tất cả các tin nhắn được công bố.

Trang web này có một số tài nguyên tốt giải thích giao thức MQTT.


9

Điều này có nghĩa là nếu Khách hàng đăng ký, thì nó vẫn được kết nối với máy chủ trong khi đăng ký hợp lệ mặc dù không có luồng dữ liệu trong hầu hết thời gian?

Có, khách hàng của bạn sẽ chờ tin nhắn.

... nếu Máy khách ngắt kết nối sau khi đăng ký, thì máy chủ không thể chuyển tiếp tin nhắn

Bạn phải quản lý ngắt kết nối (đặc biệt là trong các thiết bị chạy bằng pin). Điều này có thể được thực hiện bằng tính năng " di chúc cuối cùng và di chúc " của MQTT: khi một thiết bị ngắt kết nối, nó sẽ gửi một tin nhắn cuối cùng.


1

Bạn nên phân biệt kết nối và phiên.

Tất cả mọi thứ được xác định bởi phiên. Khi kết nối MQTT được ủy quyền cho nhà môi giới lần đầu tiên, nhà môi giới tạo phiên cho kết nối này, thường dựa trên tham số kết nối máy khách-id.

Trong giao thức MQTT 3.1.1 (hiện tại mặc định trong hầu hết các máy khách / nhà môi giới) trong khi kết nối, bạn có thể chỉ định cờ sạch = true hoặc clean = false. Nếu sạch = true thì người môi giới sẽ tự động tạo phiên mới và đóng khi kết nối bị ngắt / đóng. Nếu sạch = false, nhà môi giới sẽ duy trì phiên và phân phối các sự kiện ở đó (vào một số loại lưu trữ phiên) ngay cả khi máy khách bị ngắt kết nối. Nó phụ thuộc vào việc thực hiện của các nhà môi giới nếu nó cho phép sạch = phiên sai và ttl tối đa của phiên đó là bao nhiêu.

Trong giao thức MQTT 5.0 (rất mới, nhưng phối cảnh) có thể chỉ định phiên ttl từ phía máy khách hoặc thậm chí thay đổi nó sau khi kết nối được thực hiện. Điều này cực kỳ hữu ích cho các kết nối WAN không ổn định (chủ yếu là IoT) hoặc các kết nối trạng thái như bạn mô tả.

AFAIK hiện MQTT 5,0 giao thức từ góc độ khách hàng có thể được sử dụng trong python với gmqtt và trong javascript với mqtt.js .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.