MQTT (MQ Telemetry Transport) là một giao thức thông tin mở nhẹ cung cấp cho các client tài nguyên mạng hạn chế một cách đơn giản để phân phối thông tin đo đạc từ xa trong môi trường băng thông thấp. Giao thức này sử dụng mẫu giao tiếp xuất bản / đăng ký, được sử dụng cho giao tiếp giữa máy với máy (M2M).
MQTT được tạo ra như một giao thức chi phí thấp để đáp ứng các giới hạn về băng thông và CPU, được thiết kế để chạy trong môi trường nhúng, nơi nó có thể cung cấp một đường dẫn truyền thông tin cậy, hiệu quả. Thích hợp để kết nối các thiết bị có footprint mã nhỏ, MQTT là một lựa chọn tốt cho các mạng không dây trải qua các mức độ trễ khác nhau do giới hạn băng thông không thường xuyên hoặc kết nối không đáng tin cậy. Giao thức này có ứng dụng trong các ngành công nghiệp từ ô tô, năng lượng đến viễn thông.
Mặc dù MQTT bắt đầu như một giao thức độc quyền được sử dụng để giao tiếp với các hệ thống kiểm soát giám sát và thu thập dữ liệu (SCADA) trong ngành dầu khí, nó đã trở nên phổ biến trong lĩnh vực thiết bị thông minh và ngày nay là giao thức mã nguồn mở hàng đầu để kết nối internet vạn vật ( IoT) và các thiết bị IoT (IIoT) công nghiệp.
TT trong MQTT là viết tắt của Telemetry Transport, MQ liên quan đến một sản phẩm được gọi là IBM MQ.
Nhằm tối đa hóa băng thông có sẵn, mô hình giao tiếp xuất bản / đăng ký (pub / sub) của MQTT là một giải pháp thay thế cho kiến trúc client - server truyền thống giao tiếp trực tiếp với một điểm cuối. Trong mô hình pub / sub, client gửi tin nhắn (pub) được tách riêng khỏi các client nhận tin nhắn (sub). Bởi vì cả pub và sub đều không liên hệ trực tiếp với nhau, bên thứ ba là broker sẽ đảm nhiệm các kết nối giữa chúng.
MQTT client bao gồm pub và sub, đó là các thuật ngữ liên quan đến việc client đang xuất bản thông tin hay đã đăng ký để nhận thông tin. Hai chức năng này có thể được thực hiện trong cùng một MQTT client. Khi một thiết bị (hoặc client) muốn gửi dữ liệu đến một server (hoặc nhà broker), nó được gọi là pub. Khi hoạt động bị đảo ngược, nó được gọi là sub. Theo mô hình pub / sub, nhiều client có thể kết nối với một broker và đăng ký các chủ đề mà client đó quan tâm.
Nếu kết nối từ một client đăng ký đến một nhà broker bị hỏng, thì broker sẽ đệm các thông tin và đẩy chúng ra cho sub khi nó trực tuyến trở lại. Nếu kết nối từ client xuất bản đến broker bị ngắt kết nối mà không có thông báo, thì broker có thể đóng kết nối và gửi cho sub một tin nhắn đã lưu trong bộ nhớ cache kèm theo hướng dẫn từ pub.
Pub gửi thông tin, sub nhận được thông tin mà nó quan tâm và broker chuyển thông điệp từ pub đến sub. Pub và sub là MQTT client, chỉ giao tiếp với MQTT broker. MQTT client có thể là bất kỳ thiết bị hoặc ứng dụng nào (từ bộ vi điều khiển như Arduino đến máy chủ ứng dụng đầy đủ được lưu trữ trong đám mây) chạy thư viện MQTT.
MQTT broker hoạt động như một trung gian giữa những client đang gửi thông tin và những sub đang nhận những thông tin đó. Nếu so sánh với bưu điện thì broker chính là bưu điện. Tất cả các thông tin phải thông qua broker trước khi chúng có thể được chuyển đến sub.
Các broker có thể phải xử lý hàng triệu MQTT client được kết nối đồng thời, vì vậy khi chọn MQTT broker, doanh nghiệp cần đánh giá dựa trên khả năng mở rộng, khả năng tích hợp, giám sát và khả năng chống thất bại.
Một phiên MQTT được chia thành bốn giai đoạn: kết nối, xác thực, giao tiếp và kết thúc. Client bắt đầu bằng cách tạo kết nối TCP / IP đến broker bằng cách sử dụng cổng tiêu chuẩn hoặc cổng tùy chỉnh được xác định bởi các nhà khai thác của broker. Khi tạo kết nối, server có thể tiếp tục một phiên cũ nếu nó được cung cấp danh tính client được sử dụng lại.
Các cổng tiêu chuẩn là 1883 cho giao tiếp không được mã hóa và 8883 cho giao tiếp được mã hóa - sử dụng Lớp cổng bảo mật (SSL) / Bảo mật lớp truyền tải (TLS). Trong quá trình bắt tay SSL / TLS, client xác thực chứng chỉ server và xác thực server. Client cũng có thể cung cấp chứng chỉ client cho broker trong quá trình bắt tay. Broker có thể sử dụng điều này để xác thực client. Mặc dù không phải là một phần cụ thể của đặc tả MQTT, nhưng các broker đã trở thành thông lệ để hỗ trợ xác thực client bằng chứng chỉ phía client SSL / TLS.
Vì giao thức MQTT nhằm mục đích là một giao thức cho các thiết bị IoT và bị ràng buộc tài nguyên, SSL / TLS có thể không phải lúc nào cũng là một tùy chọn và trong một số trường hợp, có thể không được mong muốn. Trong những trường hợp như vậy, xác thực được trình bày dưới dạng tên người dùng và mật khẩu rõ ràng, được client gửi đến server - đây là một phần của chuỗi gói CONNECT / CONNACK. Ngoài ra, một số broker, đặc biệt là các broker mở được công bố trên internet, sẽ chấp nhận những client ẩn danh. Trong những trường hợp như vậy, tên người dùng và mật khẩu được để trống.
MQTT được coi là một giao thức nhẹ vì tất cả các thông điệp của nó đều có một footprint mã nhỏ. Mỗi thông báo bao gồm một header cố định 2 byte - một header biến tùy chọn, trọng tải thông tin được giới hạn ở 256 megabyte (MB) thông tin và một mức chất lượng dịch vụ (QoS).
Trong giai đoạn giao tiếp, client có thể thực hiện các hoạt động xuất bản, đăng ký, hủy đăng ký và ping. Hoạt động xuất bản gửi một khối dữ liệu nhị phân hay nội dung đến một chủ đề do pub xác định.
MQTT hỗ trợ các đối tượng nhị phân lớn (BLOB) có kích thước lên đến 256 MB. Định dạng của nội dung sẽ dành riêng cho ứng dụng. Đăng ký chủ đề được thực hiện bằng cách sử dụng cặp gói SUBSCRIBE / SUBACK và việc hủy đăng ký cũng được thực hiện tương tự bằng cách sử dụng cặp gói UNSUBSCRIBE / UNSUBACK.
Các chuỗi chủ đề tạo thành một cây chủ đề tự nhiên với việc sử dụng một ký tự phân tách đặc biệt, dấu gạch chéo phía trước (/). Client có thể đăng ký và hủy đăng ký toàn bộ các nhánh trong cây chủ đề bằng cách sử dụng các ký tự đại diện đặc biệt. Có hai ký tự đại diện: ký tự đại diện cấp một, ký tự dấu cộng (+); và một ký tự đại diện đa cấp, ký tự băm (#). Một ký tự chủ đề đặc biệt, ký tự đô la ($), loại trừ một chủ đề khỏi bất kỳ đăng ký ký tự đại diện gốc nào. Thông thường, $ được sử dụng để vận chuyển các thông điệp hệ thống hoặc máy chủ cụ thể.
Một hoạt động khác mà client có thể thực hiện trong giai đoạn giao tiếp là ping broker server bằng cách sử dụng chuỗi gói PINGREQ / PINGRESP. Thao tác này không có chức năng nào khác ngoài việc duy trì kết nối trực tiếp và đảm bảo kết nối TCP không bị ngắt bởi cổng hoặc bộ định tuyến.
Khi một pub hoặc sub muốn kết thúc một phiên MQTT, nó sẽ gửi một thông báo NGẮT KẾT NỐI đến broker và sau đó đóng kết nối. Nó mang lại cho client khả năng dễ dàng kết nối lại bằng cách cung cấp danh tính client và tiếp tục lại nơi nó đã dừng.
Nếu việc ngắt kết nối xảy ra đột ngột mà không có thời gian để pub gửi thông báo KẾT NỐI, broker có thể gửi cho sub một tin nhắn từ pub mà broker đã lưu vào bộ nhớ cache trước đó.