Giao thức MQTT

    0

    MQTT (Message Queuing Telemetry Transport) là một giao thức truyền thông đa năng thuộc tầng ứng dụng và được xem như giao thức tiêu chuẩn trong IoT. Trong bài học này chúng ta sẽ cùng tìm hiểu một số đặc điểm quan trọng nhất của giao thức MQTT.

    Giới thiệu chung về giao thức MQTT

    MQTT (Message Queuing Telemetry Transport) là một giao thức truyền thông đặc biệt phổ biến trong IoT do Andy Stanford-Clark (IBM) và Arlen Nipper (EuroTech) phát minh vào năm 1999. Giao thức này đặc biệt phù hợp cho việc truyền dữ liệu giữa các thiết bị IoT. Đến nay, MQTT được xem là một giao thức tiêu chuẩn trong IoT.

    Các thiết bị IoT có đặc điểm chung là: hạn chế về năng lực xử lý, sử dụng kết nối mạng băng thông thấp, yêu cầu tiêu thụ năng lượng thấp, đa dạng về kiến trúc phần cứng và phần mềm. Để đáp ứng các yêu cầu đó, giao thức MQTT có những đặc điểm quan trọng sau:

    1. MQTT là một giao thức rất nhẹ, phù hợp cho việc truyền tải giữa các thiết bị IoT vốn có băng thông thấp. MQTT sử dụng cấu trúc dữ liệu dạng nhị phân đơn giản và gọn nhẹ. Mỗi gói tin MQTT có header chỉ 2 byte. Các giao thức ứng dụng truyền thống dựa trên văn bản phổ biến như HTTP đều rất nặng khi so với MQTT và không phù hợp với môi trường IoT.
    2. Thực thi của MQTT là một thư viện nhẹ đối với thiết bị, giúp nó rất phù hợp với các thiết bị hạn chế về năng lực xử lý. Bản thực thi của MQTT có thể cài đặt ở dạng thư viện lên nhiều loại thiết bị khác nhau, từ máy tính cá nhân, thiết bị di động thông minh, máy tính mini Raspberry Pi, tới thiết bị Arduino. 
    3. Thư viện thực thi của MQTT cũng được tạo ra cho nhiều nền tảng phát triển ứng dụng khác nhau. Hiện nay có thư viện MQTT cho C, C++, .NET, Java, Python, JavaScript. Các nền tảng phát triển ứng dụng này đều hoạt động trên nhiều loại thiết bị IoT cũng như các thiết bị đầu cuối truyền thống. Điều này giúp cho MQTT trở nên đặc biệt phổ biến.
    4. MQTT sử dụng dịch vụ truyền thông của TCP. Điều này giúp MQTT khai thác cơ chế truyền tin cậy của TCP trong môi trường mạng thiếu ổn định của IoT.
    5. MQTT có cơ chế đảm bảo chất lượng dịch vụ riêng, kết hợp với cơ chế truyền tin cậy của TCP, giúp đảm bảo việc truyền thông tin trong môi trường IoT.
    6. MQTT sử dụng mô hình truyền thông điệp kiểu publisher / subscriber. Trong mô hình này, một thành phần trung gian gọi là MQTT broker sẽ đảm nhiệm việc chuyển tiếp dữ liệu từ một nguồn phát (publisher) tới nhiều đích nhận (subscriber). 
    7. MQTT có khả năng truyền thông theo kiểu 1 – nhiều (multicast/broadcast) rất phù hợp với IoT. Đây là kết quả trực tiếp từ mô hình publisher / subscriber. Mô hình này cho phép 1 ứng dụng điều khiển đồng thời nhiều thiết bị, hoặc dữ liệu từ một thiết bị có thể đồng thời tới nhiều đích (như server lưu trữ, phần mềm điều khiển).

    Hiện nay đang cùng tồn tại một số phiên bản khác nhau của MQTT, bao gồm MQTT-SN v1.2, MQTT 3.1, MQTT 3.1.1, MQTT 5. Việc lựa chọn phiên bản cần lưu ý đến khả năng hỗ trợ của server và các thư viện client.

    So sánh HTTP và MQTT

    MQTT là một giao thức “đa năng” theo nghĩa nó có thể được sử dụng bởi bất kỳ phần mềm nào để truyền tải bất kỳ dữ liệu nào.

    Hiện nay HTTP rất phổ biến trong phát triển ứng dụng mạng. HTTP, mặc dù có khởi đầu là một giao thức chuyên dụng cho truyền tải văn bản web, cũng phát triển thành một giao thức “đa năng”. Thực tế các thư viện hỗ trợ HTTP client cũng hoạt động rất tốt trên các thiết bị như máy tính mini.

    Tuy nhiên, so với HTTP, MQTT có một số điểm khác biệt cần lưu ý khi phát triển ứng dụng:

    • MQTT sử dụng mô hình truyền thông điệp publisher / subscriber, trong khi HTTP sử dụng mô hình request / response. Mô hình publisher / subscriber tạo ra ứng dụng phân tán hoạt động theo kiểu bất đồng bộ và hướng sự kiện. Mô hình request / response hoạt động chủ yếu theo dạng đồng bộ.
    • MQTT cho phép truyền thông tin client – 0 / 1 / nhiều client (truyền thông tin theo dạng broadcast / multicast). HTTP chỉ cho phép truyền thông tin 1 client – 1 server (truyền thông tin kiểu unicast). Ngoài ra, HTTP cũng không cho phép truyền client – client.
    • MQTT sử dụng cấu trúc gói tin dạng nhị phân, trong khi HTTP sử dụng cấu trúc gói tin dạng văn bản. Cấu trúc gói tin dạng văn bản yêu cầu dữ liệu nhị phân phải được chuyển về văn bản dạng Base64 mới có thể đóng gói. Cấu trúc gói tin nhị phân của MQTT yêu cầu dữ liệu (gọi là payload) phải chuyển về dạng mảng byte để đóng gói.
    • MQTT và HTTP đều đòi hỏi phần mềm server độc lập và cùng sử dụng dịch vụ giao vận của TCP. MQTT server (thường gọi là broker) mặc định sử dụng cổng TCP/1883, còn HTTP server sử dụng cổng TCP/80.

    Mô hình hoạt động của MQTT

    MQTT sử dụng mô hình truyền thông điệp kiểu pub/sub. Mô hình pub/sub (publisher/subscriber) là một mô hình truyền thông điệp trong hệ thống phân tán. Khi áp dụng MQTT đòi hỏi các thành phần sau:

    MQTT client: là thành phần nguồn phát đi thông điệp hoặc đích nhận thông điệp cuối cùng. Nguồn phát đi thông điệp được gọi là publisher. Đích nhận thông điệp được gọi là subscriber.

    Client thực tế là các thư viện thực thi MQTT nhúng trong ứng dụng khác. Client có thể nhúng trong các loại chương trình khác nhau hoạt động ở nhiều vai trò, bao gồm: ứng dụng hoạt động trên desktop, mobile; chương trình server cài đặt trên một máy chủ; phần mềm hoạt động trên thiết bị IoT  (như Raspberry Pi, Arduino).

    Hiện nay có nhiều thư viện client phổ biến cho các nền tảng khác nhau: MqttNet cho nền tảng .NET, Paho client cho Python, Paho client cho Java, C/C++ client cho Arduino, v.v.. Trên mỗi nền tảng thậm chí có nhiều thư viện client khác nhau.

    Mỗi client có thể đồng thời đóng vai trò publisher và subscriber. Ví dụ, một máy tính mini Raspberry Pi khi gắn với các thiết bị cảm biến có thể đóng vai trò subscriber để nhận yêu cầu (thường phát từ ứng dụng web hoặc mobile), đồng thời có thể đóng vai trò publisher để truyền về server số liệu thu thập từ cảm biến.

    MQTT broker: là một phần mềm trung gian đóng vai trò trung tâm chuyển tiếp thông điệp giữa các client. 

    Trong mô hình hoạt động của MQTT, các client không trao đổi thông điệp trực tiếp với nhau. Thông điệp từ publisher phát đi sẽ truyền đến broker. Broker căn cứ vào “chủ đề” của thông điệp để phân phối nó tới cho các subscriber phù hợp.

    Khác biệt với client, broker là một phần mềm hoặc dịch vụ độc lập. Phần mềm broker thường cài trên server có IP (hoặc domain name) cố định để client có thể kết nối tới. Broker cũng có thể là một dịch vụ do một hãng cung cấp trên đám mây.

    Mosquitto là một trong những broker mã mở miễn phí có thể cài đặt trên cả windows và linux. Có thể sử dụng broker này cho mục đích thử nghiệm. Một broker thương mại phổ biến khác là HiveMQ.

    MQTT broker độc lập với các client. Broker thường do các hãng riêng phát triển. Một chương trình broker có thể làm việc với client bất kỳ, không phân biệt client đó được xây dựng trên nền tảng nào và do ai phát triển.

    Hình sau đây minh họa mô hình hoạt động tổng quát của một hệ thống IoT sử dụng MQTT.

    Các khái niệm trong MQTT

    Thông điệp – Message

    Message hay thông điệp, còn được gọi là gói tin (packet) trong MQTT là đơn vị dữ liệu được truyền giữa các thành phần. Thông điệp là một chuỗi byte theo định dạng của MQTT được thư viện client sinh ra. Kích thước tối đa của mỗi thông điệp là 256MB.

    Mỗi thông điệp chứa các phần: 

    • Header tĩnh: 2 byte, chứa thông tin về loại thông điệp, các cờ và độ dài của thông điệp
    • Header động: có độ dài tùy ý, chứa chủ đề (topic) của thông điệp và thông tin về chất lượng dịch vụ (QoS) yêu cầu
    • Payload: là phần dữ liệu gửi trong thông điệp.

    MQTT định nghĩa một số loại gói tin, dưới đây là một số loại trong đó:

    • CONNECT: client gửi broker để thiết lập liên kết.
    • CONNACK: broker gửi client để xác nhận liên kết.
    • DISCONNECT: client hoặc broker dùng để ngắt liên kết.
    • PUBLISH: client dùng để phát đi thông điệp.
    • SUBSCRIBE: client gửi cho broker để đăng ký chủ đề.
    • SUBACK: broker gửi lại cho client để xác định chủ đề đăng ký.
    • UNSUBSCRIBE: client gửi cho broker để hủy đăng ký chủ đề.
    • UNSUBACK: broker gửi lại cho client để xác nhận hủy đăng ký chủ đề.

    Chủ đề – Topic

    Topic hay chủ đề trong MQTT là một chuỗi ký tự UTF-8 mà broker sử dụng để lọc và chuyển tiếp thông cho các client đang kết nối. Chuỗi chủ đề được chứa trong thông điệp của MQTT, ở phần header động.

    Publisher khi phát đi một thông điệp tới broker sẽ luôn phải kèm theo một chuỗi chủ đề. Subscriber chỉ nhận được thông điệp theo chủ đề nó đã đăng ký. Broker sẽ lọc thông điệp theo chủ đề và chuyển tiếp cho subscriber phù hợp.

    Chuỗi chủ đề được tổ chức theo cấu trúc phân cấp. Các cấp độ được phân tách bởi ký tự \. Ví dụ, trong một hệ thống nhà thông minh, có thể sử dụng các chủ đề như sau để điều khiển các thiết bị: “home/livingroom/airconditioner”, “home/kitchen/refrigerator”. 

    Như vậy, có thể hình dung chủ đề như là “lệnh” trong mqtt, trong đó publisher phát lệnh, một hoặc nhiều subscriber nhận lệnh tương ứng. Những thông tin khác đi kèm lệnh có thể đặt trong phần payload của gói tin mqtt.

    Trong chuỗi chủ đề có thể sử dụng các ký tự đại diện (wildcard), bao gồm:

    • Ký tự +: tương ứng với một cấp độ chủ đề bất kỳ. Ví dụ, nếu subscriber đăng ký nhận thông điệp theo chủ đề “sport/+”, broker sẽ chuyển tiếp cho subscirber đó tất cả các thông điệp chứa chủ đề bắt đầu bằng “sport” nhưng khác nhau ở chủ đề con, như “sport/football”, “sport/basketball”, “sport/baseball”, v.v..
    • Ký tự #: tương ứng với nhiều cấp độ chủ đề bất kỳ. Ví dụ, nếu subscriber đăng ký nhận thông điệp theo chủ đề “sport/#”, broker sẽ chuyển tiếp cho nó tất cả các thông điệp chứa chủ đề bắt đầu bằng “sport” nhưng khác nhau ở các chủ đề con đến nhiều cấp độ, như “sport/football”, “sport/football/laliga”, “sport/football/premierleague”, “sport/basketball”, “sport/basketball/nba”, v.v.. Tức là, so với +, # đại diện cho nhiều cấp độ chủ đề. 

    Tải trọng – Payload

    Payload hay tải trọng là phần thông tin lưu trong gói tin của MQTT thường dùng để chứa dữ liệu mà publisher muốn gửi cho subscriber. 

    Nếu xem chủ đề là một dạng lệnh thì tải trọng có thể xem là dữ liệu hoặc tham số phục vụ cho xử lý lệnh đó.

    Trong MQTT 3.1.1, kích thước tối đa của phần tải trọng là 268435455 B. Trong IoT khuyến nghị không sử dụng phần tải trọng quá lớn cho gói tin MQTT.

    Do đặc thù của MQTT sử dụng gói tin nhị phân, mọi dữ liệu muốn đưa vào phần tải trọng cũng phải chuyển thành chuỗi byte.

    Trong .NET có thể sử dụng class BitConverter hoặc kỹ thuật serialization để chuyển đổi dữ liệu về dạng chuỗi byte và ngược lại. Các kỹ thuật này đã được học trong bài học tương ứng.

    Chất lượng dịch vụ – QoS

    QoS (Quality of Service) hay Chất lượng dịch vụ trong MQTT là thỏa thuận giữa publisher và receiver thể hiện mức độ đảm bảo sự tin cậy khi phân phối thông điệp. 

    Giao thức MQTT cũng cung cấp ba mức độ chất lượng dịch vụ (QoS) để đảm bảo độ tin cậy cho việc truyền dữ liệu:

    • 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 tính năng báo nhận của giao thức TCP. Ở mức độ này, MQTT thực tế không tham gia vào việc đảm bảo chất lượng dịch vụ.
    • 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.

    Việc sử dụng mức độ chất lượng dịch vụ nào phụ thuộc vào yêu cầu của phần mềm. Mức độ yêu cầu càng cao thì càng an toàn với dữ liệu gửi, nhưng đồng thời lại làm tăng chi phí (về thời gian, xử lý, và băng thông) cho quá trình gửi.

    Cầu nối – Bridge

    Bridge hay cầu nối trong MQTT là thành phần giúp kết nối các broker với nhau. Cầu nối thường được sử dụng để chia sẻ thông điệp giữa các hệ thống. 

    Một trường hợp sử dụng phổ biến của cầu nối là tạo ra một mạng lưới broker, với một broker ở trung tâm với một số broker ở biên.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Kết luận

    Trong bài học này chúng ta đã xem xét chi tiết về giao thức MQTT. Để có thể lập trình được với giao thức này (sẽ xem xét trong bài học sau), bạn cần ghi nhớ:

    • MQTT hoạt động theo mô hình publish / subscribe. Đây là điều khác biệt lớn nhất với các giao thức ứng dụng quen thuộc khác.
    • MQTT cần cài đặt Broker riêng rẽ. Broker có thể xem như một dạng server trung chuyển thông điệp giữa các client.
    • Các khái niệm cơ bản của MQTT, bao gồm message, payload, topic, client, broker, QoS.

    Trong bài học tiếp theo chúng ta sẽ xem xét kỹ thuật lập trình MQTT với thư viện MQTTnet.

    Theo dõi
    Thông báo của
    guest

    0 Thảo luận
    Phản hồi nội tuyến
    Xem tất cả bình luận