Trong bài này chúng ta sẽ cùng tìm hiểu giao thức MQTT là gì? Cách sử dụng giao thức này trong lập trình IOT. Hiểu được vị trí và tầm quan trọng của MQTT trong thế giới Internet of Things hiện nay.
Giao thức MQTT là gì?
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. 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ế.
MQTT là lựa chọn lý tưởng trong các môi trường như:
- Những nơi mà giá mạng viễn thông đắt đỏ hoặc băng thông thấp hay thiếu tin cậy.
- Khi chạy trên thiết bị nhúng bị giới hạn về tài nguyên tốc độ và bộ nhớ.
- Bởi vì giao thức này sử dụng băng thông thấp trong môi trường có độ trễ cao nên nó là một giao thức lý tưởng cho các ứng dụng M2M (Machine to Machine).
MQTT cũng là giao thức sử dụng trong Facebook Messager và Amazon IoT.
Lịch sử hình thành
MQTT được phát minh bởi Andy Stanford – Clark (IBM) và Arlen Nipper (EUROTECH) cuối năm 1999 khi mà nhiệm vụ của họ là tạo ra một giao thức sao cho sự hao phí năng lượng và băng thông là thấp nhất để kết nối đến đường ống dẫn dầu thông qua sự kết nối của vệ tinh.
Năm 2011, IBM và Eurotech đã trao lại MQTT cho một dự án của Eclipse có tên là Paho.
Năm 2013 MQTT đã được đệ trình lên OASIS (Organization for the Advancement of Structured Information Standards) để chuẩn hóa và trở thành 1 chuẩn giao thức trong tầng ứng dụng của bộ giao thức TCP/IP.
Tính năng, đặc điểm nổi bật
- Dạng truyền thông điệp theo mô hình Pub/Sub cung cấp việc truyền tin phân tán một chiều, tách biệt với phần ứng dụng.
- Việc truyền thông điệp là ngay lập tức, không quan tâm đến nội dung được truyền.
- Sử dụng TCP/IP là giao thức nền.
- Tồn tại ba mức độ tin cậy cho việc truyền dữ liệu (QoS: Quality of service)
- QoS 0: Broker/client sẽ gửi dữ liệu đúng một lần, quá trình gửi được xác nhận bởi chỉ giao thức TCP/IP.
- QoS 1: Broker/client sẽ gửi dữ liệu 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 1 lần xác nhận đã nhận được dữ liệu.
- QoS 2: Broker/client đảm bảo khi gửi dữ liệu thì phía nhận chỉ nhận được đúng một lần, quá trình này phải trải qua 4 bước bắt tay.
- Phần bao bọc dữ liệu truyền nhỏ và được giảm đến mức tối thiểu để giảm tải cho đường truyền.
Ưu điểm của giao thức MQTT
- Truyền thông tin hiệu quả hơn.
- Tăng khả năng mở rộng.
- Giảm đáng kể tiêu thụ băng thông mạng.
- Rất phù hợp cho điều khiển và do thám.
- Tối đa hóa băng thông có sẵn.
- Chi phí thấp.
- Rất an toàn, bảo mật.
- Được sử dụng trong các ngành công nghiệp dầu khí, các công ty lớn như Amazon, Facebook, ….
- Tiết kiệm thời gian phát triển.
- Giao thức publish/subscribe thu thập nhiều dữ liệu hơn và tốn ít băng thông hơn so với giao thức cũ.
Mô hình Publish/Subscriber trong giao thức MQTT
Bạn đã hiểu được giao thức MQTT là gì, vậy chúng ta sẽ phân tích mô hình và cơ chế hoạt động của nó nhé.
Thành phần bao gồm:
MQTT Broker là gì?
MQTT Broker hay máy chủ mô giới được coi như trung tâm, nó là điểm giao của tất cả các kết nối đến từ Client (Publisher/Subscriber).
Nhiệm vụ chính của Broker là nhận thông điệp (message) từ Publisher, xếp vào hàng đợi rồi chuyển đến một địa điểm 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 message, lưu trữ message, logs, ….
MQTT Broker được cung cấp dưới dạng mã nguồn mở hoặc các phiên bản thương mại giúp người dùng có thể tự cài đặt và tạo broker riêng. Ngoài ra các bạn cũng có thể sử dụng Broker trên điện toán đám mây với các nền tảng IOT như hive broker, amazone,….
MQTT Client là gì
Là các thiết bị/ứng dụng Client kết nối đến Broker để thực hiện truyền nhận dữ liệu .Client thì được chia thành hai nhóm là Publisher và Subscriber. Một Client có thể có 1 trong 2 nhiệm vụ hoặc cả 2.
Publisher là thiết bị gửi bản tin lên broker
Subscriber là người nhận bản tin mỗi khi có bản tin mới gửi lên Broker.
Lấy một ví dụ đơn giản, mô hình này cũng giống như mô giới nhà đất vậy. Người bán đất (Publisher ) sẽ liên hệ với Mô giới (Broker), gửi cho mô giới thông tin về lô đất đó, giá cả… Sau đó mô giới sẽ liên hệ với người mua đất (Subscriber), người này đã đăng kí với mô giới là nếu có đất ở khu ABC thì báo cho tôi nhé.
Vậy là người mua sẽ mua được đất từ người bán, thông qua một ông trung gian. Mà không cần liên hệ trực tiếp với nhau
Tính chất của mô hình pub/sub
- Tính chất:
- Space decoupling (Không gian tách biệt)
- Time decoupling (Thời gian tách biệt)
- Synchronization decoupling (Sự đồng bộ riêng rẽ)
- Đặc điểm riêng:
- MQTT sử dụng cơ chế lọc thông điệp dựa vào tiêu đề (subject-based)
- MQTT có một tầng gọi là chất lượng dịch vụ (Quality of Services – QoS). Nó giúp cho dễ dàng nhận biết được là message có được truyền thành công hay không.
Cơ chế hoạt động của giao thức MQTT
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 (máy khách) bắt đầu bằng cách tạo kết nối Transmission Control Protocol/Internet Protocol (TCP/IP) tới 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à phát triển broker.
- Các cổng tiêu chuẩn là 1883 cho giao tiếp không 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 giao tiếp SSL/TLS, máy khách cần kiểm chứng và xác thực máy chủ.
- Sau đó, Client sẽ gửi bản tin lên broker nếu là Publisher hoặc nhận bản tin từ broker về nếu là Subscriber. Quá trình kết nối này sẽ được giữ đến khi Kết thúc kết nối.
- Sau khi kết thúc để có thể truyền nhận MQTT, chúng ta lại tiếp tục quay lại các bước trên.
Các khái niệm trong MQTT
Message
Trong giao thức MQTT, message còn được gọi là “message payload”, 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.
Topic
Topic có thể coi như một “đường truyền” logic giữa 2 điểm là publisher và subscriber. Về cơ bản, khi message được publish vào một topic thì tất cả những subscriber của topic đó sẽ nhận được message này.
Giao thức MQTT cho phép khai báo các topic kiểu phân cấp.
Giả sử chúng ta có một hệ thống cảm biến đo thông tin môi trường trong ngôi nhà của chúng ta. 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ủa chúng ta có thể được khai báo như sau
home/living-room/temperature: topic thông tin nhiệt độ phòng khách
home/living-room/humidity: topic thông tin độ ẩm phòng khách
home/kitchen/temperature: topic thông tin nhiệt độ bếp ăn
QoS
Ở đây có 3 tuỳ chọn QoS (Qualities of service) khi “publish” và “subscribe”:
- QoS0: Broker/client sẽ gởi dữ liệu đúng 1 lần, quá trình gởi được xác nhận bởi chỉ giao thức TCP/IP, giống kiểu đem con bỏ chợ.
- QoS1: Broker/client sẽ gởi dữ liệu với ít nhất 1 lần xác nhận từ đầu kia, nghĩa là có thể có nhiều hơn 1 lần xác nhận đã nhận được dữ liệu.
- QoS2: Broker/client đảm bảm khi gởi dữ liệu thì phía nhận chỉ nhận được đúng 1 lần, quá trình này phải trải qua 4 bước bắt tay.
Một gói tin có thể được gởi ở bất kỳ QoS nào, và các client cũng có thể subscribe với bất kỳ yêu cầu QoS nào. Có nghĩa là client sẽ lựa chọn QoS tối đa mà nó có để nhận tin. Ví dụ, nếu 1 gói dữ liệu được publish với QoS2, và client subscribe với QoS0, thì gói dữ liệu được nhận về client này sẽ được broker gởi với QoS0, và 1 client khác đăng ký cùng kênh này với QoS 2, thì nó sẽ được Broker gởi dữ liệu với QoS2.
Một ví dụ khác, nếu 1 client subscribe với QoS2 và gói dữ liệu gởi vào kênh đó publish với QoS0 thì client đó sẽ được Broker gởi dữ liệu với QoS0. QoS càng cao thì càng đáng tin cậy, đồng thời độ trễ và băng thông đòi hỏi cũng cao hơn.
Retain
Retain là một cờ (flag) được gắn cho một message 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 topic kèm theo mức QoS tương ứng. Khi client bắt đầu subscribe topic có message được lưu lại đó, client ngay lập tức nhận được message.
MQTT Bridge
MQTT Bridge là một tính năng của MQTT Broker cho phép các MQTT 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 topic được trao đổi giữa 2 broker, chiều trao đổi (1 chiều hay 2 chiều) và topic mapping giữa 2 broker
Các broker MQTT miễn phí nổi tiếng hiện nay
Public Broker
Các public Broker là các broker mọi người đều có thể truy cập vào, thường thì chúng ta sẽ sử dụng các broker này để test kết nối, hoặc làm các project đơn giản. Các public Broker thông dụng nhất như sau
Các nhà cung cấp này cũng sẽ cung cấp cả private Broker tùy vào việc sử dụng của các bạn
Private Broker
Các Private Broker thường được sử dụng khi làm các sản phẩm, với kết nối bảo mật SSL/TLS giúp bảo mật thông tin tốt hơn.
Vì là free nên các bạn phải sử dụng theo giới hạn mà mỗi nhà cung cấp đưa ra. Khi vượt qua ngưỡng đó chúng ta cần trả thêm tiền để có thể sử dụng.
Ứng dụng của MQTT hiện nay
- Facebook Messenger: Facebook đã sử dụng các khía cạnh của MQTT trong Facebook Messenger để trò chuyện trực tuyến . Tuy nhiên, không rõ MQTT được sử dụng bao nhiêu hoặc để làm gì.
- IECC Scalable: DeltaRail phiên bản mới nhất của hệ thống kiểm soát hiệu IECC của họ đã sử dụng MQTT cho thông tin liên lạc trong các phần khác nhau của hệ thống và các thành phần khác của hệ thống báo hiệu. Nó cung cấp khung truyền thông cơ bản cho một hệ thống tuân thủ các tiêu chuẩn CENELEC cho các thông tin liên lạc quan trọng về an toàn.
- Amazon Web Services đã công bố Amazon IoT dựa trên MQTT vào năm 2015.
- Các tổ chức không gian địa lý SensorThings API đặc điểm kỹ thuật tiêu chuẩn có một phần mở rộng MQTT trong tiêu chuẩn như một giao thức thông báo bổ sung ràng buộc. Nó đã được chứng minh trong một thí điểm IoT của Bộ An ninh Nội địa Hoa Kỳ.
- Các dịch vụ của Cơ sở hạ tầng thượng nguồn OpenStack được kết nối bằng một bus tin nhắn hợp nhất MQTT với Mosquitto là broker MQTT.
- Adafruit đưa ra một MQTT miễn phí Cloud Service cho thí nghiệm IOT và người học gọi Adafruit IO trong năm 2015.
- Microsoft Azure IoT Hub sử dụng MQTT làm giao thức chính cho các tin nhắn từ xa .
- XIM, Inc. đã ra mắt ứng dụng khách MQTT có tên MQTT Buddy vào năm 2017. Đây là ứng dụng MQTT dành cho Android và iOS , nhưng không phải là F-Droid , người dùng có sẵn bằng tiếng Anh, tiếng Nga và tiếng Trung Quốc.
- Node-RED hỗ trợ các nút MQTT kể từ phiên bản 0.14, để định cấu hình đúng các kết nối TLS.
- Nền tảng tự động hóa phần mềm nguồn mở Home Assistant được bật MQTT và cung cấp bốn tùy chọn cho các broker MQTT.
Kết
Nếu giao thức HTTP rất quan trọng trong hệ thống Internet hiện nay, thì MQTT lại được sử dụng trong các hệ thống IOT.
Giao thức MQTT có tính Realtime cao, gọn nhẹ, dễ sử dụng. Hầu hết các sản phẩm IOT hiện nay đều có sử dụng giao thức MQTT, MQTT còn có thể kết hợp với các Server HTTP để có thể lưu trữ và truy cập dữ liệu từ App hoặc web.
Nếu thấy có ích hãy chia sẻ bài viết và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi nhé