Đây là một trong số các bài viết mở đầu cho series "xây dựng hệ thống cảm biến môi trường trong nhà thông minh". Series này sẽ hướng dẫn các bạn xây dựng hoàn chỉnh một hệ thống cảm biến nhiệt độ - độ ẩm - ánh sáng của một ngôi nhà thông minh. Tuy nhiên, trước khi bắt tay vào xây dựng hệ thống, chúng ta cần check lại một số kiến thức cơ bản cũng như các nền tảng công nghệ sẽ được áp dụng trong sản phẩm này.

HiveMQ
HiveMQ - một trong số các openSource MQTT broker

MQTT = Message Queue Telemetry Transport

Đây là một giao thức truyền thông điệp (message) 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.

Kiến trúc mức cao (high-level) của MQTT gồm 2 phần chính là Broker và Clients.

MQTT high-level architecture

Trong đó, broker đượ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. Nhiệm vụ chính của broker là nhận mesage từ publisher, xếp các message 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 message, lưu trữ message, logs,...

Client thì được chia thành 2 nhóm là publisher và subscriber. Client là các software components hoạt động tại edge device  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à publish các message lên một topic cụ thể hoặc subscribe một topic nào đó để nhận message từ topic 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...

Các bạn có thể tưởng tượng broker giống như một sạp báo. Publisher là các tòa soạn báo. Tòa soạn in báo và chuyển cho sạp báo. Người đọc báo đến sạp báo, chọn tờ báo mình cần đọc (subscriber).

sạp báo

Tham khảo các khóa học lập trình online, onlab, và thực tập lập trình tại TechMaster

Các khái niệm đáng chú ý trong giao thức MQTT

Trong một hệ thống sử dụng giao thức MQTT, nhiều client kết nối tới một server (Trong MQTT, server được gọi là MQTT Broker).Mỗi client sẽ đăng ký theo dõi các kênh thông tin (topic) hoặc gửi dữ liệu lên kênh thông tin đó. Quá trình đăng ký này gọi là “subscribe” và hành động một client gửi dữ liệu lên kênh thông tin được gọi là “publish”. Mỗi khi kênh thông tin đó được cập nhật dữ liệu (dữ liệu này có thể đến từ các client khác) thì những client nào đã đăng ký theo dõi kênh này sẽ nhận được dữ liệu cập nhật đó.

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

Bên cạnh đó, MQTT cũng hộ trợ wildcards trong cú pháp khai báo topic, cụ thể đó là "+" và "#". Trong đó, "+" bao gồm các topic ở cùng 1 level và "#" bao gồm tất cả các topic nằm dưới topic hiện tại.

Cụ thể như sau, khi muốn biết thông tin nhiệt độ của từng phòng, ta chỉ cần khai báo topic cần theo dõi là:

home/+/temperature

Khi muốn biết tất cả thông tin trong 1 phòng, ta sẽ khai báo topic cần theo dõi là:

home/kitchen/#

QoS - Quality of Service

Khái niệm này ra đời do nhu cầu đảm bảo sự chắc chắn trong việc gửi - nhận message giữa client và broker

MQTT hỗ trợ 3 mức QoS

QoS-0 là mức đảm bảo thấp nhất, tất cả các message có QoS 0 sau khi được gửi đi bởi publisher sẽ không được kiểm tra xem đã đến broker hay chưa (fire - and - forget)

QoS-1: message được đảm bảo rằng đã đến nơi nhận ít nhất 1 lần (tức là sự trùng lặp vẫn có thể xảy ra)

QoS-2: đây là mức đảm bảo cao nhất, broker sẽ đảm bảo các message có QoS-2 sẽ đến nơi nhận chỉ 1 lần duy nhất, không trùng lặp, không thất lạc. Tất nhiên việc xác nhận với QoS-2 sẽ tốn băng thông hơn 2 cách còn lại.

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

Bảo mật

MQTT được thiết kế một cách nhẹ và linh hoạt nhất có thể. Do đó nó chỉ có 1 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.

Giao thức MQTT ra đời năm 1999 và tính đến thời điểm hiện tại, MQTT phiên bản 3.1.1 được công nhận chuẩn OASIS.

Techmaster via Dzone