Xây dựng hệ thống Internet of Thing sử dụng nền tảng Azure IoT Hub (P2)

Phần 2: Kiến trúc IoT Hub Endpoint

Trong phần 1, như đã giới thiệu thì chúng ta đã biết cách tạo một Device đại diện bởi một thiết bị, được đăng ký với Azure IoT Hub. Trong phần này chúng ta sẽ đi sâu vào tìm hiểu kiến trúc của một IoT Hub Endpoint gồm 2 kiến trúc con là: Device TwinDevice Endpoint, và cách thức tương tác với những kiến trúc này.

2.1 Kiến trúc Device Twin:

Device Twin về cơ bản là một “JSON State Document”, có thể hiểu đơn giản Device Twin giống như một cơ sở dữ liệu trung gian dùng để lưu trữ trạng thái của thiết bị được đại diện bởi Device, theo định dạng chuỗi JSON và có kiến trúc, quy tắc đã được xây dựng sẵn bởi Azure. Chúng ta có thể tương tác giữa kiến trúc này với thiết bị bằng cách sử dụng giao thức MQTT hoặc REST API. Trong phần này mình sẽ giới thiệu với các bạn về kiến trúc của Device Twin và cách thức tương tác sử dụng giao thức MQTT.

Dữ liệu lưu trữ trong Device Twin đại diện cho trạng thái của thiết bị, Device Twin bao gồm 3 trường lưu trữ dự liệu là: reported, desired và tags. Các trường này được coi là trung gian giao tiếp giữa thiết bị (device) và các ứng dụng (application).

  • Trường reported: mô tả trạng thái hiện tại của thiết bị vật lý (trạng thái thực của thiết bị) mà Device Twin đang mô tả, được lưu trữ dưới định dạng chuỗi JSON. Vì vậy, các thiết bị vật lý truy vấn vào trường reported và các ứng dụng khác sẽ dựa vào giá trị ở trường này để truy xuất trạng thái của thiết bị theo thời gian thực và có thể nhận thông báo thay đổi khi dữ liệu thay đổi. 
  • Trường desired: mô tả trạng thái mà các ứng dụng khác mong muốn gửi đến thiết bị (trạng thái mong muốn của thiết bị), ví dụ dữ liệu từ các ứng dụng điều khiển từ xa bằng điện thoại, website của người dùng hay các nhà quản lý thiết bị. Phía ứng dụng người dùng sẽ ghi trạng thái mong muốn của thiết bị vào trường desired bằng định dạng chuỗi JSON. Thiết bị vật lý sẽ dựa vào giá trị ở trường này để thay đổi trạng thái mới.
  • Trường tags: là trường được sử dụng riêng bên phía ứng dụng, thiết bị không thể truy vấn vào trường này. Có thể dùng trường này để cài đặt những thiết lập ban đầu và sắp xếp tổ chức các thiết bị bên phía ứng dụng.

Các bạn có thể quan sát hình bên dưới để hiểu rõ hơn về cấu trúc của Device Twin:

Các trường này sẽ được tự động quản lý bởi Azure, khi chúng ta thiết kế hệ thống thì trường tags ít khi được sử dụng chỉ cần quan tâm đến trường properties (bao gồm repored và desired). Bên trong các trường repored và desired còn có thể chứa các trường metadata, version,… để thể hiện các thông tin cụ thể khác nhau về thời gian, phiên bản,… của Device Twin.

Ngoài trường properties và trường tags ra, Device Twin còn chứa các trường như deviceId, status, cloudToDeviceMessageCount,… dùng để cho biết thông tin về Id, trạng thái, số gói tin được gửi đến và một số thông tin khác của thiết bị.

Device Twin sử dụng các MQTT topic được định nghĩa sẵn giúp các ứng dụng và thiết bị có thể tương tác với nhau dễ dàng hơn bằng cách subscribe hoặc publish vào các topic này, cụ thể các ứng dụng có thể thực hiện các tương tác với thiết bị liên quan đến 3 loại truy vấn đối với reported và desired là: PATCH (cập nhật dữ liệu), GET (truy xuất dữ liệu) hoặc POST (phản hồi dữ liệu). Để thực hiện thành công các yêu cầu truy vấn trên, thiết bị và các ứng dụng phải publish hoặc subscribe đúng tên topic và đúng định dạng gói tin được quy định bởi IoT Hub Endpoint nếu không thì yêu cầu đó sẽ bị từ chối.

Sau khi thiết lập kết nối thành công, một thiết bị có thể gửi gói tin đến Device Twin bằng cách publish dữ liệu vào các topic có định dạng sau:  $iothub/twin/PATCH/properties/reported/?$rid={request id}.

Trong đó{request id} do thiết bị cung cấp thông thường giá trị của nó bằng 1.

Sau khi thực hiện truy vấn, IoT Hub sẽ lặp tức phản hồi lại bằng cách tự động publish một gói tin đến topic tương ứng có dạng: $iothub/twin/res/#.

Device Twin sẽ publish một gói tin đến topic có dịnh dạng: $iothub/twin/res/{status}/?$rid={request id} để thông báo gói tin đã được gửi thành công hay không.

Trong đó{status} là mã trạng thái, được cho với những giá trị ở bảng sau:

Để truy xuất tất cả thông tin của các trường trong Device Twin, đầu tiên để nhận được thông tin của các trường trả về ta phải subscribes topic có định dạng $iothub/twin/res/# .

Sau đó, publish một gói tin rỗng tới topic có định dạng $iothub/twin/GET/?$rid={request id}

Một ứng dụng  với chức năng điều khiển từ xa muốn thay đổi trạng thái của thiết bị thì thực hiện mong muốn cập nhật bằng cách thay đổi trường desired, Device Twin sẽ lập tức phản hồi bằng cách publish một gói tin vào topic $iothub/twin/PATCH/properties/desired/?$version={new version}

Trong đó{new version} là số lần gửi gói tin.

Sau đó, muốn cập nhật trạng thái của thiết bị mà người dùng mong muốn thì thiết bị phải subscribes topic $iothub/twin/PATCH/properties/desired/#

2.2 Kiến trúc Device Endpoint:

Device Endpoint có thể hiểu đơn giản giống như một nơi chứa cặp trường đối xứng (D2C endpoint, C2D endpoint) để cho phép thiết bị giao tiếp 2 chiều với IoT Hub theo một đường truyền nhất định,kiến trúc này phù hợp với những ứng dụng đo đạc dữ liệu từ xa như quan trắc môi trường, dữ liệu được thu thập từ môi trường qua các cảm biến rồi gửi lên cloud. Chúng ta có thể tương tác với thiết bị bằng cách sử dụng giao thức MQTT hoặc AQMP. Trong phần này mình sẽ giới thiệu với các bạn về kiến trúc của Device Endpoint và cách thức tương tác sử dụng giao thức MQTT.

Cấu trúc của device endpoint bao gồm 2 endpoint để thiết bị giao tiếp với cloud:

  • D2C (device to cloud) : thiết bị dùng endpoint này để gửi gói tin đến cloud.

Topic: devices/deviceID/messages/events/

  • C2D (cloud to device) : thiết bị dùng endpoint này để nhận gói tin từ cloud gửi về thiết bị.

Topic: devices/ deviceID /messages/devicebound/#

Trong đó:  deviceID là ID của thiết bị, được tạo ra khi đăng kí một thiết bị mới.

TẠM KẾT:

Nhìn chung thì IoT Hub cung cấp 2 phương thức để có thể tương tác với thiết bị thông qua “cơ sở dữ liệu trung gian” là Device TwinDevice Endpoint, bằng cách khai tác các truy vấn thích hợp đối với các trường reported và desired thông qua giao thức MQTT đối với phương thức Device Twin để đảm bảo quá trình điều khiển, giám sát, đồng bộ trạng thái và tránh xung đột giữa các ứng dụng, còn đối với phương thức Device Endpoint giúp cho việc thu thập dữ liệu từ xa được đơn giản hóa hơn. Ta có thể thấy được Azure IoT Hub cung cấp kiến trúc quản lý này rất hữu ích, tuy nhiên các nhà phát triển và lập trình viên phải biết cách xây dựng, sử dụng linh hoạt các ngữ cảnh đối với từng phương thức cho phù hợp, để khai thác tối đa hiệu quả của kiến trúc này giúp hệ thống hoạt động tốt nhất có thể.

Chúc các bạn thành công!

Lê Công Vĩnh Khải – Cố vấn mảng IoTs tại Cộng đồng Kỹ thuật TAPIT

Tìm hiểu thêm:
Fanpage Cộng đồng Kỹ thuật TAPIT: TAPIT – Learning, Research and Sharing Community