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

Trong phần trước mình đã giới thiệu cho các bạn cách để tạo cặp public/ private key, tạo chuỗi JWT hoàn chỉnh. Ở phần này chúng ta sẽ đi tìm hiểu trình tự các bước thực hiện kết nối một thiết bị IoT cụ thể tới Google Cloud IoT Core.

Phần 3: Hướng dẫn đăng ký và kết nối thiết bị tới Google IoT Core

1. Hướng dẫn đăng ký thiết bị với registry và liên kết Public key

Các thiết bị IoT kết nối đến dịch vụ Google IoT Core được xem là các “device” trong “registry”. Registry là nơi cho phép chúng ta lưu trữ các thiết bị IoT có những tính chất gần giống nhau cùng kết nối tới Google IoT Core.

Để đơn giản hóa thì chúng ta có thể xem project như một ngôi nhà, bên trong ngôi nhà lại chia ra các căn phòng như phòng ngủ, phòng khách,… tương ứng với các phòng đó chính là các registry. Và những thiết bị gói gọn  trong các căn phòng đó sẽ được xem là các device.

Để bắt đầu, tại giao diện console của GCP các bạn chọn CREATE REGISTRY.

Chúng ta có thể tạo 1 Registry ID bất kỳ (NodeMCU, MyHome,..) nhưng không được phép trùng tên với registry khác nằm bên trong project mà chúng ta đang làm việc, ở đây mình ví dụ đặt tên là Tapit-ID. Tại phần region mình sẽ chọn asia-east1 để tối ưu độ trễ của đường truyền dữ liệu, còn protocol mình sẽ chọn giao thức MQTT để thực hiện kết nối.

Mỗi registry mà chúng ta đăng ký, Google IoT Core bắt buộc chúng ta phải liên kết tới một hay nhiều topics nằm trong một dịch vụ khác có tên là Cloud Pub/Sub (Mình sẽ nói về dịch vụ này ở bài viết sau). Theo nguyên tắc, Google IoT Core chính là khi một gói tin gửi từ thiết bị IoT lên Google IoT Core, Google IoT Core sẽ chỉ lưu trữ một vài loại gói tin đặc biệt liên quan đến cấu hình hoặc trạng thái của thiết bị và ít bị thay đổi, còn những gói tin được gửi với số lượng lớn và thường xuyên hơn thì sẽ cần chuyển tiếp đến một dịch vụ khác có tên là Cloud Pub/Sub.

Vì vậy nhiệm vụ của chúng ta sau khi tạo một registry là phải xác định trước những gói tin được gửi từ thiết bị sẽ được chuyển tiếp tới những topic nào nằm trong dịch vụ Cloud Pub/Sub.

Ở đây, Google IoT Core đã định nghĩa sẵn cho chúng ta 3 loại topic nằm trong Cloud Pub/Sub mà dựa vào đó chúng ta sẽ chia luồng dữ liệu sao cho hợp lý:

  • Default telemetry topic: đây là topic mặc định bắt buộc phải có khi khởi tạo 1 registry. Theo định nghĩa của GIC, topic này dùng để gửi các dữ liệu về môi trường xung quanh mà thiết bị thu thập được. 
  • Device telemetry topic: Topic này không bắt buộc phải có khi khởi tạo 1 registry. Tuy nhiên nếu chúng ta muốn khởi tạo thì nhấn vào Add more telemetry topics. Mục đích của các topic này cũng giống như topic Default telemetry là dùng để gửi các dữ liệu về môi trường xung quanh. Tuy nhiên khi sử dụng các topic này thì chúng ta có thể dễ dàng phân luồng dữ liệu cụ thể từ một thiết bị.
  • Device state topic: Topic này không bắt buộc phải có khi khởi tạo 1 registry, mục đích của topic này là dùng để gửi các dữ liệu về trạng thái hiện tại của thiết bị IoT lên Cloud.

Ở đây mình demo 2 topic là default telemtry topic với path projects/tapitdemo/topics/my-eventsdevice state topic với path projects/tapitdemo/topics/state. Sau đó nhấn chọn CREATE.

Sau khi khởi tạo Registry xong, ở thanh menu registry của giao diện Console, chúng ta chọn Devices, sau đó nhấn chọn CREATE A DEVICE.

Tại giao diện đăng ký, các bạn có thể đặt tên bất kỳ cho Device ID nhưng lưu ý không được trùng tên với các Device ID khác trong registry, ở đây mình đặt tên Device ID là “ESP32”.

Ở phần Authentication liên quan đến chức năng xác thực thiết bị khi kết nối đến GIC, như đã hướng dẫn ở phần trước, khi một thiết bị kết nối đến GIC sẽ kèm chuỗi JWT được ký (mã hóa) bằng private key, GIC sẽ sử dụng public key để giải mã và xác thực thiết bị vì vậy để chuẩn bị cho các kết nối sau này chúng ta phải đăng ký public key với GIC trước. Các bạn có thể chọn phương thức upload là Enter manually (điền trực tiếp) hoặc Upload (tải lên từ máy tính). Ở đây mình chọn là Upload vì file Public Key mình đã tải về máy rồi nên mình chỉ cần tải lên GIC là xong. Lưu ý phần Public key format các bạn chọn mục tương ứng với thuật toán đã khởi tạo cặp private-pub key ( thường là ES256 hoặc RS256). Các thông số còn lại chúng ta không cần quan tâm, các bạn cuộn xuống dưới cùng và chọn CREATE để hoàn tất.

2/ Hướng dẫn kết nối MQTT.fx với Google IoT Core thông qua giao thức MQTT

Sau khi liên kết public key xong, chúng ta sẽ thực hiện kết nối giữa thiết bị IoT với Cloud sử dụng cặp private-public key tương ứng. Ở đây mình sẽ sử dụng công cụ MQTT.fx như là một MQTT Client để demo. Chúng ta có thể sử dụng các thông số của device-ID “ESP32” đã khởi tạo để bắt đầu, nhưng để trực quan hơn mình sẽ tạo thêm 1 device-ID khác có tên là “MQTT” để kết nối. Nếu chưa có MQTT.fx các bạn có thể download ở đây .

Tại giao diện MQTT.fx, các bạn nhấn vào biểu tượng răng cưa (biểu tượng setting).

Ở thanh điều hướng bên trái, các bạn chọn New Profile và bắt đầu việc cấu hình.

  • Profile Name: Các bạn có thể đặt bất kỳ tên gì cho Profile Name, ở đây mình đặt là GCP.
  • Profile Type: Các bạn có thể chọn mục Google Cloud IoT đã thiết lập sẵn giao diện dùng để kết nối đến GIC, tuy nhiên để hiểu rõ cách dùng JWT và bản chất của quá trình kết nối chúng ta sẽ sử dụng lựa chọn là MQTT Broker.
  • Broker Address: mqtt.googleapis.com
  • Broker Port: 8883 hoặc 443.
  • Client ID: Các bạn thay thế các thông số bôi đỏ dưới đây, bốn thông số này có thể tìm thấy trên Google IoT Core sau khi đã thiết lập device và registry như ở các bài viết trước: projects/PROJECT-ID/locations/REGION/registries/REGISTRY-ID/devices/DEVICE-ID

Các thông số mục General chúng ta tạm không quan tâm, chúng ta sẽ chuyển hướng sang mục khác có tên là User Credentials.

Ở mục User Credentials, chúng ta có thực hiện cấu hình như sau:

  • User Name: Các bạn có thể đặt tên bất kỳ, tại vì GIC không quan tâm trường này. Tuy nhiên, các bạn lưu ý không được bỏ trống mục này vì MQTT.fx quy định không cho phép gửi trường Password nếu như không có trường User Name, dẫn đến việc thực hiện kết nối bị lỗi.
  • Password: Copy chuỗi JWT và paste vào mục này. Lưu ý chuỗi JWT phải nằm trong khoản thời gian “iat” và “exp” (trong trường payload) thì GIC mới chấp nhận chuỗi JWT này.

Cuối cùng chúng ta chuyển hướng sang mục SSL/TLS, hiện tại Google IoT Core chỉ hỗ trợ chuẩn TLS1.2 nên ở mục Protocol chúng ta chỉ có thể chọn TLSv1.2. Tiếp theo ta chọn CA signed server certificate, Google sẽ tự xác thực chứng chỉ này.

Sau khi đã cấu hình xong,  nhấn OK để hoàn tất việc cấu hình. Để kết nối MQTT.fx tới dịch vụ Google IoT Core, các bạn nhấn chọn nút CONNECT. Nếu kết nối thành công sẽ có biểu tượng ổ khóa màu xanh lá cây ở góc phải như hình:

Như vậy qua phần này mình đã giới thiệu cho các bạn cách để cấu hình cũng như thiết lập các thông số của một client cụ thể khi muốn kết nối tới dịch vụ Google IoT Core thông qua giao thức MQTT. Trong phần tới, chúng ta sẽ đi sâu vào cách các thiết bị IoTs tương tác với GIC để có thể sử dụng hiệu quả nền tảng. Chúc các bạn thành công!

Nhóm TAPIT IoTs

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

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