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

Qua bài viết phần 2phần 3 chúng ta đã tìm hiểu về kiến trúc cơ bản của IoT Hub gồm: Device Endpoint và Device Twin, và tiếp đến hướng dẫn các bạn kết nối thiết bị với IoT Hub qua giao thức MQTT. Bài viết này mình sẽ thực hành gửi, nhận dữ liệu, tương tác giữa MQTT client và IoT hub. Trong đó MQTT.fx đóng vai trò là một MQTT client và Azure IoT tools đóng vai trò đại diện IoT Hub Endpoint (có thể tương tác với thiết bị).

Phần 4. Tương tác giữa các thiết bị với IoT Hub

1. THỰC HÀNH TƯƠNG TÁC VỚI ENDPOINT

Iot hub có tích hợp sẵn 1 endpoint (built-in endpoint) mà các dịch vụ back-end có thể sử dụng để đọc dữ liệu được. Khi gói tin được gửi từ thiết bị Iot hub của bạn thì mặc định được chuyển đến built-in endpoint này. Endpoint này giao tiếp với thiết bị qua các giao thức như MQTT, AMQP và HTTPS.

Tại Azure IoT tools ta nhấn chuột phải vào thiết bị và chọn Start Monitoring Built-in Event Endpoint để có thể tương tác với thiết bị.

Client publish vào topic devices/{device_id}/messages/events/ để gửi dữ liệu từ thiết bị đến Endpoint.

Client subscribe topic: devices/{device_id}/messages/devicebound/# để nhận dữ liệu từ IoT Hub gửi về thiết bị.

2. THỰC HÀNH TƯƠNG TÁC VỚI DEVICE TWIN

2.1. Cập nhật dữ liệu qua trường Reported :

Device Twin cho phép cập nhật dữ liệu qua trường Reported

  • Trước tiên, client phải subcribe topic $iothub/twin/res/# để nhận phản hồi từ IoT Hub.
  • Client gửi gói tin theo định dạng Json vào topic $iothub/twin/PATCH/properties/reported/?$rid={request id} để cập nhật dữ liệu.
  • IoT hub gửi gói tin phản hồi về client: $iothub/twin/res/{status}/?$rid={request id}

Trong đó {status} là  mã thông báo

Nếu {status}204 có nghĩa đã cập nhật dữ liệu thành công.

2.2. Truy xuất dữ liệu:

Đầu tiên, client subscribes đến topic $iothub/twin/res/# để nhận được phản hồi. Tiếp theo chúng ta gửi một gói tin trống đến topic $iothub/twin/GET/?$rid= {request id}. Sau đó IoT hub sẽ gửi một gói tin phản hồi có chứa dữ liệu trong Device Twin trong topic $iothub/twin/res/{status}/?$rid= {request id}

Trong đó {status} là mã thông báo

Nếu {status}200 thì chúng ta đã truy xuất thành công.

Publish gói tin trống

Nhận dữ liệu

2.3. Nhận thông báo khi cập nhật trường Desired:

Khi client được kết nối, IoT hub sẽ gửi thông báo qua topic $iothub/twin/PATCH/properties/desired/?$version={new version}

3. KẾT NỐI ESP8266 VÀ IOT HUB SỬ DỤNG GIAO THỨC MQTT

3.1. Cài đặt thư viện:

Chúng ta sử dụng hai thư viện chính là:

  • ESP8266WiFi
  • PubSubClient

Để ESP8266 kết nối với IoT hub chúng ta sử dụng thư viện ESP8266WiFi.

Để ESP8266 có thể tương tác với IoT Hub thông qua giao thức MQTT như một client thì chúng ta sẽ sử dụng thư viện có tên PubSubClient. Các bạn có thể tải thư viện tại đây.

Sau khi cài đặt thư viện, có một thay đổi nhỏ mà ta cần phải lưu ý nằm trong thư viện PubSubClient. Ở thư mục chứa thư viện PubSubClient, mở file PubSubClient.h ra sẽ tìm thấy định nghĩa:

#define MQTT_MAX_PACKET_SIZE 128

Cấu hình này mặc định các dữ liệu trả về từ IoT Hub thông qua các topic chỉ là 128Byte, kích thước của các topic từ IoT Hub có thể lên tới 256KB nên nếu dữ liệu trả về lớn hơn 128Byte có thể làm mất dữ liệu. Để khắc phục vấn đề này chúng ta sẽ tăng giá trị của biến MQTT_MAX_PACK_SIZE lên như sau:

#define MQTT_MAX_PACKET_SIZE 1024

3.2. Viết chương trình kết nối ESP8266 đến IoT hub:

  • Cài đặt và kết nối Wifi
  • Khởi tạo MQTT Client để kết nối tới IoT Hub:
    • Khởi tạo DEVICE_ID, HOST NAME, Username/Password
    • Subscribe, publish các topic để truyền nhận dữ liệu

Về việc khởi tạo các thông số trên các bạn có thể xem lại Phần 3.

Sau khi đã cài đặt xong thư viện cũng như lấy được các thông tin cần thiết, chúng ta sẽ viết chương trình kết nối cho ESP8266 theo đoạn chương trình mẫu dưới đây:

 

Giải thích chương trình: Sau mỗi 10 giây, ESP8266 sẽ publish một chuỗi có định dạng JSON tới trường desired của topic $iothub/twin/PATCH/properties/reported/?$rid=1

Đồng thời chúng ta cũng sẽ subscribe topic $iothub/twin/res/# để có thể nhận được thông báo chúng ta đã gửi gói tin thành công hay chưa.

Sau khi nạp code thành công chúng ta mở Serial Monitor trong Arduino IDE ra để quan sát (lưu ý cài đặt mức baudrate là 115200). Dữ liệu nhận được sẽ như sau:

Như vậy qua phần này hy vọng các bạn hiểu thêm được về IoT Hub Endpoint thông qua tương tác giữa chúng với thiết bị. Nhóm TAPIT IoTs R&D hy vọng qua chuỗi bài hướng dẫn “Xây dựng hệ thống Internet of Things sử dụng nền tảng Mircrosoft Azure IoT hub”, giúp các bạn có cái nhìn tổng quan hơn về IoT platform cũng như có được kiến thức căn bản nhất để xây dựng các ứng dụng IoTs kết hợp với nền tảng Microsoft Azure cho riêng mình. Chúc các bạn thành công!

Nhóm thực tập & TAPIT IoT

Quốc Thắng, Ngọc Chính, Minh Duy

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