Giới thiệu giao thức truyền thông điệp/giao tiếp MQTT 

Giao thức mạng là một khái niệm không còn mấy xa lạ đối với công nghệ thông tin ngày nay. Để kết nối hai hay nhiều thực tể trong một hệ thống nhằm trao đổi thông tin thì cần kết nối theo một giao thức mạng nhất định. Một số giao thức mạng phổ biến có thể kể đến như TPC/IP, HTTPS, SMTP, MINE, … Các giao thức mạng này chủ yếu hỗ trợ liên kết của máy tính đến máy chủ, từ máy chủ về các router và các thiết bị mạng khác.

Theo xu hướng phát triển, các thiết bị được phát triển nhỏ gọn, cơ động hơn, điển hình là sự phát triển của các thiết bị IoT. Tuy nhiên, các thiết bị IoT đòi hỏi sự giao tiếp tức thì, nhanh chóng hơn so với các phương thức thông thường và cũng đòi hỏi giao thức trong mạng thiết bị có tính bảo mật cao hơn. Điều này thách thức các giao thức mạng truyền thống và cũng là động cơ để ra đời các giao thực mạng phù hợp hơn.

MQTT (Message Queueing Telemetry Transport) là một giao thức mạng như vậy, MQTT được coi là một giao thức mạng kích thước nhỏ (lightweight). Giao thức truyền thông điệp/giao tiếp (message) của MQTT tuân theo theo mô hình publish/subscribe (xuất bản – theo dõi), sử dụng băng thông thấp, độ tin cậy cao và có khả năng hoạt động trong điều kiện đường truyền không ổn định.

Năm 1999, hai kỹ sư - Andy Stanford-Clark (IBM) và Arlen Nipper (Eurotech) khi họ phải phát minh ra một giao thức mới để kết nối các đường ống dẫn dầu trên các mạng vệ tinh không đáng tin cậy và họ đã cho ra đời MQTT. MQTT hướng tới một giao thức mạng có sự nhỏ gọn trong truyền tin, giảm thiểu tiêu hao năng lượng được sử dụng.

Năm 2011, IBM và Eurotech đã tặng MQTT cho dự án Eclipse được đề xuất có tên là Paho. Trong quá trình này, các nhà phát triển cũng nghiên cứu để tạo ra các phiên bản giao thức sát hơn với thực tế thiết bị sử dụng, có thể kể đến như MQTT-SN (MQTT cho mạng thiết bị cảm biến) là một phiên bản cho các thiết bị cảm biến chạy bằng pin trên các mạng không hỗ trợ TCP/IP như Zigbee.

Trong năm 2013, nó đã được đệ trình lên OASIS để chuẩn hóa. Phiên bản mới nhất của đặc tả giao thức 5.0 đã trở thành một tiêu chuẩn OASIS. Hiện có 4 phiên bản MQTT vẫn đang được sử dụng phổ biến là MQTT 5.0, MQTT 3.11, MQTT 3.1 và MQTT-SN v1.2. Các tiêu chuẩn MQTT đều tuân theo quy tắc của mô hình publish/subscribe, mô hình này đã được chuẩn hóa dưới dạng tiêu chuẩn ISO (ISO/IEC 20922).

Một số ứng dụng nổi bật với giao thức MQTT trên thế giới có thể kể đến như Thông số kỹ thuật tiêu chuẩn SensorThings API của Open Geospatial Consortium đã được Bộ An ninh Nội địa Hoa Kỳ áp dụng, Home Assistant (nền tảng nhà thông minh mã nguồn mở) với hơn 2 triệu người dùng hiện nay trên thế giới, Eclipse Foundation với giao thức Sparkplug tương thích MQTT ứng dụng trong các thiết bị cảm biến thời gian thực phát triển thiết bị IoT vô cùng phổ biến hiện nay.

Kiến trúc giao thức MQTT

Kiến trúc mức cao nhất của MQTT gồm 2 thành phần chính là Broker và Clients.

Broker được coi là trung tâm, là điểm giao, là trục chính giao với tất cả các Clients. Nhiệm vụ chính của broker là nhận các giao tiếp từ các thiết bị xuất bản hay hiểu đơn giản là các thiết bị tạo giao tiếp, xếp các giao tiếp theo hàng đợi rồi chuyển chúng tới một địa chỉ cụ thể. Nhiệm vụ phụ của Broker là nó có thể đảm nhận thêm một vài tính năng liên quan tới quá trình truyền thông như: bảo mật giao tiếp, lưu trữ giao tiếp, ghi lại lịch sử giao tiếp, …

Client thì được chia thành 2 nhóm là xuất bản giao tiếp và theo dõi. Client hoạt động tại thiết bị di dộng nên chúng được thiết kế để có thể hoạt động một cách linh hoạt (lightweight). Client chỉ làm ít nhất một trong 2 việc là xuất bản các giao tiếp lên một kênh cụ thể hoặc theo dõi một kênh nào đó để nhận các thông điệp từ kênh này. MQTT Clients tương thích với hầu hết các nền tảng hệ điều hành hiện có: MAC OS, Windows, LInux, Androids, iOS… 

Hình 1: Kiến trúc giao thức MQTT

+ Connect (kết nối): Thông điệp này có nhiệm vụ là thông báo việc chờ kết nối được thiết lập với máy chủ và đồng thời tạo liên kết giữa các nút trong mạng từ thiết bị đến máy chủ.Các khái niệm trong MQTT

- Cơ chế xuất bản và theo dõi: Trong một hệ thống sử dụng giao thức MQTT, nhiều node trạm (gọi là mqtt client hoặc gọi tắt là client) kết nối tới một MQTT server (gọi là Broker). Mỗi client sẽ đăng ký một vài kênh (topic), ví dụ như “/client1/channel1”, “/client1/channel2”. Quá trình đăng ký này gọi là “subscribe”, giống như chúng ta đăng ký nhận tin trên một kênh Youtube vậy. Mỗi client sẽ nhận được dữ liệu khi bất kỳ trạm nào khác gởi dữ liệu và kênh đã đăng ký. Khi một client gởi dữ liệu tới kênh đó, gọi là xuất bản.

- MQTT Broker: là một phần mềm máy tính cho phép tạo một máy chủ (server) kết nối giữa các MQTT client và các thiết bị nói chung trong mạng. MQTT Borker có thể do “host” hoặc người vận hành hệ thống tự xây dựng hoặc một bên thứ ba. Các phần mềm trên thị trường hiện nay được xây dựng ở hai dạng mã nguồn và triển khai độc quyền cho từng trường hợp cụ thể. Các Broker hoạt động như một trạm bưu điện nhận nội dung đến và chuyển nội dụng đi nhưng không sử dụng địa chỉ của client nhận như điểm đến của nội dung mà quản lý dưới dạng kênh (topic). Các client muốn có nội dung thì cần đăng ký kênh đó, sau đó khi Broker nhận được nội dung sẽ tự động chuyển đến client đã đăng ký, có thể có nhiều client cùng đăng ký một kênh và một client cũng đăng ký được nhiều kênh khác nhau trên một trạm Broker. Các client cũng có thể là điểm sản xuất nội dung và đồng thời cũng có thể đăng ký kênh của client khác cùng nội dung hoặc khác nội dung. Hiện nay Broker có thể triển khai vật lý hoặc trên đám mây, tuy nhiên triển khai trên đám mây dễ hỗ trợ khi có Broker bị hỏng hoặc bị lỗi. Broker sẽ quản lý, theo dõi mọi phiên làm việc của các nội dung, kênh và client có trao đổi nội dung trên nó.

Có thể tóm lại một số ưu điểm của Broker hay cũng là ưu điểm khi sử dụng giao thức MQTT là:

+ Quản lý, loại bỏ các kết nối client mà có dấu hiệu nguy hiểm, dễ bị tấn công hoặc không an toàn.

+ Dễ dàng quản lý quy mô tổng thể của mạng, dễ dàng mở rộng hoặc thu nhỏ tùy thuộc theo số thiết bị, số client, số kênh và số Broker.

+ Dễ dàng quản lý các trạng thái và thông tin (chứng chỉ mạng, tình trạng bảo mật, xác thực bảo mật, kết nối hay đang nghỉ) của client tham gia trong mạng.

+ Giảm thiểu tình trạng quá tải của hệ thống trong mạng, giảm thiểu nguy cơ tấn công quá tải truy cập.

- Giao tiếp (message): có định dạng mặc định là plain-text (chữ viết người đọc được), tuy nhiên người sử dụng có thể cấu hình thành các định dạng khác. Có 3 loại tin nhắn chính trong giao tiếp của MQTT:

+ Disconnect (ngắt kết nối): Thông điệp này có nhiệm vụ là thông báo việc chờ giao thức MQTT tại các client hoàn thành bất kỳ công việc nào của nó và ngắt kết nối phiên làm việc TCP/IP giữa máy chủ Broken với các nút mạng cũng như các thiết bị trong mạng.

+ Publish: Thông điệp này có nhiệm vụ là thông báo đẩy gói tin vào một luồng làm việc của ứng dụng (application thread) đồng thời chuyển yêu cầu đến MQTT client ngay sau khi khi thông báo được đưa ra.

- Kênh (topic): như một "đường truyền" logic giữa 2 điểm là xuất bản và theo dõi. Về cơ bản, khi một giao tiếp được xuất bản vào một kênh thì tất cả những theo dõi của topic đó sẽ nhận được giao tiếp này. Giao thức MQTT cho phép khai báo các topic kiểu phân cấp.

Giả sử có một hệ thống cảm biến đo thông tin môi trường trong ngôi nhà. Một ngôi nhà thường sẽ có nhiều phòng và mỗi phòng lại có bộ cảm biến môi trường riêng. Như vậy, các topic phục vụ truyền tải thông tin môi trường cho ngôi nhà có thể được khai báo như sau:

home/living-room/temperature: kênh thông tin nhiệt độ phòng khách

home/bedroom/humidity: kênh thông tin độ ẩm phòng ngủ

home/kitchen/humidity: kênh thông tin độ ẩm bếp ăn

Bên cạnh đó MQTT hỗ trợ cú pháp khai báo cho kênh như: "+" bao gồm các topic ở cùng một cấp và "#" bao gồm tất cả các topic nằm dưới topic hiện tại.

home/+/humidity: cho biết độ ẩm của tất cả các phòng trong nhà
home/bathroom/#: cho biết tất cả thông tin về phòng tắm

- Yêu cầu QoS (Qualities of service):  giao thức MQTT có 3 kiểu yêu cầu QoS

+ QoS0: Broker/client sẽ gửi giao tiếp đúng một lần, quá trình gửi được xác nhận bởi giao thức TCP/IP.

+ QoS1: Broker/client sẽ gửi giao tiếp với ít nhất một lần xác nhận từ đầu kia, nghĩa là có thể có nhiều hơn một lần xác nhận đã nhận được giao tiếp.

+ QoS2: Broker/client đảm bảm khi gửi giao tiếp thì phía nhận chỉ nhận được đúng một lần.

- Retain: là một cờ (flag) được gắn cho một giao tiếp của giao thức MQTT. Retain chỉ nhận giá trị 0 hoặc 1 (tương ứng 2 giá trị logic false hoặc true). Nếu retain = 1, broker sẽ lưu lại message cuối cùng của 1 kênh kèm theo mức QoS tương ứng. Khi client bắt đầu theo dõi kênh có giao tiếp được lưu lại đó, client ngay lập tức nhận được giao tiếp đó.

- Cầu kết nối MQTT (MQTT Bridge): là một tính năng của Broker cho phép các Broker có thể kết nối và trao đổi dữ liệu với nhau. Để sử dụng tính năng này, ta cần tối thiểu 2 Broker, trong đó, một Broker bất kỳ sẽ được cấu hình thành Bridge. Khi cấu hình MQTT bridge, ta cần lưu ý tới các thông số sau:

+ address: địa chỉ của broker cần kết nối;

+ bridge_protocol_version: phiên bản của giao thức MQTT đang sử dụng chung cho 2 broker;

+ topic: phần này định nghĩa 3 thong số: tên kênh được trao đổi giữa 2 broker, chiều trao đổi (1 chiều hay 2 chiều) và bản đồ kết nối kênh giữa 2 broker.

Mô tả dữ liệu trong một giao tiếp của MQTT

- Các bit trong một byte được gán nhãn từ 7 đến 0. Bit số 7 là bit quan trọng nhất, bit ít quan trọng nhất được gán số bit 0.

- Giá trị “Hai bit số nguyên” dữ liệu là các số nguyên không dấu 16 bit theo thứ tự big-endian: byte thứ tự cao đứng trước byte thứ tự thấp hơn. Điều này có nghĩa là một từ 16 bit được trình bày trên mạng dưới dạng Byte quan trọng nhất (MSB), tiếp theo là Byte ít quan trọng nhất (LSB).

- Giá trị “Bốn bit số nguyên” dữ liệu là các số nguyên không dấu 32 bit theo thứ tự big-endian: byte thứ tự cao đứng trước byte thứ tự thấp hơn liên tiếp. Điều này có nghĩa là một từ 32 bit được trình bày trên mạng dưới dạng Byte quan trọng nhất (MSB), tiếp theo là Byte quan trọng nhất tiếp theo (MSB), tiếp theo là Byte quan trọng nhất tiếp theo (MSB), tiếp theo là Byte ít quan trọng nhất (LSB).

- Các trường văn bản trong Gói điều khiển MQTT được mô tả sau này được mã hóa dưới dạng chuỗi UTF-8. UTF-8 [RFC3629] là một mã hóa hiệu quả các ký tự Unicode tối ưu hóa việc mã hóa các ký tự ASCII để hỗ trợ giao tiếp dựa trên văn bản. Mỗi chuỗi này được bắt đầu bằng một trường độ dài hai Byte số nguyên cung cấp số byte trong chính chuỗi được mã hóa UTF-8, Cấu trúc của Chuỗi được mã hóa UTF-8 bên dưới. Do đó, kích thước tối đa của Chuỗi được mã hóa UTF-8 là 65,535 byte. Trừ khi có quy định khác, tất cả các chuỗi được mã hóa UTF-8 có thể có bất kỳ độ dài nào trong phạm vi từ 0 đến 65,535 byte.

Hình 2: Cấu trúc của chuỗi được mã hóa UTF-8

- Kích thước Byte số nguyên được mã hóa bằng cách sử dụng một lược đồ mã hóa sử dụng một byte duy nhất cho các giá trị lên đến 127. Các giá trị lớn hơn được xử lý như bảng dưới. Bảy bit quan trọng nhất của mỗi byte mã hóa dữ liệu và bit quan trọng nhất được sử dụng để cho biết liệu có các byte theo sau trong biểu diễn hay không. Do đó, mỗi byte mã hóa 128 giá trị và một "bit tiếp tục". Số byte tối đa trong trường biến Byte số nguyên là bốn. Giá trị được mã hóa phải sử dụng số byte tối thiểu cần thiết để đại diện cho giá trị.

Kích thước

Bắt đầu

Đến

1

0 (0x00)

127 (0x7F)

2

128 (0x80, 0x01)

16,383 (0xFF, 0x7F)

3

16,384 (0x80, 0x80, 0x01)

2,097,151 (0xFF, 0xFF, 0x7F)

4

2,097,151(0x80, 0x80, 0x80, 0x01)

268,435,455 (0xFF, 0xFF,  0xFF, 0x7F)

- Dữ liệu nhị phân được biểu thị bằng độ dài Số nguyên hai Byte cho biết số byte dữ liệu, theo sau là số byte đó. Do đó, độ dài của Dữ liệu nhị phân được giới hạn trong phạm vi từ 0 đến 65,535 Byte.

Bảo mật

MQTT được thiết kế một cách nhẹ và linh hoạt nhất có thể. Chính bởi vậy nó chỉ có một lớp bảo mật ở tầng ứng dụng: bảo mật bằng xác thực (xác thực các client được quyền truy cập tới broker).

Tuy vậy, MQTT vẫn có thể được cài đặt kết hợp với các giải pháp bảo mật đa tầng khác như kết hợp với VPN ở tầng mạng hoặc SSL/TLS ở tầng transport.

MQTT được thiết kế nhằm phục vụ truyền thông machine-to-machine nhưng thực tế chứng minh nó lại linh hoạt hơn mong đợi. Nó hoàn toàn có thể áp dụng cho các kịch bản truyền thông khác như: machine-to-cloud, cloud-to-machine, app-to-app. Chỉ cần có một Broker phù hợp và MQTT client được cài đặt đúng cách, các thiết bị xây dựng trên nhiều nền tảng khác nhau có thể giao tiếp với nhau một cách dễ dàng.

Kết luận

Trong bài viết này, giao thức truyền thông điệp/giao tiếp MQTT được giới thiệu đến người đọc từ giới thiệu chung đến các thông tin kỹ thuật chi tiết để có thể triển khai MQTT thực tế hiện nay. MQTT là một giao thức không mới trên thế giới nhưng với sự phát triển của các thiết bị IoT thì vẫn là một giao thức mới đáng để Việt Nam học tập và ứng dụng thực tiễn trong triển khai kết nối các thiết bị trong mạng hiện nay.

Thông qua việc giới thiệu giao thức mạng này, bài đọc đưa ra các cơ sở tri thức để áp dụng phát triển hạ tầng Internet vạn vật (IoT) phục vụ các ứng dụng nghiệp vụ, chuyên môn trong chính phủ điện tử hiện nay. Hi vọng trong tương lai có thể thấy các ứng dụng triển khai MQTT phục vụ người dân và cơ quan nhà nước trong khuôn khổ chính phủ điện tử của Việt Nam.

Vũ Cao Minh Đức

Tài liệu tham khảo

  1. ISO/IEC 20922:2016, Information technology — Message Queuing Telemetry Transport (MQTT) v3.1.
  2. MQTT Version 5.0, OASIS Standard, 07 March 2019
  3. OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee.
335 Go top

Sự kiện nổi bật

Ý kiến về Trang thông tin điện tử Cục Tin học hóa?
1. Đạt yêu cầu, 1180 phiếu (88 %)
2. Chưa đạt yêu cầu, 107 phiếu (8 %)
3. Cần thêm chủ đề, 57 phiếu (4 %)
Tổng số phiếu: 1344
THÔNG KÊ TRUY CẬP
  • Người trực tuyến Người trực tuyến
    • Khách Khách 26
    • Thành viên Thành viên 0
    • Tổng Tổng 26
    • Tổng lượt truy cập: Tổng lượt truy cập: 18316929