Phần 3. Kết nối thiết bị IoT với Internet

0
1490

Giới thiệu

I trong IoT là viết tắt của Internet. Kết nối đám mây và các dịch vụ giúp cho thiết bị IoT có rất nhiều tính năng, từ việc thu thập các phép đo từ các cảm biến kết nối với thiết bị đến việc gửi thông điệp để điều khiển các thiết bị truyền động. Các thiết bị IoT thường kết nối với dịch vụ IoT đám mây duy nhất sử dụng giao thức truyền thông tiêu chuẩn và dịch vụ đó được kết nối với phần còn lại của ứng dụng IoT bao gồm từ các dịch vụ AI để đưa ra các quyết định thông minh về dữ liệu, đến các ứng dụng web để điều khiển hoặc báo cáo.

Dữ liệu được thu thập từ các cảm biến và gửi lên đám mây được gọi là telemetry.

Các thiết bị IoT có thể nhận thông điệp từ đám mây. Thông thường, các thông báo chứa các lệnh, là các hướng dẫn để thực hiện một hành động trong nội bộ (như khởi động lại hoặc cập nhật chương trình cơ sở) hoặc sử dụng bộ truyền động (như bật đèn).

Bài viết sẽ giới thiệu một số giao thức truyền thông mà các thiết bị IoT sử dụng để kết nối với đám mây và các loại dữ liệu mà chúng có thể gửi hoặc nhận.

Một số nội dung chính của bài viết       :

Các giao thức giao tiếp

Giao thức truyền thông điệp MQTT (Message Queueing Telemetry Transport)

Phép đo từ xa (Telemetry)

Lệnh

1. Các giao thức giao tiếp

Có một số giao thức truyền thông phổ biến được thiết bị IoT sử dụng để giao tiếp với Internet. Phổ biến nhất là dựa trên publish/subscribe thông điệp thông qua một số loại Broker. Các thiết bị IoT kết nối với Broker và publish phép đo từ xa, subscribe các lệnh. Các dịch vụ đám mây cũng kết nối với Broker và publish tất cả các thông điệp đo từ xa và subscribe các lệnh tới các thiết bị cụ thể hoặc cho các nhóm thiết bị.

Các giao thức cơ bản của các thiết bị IoT bao gồm MQTT, AMQP và HTTP/ HTTPS, trong đó bài viết này đề cập đến giao thức MQTT là giao thức phổ biến nhất.

2. Giao thức MQTT (Message Queueing Telemetry Transport)

MQTT là một giao thức nhắn tin tiêu chuẩn mở, nhẹ, có thể gửi thông điệp giữa các thiết bị, ra đời năm 1999 nhằm giám sát các đường ống dẫn dầu và chính thức được IBM phê duyệt là tiêu chuẩn mở năm 2015.

MQTT có kiến trúc gồm Broker duy nhất và các Client. Broker kết nối và định tuyến thông điệp đến tất cả các Client. Các thông điệp được định tuyến không gửi trực tiếp đến từng Client riêng lẻ mà sử dụng các Topic được đặt tên. Mỗi Client sẽ publish một topic và bất kỳ Client nào cũng sẽ nhận được thông báo về Topic đã subscribe.

Kết nối thiết bị IoT với MQTT

Phần đầu tiên của việc thêm điều khiển Internet vào đèn ngủ là kết nối nó với một MQTT Broker.

Trong thực tế, ở các vị trí có nhiều đèn như sân vận động, cần thu thập dữ liệu từ nhiều cảm biến ánh sáng trước khi quyết định bật đèn. Điều này giúp gửi lệnh một cách chính xác như ngăn bật đèn trong trường hợp một cảm biến bị mây hoặc vật che phủ, nhưng các cảm biến khác phát hiện đủ ánh sáng.

Bởi vì việc thiết lập của Broker trong MQTT rất phức tạp nên ta có thể sử dụng máy chủ thử nghiệm công khai chạy Eclipse Mosquitto- một Broker MQTT mã nguồn mở. Broker thử nghiệm này có sẵn tại test.mosquitto.org, đây là công cụ tuyệt vời để kiểm tra Clients và Servers MQT bởi nó không yêu cầu thiết lập tài khoản, tuy nhiên do sự công khai và không an toàn vì vậy không nên sử dụng với những dữ liệu cần được bảo mật

Làm theo các bước bên dưới để kết nối thiết bị với Broker MQTT:

Arduino – Wio Terminal

Single-board computer – Raspberry Pi/Virtual IoT device

MQTT trong IoT

Các Topic có hệ thống phân cấp, các Client subscribe các cấp độ khác nhau bằng cách sử dụng các ký tự đại diện. Ví dụ, gửi thông điệp đo từ xa về nhiệt độ đến Topic /telemetry/temperature và thông điệp độ ẩm tới Topic /telemetry/humidity, sau đó ứng dụng đám mây để subscribe Topic /telemetry/* nhận cả tin nhắn đo từ xa các thông số nhiệt độ và độ ẩm.

Tin nhắn có thể được gửi đi kèm với một QoS (Quality of Service) để xác định sự đảm bảo của tin nhắn được nhận.

– At most once – tin nhắn chỉ được gửi một lần, Client và Broker không phải thực hiện thêm bước nào để xác nhận việc gửi.

– At least once – tin nhắn được người gửi nhiều lần cho đến khi nhận được xác nhận (đã xác nhận gửi).

– Exactly once – người gửi và người nhận thống nhất hai cấp để đảm bảo chỉ nhận được một bản sao của tin nhắn (gửi đảm bảo).

Mặc dù MQ trong MQTT (Message Queueing) có nghĩa là hàng đợi tin nhắn, nhưng nhưng nó không thực sự hỗ trợ hàng đợi tin nhắn. Nghĩa là nếu một Client ngắt kết nối, sau đó kết nối lại, nó sẽ không nhận được tin nhắn được gửi trong quá trình ngắt kết nối, ngoại trừ những tin nhắn mà nó đã bắt đầu xử lý bằng quy trình QoS. Khi tin nhắn có sự thiết lập cờ, Broker MQTT sẽ lưu tin nhắn cuối cùng về một Topic có cờ này và gửi tin nhắn này cho bất kỳ Clients nào subscribe Topic sau đó. Khi đó, các Client sẽ luôn nhận được tin nhắn mới nhất khi kết nối lại.

+ MQTT cũng hỗ trợ chức năng lưu tình trạng hoạt động để kiểm tra xem kết nối có còn tồn tại trong khoảng thời gian dài giữa các tin nhắn hay không.

 + Các kết nối MQTT ở chế độ công khai và mở hoặc được mã hóa và bảo mật bằng tên người dùng và mật khẩu hoặc chứng chỉ.

MQTT giao tiếp qua TCP/IP, cùng một giao thức mạng cơ bản như HTTP, nhưng trên cổng khác. Cũng có thể sử dụng MQTT qua cổng kết nối web để giao tiếp với các ứng dụng web đang chạy trong trình duyệt hay trong trường hợp tường lửa hoặc các quy tắc mạng khác chặn các kết nối MQTT tiêu chuẩn.

3. Phép đo từ xa

Phép đo từ xa có nguồn gốc từ tiếng Hy Lạp, là hành động thu thập dữ liệu từ các cảm biến và gửi lên đám mây.

Một trong những thiết bị đo từ xa đầu tiên được phát minh ở Pháp vào năm 1874 để gửi thông tin về thời tiết theo thời gian thực và độ sâu của tuyết từ Mont Blanc đến Paris, sử dụng dây vật lý vì thời điểm đó chưa có sẵn công nghệ không dây.

Xét ví dụ về bộ điều chỉnh nhiệt thông minh.

Bộ điều nhiệt có các cảm biến nhiệt độ để thu thập phép đo từ xa. Nó có thể được tích hợp sẵn một cảm biến nhiệt độ và kết nối với nhiều cảm biến nhiệt độ bên ngoài qua giao thức không dây như Bluetooth Low Energy (BLE).

Ví dụ về dữ liệu đo từ xa mà nó sẽ gửi là:

TênGiá trị Mô tả
thermostat_temperature180CNhiệt độ được đo bằng cảm biến nhiệt độ tích hợp của máy điều nhiệt
livingroom_temperature190CNhiệt độ được đo bằng một cảm biến nhiệt từ xa đã được đặt tên là “livingroom” để xác định căn phòng mà nó được lắp đặt
bedroom_temperature200CNhiệt độ được đo bằng một cảm biến nhiệt từ xa đã được đặt tên là “bedroom” để xác định căn phòng mà nó được lắp đặt

Sau đó, dịch vụ đám mây sử dụng dữ liệu đo từ xa này để đưa ra quyết định về những lệnh nào cần gửi để kiểm soát hệ thống sưởi.

Gửi phép đo từ xa từ thiết bị IoT

Phần tiếp theo nhằm thêm tính năng điều khiển đèn ngủ qua Internet là gửi phép đo từ xa về mức độ sáng tới Broker MQTT theo Topic đo từ xa.

Dữ liệu gửi được mã hóa dưới dạng JSON (JavaScript Object Notation)- tiêu chuẩn mã hóa dữ liệu trong văn bản bằng cách sử dụng các cặp khóa/giá trị.

Tìm hiểu thêm về JSON trên JSON.org documentation.

Làm theo các bước dưới đây để gửi phép đo từ xa từ thiết bị đến Broker MQTT:

Arduino – Wio Terminal

Single-board computer – Raspberry Pi/Virtual IoT device

Nhận phép đo từ xa từ Broker MQTT

Khi đã gửi phép đo từ xa thì cần thực hiện việc thu và xử lý dữ liệu thu được. Phần code thực hiện việc này (server code) thông thường sẽ được triển khai trên dịch vụ đám mây như là một phần của một ứng dụng IoT lớn. Nhưng ở đây ta sẽ chạy cục bộ trên máy tính hoặc Pi. Server code gồm một ứng dụng Python để nhận các thông báo từ xa qua MQTT về mức độ sáng

Cài đặt Python Code và VS Code

Cần cài đặt Python và VS Code trên máy tính để có thể thực hiện code server. Nếu đang sử dụng thiết bị IoT ảo hoặc đang làm việc trên Raspberry Pi, có thể bỏ qua bước này.

1. Cài đặt Python. Tham khảo Python downloads page  để biết hướng dẫn về cách cài đặt phiên bản Python mới nhất.

2. Cài đặt Visual Studio Code (VS Code). Tham khảo VS Code documentation  để biết hướng dẫn cài đặt VS Code.

3. Cài đặt phần mở rộng VS Code Pylance. Đây là phần mở rộng cho VS Code cung cấp hỗ trợ ngôn ngữ Python. Tham khảo Pylance extension documentation để biết hướng dẫn về cách cài đặt trong VS Code.

Định cấu hình môi trường ảo Python

Một trong những tính năng mạnh mẽ của Python là khả năng cài đặt pip packages – các gói code do người khác viết và gửi lên Internet. Có thể cài đặt pip packages vào máy tính bằng lệnh, sau đó sử dụng các gói đó trong code. Sử dụng pip để cài đặt gói để giao tiếp qua giao thức MQTT.

Mặc định là khi cài đặt một gói, gói đó có sẵn ở mọi nơi trên máy tính do đó có thể dẫn đến sự cố với các phiên bản gói khác nhau. Để khắc phục sự cố này, có thể sử dụng môi trường ảo Python là bản sao của Python trong thư mục chuyên dụng mà khi cài đặt các gói pip, chúng chỉ được cài đặt vào thư mục đó.

* Định cấu hình môi trường ảo Python và cài đặt các gói pip MQTT.

1. Chạy lệnh sau để tạo và điều hướng đến một thư mục mới:

mkdir nightlight-server
cd nightlight-server

2. Chạy lệnh sau để tạo môi trường ảo trong thư mục .venv

python3 -m venv .venv

3. Kích hoạt môi trường ảo:

Trên Windows: Nếu đang sử dụng Command Prompt hoặc Command Prompt thông qua Windows Terminal, chạy:

.venv \ Scripts \ active.bat

Nếu đang sử dụng PowerShell, chạy:

. \. venv \ Scripts \ Activate.ps1

Trên macOS hoặc Linux, chạy:

source ./.venv/bin/activate

4. Khi môi trường ảo đã được kích hoạt, lệnh python mặc định sẽ chạy phiên bản Python để tạo môi trường ảo. Chạy lệnh sau để tải phiên bản:

python --version

Đầu ra tương tự như sau:

(.venv) ➜ nightlight-server python –version
Python 3.9.1

Đảm bảo sử dụng phiên bản Python 3.6 hoặc cao hơn cho phù hợp.5. Chạy các lệnh sau để cài đặt gói pip cho thư viện MQTT- Paho-MQTT.

pip cài đặt paho-mqtt

Gói pip này chỉ được cài đặt trong môi trường ảo và sẽ không khả dụng bên ngoài môi trường này.

* Viết server code

Có thể sử dụng Python để viết Server code .

Viết server code.

1. Từ thiết bị đầu cuối hoặc dòng lệnh, chạy lệnh bên trong môi trường ảo để tạo tệp Python có tên app.py:

Từ Windows chạy:

type nul > app.py

Trên macOS hoặc Linux, chạy:

touch app.py

2. Mở thư mục hiện tại trong VS Code:

code .

3. Khi khởi chạy VS Code sẽ kích hoạt môi trường ảo Python. Điều này sẽ được báo cáo trong thanh trạng thái dưới cùng:

4. Nếu VS Code Terminal đã chạy khi VS Code khởi động thì sẽ không kích hoạt môi trường ảo. Khi đó, hủy thiết bị đầu cuối bằng cách sử dụng nút Kill the active terminal instance:

5. Khởi chạy thiết bị đầu cuối mã VS Code Terminal mới bằng cách chọn *Terminal -> New Terminal, or pressing CTRL+`. Thiết bị đầu cuối mới sẽ tải môi trường ảo mà tên của môi trường ảo (.venv) sẽ có trong dấu nhắc:

➜  nightlight source .venv/bin/activate
(.venv) ➜  nightlight 

6. Mở tệp app.py từ trình khám phá Mã VS và thêm mã sau:

import json
import time

import paho.mqtt.client as mqtt

id = '<ID>'

client_telemetry_topic = id + '/telemetry'
client_name = id + 'nightlight_server'

mqtt_client = mqtt.Client(client_name)
mqtt_client.connect('test.mosquitto.org')

mqtt_client.loop_start()

def handle_telemetry(client, userdata, message):
    payload = json.loads(message.payload.decode())
    print("Message received:", payload)

mqtt_client.subscribe(client_telemetry_topic)
mqtt_client.on_message = handle_telemetry

while True:
    time.sleep(2)

Thay thế <ID> trên dòng 6 bằng ID duy nhất đã sử dụng khi tạo mã thiết bị.

Đây phải là ID đã sử dụng trên thiết bị của mình, nếu không mã máy chủ sẽ không subscribe hoặc publish đúng chủ đề.

7. Từ thiết bị đầu cuối VS Code, chạy lệnh sau để chạy ứng dụng Python của bạn:

python app.py

Ứng dụng bắt đầu nhận tin nhắn từ thiết bị IoT.

8. Đảm bảo thiết bị đang chạy và gửi tin nhắn đo từ xa. Điều chỉnh mức độ sáng phát hiện bởi thiết bị vật lý hoặc thiết bị ảo. Tin nhắn nhận được sẽ được in ra thiết bị đầu cuối.

(.venv) ➜  nightlight-server python app.py
Message received: {'light': 0}
Message received: {'light': 400}

File app.py trong môi trường ảo đèn ngủ phải chạy cho tệp app.py trong môi trường ảo máy chủ đèn ngủ để nhận tin nhắn.

Tần suất gửi dữ liệu đo từ xa?

Một vấn đề quan trọng với phép đo từ xa là tần suất đo và gửi dữ liệu? Nếu đo lường thường xuyên thì có thể phản hồi nhanh hơn với những thay đổi trong phép đo, nhưng công suất tiêu thụ lớn hơn, băng thông lớn hơn, tạo ra nhiều dữ liệu hơn và cần nhiều tài nguyên đám mây hơn để xử lý. Do đó cần phải đo đủ thường xuyên nhưng với tần suất hợp lý.

Đối với máy điều nhiệt, đo vài phút một lần là đủ vì nhiệt độ không thay đổi thường xuyên. Nếu chỉ đo mỗi ngày một lần thì có thể sưởi ấm ngôi nhà vào ban đêm với những ngày nắng, trong khi nếu đo mỗi giây thì sẽ có hàng nghìn phép đo nhiệt độ trùng lặp không cần thiết mà ảnh hưởng đến tốc độ Internet và băng thông (vấn đề đối với những người dùng có băng thông hạn chế), sử dụng nhiều năng lượng hơn (là vấn đề đối với các thiết bị chạy bằng pin như cảm biến từ xa) và làm tăng chi phí của các nhà cung cấp tài nguyên điện toán đám mây xử lý và lưu trữ chúng.

Nếu đang theo dõi dữ liệu xung quanh bộ phận máy móc trong nhà máy thì cần đo nhiều lần trong một giây vì nếu có sai sót có thể gây ra thiệt hại nghiêm trọng dẫn đến giảm hàng triệu đô la doanh thu. Khi đó nên chọn lãng phí băng thông hơn là bỏ phép đo từ xa.

Trong trường hợp này, nên xem xét trang bị một thiết bị xử lý tại biên để xử lý phép đo từ xa nhằm giảm sự phụ thuộc vào Internet.

Mất kết nối

Trong trường hợp mất kết nối Internet thì thiết bị IoT nên để mất dữ liệu hay nên lưu dữ liệu đến khi kết nối được khôi phục? Tùy thuộc từng trường hợp mà có các cách xử lý sự cố khác nhau.

Đối với máy điều nhiệt, có thể để xóa dữ liệu cũ ngay sau khi đo nhiệt độ mới. Hệ thống sưởi ấm không quan tâm 20 phút trước là bao nhiêu độ mà nhiệt độ hiện tại sẽ xác định xem hệ thống sưởi nên bật hay tắt.

Đối với máy móc, nhu cầu lưu dữ liệu cao hơn, đặc biệt nếu dữ liệu được sử dụng để xác định nguyên nhân sự cố và báo cáo. Có những mô hình học máy phát hiện sự bất thường trong các luồng dữ liệu bằng cách xem dữ liệu từ khoảng thời gian xác định (như giờ trước) và phát hiện dữ liệu bất thường. Điều này thường được sử dụng để bảo trì dự đoán, tìm kiếm các dấu hiệu dự báo bộ phận hỏng hóc sớm để có thể sửa chữa hoặc thay thế trước. Để có thể xử lý dữ liệu kịp thời nhằm phát hiện bất thường, khi thiết bị IoT mất kết nối, dữ liệu vẫn được lưu và ngay khi kết nối lại, nó sẽ gửi tất cả phép đo từ xa được tạo ra trong thời gian Internet ngừng hoạt động.

Các nhà thiết kế thiết bị IoT cũng nên xem xét thiết bị IoT có thể được sử dụng trong thời gian Internet bị ngắt hoặc mất tín hiệu do vị trí gây ra hay không. Một bộ điều nhiệt thông minh có thể đưa ra một số quyết định để kiểm soát hệ thống sưởi nếu nó không thể gửi thiết bị đo từ xa lên đám mây do mất điện.

Để MQTT có thể xử lý sự cố mất kết nối, thiết bị và server code cần phải đảm bảo việc gửi tin nhắn. Ví dụ, bằng cách yêu cầu tất cả các tin nhắn được gửi phải được trả lời bởi các tin nhắn bổ sung về một Topic trả lời, nếu không chúng được xếp hàng thủ công để được phát lại sau.

4. Lệnh

Lệnh là các thông báo được đám mây gửi đến một thiết bị, hướng dẫn thiết bị đó làm gì. Trong series bài viết này thì hầu hết các lệnh đều liên quan đến một số đầu ra thông qua một bộ truyền động, nhưng có thể là lệnh cho chính thiết bị, như khởi động lại hoặc thu thập thêm phép đo từ xa và phản hồi cho lệnh.

Bộ điều nhiệt có thể nhận lệnh từ đám mây để bật hệ thống sưởi. Dựa trên dữ liệu đo từ xa từ tất cả các cảm biến, nếu dịch vụ đám mây quyết định bật hệ thống sưởi, thì nó sẽ gửi lệnh có liên quan.

Gửi lệnh đến Broker MQTT

Bước tiếp theo để điều khiển đèn ngủ bằng Internet là code máy chủ gửi lệnh trở lại thiết bị IoT để điều khiển đèn dựa trên mức độ ánh sáng mà nó cảm nhận được.

1. Mở server code trong VS Code

2. Thêm dòng sau vào sau phần khai báo client_telemetry_topic để xác định Topic sẽ gửi lệnh đến:

server_command_topic = id + '/commands'

3. Thêm code sau vào cuối hàm handle_telemetry:

command = { 'led_on' : payload['light'] < 300 }
print("Sending message:", command)

client.publish(server_command_topic, json.dumps(command))

Gửi thông báo JSON đến Topic lệnh với giá trị của led_on được đặt thành true hoặc false tùy thuộc vào sự so sánh ánh sáng với 300. Nếu ánh sáng nhỏ hơn 300, true sẽ được gửi để hướng dẫn thiết bị bật đèn LED.

4. Chạy code giống code trước

5. Điều chỉnh mức độ ánh sáng có được từ thiết bị vật lý hoặc ảo. Các tin nhắn và các lệnh đã nhận và gửi sẽ được ghi vào thiết bị đầu cuối:

(.venv) ➜  nightlight-server python app.py
Message received: {'light': 0}
Sending message: {'led_on': True}
Message received: {'light': 400}
Sending message: {'led_on': False}

Phép đo từ xa và các lệnh được gửi theo một Topic duy nhất, nghĩa là phép đo từ xa từ nhiều thiết bị sẽ xuất hiện trên cùng một Topic đo từ xa và các lệnh tới nhiều thiết bị sẽ xuất hiện trên cùng một Topic lệnh. Nếu muốn gửi một lệnh đến một thiết bị cụ thể, có thể sử dụng nhiều Topic, đặt tên với id thiết bị duy nhất, như /lệnh/thiết bị1, /lệnh/thiết bị2. Bằng cách đó, một thiết bị có thể nhận các tin nhắn chỉ dành cho thiết bị đó.

Có thể tìm thấy code này trong thư mục lệnh /máy chủ mã.

Xử lý các lệnh trên thiết bị IoT

Khi các lệnh đang được gửi từ máy chủ, có thể thêm code vào thiết bị IoT để xử lý chúng và điều khiển đèn LED.

Thực hiện theo bước bên dưới để nhận lệnh từ Broker MQTT:

Arduino – Wio Terminal

Single-board computer – Raspberry Pi/Virtual IoT device

Sau khi chạy code này, hãy thử nghiệm với việc thay đổi mức độ ánh sáng. Xem đầu ra từ máy chủ và thiết bị, đồng thời xem đèn LED khi bạn thay đổi mức độ ánh sáng.

Mất kết nối

Dịch vụ đám mây phải làm gì khi cần gửi lệnh đến thiết bị IoT đang ngoại tuyến?

Nếu lệnh mới nhất ghi đè lệnh trước đó thì có thể bỏ qua các lệnh trước. Nếu dịch vụ đám mây gửi lệnh bật hệ thống sưởi, sau đó gửi lệnh tắt, thì có thể bỏ qua lệnh bật.

Nếu các lệnh được xử lý theo trình tự, như di chuyển một cánh tay robot lên, sau đó đóng một bộ gắp thì chúng cần được gửi theo thứ tự sau khi kết nối được khôi phục.

Biên dịch: Bắc Đặng

Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com

0 0 Phiếu bầu
Article Rating
Subscribe
Notify of
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả các bình luận