Xây dựng hệ thống Internet of Thing sử dụng nền tảng Google Cloud IoT Core (P4)

Trong phần 3, mình đã hướng dẫn cách kết nối thiết bị IoT đến Google Cloud IoT Core (GCIC) qua giao thức MQTT. Trong phần này chúng ta sẽ tiếp tục với cách truyền nhận dữ liệu thông qua các topic đặc biệt được quy định bởi GCIC nhé.

Phần 4: Tương tác giữa các thiết bị IoT với Google Cloud IoT Core thông qua giao thức MQTT

1. Phân loại topic tương tác giữa MQTT Client và Google Cloud IoT Core:

Với mô hình MQTT cổ điển, các client sau khi kết nối với broker sẽ gửi tin (publish) và đăng ký nhận tin (subscribe) đến các topic bất kỳ mà không hề có tính phân loại. Tuy nhiên khi làm việc với GCIC, client muốn gửi và nhận gói tin phải tuân theo kiến trúc và các quy tắc topic được Google xây dựng sẵn, việc này về cơ bản sẽ không mang lại quá nhiều khác biệt với hệ thống nhỏ nhưng với quy mô lớn như doanh nghiệp với lượng gói tin rất lớn được trao đổi liên tục trong thời gian ngắn và các client được phân loại vai trò rõ ràng thì mô hình của GCIC kết hợp với nền tảng nhắn tin thời gian thực Cloud Pub/Sub sẽ mang lại rất nhiều lợi ích về mặt thiết kế, quản lý, hiệu suất và phù hợp với các thiết bị IoT trong thực tế. Ngoài ra GCIC còn hỗ trợ tương tác thông qua giao thức HTTPS trong một số trường hợp nhưng trong phạm vi bài viết sẽ chỉ tập trung vào giao thức chính là giao thức MQTT.

Để dễ hình dung, đứng ở vai trò thiết bị (Device) chúng ta sẽ chia ra hai quá trình là:

  • Truyền dữ liệu (publisher): Device (client) -> Cloud (server) bao gồm các loại topic:
    • State:
      • Format topic: /devices/{device-id}/state
      • Mục đích sử dụng: gửi dữ liệu liên quan đến trạng thái hiện tại của thiết bị, không bao gồm môi trường xung quanh. Ví dụ như trạng thái hoạt động của thiết bị, phiên bản firmware hiện tại.
      • Tần suất gửi dữ liệu: không thường xuyên, khuyến khích khoảng thời gian giữa các gói nhanh nhất là 10 giây/thiết bị (GCIC giới hạn không được gửi nhanh hơn tần suất 1 gói/giây/thiết bị đối với loại topic này).
      • Dung lượng gói tin tối đa: 64 KB
      • Persistence (lưu trữ theo thời gian): 10 gói tin cuối cùng được lưu trữ ở GCIC. Có thể cấu hình để chuyển tiếp gói tin đến Cloud Pub/Sub topic (không bắt buộc).
    • Telemetry (hay telemetry events)
      • Format topic: /devices/{device-id}/events
      • Mục đích sử dụng: gửi tất cả các dữ liệu sự kiện, ví dụ như dữ liệu đo đạc từ cảm biến về môi trường xung quanh, dữ liệu trạng thái điều khiển  các thiết bị,… Tóm lại đây là topic có thể dùng để gửi loại dữ liệu thông thường với tần suất gói tin lớn.
      • Tần suất gửi dữ liệu: thường xuyên.
      • Dung lượng gói tin tối đa: 256 KB
      • Persistence: tất cả gói tin khi gửi đến GCIC sẽ tự động được chuyển tiếp đến topic trong dịch vụ Cloud Pub/Sub (topic này phải được đăng ký trong quá trình tạo registry).
  • Nhận dữ liệu (subscriber): Cloud (server) -> Device (client) bao gồm các loại topic:
    • Configuration:
      • Format topic: /devices/{device-id}/config
      • Mục đích sử dụng: gửi yêu cầu cập nhật cấu hình đặc biệt đến thiết bị, ví dụ cập nhật firmware mới, khởi động thiết bị, kích hoạt một tính năng đặc biệt nào đó hoặc thay đổi thuộc tính của thiết bị.
      • Tần suất gửi dữ liệu: không thường xuyên, khuyến khích khoảng thời gian giữa các gói nhanh nhất là 10 giây/thiết bị (GCIC giới hạn không được gửi nhanh hơn tần suất 1 gói/giây/thiết bị đối với loại topic này).
      • Dung lượng gói tin tối đa: 64 KB
      • Persistence (lưu trữ theo thời gian): 10 gói tin cuối cùng được lưu trữ ở GCIC.
    • Command:
      • Format topic: /devices/{device-id}/commands/# (yêu cầu phải có hậu tố wildcard #)
      • Mục đích sử dụng: gửi dữ liệu thông thường đến thiết bị, ví dụ yêu cầu điều khiển trạng thái ngoại vi, thay đổi tính năng,…
      • Tần suất gửi dữ liệu: thường xuyên
      • Dung lượng gói tin tối đa: 256 KB
      • Persistence (lưu trữ theo thời gian): không lưu trữ mà chỉ chuyển tiếp đến những subscriber hiện tại mà thôi.

Như vậy có thể nhận thấy rằng, GCIC quy định rất rõ ràng các loại gói tin nên được tổ chức gửi và nhận ở các topic khác nhau. Cũng ở vai trò thiết bị với những topic như trên, có thể phân loại theo mục đích sử dụng thực tế (đây là một cách hiểu tường minh hơn do mình rút ra được từ những lý thuyết ở trên) là:

  • Các dữ liệu liên quan đến nội tại của thiết bị, thường được sử dụng bởi nhà sản xuất và tần suất gửi thấp bao gồm: State (publish) và Config (subscribe).
  • Các dữ liệu liên quan đến tính năng của thiết bị trong quá trình vận hành, có thể dùng để tương tác giữa thiết bị với các ứng dụng người dùng bao gồm: Telemetry (publish) và Command (subscribe).

Lưu ý: vì được tổ chức và quy định cụ thể như vậy, nếu client publish hoặc subscribe đến một topic sai định dạng sẽ bị ngắt kết nối ngay lập tức.

Một câu hỏi đặt ra là, vậy làm thế nào các client có thể gửi dữ liệu cho nhau khi các topic dùng để publish và subscribe tách rời nhau và chỉ diễn ra một chiều như vậy? Chiều ngược lại được thực hiện như thế nào? Câu trả lời là dữ liệu từ các topic còn có thể tương tác theo chiều ngược lại với nhiều cách khác nhau như: kết hợp với Cloud Pub/Sub, sử dụng Google IoT Core API (API cho nhiều ngôn ngữ như: Node.js, PHP, Python, C#,…) hoặc có thể review gói tin bằng công cụ có sẵn của Google như Cloud Platform Console và Gcloud. Cụ thể được tổng hợp lại ở bảng sau:

Topic

Send

Receive
State

MQTT bridge

Cloud Pub/Sub Topic

Cloud IoT Core API (tối đa 10)

Cloud Platform Console (tối đa 10)

Gcloud (tối đa 10)

Telemetry

MQTT bridge

Cloud Pub/Sub Topic

Configuration Cloud IoT Core API

Cloud Platform Console

Gcloud

MQTT bridge

Cloud IoT Core API (tối đa 10)

Cloud Platform Console (tối đa 10)

Gcloud (tối đa 10)

Command Cloud IoT Core API

Cloud Platform Console

Gcloud

MQTT bridge

2. Thực hành tương tác MQTT client với các topic:

Để hiểu rõ hơn về cách truyền nhận dữ liệu qua các topic với MQTT client, mình sẽ hướng dẫn các bạn thực hành với hai loại topic mẫu là State và Configuration, trong đó một client là MQTT.fx và một client đóng vai trò ngược lại sẽ là Cloud Platform Console hoặc Gcloud.

 

  • Thực hành với Topic State (publish):

Để publish một gói tin đến topic State, đầu tiên MQTT.fx cần kết nối đến GCIC, cách kết nối đã được hướng dẫn ở phần 3, các bạn có thể xem lại nhé. Định dạng topic là /devices/{device-id}/state, ở đây mình publish một gói tin như hình:

Sau khi publish xong, bây giờ chúng ta sẽ review gói tin đã được lưu trữ ở GCIC. Để review gói tin sử dụng Cloud Platform Console, ở cửa sổ console của mục device, chọn Configration & state history (nhớ tick vào ô state history bên dưới), sẽ thấy được danh sách 10 gói tin state gần nhất (ở đây mình có 3 gói). Khi chọn vào từng gói tin có thể xem được ở gói tin ở dạng mã hóa Base64 hoặc dạng Text.

Để review gói tin sử dụng Gcloud, tại cửa sổ Activate Cloud Shell, thực thi dòng lệnh như hình bên dưới cũng sẽ nhận được lịch sử tối đa 10 gói tin gần nhất (ở đây mình có 3 gói):

gcloud iot devices states list –registry=registry1 –device=device1 –region=asia-east1 –format=json

 

  • Thực hành với Topic Configuration (subscribe):

Đầu tiên, chúng ta sẽ thực hiện bước publish bằng Cloud Platform Console, tại cửa sổ device console. Chọn UPDATE CONFIG.

Sau đó điền gói tin bất kỳ vào cửa sổ với định dạng Text và chọn SEND TO DEVICE. Sau khi publish xong, tương tự gói tin State, gói tin Config sẽ được lưu trữ ở GCIC tối đa 10 gói gần nhất nên các bạn cũng có thể xem ở cửa sổ Configration & state history như hướng dẫn ở trên.

Bây giờ, để nhận được gói tin bằng MQTT client, sử dụng MQTT.fx thực hiện subscribe vào topic có định dạng: /devices/{device-id}/config, kết quả trả về sẽ là gói tin config cuối cùng và cả lịch sử các gói tin Config khác được lưu ở GCIC.

Như vậy qua ví dụ trên hy vọng các bạn có thể hiểu được cơ bản kiến trúc tổ chức gói tin thông qua các topic theo giao thức MQTT, các bạn nên tự tìm hiểu và thực hành tương tự với các topic còn lại để hiểu rõ thêm. Đây cũng chính là phần quan trọng nhất khi làm việc với nền tảng này, ngoài ra GCIC còn liên kết với nền tảng lưu trữ và phân tán gói tin theo mô hình Publish/Subscribe rất mạnh mẽ là Cloud Pub/Sub đối với hai loại topic telemtery và state, nếu có thời gian mình sẽ viết riêng một bài về cái này. Ở phần tiếp theo mình sẽ hướng dẫn các bạn sử dụng board ESP32 kết nối với GCIC qua giao thức MQTT. Các bạn nhớ theo dõi để không bỏ lỡ bài viết nhé, chúc các bạn thành công!

Nhóm TAPIT IoTs

Xem tiếp phần 5: Kết nối ESP32 đến Google Cloud IoT Core thông qua giao thức MQTT (đang cập nhật…)

Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32