MQTT

**MQTT** (**Message Queuing 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à:

# Loại bỏ các kết nối client dễ bị tấn công và không an toàn.
# Có thể dễ dàng mở rộng quy mô từ một thiết bị đến hàng nghìn thiết bị.
# Quản lý và theo dõi tất cả các trạng thái kết nối của client, bao gồm cả chứng chỉ và thông tin xác thực bảo mật.
# Giảm thiểu tình trạng quá tải của hệ thống mạng mà không ảnh hưởng đến bảo mật (với mạng di động hoặc vệ tinh)

## 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:

* Reason codes: Phản hồi trong quá trình truyền hỗ trợ mã trả về (return codes), mã này cho biết lý do lỗi.
* Shared subscriptions: Cho phép cân bằng tải giữa các client và do đó giảm nguy cơ gặp sự cố tải.
* Message expiry: Tin nhắn có thể bao gồm ngày hết hạn và sẽ bị xóa nếu chúng không được gửi đi trong khoảng thời gian này.
* Topic alias: Tên của chủ đề có thể được thay thế bằng một số.

## 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ố *[[QoS|chất lượng dịch vụ]] (QoS)* như sau:

* Nhiều nhất một lần: Tin nhắn chỉ được gửi một lần. Client và broker không phải thực hiện thêm bước nào để xác nhận việc gửi có thành công hay không Cơ chế gởi và quên (tiếng Anh: *fire and forget,* tạm dịch: gởi và quên).
* Ít nhất một lần: Tin nhắn được người gửi thử lại nhiều lần cho đến khi nhận được xác nhận là đã gởi được. (tiếng Anh: *acknowledged delivery,* tạm dịch: *X*ác nhận đã gởi được) 
* Chính xác một lần: Phía gởi và phía nhận thực hiện quá trình bắt tay hai cấp để đảm bảo chỉ nhận được một bản sao của tin nhắn (tiếng Anh: *assured delivery*, tạm dịch: đảm bảo gởi được).

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ư:

* OpenHAB, nền tảng nhà thông minh mã nguồm mở hỗ trợ MQTT.
* Thông số kỹ thuật tiêu chuẩn SensorThings API của Open Geospatial Consortium bao gồm một phần mở rộng MQTT trong giao thức tin nhắn. Nó đã được chứng minh ở một đơn vị thí điểm IoT của Bộ An ninh Nội địa Hoa Kỳ.
* XIM, Inc. đã giới thiệu một ứng dụng MQTT client cho Android và iOS, tên là *MQTT Buddy*.
* Node-RED hỗ trợ MQTT với TLS kể từ phiên bản 0.14.
* Home Assistant, nền tảng nhà thông minh mã nguồn mở, hỗ trợ MQTT và cung cấp bốn tùy chọn cho MQTT broker.
* ejabberd hỗ trợ MQTT kể từ phiên bản 19.02.
* Eclipse Foundation với giao thức Sparkplug tương thích MQTT. Sparkplug được xây dựng dựa trên MQTT, cộng thêm các tính năng cần thiết trong các ứng dụng công nghiệp thời gian thực.

## Xem thêm

* Apache ActiveMQ
* RabbitMQ
* Advanced Message Queuing Protocol (AMQP)
* Streaming Text Oriented Messaging Protocol (STOMP)
* Constrained Application Protocol (CoAP)
* Extensible Messaging and Presence Protocol (XMPP)
* IBM MQ

## Chú thích

## Liên kết ngoài

* 
* Trang web chính thức của Ủy ban kỹ thuật
* Thông số kỹ thuật MQTT
** Phiên bản 5.0, 2019-03-07: Phiên bản PDF, phiên bản HTML
** Phiên bản 3.1.1 Plus Errata 01, 2015-12-10: Phiên bản PDF, phiên bản HTML
** Phiên bản 3.1.1, 2014-10-29: Phiên bản PDF, phiên bản HTML
** Phiên bản 3.1, 2010: ấn bản PDF , ấn bản HTML
* Thông số kỹ thuật MQTT-SN
** Phiên bản 1.2, 2013-11-14: Phiên bản PDF