Phần 8. Di chuyển logic ứng dụng sang đám mây

0
653

Bài viết trước đã giới thiệu cách kết nối hệ thống giám sát độ ẩm của đất và điều khiển rơle đến dịch vụ IoT dựa trên công nghệ đám mây. Bài viết này sẽ trình bày cách di chuyển server code để điều khiển thời gian di chuyển lên đám mây sử dụng serverless functions.

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

1. Khái niệm Serverless

2. Cách tạo một ứng dụng serverless.

3. Cách tạo trình kích hoạt sự kiện IoT Hub.

4. Cách gửi yêu cầu phương thức trực tiếp từ serverless code.

5. Cách triển khai serverless code trên đám mây.

1. Khái niệm Serverless

Serverless hoặc serverless computing liên quan đến việc tạo các khối mã nhỏ chạy trong đám mây phù hợp với các loại sự kiện khác nhau. Khi xuất hiện sự kiện, mã sẽ được chạy để chuyển dữ liệu về sự kiện. Những sự kiện này có thể từ yêu cầu web, đưa tin nhắn vào hàng đợi, thay đổi dữ liệu trong cơ sở dữ liệu hoặc tin nhắn gửi từ dịch vụ IoT của các thiết bị IoT.

Điều này tương tự như sử dụng trình kích hoạt cơ sở dữ liệu, mã được kích hoạt bởi một sự kiện như chèn một hàng.

Mã chỉ chạy khi sự kiện xảy ra, khi đó nó được tải và chạy làm hạn chế khả năng mở rộng của máy chủ nếu nhiều sự kiện xảy ra cùng một lúc, nhà cung cấp đám mây có thể chạy Functions nhiều lần tùy theo nhu cầu cùng một lúc trên bất kỳ máy chủ có sẵn nào. Nhược điểm là nếu cần chia sẻ thông tin giữa các sự kiện, phải lưu mã ở đâu kiểu như cơ sở dữ liệu chứ không phải lưu như trong bộ nhớ.

Mã được viết dưới dạng một hàm lấy thông tin chi tiết về sự kiện làm tham số. Để viết các hàm serverless này, có thể sử dụng một loạt các ngôn ngữ lập trình.

Serverless còn được gọi là Functions như một dịch vụ (FaaS) vì mỗi trình kích hoạt sự kiện được triển khai dưới dạng một Functions trong mã.

Khác với cái tên, serverless có sử dụng máy chủ. Việc đặt tên này do với tư cách là nhà phát triển không quan tâm đến các máy chủ mà chỉ quan tâm đến việc chạy mã để phù hợp với một sự kiện. Nhà cung cấp đám mây có serverless runtime để quản lý việc phân bổ máy chủ, mạng, lưu trữ, CPU, bộ nhớ và những thứ cần thiết để chạy mã. Với mô hình này, người dùng không trả tiền cho mỗi máy chủ của dịch vụ (vì không có máy chủ) mà trả tiền cho thời gian mã đang chạy và dung lượng bộ nhớ được sử dụng.

Trên đám mây, sử dụng Serverless là một trong những cách rẻ nhất để chạy mã. Khi mã không chạy thì không phải trả tiền.

Theo quan điểm của một nhà phát triển IoT, serverless là một mô hình lý tưởng. Người dùng có thể viết một hàm để phản hồi lại các tin nhắn từ bất kỳ thiết bị IoT nào kết nối với dịch vụ IoT lưu trữ trên đám mây. Mã này sẽ xử lý tất cả các tin nhắn đã gửi, nhưng chỉ chạy khi cần thiết.

Mô hình serverless đang chuyển sang các dịch vụ đám mây khác ngoài việc chạy mã. Ví dụ: cơ sở dữ liệu serverless có sẵn trên đám mây bằng cách sử dụng mô hình định giá serverless, trong đó người dùng trả tiền cho việc thực hiện mỗi yêu cầu dựa trên cơ sở dữ liệu, như truy vấn hoặc chèn, thường sử dụng định giá dựa trên số lượng công việc để phục vụ yêu cầu.

2. Cách tạo một ứng dụng serverless

Dịch vụ serverless computing của Microsoft được gọi là Azure Functions.

Video ngắn dưới đây có cái nhìn tổng quan về Azure Functions

Để viết Azure Functions, trước tiên phải chọn ngôn ngữ để viết. Azure Functions hỗ trợ Python, JavaScript, TypeScript, C #, F #, Java và Powershell. Bài viết này viết ứng dụng Azure Functions bằng Python. Azure Functions cũng hỗ trợ các trình xử lý tùy chỉnh để viết các hàm bằng bất kỳ ngôn ngữ nào hỗ trợ các yêu cầu HTTP, bao gồm cả COBOL.

Functions App bao gồm một hoặc nhiều trình kích hoạt – các Functions phản hồi các sự kiện. Có thể có nhiều trình kích hoạt bên trong một Functions App cùng chia sẻ cấu hình chung. Ví dụ: trong file cấu hình cho Functions App của người dùng, có chi tiết kết nối của IoT Hub và tất cả các Functions trong ứng dụng sử dụng thông tin này để kết nối và nghe các sự kiện.

* Cách cài đặt công cụ Azure Functions

Một tính năng tuyệt vời của Azure Functions là chạy cục bộ. Cùng một runtime trong đám mây có thể chạy trên máy tính, cho phép viết mã phản hồi các thông báo IoT và chạy cục bộ. Thậm chí người dùng có thể gỡ lỗi mã khi xử lý các sự kiện. Khi mã thỏa mãn yêu cầu của người dùng thì có thể triển khai lên đám mây.

Azure Functions có sẵn dưới dạng CLI, được gọi là Azure Functions Core Tools.

1. Cài đặt các công cụ cốt lõi của Azure Functions bằng cách làm theo các hướng dẫn trong tài liệu của Azure Functions.

2. Cài đặt tiện ích mở rộng Azure Functions cho VS Code để hỗ trợ tạo, gỡ lỗi và triển khai các Functions Azure.

Khi triển khai ứng dụng Azure Functions lên đám mây, cần sử dụng dung lượng nhỏ lưu trữ đám mây để lưu File ứng dụng và File log. Khi chạy Functions App cục bộ, vẫn cần kết nối với bộ nhớ đám mây nhưng không sử dụng bộ nhớ đám mây thực tế mà sử dụng trình giả lập bộ nhớ Azurite.

Trong Azure, Azure Functions sử dụng bộ nhớ là Azure Storage Account. Các tài khoản này có thể lưu trữ File, blobs, dữ liệu trong bảng hoặc trong hàng đợi. Người dùng có thể chia sẻ một tài khoản lưu trữ giữa nhiều ứng dụng, như Functions App và web.

1. Azurite là một ứng dụng Node.js, vì vậy cần phải cài đặt Node.js. Hướng dẫn tải và cài đặt trên Node.js website hoặc từ Homebrew trên Mac

2. Cài đặt Azurite bằng lệnh sau (npm là một công cụ được cài đặt cài đặt Node.js):

npm install -g azurite

3. Tạo thư mục tên azurite để Azurite lưu dữ liệu:

mkdir azurite

4. Chạy Azurite và chuyển vào thư mục mới:

azurite --location azurite

5. Trình mô phỏng lưu trữ Azurite sẽ khởi chạy và sẵn sàng cho Functions runtime kết nối cục bộ.

➜  ~ azurite --location azurite  
Azurite Blob service is starting at http://127.0.0.1:10000
Azurite Blob service is successfully listening at http://127.0.0.1:10000
Azurite Queue service is starting at http://127.0.0.1:10001
Azurite Queue service is successfully listening at http://127.0.0.1:10001
Azurite Table service is starting at http://127.0.0.1:10002
Azurite Table service is successfully listening at http://127.0.0.1:10002

* Cách tạo một project Azure Functions

Sử dụng Azure Functions CLI để tạo một Functions App mới.

1. Tạo và điều hướng đến thư mục cho Functions App có tên soil-moisture-trigger

mkdir soil-moisture-trigger
cd soil-moisture-trigger

2. Tạo môi trường ảo Python bên trong thư mục này:

python3 -m venv .venv

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

Trên Windows:

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

.venv\Scripts\activate.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

Các lệnh này chạy từ cùng vị trí đã chạy lệnh để tạo môi trường ảo. Không cần điều hướng vào thư mục .venv, mà luôn chạy lệnh kích hoạt và các lệnh để cài đặt các gói hoặc chạy mã từ thư mục đã chọn trong khi tạo môi trường ảo.

4. Chạy lệnh sau để tạo Functions App trong thư mục này:

func init --worker-runtime python soil-moisture-trigger

Khi đó sẽ tạo ra 3 File:

host.json – chứa cài đặt cho Functions App. Người dùng không cần sửa đổi các cài đặt này.

local.settings.json – chứa các cài đặt mà ứng dụng sử dụng khi chạy cục bộ, như chuỗi kết nối cho IoT Hub. Các cài đặt này chỉ là cục bộ và không nên thêm vào kiểm soát mã nguồn. Khi triển khai ứng dụng lên đám mây, không triển khai các cài đặt này mà cài đặt được tải từ Application Settings.

request.txt – là File yêu cầu Pip chứa các gói Pip cần thiết để chạy Functions App.

5. File local.settings.json cài đặt cho tài khoản lưu trữ mà Functions App sẽ sử dụng. Để kết nối với trình mô phỏng lưu trữ cục bộ Azurite, đặt giá trị này như sau:

"AzureWebJobsStorage": "UseDevelopmentStorage=true",

6. Cài đặt các gói Pip cần thiết bằng cách sử dụng File yêu cầu:

pip install -r requirements.txt

Các gói Pip bắt buộc phải có trong File này để khi triển khai Functions App lên đám mây, đảm bảo runtime cài đặt đúng gói.

7. Chạy lệnh sau để bắt đầu runtime Functions nhằm kiểm tra các cài đặt trên hoạt động chính xác:

func start

Người dùng sẽ thấy runtime khởi động và báo cáo không tìm thấy bất kỳ functions công việc nào (trình kích hoạt).

(.venv) ➜  soil-moisture-trigger func start
Found Python version 3.9.1 (python3).

Azure Functions Core Tools
Core Tools Version:       3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0  (64-bit)
Function Runtime Version: 3.0.15417.0

[2021-05-05T01:24:46.795Z] No job functions found.

Nếu nhận được thông báo tường lửa, hãy cấp quyền truy cập vì ứng dụng func cần đọc và ghi vào mạng.

Nếu sử dụng macOS, có thể có cảnh báo trong đầu ra:

(.venv) ➜  soil-moisture-trigger func start
Found Python version 3.9.1 (python3).

Azure Functions Core Tools
Core Tools Version:       3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0  (64-bit)
Function Runtime Version: 3.0.15417.0

[2021-06-16T08:18:28.315Z] Cannot create directory for shared memory usage: /dev/shm/AzureFunctions
[2021-06-16T08:18:28.316Z] System.IO.FileSystem: Access to the path '/dev/shm/AzureFunctions' is denied. Operation not permitted.
[2021-06-16T08:18:30.361Z] No job functions found.

Có thể bỏ qua những lệnh trên nếu Functions App khởi động chính xác và hiển thị các Functions đang chạy.

8. Dừng Functions App bằng cách nhấn ctrl + c.

9. Mở thư mục hiện tại trong VS Code, sau đó chạy:

code .

VS Code sẽ phát hiện project Functions và hiển thị thông báo:

Chọn Yes

10. Đảm bảo môi trường ảo Python đang chạy trong VS code terminal. Kết thúc và khởi động lại nếu cần.

3. Cách tạo trình kích hoạt sự kiện IoT Hub

Functions App là shell của serverless code. Để phản hồi các sự kiện của IoT Hub, có thể thêm trình kích hoạt IoT Hub vào ứng dụng này. Trình kích hoạt này cần kết nối với luồng thông báo gửi đến IoT Hub và phản hồi chúng bằng cách kết nối với endpoint tương thích của Event Hub IoT Hubs.

IoT Hub dựa trên dịch vụ Azure khác được gọi là Azure Event Hub. Event Hubs là dịch vụ cho phép gửi và nhận tin nhắn nhằm thêm các tính năng cho các thiết bị IoT. Cách kết nối để đọc tin nhắn từ IoT Hub giống như khi sử dụng Event Hubs.

Để kết nối thiết bị IoT với IoT Hub, thiết bị đó phải sử dụng khóa bí mật đảm bảo chỉ các thiết bị được phép mới có thể kết nối. Điều tương tự cũng áp dụng khi kết nối để đọc tắt tin nhắn, mã của bạn sẽ cần một chuỗi kết nối có chứa khóa bí mật, cùng với các chi tiết của IoT Hub.

Chuỗi kết nối mặc định nhận được có quyền iothubowner, cung cấp cho bất kỳ mã nào toàn quyền trên IoT Hub. Tốt nhất nên kết nối với mức quyền thấp nhất cần thiết.

Khi đã kết nối trình kích hoạt, mọi tin nhắn được gửi đến IoT Hub sẽ gọi code bên trong hàm. Trình kích hoạt sẽ nhận được thông báo dưới Event Hubs.

1. Từ VS Code terminal, chạy lệnh sau để lấy chuỗi kết nối cho endpoint tương thích của IoT Hubs event Hub:

az iot hub connection-string show --default-eventhub \
                                  --output table \
                                  --hub-name <hub_name>

Thay <hub_name> bằng tên đã sử dụng cho IoT Hub.

2. Trong VS Code, mở file local.settings.json. Thêm giá trị bổ sung sau vào phần Values:

"IOT_HUB_CONNECTION_STRING": "<connection string>"

Thay <connection string> bằng giá trị từ bước trước. Thêm dấu phẩy sau dòng trên để tạo JSON hợp lệ.

* Cách tạo trình kích hoạt sự kiện

1. Từ VS code terminal, chạy lệnh sau trong thư mục soil-moisture-trigger:

func new --name iot-hub-trigger --template "Azure Event Hub trigger"

Lệnh này tạo ra Function mới iot-hub-trigger. Trình kích hoạt sẽ kết nối với endpoint tương thích của Event Hub trên IoT Hub. Không có trình kích hoạt IoT Hub cụ thể.

Thao tác này sẽ tạo một thư mục bên trong thư mục soil-moisture-trigger được gọi là iot-hub-trigger. Trong đó sẽ có các File sau:

__init__.py – là File Python code chứa trình kích hoạt, sử dụng quy ước tên file Python chuẩn để biến thư mục này thành một mô-đun Python.

File này chứa mã sau:

from typing import List
import logging
import azure.functions as func

def main(events: List[func.EventHubEvent]):
    for event in events:
        logging.info('Python EventHub trigger processed an event: %s',
                        event.get_body().decode('utf-8'))

Cốt lõi của trình kích hoạt là main function. Hàm này có một tham số gọi là events chứa danh sách EventHubEvent. Mỗi sự kiện trong danh sách này là một thông báo gửi đến IoT Hub, cùng với các thuộc tính giống như các chú thích.

Trình kích hoạt này xử lý danh sách các sự kiện, thay vì các sự kiện riêng lẻ. Khi lần đầu tiên chạy trình kích hoạt, nó sẽ xử lý mọi sự kiện chưa được xử lý trên IoT Hub (các thông báo được lưu trữ trong một thời gian để không bị mất nếu mã ứng dụng ngoại tuyến). Sau đó, nó thường xử lý một danh sách chỉ chứa một sự kiện, trừ khi có nhiều sự kiện được gửi đến Hub trong một khoảng thời gian ngắn.

Cốt lõi của hàm này lặp lại danh sách và ghi nhật ký các sự kiện.

function.json – chứa cấu hình cho trình kích hoạt. Cấu hình chính nằm trong một phần được gọi là bindings. Bindings là thuật ngữ chỉ kết nối giữa Azure Functions và các dịch vụ Azure khác. Hàm này có đầu vào ràng buộc với một Event Hub – nó kết nối với một Event Hub và nhận dữ liệu.

Các binding đầu ra để gửi đầu ra của một hàm đến một dịch vụ khác. Ví dụ: thêm một liên kết đầu ra vào cơ sở dữ liệu và trả về sự kiện IoT Hub từ function sẽ tự động được chèn vào cơ sở dữ liệu.

Phần bindings bao gồm cấu hình cho ràng buộc. Các giá trị quan tâm là:

– “type”: “eventHubTrigger” – cho biết function cần lắng nghe các sự kiện từ Event Hub

– “name”: “events” – là tên thông số sử dụng cho các sự kiện của Event Hub. Giá trị này khớp với tên tham số trong hàm chính trong mã Python.

“direction”: “in” – là liên kết đầu vào, dữ liệu từ event hub đi vào function.

“connection”: “” – xác định tên của cài đặt để đọc chuỗi kết nối. Khi chạy cục bộ, giá trị này sẽ đọc cài đặt này từ file local.settings.json.

Chuỗi kết nối không được lưu trữ trong file function.json mà phải đọc từ cài đặt để ngăn người dùng vô tình làm lộ chuỗi kết nối của mình.

1. Cập nhật giá trị của “connection” trong file function.json để trỏ đến giá trị mới đã được thêm vào file local.settings.json:

"connection": "IOT_HUB_CONNECTION_STRING",

* Cách chạy trình kích hoạt sự kiện

1. Đảm bảo không chạy trình theo dõi sự kiện của IoT Hub vì nếu chạy cùng lúc với ứng dụng Function, ứng dụng Function sẽ không thể kết nối và sử dụng các sự kiện.

Nhiều ứng dụng có thể kết nối với các endpoint của IoT Hub bằng cách sử dụng các consumer groups khác nhau.

2. Chạy lệnh sau từ VS Code terminal để chạy Functions App,

func start

Functions App sẽ khởi động và khám phá ra hàm iot-hub-trigger. Sau đó, nó sẽ xử lý tất cả các sự kiện gửi đến IoT Hub trong ngày.

(.venv) ➜  soil-moisture-trigger func start
Found Python version 3.9.1 (python3).

Azure Functions Core Tools
Core Tools Version:       3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0  (64-bit)
Function Runtime Version: 3.0.15417.0

Functions:

        iot-hub-trigger: eventHubTrigger

For detailed output, run func with --verbose flag.
[2021-05-05T02:44:07.517Z] Worker process started and initialized.
[2021-05-05T02:44:09.202Z] Executing 'Functions.iot-hub-trigger' (Reason='(null)', Id=802803a5-eae9-4401-a1f4-176631456ce4)
[2021-05-05T02:44:09.205Z] Trigger Details: PartionId: 0, Offset: 1011240-1011632, EnqueueTimeUtc: 2021-05-04T19:04:04.2030000Z-2021-05-04T19:04:04.3900000Z, SequenceNumber: 2546-2547, Count: 2
[2021-05-05T02:44:09.352Z] Python EventHub trigger processed an event: {"soil_moisture":628}
[2021-05-05T02:44:09.354Z] Python EventHub trigger processed an event: {"soil_moisture":624}
[2021-05-05T02:44:09.395Z] Executed 'Functions.iot-hub-trigger' (Succeeded, Id=802803a5-eae9-4401-a1f4-176631456ce4, Duration=245ms)

Mỗi lệnh gọi đến hàm sẽ được bao quanh bởi Executing 'Functions.iot-hub-trigger'/Executed 'Functions.iot-hub-trigger' trong đầu ra.

Nếu gặp lỗi sau:

The listener for function 'Functions.iot-hub-trigger' was unable to start. Microsoft.WindowsAzure.Storage: Connection refused. System.Net.Http: Connection refused. System.Private.CoreLib: Connection refused.

Thì kiểm tra Azurite đang chạy và đặt AzureWebJobsStorage trong file local.settings.json thành UseDevelopmentStorage = true.

3. Khi đó sẽ thấy thông báo độ ẩm mới của đất trong Functions App.

4. Dừng và khởi động lại Functions App. Khi đó hệ thống sẽ chỉ xử lý các tin nhắn mới mà không xử lý các tin nhắn trước đó.

VS Code cũng hỗ trợ gỡ lỗi các Functions. Đặt điểm ngắt bằng cách nhấp vào đường viền ở đầu mỗi dòng mã hoặc đặt con trỏ trên dòng mã và chọn Run -> Toggle breakpoint hoặc nhấn F9. Khởi chạy trình gỡ lỗi bằng cách chọn Run -> Start debugging, nhấn F5 hoặc chọn ngăn Run and debug và chọn nút Start debugging để xem chi tiết của các sự kiện đang được xử lý.

4. Cách gửi yêu cầu phương thức trực tiếp từ mã serverless

Đến thời điểm này, Functions App đang nghe thông báo từ IoT Hub bằng cách sử dụng endpoint tương thích của Event Hub. Bây giờ gửi lệnh đến thiết bị IoT bằng cách sử dụng một kết nối khác với IoT Hub thông qua Registry Manager. Đây là công cụ cho phép người dùng xem những thiết bị đã đăng ký với IoT Hub và giao tiếp với thiết bị đó bằng cách gửi tin nhắn đám mây tới thiết bị, yêu cầu phương thức trực tiếp hoặc cập nhật bản sao thiết bị. Có thể sử dụng nó để đăng ký, cập nhật hoặc xóa các thiết bị IoT khỏi IoT Hub.

Để kết nối với Registry Manager, cần một chuỗi kết nối.

* Cách lấy chuỗi kết nối Registry Manager

1. Chạy lệnh sau để lấy chuỗi kết nối:

az iot hub connection-string show --policy-name service \
                                  --output table \
                                  --hub-name <hub_name>

Thay <hub_name> bằng tên đã sử dụng cho IoT Hub.

ServiceConnect yêu cầu chuỗi kết nối bằng cách sử dụng tham số dịch vụ –policy-name. Khi đó, người dùng có thể chỉ định những quyền mà chuỗi kết nối đó cho phép. Chính sách Service Connect cho phép mã kết nối và gửi tin nhắn đến các thiết bị IoT.

2. Trong VS Code, mở file local.settings.json. Thêm giá trị bổ sung sau vào phần Giá trị:

"REGISTRY_MANAGER_CONNECTION_STRING": "<connection string>"

Thay <connection string> bằng giá trị từ bước trước. Thêm dấu phẩy sau dòng trên để tạo JSON hợp lệ này.

* Cách gửi một yêu cầu phương pháp trực tiếp đến một thiết bị

1. SDK cho Registry Manager có sẵn thông qua gói Pip. Thêm dòng sau vào file tin request.txt để thêm phần phụ thuộc vào gói này:

azure-iot-hub

2. Đảm bảo rằng VS Code terminal đã kích hoạt môi trường ảo và chạy lệnh sau để cài đặt các gói Pip:

pip install -r requirements.txt

3. Thêm các lệnh sau vào file __init__.py:

import json
import os
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import CloudToDeviceMethod

Thao tác này nhập một số thư viện hệ thống, cũng như các thư viện để tương tác với Registry Manager và gửi các yêu cầu phương thức trực tiếp.

4. Xóa mã bên trong phương thức main, nhưng vẫn giữ nguyên phương thức đó.

5. Khi nhận được nhiều tin nhắn, chỉ xử lý tin nhắn cuối cùng vì đây là độ ẩm hiện tại của đất. Thêm mã sau để nhận thông báo cuối cùng từ tham số events:

event = events[-1]

6. Thêm mã sau:

body = json.loads(event.get_body().decode('utf-8'))
device_id = event.iothub_metadata['connection-device-id']

logging.info(f'Received message: {body} from {device_id}')

Mã này trích xuất nội dung của sự kiện chứa thông báo JSON gửi từ thiết bị IoT.

Sau đó, nó lấy ID thiết bị từ các chú thích chuyển cùng với tin nhắn. Nội dung của sự kiện chứa tin nhắn được gửi dưới dạng đo từ xa, từ điển iothub_metadata chứa các thuộc tính do IoT Hub đặt như ID thiết bị của người gửi và thời gian tin nhắn được gửi.

Thông tin này được ghi lại và đăng nhập trong terminal khi chạy Functions App cục bộ.

7. Thêm mã sau:

soil_moisture = body['soil_moisture']

if soil_moisture > 450:
    direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}')
else:
    direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}')

Mã này lấy độ ẩm của đất từ tin nhắn và kiểm tra độ ẩm của đất. Tùy thuộc vào giá trị mà tạo ra một lớp trợ giúp cho yêu cầu phương thức trực tiếp relay_on hoặc relay_off. Yêu cầu phương thức không cần tải trọng, do đó, nó sẽ gửi tài liệu JSON trống.

8. Thêm mã sau:

logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}')

registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING']
registry_manager = IoTHubRegistryManager(registry_manager_connection_string)

Mã này tải REGISTRY_MANAGER_CONNECTION_STRING từ file local.settings.json. Các giá trị trong file này được tạo sẵn dưới dạng các biến môi trường, đọc các giá trị này bằng cách sử dụng hàm os.environ– hàm trả về thông tin của tất cả các biến môi trường.

Khi triển khai mã này trên đám mây, các giá trị trong file local.settings.json sẽ được đặt làm Application Settings và có thể đọc chúng từ các biến môi trường.

Sau đó, mã tạo một phiên bản của lớp trợ giúp Registry Manager bằng cách sử dụng chuỗi kết nối.

9. Thêm mã sau:

registry_manager.invoke_device_method(device_id, direct_method)

logging.info('Direct method request sent!')

Mã này cho phép người quản lý sổ đăng ký gửi yêu cầu phương pháp trực tiếp đến thiết bị đã gửi phép đo từ xa.

Trong các phiên bản của ứng dụng đã tạo ở các bài viết trước bằng MQTT, các lệnh điều khiển rơle gửi đến tất cả các thiết bị. Mã giả định chỉ có một thiết bị, phiên bản mã này gửi yêu cầu phương thức đến một thiết bị duy nhất, vì vậy sẽ hoạt động nếu có nhiều thiết lập cảm biến độ ẩm và rơ le, gửi yêu cầu phương pháp trực tiếp phù hợp đến đúng thiết bị.

Chạy Functions App và đảm bảo thiết bị IoT đang gửi dữ liệu. Người dùng sẽ thấy các thông báo đang được xử lý và gửi đi các yêu cầu phương thức trực tiếp. Di chuyển cảm biến độ ẩm của đất vào và ra khỏi đất để xem các giá trị thay đổi và rơ le bật và tắt

Tìm mã này trong thư mục code/functions.

Triển khai serverless code lên đám mây

Mã đang hoạt động cục bộ, vì vậy bước tiếp theo triển khai Functions App lên đám mây.

* Cách tạo tài nguyên đám mây

Functions App cần được triển khai tới tài nguyên Functions App trong Azure, nằm trong Resource Group đã tạo cho IoT Hub. Cần tạo một Storage Account trong Azure để thay thế tài khoản giả lập đang chạy cục bộ.

1. Chạy lệnh sau để tạo Storage Account:

az storage account create --resource-group soil-moisture-sensor \
                          --sku Standard_LRS \
                          --name <storage_name> 

Thay <storage_name> bằng tên cho tài khoản lưu trữ. Tên này phải là duy nhất trên toàn cầu vì nó tạo thành một phần của URL sử dụng để truy cập tài khoản lưu trữ. Tên này được giới hạn ở 24 ký tự, chỉ sử dụng chữ thường và số, không có ký tự nào khác.

–Sku Standard_LRS chọn mức định giá, chọn tài khoản có mục đích chung với chi phí thấp nhất. Người dùng phải trả chi phí tương đối thấp cho bộ nhớ, với mức cao nhất là dưới US$0,05 mỗi tháng cho mỗi gigabyte được lưu trữ.

2. Chạy các lệnh sau để tạo Functions App:

az functionapp create --resource-group soil-moisture-sensor \
                      --runtime python \
                      --functions-version 3 \
                      --os-type Linux \
                      --consumption-plan-location <location> \
                      --storage-account <storage_name> \
                      --name <functions_app_name>

Thay <location> bằng vị trí đã sử dụng khi tạo Resource Group trong bài viết trước.

Thay <storage_name> bằng tên của tài khoản lưu trữ đã tạo ở bước trước.

Thay <functions_app_name> bằng tên duy nhất cho Functions App.

Tùy chọn –functions-version 3 đặt phiên bản Azure Functions để sử dụng. Phiên bản 3 là phiên bản mới nhất.

–os-type Linux lệnh cho Functions runtime sử dụng Linux làm hệ điều hành để lưu trữ các Functions này. Các Functions được lưu trữ trên Linux hoặc Windows, tùy thuộc vào ngôn ngữ lập trình được sử dụng. Ứng dụng Python chỉ được hỗ trợ trên Linux.

* Cách upload Application Settings

Khi phát triển Functions App, người dùng đã lưu trữ một số cài đặt trong file local.settings.json cho các chuỗi kết nối cho IoT Hub và được ghi vào Application Settings trong Functions App trong Azure để mã có thể sử dụng.

File local.settings.json chỉ dành cho cài đặt phát triển cục bộ và không nên kiểm tra trong phần kiểm soát mã nguồn như GitHub. Khi triển khai lên đám mây, sẽ sử dụng Application Settings. Đây là các cặp khóa/giá trị được lưu trữ trên đám mây và được đọc từ các biến môi trường trong mã hoặc trong runtime khi kết nối mã với IoT Hub.

1. Chạy lệnh sau để đặt cài đặt IOT_HUB_CONNECTION_STRING trong Functions App Application Settings:

az functionapp config appsettings set --resource-group soil-moisture-sensor \
                                      --name <functions_app_name> \
                                      --settings "IOT_HUB_CONNECTION_STRING=<connection string>"

Thay <functions_app_name> bằng tên đã sử dụng cho Functions App.

Thay <connection string> bằng IOT_HUB_CONNECTION_STRING từ file local.settings.json.

Lặp lại bước trên, đặt giá trị của REGISTRY_MANAGER_CONNECTION_STRING thành giá trị tương ứng từ file local.settings.json.

Khi chạy các lệnh này, chúng sẽ xuất ra danh sách tất cả các Application Settings cho Functions App. Sử dụng danh sách này để kiểm tra các giá trị có chính xác hay không.

Người dùng sẽ thấy giá trị đã đặt cho AzureWebJobsStorage. Trong File local.settings.json, giá trị này sử dụng trình mô phỏng lưu trữ cục bộ. Khi tạo Functions App, cài đặt sẽ tự động chuyển tài khoản lưu trữ làm tham số.

5. Cách triển khai Functions App lên đám mây

Lúc này đã sẵn sàng triển khai Functions App.

Chạy lệnh sau từ VS Code terminal để publish Functions App

func azure functionapp publish <functions_app_name>

Thay <functions_app_name> bằng tên đã sử dụng cho Functions App

Mã sẽ được đóng gói và gửi đến Functions App để triển khai và bắt đầu. Có nhiều đầu ra bảng điều khiển, kết thúc bằng xác nhận việc triển khai và danh sách các chức năng. Trong trường hợp này, danh sách sẽ chỉ chứa trình kích hoạt.

Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in soil-moisture-sensor:
    iot-hub-trigger - [eventHubTrigger]

Đảm bảo thiết bị IoT đang chạy. Thay đổi mức độ ẩm bằng cách điều chỉnh độ ẩm của đất hoặc di chuyển cảm biến vào và ra khỏi đất để rơ le bật và tắt khi độ ẩm của đất thay đổi.

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

5 1 Bỏ phiế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