MQTT

MQTT (Message Queueing Telemetry Transport) là một giao thức mạng kích thước nhỏ (lightweight), hoạt động theo cơ chế publish - subscribe (tạm dịch: xuất bản - đăng ký) theo tiêu chuẩn ISO (ISO/IEC 20922) và OASIS mở để truyền tin nhắn giữa các thiết bị. Giao thức này hoạt động trên nền tảng TCP/IP; tuy nhiên, bất kỳ giao thức mạng nào cung cấp các kết nối theo tuần tự, không mất dữ liệu (lossless), kết nối hai chiều đều có thể hỗ trợ MQTT. MQTT được thiết kế cho các kết nối cho việc truyền tải dữ liệu cho các thiết bị ở xa, các thiết bị hay vi điều khiển nhỏ có tài nguyên hạn chế, hoặc trong các ứng dụng có băng thông mạng bị hạn chế.
Lịch sử.
Andy Stanford-Clark (IBM) và Arlen Nipper (sau đó làm việc cho Eurotech, Inc.) là tác giả phiên bản đầu tiên của giao thức vào năm 1999. MQTT khi đó được sử dụng để giám sát các đường ống dẫn dầu trong hệ thống SCADA. Mục tiêu là tạo ra một giao thức tiết kiệm băng thông, nhẹ và sử dụng ít năng lượng pin như là một giải pháp thay thế, bởi vì khi đó các thiết bị được kết nối thông qua liên kết vệ tinh cực kỳ đắt đỏ.
Vào năm 2013, IBM đã đệ trình MQTT v3.1 cho cơ quan OASIS với một điều lệ đảm bảo rằng chỉ có thể chấp nhận những thay đổi nhỏ đối với đặc điểm kỹ thuật của nó. MQTT-SN (MQTT for Sensor Networks, tạm dịch: MQTT cho Mạng cảm biến) là một biến thể (variation) của giao thức chính cho các ứng dụng chạy bằng pin trên các mạng không hỗ trợ bộ giao thức TCP/IP, như Zigbee. Sau khi tiếp nhận việc bảo trì các tiêu chuẩn từ IBM, phiên bản 3.1.1 với những thay đổi nhỏ đã được phát hành thành tiêu chuẩn OASIS vào ngày 29 tháng 10 năm 2014. Một bản nâng cấp quan trọng cho MQTT phiên bản 5, với một số tính năng mới được bổ sung, đã được phát hành vào ngày 7 tháng 3 năm 2019.
Về lịch sử phát triển, từ "MQ" trong "MQTT" đến từ dòng sản phẩm MQ của IBM (sau đó đổi tên thành "MQSeries"). Tuy nhiên, giao thức cung cấp các tin nhắn theo cơ chế publish-subscribe (tên gọi publish-subscribe có thể làm người dùng nghĩ rằng giao thức sử dụng hàng đợi (queue) nhưng hàng đợi không có trong giao thức) và được thiết kế đặc biệt cho các thiết bị hạn chế tài nguyên và băng thông thấp, mạng có độ trễ cao chẳng hạn như các đường dây quay số điện thoại và liên kết vệ tinh.
Trong thông số kỹ thuật ở phiên bản 3.1 được IBM mở, tên chính thức của giao thức là "MQ Telemetry Protocol (MQTT)" (tạm dịch: "Giao thức đo từ xa MQ") nhưng tên viết tắt MQTT được sử dụng rộng rãi trong tài liệu thông số kỹ thuật đó. Trong tất cả các tài liệu do OASIS phát hành, giao thức này được gọi là MQTT một cách nghiêm ngặt, mặc dù bản thân ủy ban kỹ thuật được đặt tên là "OASIS Message Queuing Telemetry Transport Technical Committee".
Tổng quan.
Giao thức MQTT xác định hai dạng thực thể trong mạng: một message broker và những client. Một MQTT broker là một máy chủ (server) nhận tất cả các tin nhắn (message) từ các client và sau đó định tuyến (route) các tin nhắn này đến các client phù hợp. Một MQTT client là bất kỳ thiết bị nào (từ vi điều khiển đến một máy chủ chính thức) chạy thư viện MQTT và kết nối tới MQTT broker qua mạng.
MQTT quản lý các thông tin - dữ liệu mà nó nhận được theo hệ thống cấp bậc của các topic (tạm dịch: chủ đề). Với cơ chế publish-subscribe của MQTT, khi một publisher có một dữ liệu muốn truyền đi, nó sẽ gởi một tin nhắn điều khiển (control message) với dữ liệu muốn truyền đi đó đến MQTT broker mà nó đã kết nối đến. Broker sau đó sẽ gởi các thông tin mà nó nhận được này đến client đã đăng ký (subscribe) vào topic đó. Các publisher không cần có bất cứ thông tin nào về số lượng hay vị trí của các subscriber, đồng thời, các subscriber cũng không cần phải được cấu hình để có bất kì thông tin gì về các publisher.
Nếu một broker nhận một tin nhắn trên một topic mà hiện tại không có subscriber, broker sẽ bỏ tin nhắn đó đi, trừ khi publisher của tin nhắn đó chỉ định tin nhắn đó là một retained message (tạm dịch: tin nhắn được giữ lại). Một retained message là một tin nhắn MQTT thông thường với cờ retained được gán giá trị true. Broker lưu retained message cuối cùng và QoS tương ứng cho topic được chọn. Mỗi client đăng ký (subscribe) vào một topic phù hợp với topic của retained message sẽ ngay lập tức nhận được retained message đó sau khi client đó đăng ký. Broker chỉ lưu một retained message cho từng topic. Cơ chế này cho phép một subscriber mới của một topic có thể nhận được những thông tin mới nhất, hơn là phải chờ đợi lần cập nhật tiếp theo từ một publisher. Client chỉ tương tác với một broker, nhưng một hệ thống có thể chứa một số máy chủ làm broker với nhiệm vụ trao đổi dữ liệu dựa trên các topic hiện tại được các client đăng ký.
Một tin nhắn điều khiển tối thiểu của MQTT có thể có ít nhất là hai byte dữ liệu. Một tin nhắn điều khiển có thể mang gần 256 megabyte dữ liệu nếu cần thiết. Có 14 kiểu tin nhắn được định nghĩa để kết nối và ngắt kết nối một client khỏi broker, để xuất bản (publish) dữ liệu, xác nhận việc nhận dữ liệu đã nhận được và giám sát kết nối giữa client và server (máy chủ).
MQTT hoạt động ở tầng ứng dụng (Application layer), và dựa trên giao thức TCP (ở tầng giao vận, Transport layer) để truyền dữ liệu. Giao thức MQTT-SN, biến thể từ MQTT, sử dụng trên các phương thức tiện truyền tải khác như giao thức UDP hoặc Bluetooth.
MQTT gửi các thông tin đi dưới dạng văn bản thuần túy và không bao gồm bất kỳ biện pháp bảo mật hoặc xác thực nào. Việc bảo mật với MQTT có thể được thực hiện bởi TLS để mã hóa và bảo vệ thông tin được truyền khỏi việc bị đánh chặn, sửa đổi hoặc giả mạo.
Cổng MQTT không được mã hóa mặc định là 1883. Cổng được mã hóa là 8883.
MQTT broker.
MQTT broker là một phần mềm chạy trên máy tính (chạy trực tiếp trên máy hoặc trên đám mây) và có thể được tự xây dựng hoặc host bởi bên thứ ba. Các phần mềm MQTT broker ngày nay có ở hai dạng mã nguồn mở và triển khai độc quyền.
Các broker hoạt động như một bưu điện, MQTT không sử dụng địa chỉ của người sẽ được nhận tin nhắn mà sử dụng cơ chế quản lý theo "topic" (tạm dịch: "Chủ đề"), và bất kỳ ai muốn có một bản sao của tin nhắn được gởi sẽ phải đăng ký topic đó. Nhiều client có thể nhận được tin nhắn từ một broker duy nhất (one to many, tạm dịch: quan hệ một - nhiều). Tương tự, nhiều publisher có thể xuất bản (publish) các topic cho một người đăng ký (many to one, tạm dịch: quan hệ nhiều - một).
Mỗi client có thể vừa sinh và vừa nhận dữ liệu, bằng cách xuất bản (publish) và đăng ký (subscribe), tức là các thiết bị có thể xuất ra dữ liệu cảm biến và vẫn có thể nhận được thông tin cấu hình hoặc lệnh điều khiển (MQTT là một giao thức truyền thông hai chiều). Điều này giúp ích trong cả việc chia sẻ dữ liệu, quản lý và điều khiển thiết bị.
Với kiến trúc MQTT broker, các thiết bị và ứng dụng trở nên tách rời và an toàn hơn. MQTT sử dụng TLS để mã hóa thông tin về tên người dùng và mật khẩu để bảo vệ các kết nối, và có thể dùng thêm các xác thực bảo mật khác để yêu cầu client phải cung cấp file xác thực phù hợp với máy chủ.
Trong trường hợp xảy ra lỗi với một broker, một broker dự phòng/sao lưu tự động có thể được sử dụng để thay thế. Broker dự phòng có thể được thiết lập để chia sẻ tải của client thông qua nhiều server tại chỗ, đám mây hoặc sử dụng phối hợp cả hai cách này.
Broker có thể hỗ trợ cả MQTT tiêu chuẩn và các biến thể MQTT mang tính đặc thù như Sparkplug.
Các broker có thể lưu trữ dữ liệu dưới các retained message (cần đăng ký với cơ sở dữ liệu client) để những người đăng ký mới vào chủ đề có thể nhận được giá trị mới nhất ngay lập tức.
Broker cũng theo dõi tất cả thông tin của các phiên làm việc khi các thiết bị đang hoặc ngưng hoạt động, cơ chế này được gọi là "persistent sessions" (tạm dịch: "phiên liên tục").
Những ưu điểm chính của MQTT broker là:
Các loại tin nhắn của MQTT.
Connect (kết nối).
Tin nhắn Connect làm nhiệm vụ chờ kết nối được thiết lập với máy chủ và tạo liên kết giữa các nút.
Disconnect (ngắt kết nối).
Tin nhắn Disconnect chờ MQTT client hoàn thành bất kỳ công việc của nó và ngắt kết nối phiên làm việc TCP/IP.
Publish.
Trở về ngay luồng làm việc của ứng dụng (application thread) ngay sau khi chuyển yêu cầu đến MQTT client.
MQTT v5.0.
Vào năm 2019, OASIS đã chính thức phát hành tiêu chuẩn MQTT 5.0. Phiên bản 5.0 bao gồm các tính năng mới chính sau:
Quality of service (QoS).
Mỗi kết nối tới broker được đánh giá chất lượng bởi thông số "chất lượng dịch vụ (QoS)" như sau:
Trường này không ảnh hưởng đến việc xử lý các quá trình truyền dữ liệu TCP bên dưới; nó chỉ được sử dụng giữa người gửi và người nhận MQTT.
Các ứng dụng thực tế.
Đã có một số dự án được thực hiện với giao thức MQTT. Ví dụ như: