MQTT là gì?
Nội dung bài viết:
1. MQTT là gì?
2. Lịch sử
3. MQTT Architecture
4. Message Architecture
5. Chủ đề (Topics)
6. Tin nhắn lưu giữ (Retained Messages)
7. Di chúc và Di ngôn cuối cùng (Last will and testament)
8. MQTT Messages
9. Bảo mật
10. Cập nhật tiêu chuẩn MQTT v5.0
1. MQTT là gì?
- MQTT là viết tắt của Message Queuing Telemetry Transport. Đây là một giao thức nhắn tin nhẹ để sử dụng trong các trường hợp các máy khách (Clients) cần một Code Bộ nhớ nhỏ và được kết nối với các mạng không đáng tin cậy hoặc mạng có tài nguyên băng thông hạn chế. Nó chủ yếu được sử dụng cho giao tiếp giữa máy với máy (M2M) hoặc các loại kết nối internet vạn vật (Internet of Things).
2. Lịch sử
- MQTT ban đầu được tạo ra bởi Tiến sĩ Andy Stanford-Clark và Arlen Nipper vào năm 1999. Mục đích ban đầu của phương pháp truyền thông này là cho phép các thiết bị giám sát được sử dụng trong ngành dầu khí gửi dữ liệu của họ đến các máy chủ từ xa. Trong nhiều trường hợp, các thiết bị giám sát như vậy đã được sử dụng ở những vị trí xa nơi mà bất kỳ loại kết nối điện thoại cố định, kết nối có dây hoặc truyền dẫn vô tuyến nào cũng khó hoặc không thể thiết lập được. Vào thời điểm đó, lựa chọn duy nhất cho những trường hợp như vậy là liên lạc qua vệ tinh, rất đắt và được tính phí dựa trên lượng dữ liệu được sử dụng. Với hàng nghìn cảm biến trong lĩnh vực này, ngành công nghiệp dầu khí cần một hình thức giao tiếp có thể cung cấp dữ liệu đủ tin cậy để sử dụng, đồng thời sử dụng băng thông tối thiểu.
- MQTT được tiêu chuẩn hóa dưới dạng mã nguồn mở (Open Source) theo Tổ chức vì sự tiến bộ của tiêu chuẩn thông tin có cấu trúc (OASIS) vào năm 2013. OASIS hiện vẫn quản lý tiêu chuẩn MQTT.
3. MQTT Architecture
- MQTT chạy trên TCP / IP sử dụng cấu trúc liên kết PUSH / SUBSCRIBE topology. Trong MQTT architecture, có hai loại hệ thống: Máy khách (Clients) và Trung gian (Brokers). Một trung gian (Broker) là máy chủ mà các máy khách (Clients) giao tiếp. Broker nhận thông tin liên lạc từ các máy khách (Clients) và gửi các thông tin liên lạc đó cho các máy khách (Clients) khác. các máy khách (Clients) không trao đổi trực tiếp với nhau, mà kết nối với Broker. Mỗi máy khách (Client) có thể đóng vai trò là bên gửi tin (Publisher), bên nhận tin (Subscriber) hoặc cả hai.
- MQTT là một giao thức hướng sự kiện (Event-Driven Protocol). Không có xảy ra việc truyền dữ liệu định kỳ hoặc liên tục trong MQTT. Điều này giữ cho việc truyền tải ở mức tối thiểu. Một máy khách (client) chỉ gửi tin khi có thông tin được gửi đi, và một Broker chỉ gửi thông tin cho bên nhận tin khi có dữ liệu mới.
4. Message Architecture
- Một cách khác MQTT giảm thiểu việc truyền tải của nó là với cấu trúc thông điệp nhỏ, được xác định chặt chẽ. Mỗi tin nhắn (Message) có tiêu đề cố định chỉ 2 byte. Một tiêu đề tùy chọn có thể được sử dụng nhưng sẽ làm tăng kích thước của tin nhăn. Kích thước tin nhắn được giới hạn chỉ 256 MB. Ba mức Chất lượng Dịch vụ (QoS - Quality of Service) khác nhau cho phép các nhà thiết kế mạng lựa chọn giữa việc giảm thiểu truyền dữ liệu và tối đa hóa độ tin cậy.
-
QoS 0 - Cung cấp số lượng truyền dữ liệu tối thiểu. Với mức này, mỗi tin nhắn được gửi đến bên nhận (Subscriber) một lần mà không cần xác nhận. Không có cách nào để biết nếu bên nhận có nhận được tin nhắn hay không. Phương pháp này đôi khi được gọi là “Gửi và quên - Fire and Forget” hoặc “Chỉ gửi một lần duy nhất - At Most Once Delivery”. Bởi vì mức chất lượng dịch vụ này giả định rằng quá trình gửi đã hoàn tất, các tin nhắn sẽ không được lưu trữ để gửi cho các máy khách (clients) bị ngắt kết nối mà sau này sẽ kết nối lại.
-
QoS 1 – Bên trung gian (Broker) cố gắng gửi thông báo và sau đó chờ phản hồi xác nhận từ bên nhận tin (Subscriber). Nếu không nhận được xác nhận trong một khung thời gian cụ thể, tin nhắn sẽ được gửi lại. Sử dụng phương pháp này, bên nhận tin có thể nhận được tin nhắn nhiều lần nếu bên trung gian (Broker) không nhận được xác nhận của bên nhận tin (Subscriber) kịp thời. Điều này đôi khi được gọi là "Gửi ít nhất một lần - At Least Once Delivery".
-
QoS 2 – Máy khách (Client) và Trung gian (Broker) sử dụng kiểu bắt tay bốn bước để đảm bảo rằng thông báo được nhận và chỉ được nhận một lần. Điều này đôi khi được gọi là "Gửi chính xác trong một lần duy nhất - Exactly Once Delivery".
- Đối với các tình huống mà thông tin liên lạc đáng tin cậy nhưng hạn chế về tài nguyên, QoS 0 có thể là lựa chọn tốt nhất. Đối với các tình huống mà thông tin liên lạc không đáng tin cậy, nhưng các kết nối không bị giới hạn tài nguyên, thì QoS 2 sẽ là lựa chọn tốt nhất. QoS 1 cung cấp một loại giải pháp tốt nhất nhưng yêu cầu ứng dụng nhận dữ liệu phải biết cách xử lý các bản sao.
- Đối với cả QoS 1 và QoS 2, tin nhắn được lưu (Save) hoặc xếp hàng đợi (Queue) cho các máy khách ngoại tuyến (Offline) và có phiên liên tục đã thiết lập. Các tin nhắn này được gửi lại (theo mức QoS thích hợp) sau khi máy khách (Client) trực tuyến trở lại.
5. Chủ đề (Topics)
- Thông điệp trong MQTT được xuất bản dưới dạng chủ đề (Topics). Chủ đề là các cấu trúc trong hệ thống phân cấp sử dụng ký tự gạch chéo (/) làm dấu phân cách. Cấu trúc này tương tự như cấu trúc của cây thư mục trên hệ thống tệp máy tính. Một cấu trúc chẳng hạn như Sensors/OilandGas/Pressure/ cho phép bên nhận tin (Subscriber) chỉ định rằng nó chỉ nên được gửi dữ liệu từ các máy khách (clients) gửi về chủ đề Pressure hoặc rộng hơn, có thể là tất cả dữ liệu từ các máy khách (Clients) gửi về bất kỳ chủ đề sensors/OilandGas nào . Chủ đề không được tạo rõ ràng trong MQTT. Nếu một Trung gian (Broker) nhận được dữ liệu được gửi đi cho một chủ đề hiện không tồn tại, chủ đề đó sẽ được tạo đơn giản và các máy khách (clients) có thể nhận chủ đề mới.
6. Tin nhắn lưu giữ (Retained Messages)
- Để giữ cho Bộ nhớ nhỏ, các thông báo đã nhận không được lưu trữ trên Broker trừ khi chúng được đánh dấu bằng cờ được giữ lại (Retained Flag). Đây được gọi là một tin nhắn được giữ lại (Retained Message). Người dùng muốn lưu trữ các tin nhắn đã nhận sẽ cần phải lưu trữ chúng ở nơi khác bên ngoài giao thức MQTT Protocol. Có một ngoại lệ.
- Là một giao thức hướng sự kiện (Event-Driven Protocol), thậm chí có khả năng bên nhận (Subscriber) nhận được rất ít tin nhắn cho một chủ đề nhất định, thậm chí trong một khoảng thời gian dài. Trong cấu trúc chủ đề đã đề cập trước đây, có lẽ các thông báo đến chủ đề Pressure chỉ được gửi khi một cảm biến phát hiện áp suất đã vượt quá một mức nhất định. Giả sử rằng bất cứ điều gì mà cảm biến đang theo dõi không thường xuyên bị lỗi, có thể là vài tháng, hoặc thậm chí nhiều năm trước khi máy khách (Clients) gửi đi thông báo về chủ đề đó.
- Để đảm bảo rằng một bên nhận (Subscriber) mới nhận được tin nhắn từ một chủ đề, các Broker có thể giữ lại tin nhắn cuối cùng được gửi cho mỗi chủ đề. Đây được gọi là một tin nhắn được giữ lại. Bất cứ khi nào một máy khách (clients) mới nhận được một chủ đề hoặc khi một máy khách (clients) hiện tại trực tuyến trở lại, thông báo được giữ lại sẽ được gửi đến những bên nhận (Subscriber), do đó đảm bảo rằng việc nhận thông tin của nó đang hoạt động và nó có thông tin mới nhất.
7. Di chúc và Di ngôn cuối cùng (Last will and testament)
- Khi thông tin liên lạc không đáng tin cậy, có thể bên gửi (Publisher) sẽ ngắt kết nối khỏi mạng mà không có cảnh báo. Bên gửi (Publisher) có thể gửi đi một tin nhắn để gửi đến bên nhận (Subscriber) trong trường hợp Bên gửi (Publisher) ngắt kết nối đột ngột, đây được gọi là di chúc và di ngôn cuối cùng. Thông báo này được lưu trong bộ nhớ cache trên bên trung gian (Broker) và được gửi đến bên nhận (Subscriber) nếu Bên gửi (Publisher) ngắt kết nối không đúng cách. Thông thường, một thông báo như vậy bao gồm thông tin cho phép xác định Bên gửi (Publisher) bị ngắt kết nối để có thể thực hiện các hành động thích hợp.
8. MQTT Messages
- Để giữ cho giao thức nhỏ gọn, chỉ có bốn hành động có thể thực hiện với bất kỳ giao tiếp nào: Publish, Subscribe, Unsubscribe, hoặc Ping.
-
Publish - Gửi một khối dữ liệu có chứa tin nhắn sẽ được gửi. Dữ liệu này cụ thể cho từng cách triển khai nhưng có thể là một cái gì đó đơn giản như chỉ thị bật (ON)/ tắt (OFF) hoặc giá trị của một cảm biến nhất định, chẳng hạn như nhiệt độ, áp suất, v.v. Trong trường hợp chủ đề được gửi đi không tồn tại, chủ đề này được tạo trên bên trung gian (Broker).
-
Subscribe - Biến máy khách (Client) thành bên nhận (Subscriber) một chủ đề. Các chủ đề có thể được đăng ký cụ thể hoặc thông qua các ký tự đại diện cho phép đăng ký toàn bộ nhánh chủ đề hoặc một phần của bất kỳ nhánh chủ đề nào. Để đăng ký, một máy khách (Client) gửi một gói SUBSCRIBE và nhận lại một gói SUBACK. Nếu có một tin nhắn được giữ lại cho chủ đề, bên nhận (Subscriber) mới cũng nhận được tin nhắn đó.
-
PING – Máy khách (Client) có thể kiểm tra kết nối bằng ping với bên trung gian (Broker). Một gói PINGREQ được gửi bởi bên nhận (Subscriber) và một gói PINGRESP trả lời được gửi trả lời. Ping có thể được sử dụng để đảm bảo rằng kết nối vẫn hoạt động và phiên TCP không bị đóng đột ngột bởi thiết bị mạng khác như bộ định tuyến hoặc cổng.
-
DISCONNECT - Bên nhận (Subscriber) hoặc bên gửi (Publisher) có thể gửi thông báo NGẮT KẾT NỐI đến bên trung gian (Broker). Thông báo này thông báo cho bên trung gian (Broker) rằng họ sẽ không cần gửi hoặc xếp hàng các tin nhắn cho một bên nhận (Subscriber) và nó sẽ không nhận dữ liệu từ bên gửi (Publisher) nữa. Kiểu ngắt kết nối này cho phép máy khách (Client) kết nối lại bằng cách sử dụng cùng một danh tính máy khách như trước đây. Khi máy khách ngắt kết nối mà không gửi tin nhắn ngắt kết nối, di chúc và di ngôn cuối cùng của chúng sẽ được gửi đến bên nhận.
9. Bảo mật
- Mục tiêu ban đầu của giao thức MQTT là làm cho việc truyền dữ liệu nhỏ nhất và hiệu quả nhất có thể qua các đường truyền thông tin đắt tiền, không đáng tin cậy. Do đó, bảo mật không phải là mối quan tâm chính trong quá trình thiết kế và triển khai MQTT.
- Tuy nhiên, có một số tùy chọn bảo mật có sẵn với chi phí truyền dữ liệu nhiều hơn và bộ nhớ lớn hơn.
-
Network security - Nếu bản thân mạng có thể được bảo mật, thì việc truyền dữ liệu MQTT không an toàn là không thích hợp. Trong trường hợp này, các vấn đề bảo mật sẽ phải xảy ra từ chính bên trong mạng, có thể thông qua một tác nhân xấu hoặc một hình thức xâm nhập mạng khác.
-
Username và password - MQTT cho phép tên người dùng (Username) và mật khẩu (Password) để máy khách (Client) thiết lập kết nối với bên trung gian (Broker). Thật không may, để giữ cho sự sáng sủa, tên người dùng và mật khẩu được truyền dưới dạng văn bản rõ ràng. Vào năm 1999, điều này là quá đủ bởi vì việc đọc một liên lạc giữa vệ tinh và một cảm biến là một việc rất khó khăn. Tuy nhiên, ngày nay, việc đánh chặn nhiều kiểu truyền thông mạng không dây là không hiếm, khiến cho việc xác thực như vậy trở nên vô ích. Nhiều trường hợp sử dụng yêu cầu tên người dùng và mật khẩu không phải để bảo vệ chống lại những kẻ xấu mà là một cách để tránh các kết nối không chủ ý.
-
SSL / TLS - Chạy trên TCP / IP, giải pháp rõ ràng để đảm bảo truyền giữa máy khách (Client) và bên trung gian (Broker) là triển khai SSL / TLS. Thật không may, điều này làm tăng thêm chi phí đáng kể cho các giao tiếp nhẹ.
10. Cập nhật tiêu chuẩn MQTT v5.0
- Vào ngày 3 tháng 4 năm 2019, OASIS đã xuất bản tiêu chuẩn MQTT v5.0 chính thức
- Các tính năng chính MQTT v5.0 bao gồm:
-
Reason codes (Mã lý do) - Ban đầu, MQTT chỉ đơn giản là không thực hiện hành động nào nếu có lỗi. Bản thân lỗi đó là mã lỗi duy nhất. Trong phiên bản 5.0, xác nhận hiện hỗ trợ việc sử dụng mã trả lại, có thể cung cấp lý do thân thiện với người dùng về lỗi. Tất nhiên, việc sử dụng mã trả lại sẽ làm tăng một chút bộ nhớ.
-
Shared subscriptions (Đăng ký được chia sẻ) - Quá nhiều người đăng ký một chủ đề cụ thể trên một trung gian (Broker) có thể tạo ra sự cố tải. Đăng ký được chia sẻ cho phép cân bằng tải giữa các máy khách (Clients).
-
Message expiry (Tin nhắn hết hạn)- Có thể đặt tin nhắn bị xóa nếu chúng không được gửi trong một khoảng thời gian đã định. Điều này ngăn không cho các tin nhắn cũ, lỗi thời được gửi đến các bên nhận (Subscriber) đã bị ngắt kết nối trong một khoảng thời gian.
-
Topic alias (Bí danh chủ đề) - Bản thân tên của các chủ đề có thể dài đến mức làm giảm bộ nhớ nhỏ của giao thức. Các chuỗi chủ đề hiện có thể được thay thế bằng một số đại diện duy nhất khi sử dụng lặp lại các chủ đề giống nhau.