Thursday, May 4, 2017

Một số điều cần biết về phương thức MQTT

MQTT (Message Queue Telemetry Transport) là một phương thức truyền nhận dữ liệu rất nhẹ dựa trên TCP/IP. Nó bắt đầu phổ biến theo sự phát triển của IoT devices, khi người ta cần một chuẩn kết nối không chiếm nhiều băng thông và không quan tâm nhiều đến độ trễ.

Pub-sub


Client sẽ subscribe một topic trên server (thường được gọi là broker), sau đó giữa client và broker sẽ mở một connection để bắt đầu gửi/nhận dữ liệu. Khi cần gửi, client (hoặc broker) sẽ publish một message trên connection đã mở, và broker (hoặc client) sẽ nhận được message đó.

Cần lưu ý là, sau khi server nhận message, broker rất có thể sẽ chuyển message này cho một broker (hoặc client) khác, trên một connection khác đã mở trước đó.

QoS


Quality of Service (QoS) có 3 level, cho biết mức độ đảm bảo của việc gửi message:

  • QoS 0 - at most once: client chỉ gửi message đi 1 lần, không cần quan tâm đến việc broker có thật sự nhận được chưa. Mức độ đảm bảo này tương đương với TCP.
  • QoS 1 - at least once: client gửi message đi nhiều lần, cho tới khi nhận được message phản hồi "đã nhận" từ broker.
  • QoS 2 - exactly once: client và broker sẽ gửi qua lại thông qua 4 bước, để đảm bảo message đã được gửi/nhận thành công:
    1. Client gửi nội dung message cho broker.
    2. Broker ack cho client (báo là "đã nhận, cần biết có bị duplicate không").
    3. Client ack tiếp cho broker (báo là "message đó là do chính mình gửi và chưa bị duplicate"). Sau bước này, broker mới thật sự xác nhận là message đúng và đúng 1 lần, và bắt đầu xử lý nội dung message.
    4. Broker báo hoàn tất cho client.

Last will and testament (LWT)


Dịch nghĩa thì nó là di chúc, và có 2 đặc tính:

  • Luôn tạo di chúc trước khi chết
  • Chỉ được sử dụng khi đã chết

Điều đó có nghĩa là: Ngay khi subscribe, nội dung LWT được thiết lập luôn. Và nó được dùng khi broker phát hiện thấy client đã bị offline.

Client và broker sử dụng KeepAlive của TCP để xác định xem client có bị offline hay không. (Cần lưu ý là LWT không gửi gì từ client lên broker, khi connection giữa chúng đã bị ngắt; mọi thông tin đều có từ khi thiết lập kết nối)

Một ví dụ cho việc sử dụng LWT là: Bạn có nhiều device IoT kết nối với server (broker), và nếu có device nào không kết nối được với broker, bạn sẽ nhận SMS thông báo ngay. Khi đó, trên broker sẽ giữ LWT của các device (client) và dùng gói tin KeepAlive để kiểm tra kết nối. Ngay khi không nhận được gói tin KeepAlive từ device, broker gửi gói tin thông báo đến dịch vụ SMS (mà bạn đã thiết lập trước đó) để thông báo bạn ngay.

Retain


Một message mà có RETAIN=1 thì broker sẽ lưu giữ nó, để khi bất kỳ một client nào kết nối vào đúng broker và topic đó thì sẽ nhận được message này. Nó khá là hữu dụng khi muốn thông báo một trạng thái đặc biệt nào đó, ví dụ topic này không còn được dùng nữa, hoặc cần phải force update phần mềm,...

Nhưng nguyên tắc là chỉ có 1 message duy nhất được RETAIN=1 trên broker với 1 topic. Tức là message có RETAIN=1 sau sẽ đè lên message trước. Và nếu RETAIN=1 mà QoS=0 thì mọi message RETAIN=1 đều bị xóa hết.

Xem thêm


No comments:

Post a Comment

Biểu mẫu liên hệ

Name

Email *

Message *