Phần 13. Sử dụng Geofences- Hàng rào địa lý

0
702

Video dưới đây giới thiệu tổng quan về địa lý và cách sử dụng chúng trong Azure Maps. Những nội dung này sẽ được đề cập ở các phần tiếp theo trong bài viết này.

Ba bài viết trước đã trình bày cách sử dụng IoT để xác định vị trí các xe tải chở nông sản từ trang trại đến trung tâm chế biến, từ đó người dùng có thể thu thập dữ liệu GPS, gửi dữ liệu lên đám mây để lưu trữ và hiển thị nó trên bản đồ. Bước tiếp theo để tăng hiệu quả chuỗi cung ứng là nhận cảnh báo khi xe tải sắp đến trung tâm xử lý để đội ngũ nhân viên cần dỡ hàng chuẩn bị sẵn sàng các thiết bị (như xe nâng) ngay khi xe đến. Nhờ đó, họ có thể dỡ hàng nhanh chóng và cũng không phải trả phí chờ đợi cho xe tải và tài xế.

Bài viết này sẽ trình bày về hàng rào địa lý – các vùng không gian địa lý được xác định và cách kiểm tra tọa độ GPS nằm bên trong hay bên ngoài Geofences. Do đó có thể biết được cảm biến GPS đã đến hoặc rời khỏi một khu vực hay chưa.

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

1. Khái niệm hàng rào địa lý (Geofences).

2. Cách xác định Geofences.

3. Cách kiểm tra điểm dựa trên Geofences.

4. Cách sử dụng hệ thống địa lý từ serverless cod

1. Khái niệm hàng rào địa lý (Geofences)

Geofences- Hàng rào địa lý là chu vi ảo cho một khu vực địa lý trong thế giới thực. Geofences có thể là các vòng tròn được xác định tâm và bán kính (ví dụ: một vòng tròn rộng 100m xung quanh một tòa nhà) hoặc một đa giác bao phủ một khu vực như khu vực trường học, giới hạn thành phố, trường đại học hoặc khuôn viên văn phòng. Để cho ngắn gọn, nội dung tiếp theo trong bài viết sẽ sử dụng từ Geofence để nói về hàng rào địa lý.

Có nhiều người đã sử dụng Geofence mà không biết, ví dụ như đặt nhắc nhở bằng ứng dụng iOS hoặc Google Keep dựa trên vị trí chính là đã sử dụng Geofence. Các ứng dụng này sẽ thiết lập Geofence dựa trên vị trí đã cho và thông báo cho người dùng khi điện thoại của họ đi vào Geofence.

Việc biết được một chiếc xe đang ở trong hay ngoài Geofence nhằm phục vụ tốt cho việc:

– Chuẩn bị dỡ hàng: Khi nhận được thông báo một chiếc xe đã đến địa điểm cho phép một đội chuẩn bị để dỡ hàng lên xe, giảm thời gian chờ xe giúp người lái xe tăng số lần giao hàng trong ngày.

Truy thu thuế: Một số quốc gia như New Zealand, chỉ tính phí đường đối với xe chạy bằng động cơ diesel dựa trên trọng lượng của xe khi lái xe trên đường công cộng. Sử dụng Geofence cho phép theo dõi quãng đường đi trên đường công cộng thay vì đường riêng trên các địa điểm như nông trại hoặc khu vực khai thác gỗ.

Chống trộm: Khi một chiếc xe ra khỏi Geofence không rõ lý do thì có thể đã bị đánh cắp.

Tuân thủ đúng vị trí: Tại khu vực làm việc, trang trại hoặc nhà máy, có một số khu vực bị cấm đối với một số phương tiện nhất định, chẳng hạn như các phương tiện chở phân bón nhân tạo và thuốc trừ sâu phải cách xa các cánh đồng trồng sản phẩm hữu cơ. Nếu cài đặt Geofences, khi một chiếc xe đi vào khu vực cấm thì lái xe sẽ nhận được thông báo.

Azure Maps, dịch vụ đã sử dụng trong bài viết trước để trực quan hóa dữ liệu GPS, cho phép xác định phạm vi địa lý, sau đó kiểm tra xem một điểm nằm trong hay ngoài phạm vi địa lý.

2. Cách xác định Geofences

Geofences được xác định bằng GeoJSON, giống như các điểm đã được thêm vào bản đồ trong bài viết trước. Trong trường hợp này, thay vì là một FeatureCollection của các giá trị Point, nó là một FeatureCollection chứa một đa giác (Polygon).

{
   "type": "FeatureCollection",
   "features": [
     {
       "type": "Feature",
       "geometry": {
         "type": "Polygon",
         "coordinates": [
           [
             [
               -122.13393688201903,
               47.63829579223815
             ],
             [
               -122.13389128446579,
               47.63782047131512
             ],
             [
               -122.13240802288054,
               47.63783312249837
             ],
             [
               -122.13238388299942,
               47.63829037035086
             ],
             [
               -122.13393688201903,
               47.63829579223815
             ]
           ]
         ]
       },
       "properties": {
         "geometryId": "1"
       }
     }
   ]
}

Mỗi điểm trên đa giác được xác định là một cặp (kinh độ, vĩ độ) trong một mảng và những điểm này nằm trong một mảng được đặt làm tọa độ (coordinates). Trong một Point trong bài viết trước, coordinates chứa 2 giá trị, latitudelongitude; Polygon chứa 2 giá trị, longitude latitude.

Lưu ý: GeoJSON sử dụng định dạng (longitude, latitude) của các điểm

Mảng tọa độ Polygon luôn có nhiều mục nhập hơn số điểm

Theo hình chữ nhật trên, tọa độ đa giác đi từ trên cùng bên trái ở 47, -122, di chuyển sang phải đến 47, -121, xuống 46, -121, sang trái đến 46, -122, sau đó trở lại điểm bắt đầu ở 47, -122. Hành trình này tạo thành một đa giác 5 điểm – trên cùng bên trái, trên cùng bên phải, dưới cùng bên phải, dưới cùng bên trái, sau đó trên cùng bên trái để đóng lại.

* Cách xác định Geofence

Để sử dụng Geofence trong bản đồ Azure, trước tiên phải tải lên tài khoản Azure Maps sử dụng API web bản đồ. Sau đó, người dùng sẽ nhận được ID duy nhất để kiểm tra một điểm dựa trên Geofence. Bạn có thể gọi API web Azure Maps bằng cách sử dụng curl. Curl là một công cụ dòng lệnh để thực hiện các yêu cầu đối với các điểm cuối web

1. Nếu đang sử dụng Linux, macOS hoặc phiên bản Windows 10 gần đây thông thường đã cài đặt curl. Chạy phần sau từ terminal hoặc dòng lệnh để kiểm tra:

curl --version

Nếu không thấy thông tin phiên bản cho curl thì cần cài đặt từ trang tải xuống curl.

2. Tạo file GeoJSON có chứa một đa giác. Kiểm tra bằng cách sử dụng cảm biến GPS, do đó cần tạo một đa giác xung quanh vị trí hiện tại của người dùng. Có thể tạo thủ công bằng cách chỉnh sửa ví dụ GeoJSON ở trên hoặc sử dụng công cụ GeoJSON.io. GeoJSON cần chứa FeatureCollection, FeaturegeometryPolygon.

Bắt buộc phải thêm một phần tử properties cùng cấp với phần tử geometry trong đó chứa một geometryId:

"properties": {
    "geometryId": "1"
}

Nếu sử dụng GeoJSON.io thì phải thêm mục này vào phần tử properties trống theo cách thủ công, sau khi tải xuống file JSON hoặc trong trình chỉnh sửa JSON trong ứng dụng. geometryId này phải là duy nhất trong File này. Có thể tải lên nhiều Geofence dưới dạng nhiều Features trong FeatureCollection trong cùng một File GeoJSON, miễn là mỗi File có một geometryId khác nhau. Các Polygon có thể có cùng một geometryId nếu chúng được tải lên từ một File khác vào một thời điểm khác.

3. Lưu File này thành geofence.json và điều hướng đến nơi lưu trữ bằng terminal hoặc ở cửa sổ console.

4. Chạy lệnh curl sau để tạo GeoFence:

curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=<subscription_key>' \
     --header 'Content-Type: application/json' \
     --include \
     --data @geofence.json

Thay thế <subscription_key> trong URL bằng khóa API cho tài khoản Azure Maps.

URL được sử dụng để tải lên dữ liệu bản đồ qua https://atlas.microsoft.com/mapData/upload API. Lệnh gọi bao gồm tham số api-version để chỉ định API Azure Maps nào sẽ sử dụng cho phép API thay đổi theo thời gian nhưng duy trì khả năng tương thích ngược. Định dạng dữ liệu tải lên được đặt thành geojson.

Thao tác này sẽ chạy yêu cầu POST tới API tải lên và trả về danh sách các tiêu đề phản hồi bao gồm tiêu đề được gọi là location.

content-type: application/json
location: https://us.atlas.microsoft.com/mapData/operations/1560ced6-3a80-46f2-84b2-5b1531820eab?api-version=1.0
x-ms-azuremaps-region: West US 2
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains
x-cache: CONFIG_NOCACHE
date: Sat, 22 May 2021 21:34:57 GMT
content-length: 0

Khi gọi một điểm cuối web, có thể chuyển các tham số cho cuộc gọi bằng cách thêm dấu? theo sau là các cặp giá trị khóa là key = value, phân tách các cặp giá trị khóa bằng dấu &.

5. Azure Maps không xử lý điều này ngay lập tức, vì vậy bạn sẽ cần kiểm tra xem yêu cầu tải lên đã hoàn tất chưa bằng cách sử dụng URL được cung cấp trong tiêu đề location. Thực hiện một yêu cầu GET đến location để xem trạng thái. Thêm khóa đăng ký vào cuối location URL bằng cách thêm & subscribe-key = <subscription_key> vào cuối, thay thế <subscription_key> bằng khóa API cho tài khoản Azure Maps. Chạy lệnh sau:

curl --request GET '<location>&subscription-key=<subscription_key>'

curl –request GET ‘<location>&subscription-key=<subscription_key>’Thay thế <location> bằng giá trị tiêu đề location<subscription_key> bằng khóa API tài khoản Azure Maps.

6. Kiểm tra giá trị status trong phản hồi. Nếu không Succeeded, đợi một phút và thử lại.

7. Khi hiển thị trạng thái Succeeded, xem resourceLocation từ phản hồi. sẽ có thông tin chi tiết về ID duy nhất (UDID) cho         GeoJSON. UDID là giá trị sau metadata / và không bao gồm api-version. Ví dụ: nếu resourceLocation là:

{
  "resourceLocation": "https://us.atlas.microsoft.com/mapData/metadata/7c3776eb-da87-4c52-ae83-caadf980323a?api-version=1.0"
}

Khi đó, UDID là 7c3776eb-da87-4c52-ae83-caadf980323a.

Giữ bản sao của UDID này để kiểm tra Geofence khi cần thiết.

3. Cách kiểm tra điểm dựa trên Geofence

Sau khi đã tải polygon lên Azure Maps, có thể kiểm tra một điểm để biết điểm đó nằm trong hay ngoài Geofence bằng cách đưa ra một yêu cầu API web, chuyển vào UDID của Geofence và kinh độ và vĩ độ của điểm cần kiểm tra.

Khi đó, có thể chuyển giá trị searchBuffer giúp API Maps biết mức độ chính xác khi trả về kết quả, do GPS sai số tính bằng mét hoặc hơn chứ không hoàn toàn chính xác. Mặc định cho bộ đệm tìm kiếm là 50m, nhưng có thể đặt giá trị từ 0m đến 500m.

Khi lệnh gọi API trả về kết quả, một trong những phần của kết quả là distance được đo đến điểm gần nhất trên mép của Geofence, với giá trị dương nếu điểm đó nằm ngoài Geofence, giá trị âm nếu điểm đó nằm trong Geofence. Nếu khoảng cách này nhỏ hơn bộ đệm tìm kiếm, khoảng cách thực tế được trả về tính bằng mét, nếu không giá trị là 999 hoặc -999. 999 có nghĩa là điểm nằm ngoài Geofence nhiều hơn bộ đệm tìm kiếm, -999 có nghĩa là nó nằm trong Geofence nhiều hơn bộ đệm tìm kiếm.

Trong hình trên, geofence có một bộ đệm tìm kiếm dài 50m.

Một điểm ở trung tâm của Geofence, trong bộ đệm tìm kiếm có khoảng cách -999

Điểm bên ngoài bộ đệm tìm kiếm có khoảng cách là 999

Một điểm bên trong Geofence và trong bộ đệm tìm kiếm, cách Geofence 6m, có khoảng cách là 6m

Một điểm bên ngoài Geofence và trong bộ đệm tìm kiếm, cách Geofence 39m, có khoảng cách 39m

Điều quan trọng là phải biết khoảng cách đến mép của Geofence và kết hợp thông tin này với các thông tin khác như số đo GPS khác, dữ liệu tốc độ và hướng đi khi đưa ra quyết định dựa trên vị trí của xe.

Trong hình ảnh trên, có một Geofence trên một phần của khuôn viên Microsoft. Đường màu đỏ chỉ một xe tải đang chạy dọc theo đường 520, với các vòng tròn hiển thị các kết quả GPS. Hầu hết các dữ liệu nhận được là chính xác và dọc theo 520, với một số không chính xác trong Geofence. Không có cách nào để đọc có thể chính xác – không có đường nào để xe tải đột ngột chuyển hướng từ 520 vào khuôn viên trường, sau đó quay trở lại 520. Mã kiểm tra Geofence này cần phải xem xét các bài trước đó trước khi xử lý kết quả của thử nghiệm geofence.

Cách kiểm tra dựa trên Geofence

1. Bắt đầu bằng cách tạo URL cho truy vấn API web. Định dạng là:

https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=<subscription-key>&udid=<UDID>&lat=<lat>&lon=<lon>

Thay thế <subscription_key> bằng khóa API cho tài khoản Azure Maps.

Thay thế <UDID> bằng UDID của Geofence từ bài toán trước.

Thay thế <lat><lon> bằng vĩ độ và kinh độ muốn kiểm tra.

URL này sử dụng https://atlas.microsoft.com/spatial/geofence/json API để truy vấn Geofence bằng GeoJSON. Bắt buộc phải có tham số deviceId, là tên của thiết bị có tọa độ (vĩ độ, kinh độ).

Bộ đệm tìm kiếm mặc định là 50m và có thể thay đổi được bằng cách chuyển một tham số bổ sung của searchBuffer = <distance>, đặt <distance> thành khoảng cách bộ đệm tìm kiếm (đơn vị mét, trong khoảng từ 0 đến 500).

2. Sử dụng curl để thực hiện yêu cầu GET tới URL này:

curl --request GET '<URL>'

Nếu xuất hiện mã phản hồi của BadRequest với lỗi: GeoJSON không hợp lệ: Tất cả các thuộc tính đối tượng phải chứa một geometryId để xác định Geofence.

Khi đó GeoJSON đang thiếu phần thuộc tính với hình geometryId, do đó cần sửa GeoJSON, sau đó lặp lại các bước trên để tải lại và nhận UDID mới.

3. Phản hồi sẽ chứa danh sách các geometries, một hình cho mỗi đa giác được xác định trong GeoJSON được sử dụng để tạo Geofence. Mỗi hình học có 3 trường quan tâm, distancenearestLat và nearestLon.

{
    "geometries": [
        {
            "deviceId": "gps-sensor",
            "udId": "7c3776eb-da87-4c52-ae83-caadf980323a",
            "geometryId": "1",
            "distance": 999.0,
            "nearestLat": 47.645875,
            "nearestLon": -122.142713
        }
    ],
    "expiredGeofenceGeometryId": [],
    "invalidPeriodGeofenceGeometryId": []
}

nearLat và nearLon là vĩ độ và kinh độ của một điểm ở biên Geofence gần nhất với vị trí đang kiểm tra.

Distance là khoảng cách từ vị trí được kiểm tra đến điểm gần nhất trên biên của Geofence. Số âm có nghĩa là trong Geofence, ngược lại số dương là bên ngoài. Giá trị này sẽ nhỏ hơn 50 (bộ đệm tìm kiếm mặc định) hoặc 999. Lặp lại nhiều lần với các vị trí trong và ngoài Geofence.

4. Cách sử dụng hệ thống địa lý từ serverless code

Có thể thêm trình kích hoạt mới vào ứng dụng Functions để kiểm tra dữ liệu sự kiện GPS của IoT Hub dựa trên Geofence.

Nhóm người tiêu dùng

Như đã đề cập ở các bài trước, IoT Hub cho phép phát lại các sự kiện đã được Hub nhận nhưng chưa được xử lý. Tuy nhiên điều gì sẽ xảy ra nếu kết nối nhiều bộ kích hoạt? Làm thế nào để biết sự kiện nào đã được xử lý.

Không thể biết sự kiện nào đã được xử lý. Thay vào đó, có thể xác định nhiều kết nối riêng biệt để đọc hết các sự kiện và mỗi kết nối có thể quản lý việc phát lại các tin nhắn chưa đọc. Đây được gọi là nhóm người tiêu dùng. Khi kết nối với điểm cuối, người dùng có thể chỉ định nhóm người tiêu dùng nào muốn kết nối. Mỗi thành phần trong ứng dụng sẽ kết nối với một nhóm người tiêu dùng khác nhau.

Về lý thuyết, mỗi nhóm người tiêu dùng có thể kết nối tối đa với 5 ứng dụng và tất cả đều nhận được tin nhắn. Cách tốt nhất là chỉ có một ứng dụng truy cập vào mỗi nhóm người tiêu dùng để tránh xử lý tin nhắn trùng lặp và đảm bảo khi khởi động lại, tất cả các tin nhắn xếp hàng được xử lý chính xác. Ví dụ: nếu khởi chạy ứng dụng Function cục bộ và chạy ứng dụng trên đám mây, cả hai đều xử lý thông báo, dẫn đến lưu trữ các blob trùng lặp trong tài khoản lưu trữ.

File function.json cho trình kích hoạt IoT Hub đã tạo trong bài trước đó có nhóm người tiêu dùng trong phần ràng buộc trình kích hoạt sự kiện Hub là:

"consumerGroup": "$Default"

Khi tạo IoT Hub, nhóm người tiêu dùng $Default được tạo mặc định. Thêm trình kích hoạt bổ sung bằng cách sử dụng nhóm người tiêu dùng mới.

Bài viết này sẽ sử dụng một chức năng khác chức năng được sử dụng để lưu trữ dữ liệu GPS để kiểm tra Geofence. Trong một ứng dụng sản xuất, có nhiều cách để thực hiện: đặt cả hai vào một chức năng, sử dụng trình kích hoạt trên tài khoản lưu trữ để chạy một chức năng để kiểm tra Geofence hoặc sử dụng nhiều chức năng. Không có cách tối ưu, nó phụ thuộc vào phần còn lại của ứng dụng và nhu cầu của người dùng.

* Cách tạo nhóm người tiêu dùng mới

  1. Chạy lệnh sau để tạo nhóm người tiêu dùng mới tên là geofence cho IoT Hub:
az iot hub consumer-group create --name geofence \
                                 --hub-name <hub_name>

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

2. Nếu muốn xem tất cả các nhóm người tiêu dùng của IoT Hub, chạy lệnh sau:

az iot hub consumer-group list --output table \
                               --hub-name <hub_name>

Thay thế <hub_name> bằng tên đã sử dụng trong IoT Hub giúp liệt kê tất cả các nhóm người tiêu dùng

Name      ResourceGroup
--------  ---------------
$Default  gps-sensor
geofence  gps-sensor

Khi chạy trình theo dõi sự kiện của IoT Hub trong một bài viết trước, nó đã kết nối với nhóm người tiêu dùng $Default. Đây là lý do người dùng không thể chạy trình theo dõi sự kiện và trình kích hoạt sự kiện. Nếu muốn chạy cả hai, thì có thể sử dụng các nhóm người tiêu dùng khác cho tất cả các ứng dụng function và giữ $Default cho trình theo dõi sự kiện.

* Cách tạo một trình kích hoạt IoT Hub mới

Thêm trình kích hoạt sự kiện IoT Hub mới vào ứng dụng chức năng gps-trigger đã tạo trong bài trước có tên là geofence-trigger.

Định cấu hình chuỗi kết nối IoT Hub trong File function.json. Local.settings.json được chia sẻ giữa tất cả các trình kích hoạt trong Function App.

Cập nhật giá trị của consumerGroup trong file function.json để tham chiếu đến nhóm người tiêu dùng Geofence mới:

"consumerGroup": "geofence"

Sử dụng khóa đăng ký cho tài khoản Azure Maps trong trình kích hoạt này, thêm một mục mới vào File local.settings.json tên là MAPS_KEY.

Chạy ứng dụng Functions để đảm bảo nó đang kết nối và xử lý tin nhắn. iot-hub-trigger từ bài trước cũng sẽ chạy và tải các blob lên bộ nhớ.

Để tránh các kết quả đọc GPS trùng lặp trong bộ nhớ blob, dừng Function App đang chạy trên đám mây bằng cách sử dụng lệnh sau:

az functionapp stop --resource-group gps-sensor \
                    --name <functions_app_name>

Thay thế <functions_app_name> bằng tên đã sử dụng cho Function App Có thể khởi động lại bằng lệnh sau:

az functionapp start --resource-group gps-sensor \
                    --name <functions_app_name>

Thay thế <functions_app_name> bằng tên đã sử dụng cho Function App *

* Cách kiểm tra phạm vi địa lý từ trình kích hoạt

Phía trên đã sử dụng curl để truy vấn Geofence để xem liệu một điểm nằm bên trong hay ngoài. Thực hiện một yêu cầu web tương tự từ bên trong trình kích hoạt.

Cần UDID để truy vấn Geofencecủa nó. Thêm một mục mới vào File local.settings.json có tên GEOFENCE_UDID với giá trị này.

Mở file __init__.py từ trình kích hoạt geofence-trigger mới.

import json
import os
import requests

Gói yêu cầu cho phép bạn thực hiện các lệnh gọi API web. Azure Maps không có SDK Python, cần thực hiện các lệnh gọi API web để sử dụng từ mã Python.

Thêm 2 dòng sau vào đầu phương thức main để nhận khóa đăng ký Maps:

maps_key = os.environ['MAPS_KEY']
geofence_udid = os.environ['GEOFENCE_UDID']    

Trong for event in events, thêm các dòng sau nhận vĩ độ và kinh độ

event_body = json.loads(event.get_body().decode('utf-8'))
lat = event_body['gps']['lat']
lon = event_body['gps']['lon']

Mã này chuyển đổi JSON từ nội dung sự kiện thành từ điển, sau đó trích xuất latlon từ trường gps.

Khi sử dụng các yêu cầu, thay vì tạo một URL dài như đã làm với curl, có thể chỉ sử dụng phần URL và chuyển các tham số làm từ điển. Thêm mã sau để xác định URL để gọi và định cấu hình các tham số:

url = 'https://atlas.microsoft.com/spatial/geofence/json'

params = {
    'api-version': 1.0,
    'deviceId': 'gps-sensor',
    'subscription-key': maps_key,
    'udid' : geofence_udid,
    'lat' : lat,
    'lon' : lon
}

Các mục trong từ điển tham số sẽ khớp với các cặp giá trị khóa đã sử dụng khi gọi API web qua curl.

Thêm dòng mã sau để gọi API web:

response = requests.get(url, params=params)

Điều này gọi URL với các tham số và nhận lại một đối tượng phản hồi.

Thêm mã sau vào bên dưới:

distance = response_body['geometries'][0]['distance']

if distance == 999:
    logging.info('Point is outside geofence')
elif distance > 0:
    logging.info(f'Point is just outside geofence by a distance of {distance}m')
elif distance == -999:
    logging.info(f'Point is inside geofence')
else:
    logging.info(f'Point is just inside geofence by a distance of {distance}m')

Mã này giả định 1 hình và trích ra khoảng cách từ hình đơn lẻ đó. Sau đó, ghi lại các tin nhắn khác nhau dựa trên khoảng cách.

Sau khi chạy code trên sẽ thấy trong kết quả ghi nhật ký nếu tọa độ GPS ở bên trong hoặc bên ngoài Geofence, nếu điểm đó nằm trong phạm vi 50m. Thử mã này với các Geofence khác nhau dựa trên vị trí của cảm biến GPS, thử di chuyển cảm biến (ví dụ: kết nối với WiFi từ điện thoại di động hoặc với các tọa độ khác nhau trên thiết bị IoT ảo) để xem sự thay đổi này.

Khi đã sẵn sàng, hãy triển khai mã này vào Function App trên đám mây. Đừng quên triển khai Application Settings.

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