本文介紹:
世紀互聯Azure IoT Hub的一種獲取設備下線通知方案
視頻介紹:
您可在B站觀看視頻介紹:https://www.bilibili.com/video/BV1RK4y1b7Zp/
或在作者博客觀看:https://www.51azure.cloud/post/2020/5/3/azure-iot-hub-disconnect-device
圖文介紹:
對於Global Azure IoT Hub, 通過集成的和Event Grid的綁定即可獲得物聯網設備的上線下線事件,再通過配合邏輯應用或者Azure Function等其他paas服務可以實時的通知到自己的業務系統。
但是事件訂閱的的功能截止到2020年4月,由世紀互聯運營的Azure 尚不支持此功能,本文演示了一種在世紀互聯運營的Azure IoT Hub中獲取設備下線的方案,方案是開放的,其中的組件也是可以替換的,可根據實際業務架構進行調整。
本方案並不是一種值得推薦的方案,只是在當前的狀況下(世紀互聯暫不支持原生的設備下線通知)的一種能滿足需求的方法。
主要原理是:
定時從“設備孿生”中查詢掉線的設備;
將查詢邏輯封裝到Azure Functions 中(可選);
同時在這類場景中,對於可預知的設備關機,比如設備是一臺電視機頂盒,通常會通過遙控器關機,則可以在關機前發送一條特定的消息,通知雲端某臺設備要關機了,以達到較爲實時的下線通知。
對於可能存在突然斷電等情況的設備下線,則可以使用本文的方式。
重點步驟:
在Azure Portal的IoT Hub控制檯體驗查詢語句:
SELECT * FROM C WHERE connectionState='Disconnected'
查詢結果會自動展示出來:
創建Azure Function 來託管查詢代碼:
使用VS Code 創建Function:
在VS Code中鍵入 CTRL+SHIFT+P 三個按鍵,輸入 Azure Functions: Create new project
本例中使用C#:
選擇TimerTirgger 定時觸發的方式執行Functions:
輸入Function的名稱,這裏可以自定義:
設置命名空間,C#項目的通用設置,這裏可以自定義:
設置定時觸發的規則:
本例中,將下圖的5 改成1,表示每隔1分鐘執行1次 ,
參考的NCRONTAB表達式如下:
可在Azure 官網文檔查閱:
Function 執行需要使用一個Storage Account,可以選擇已經創建好的或者新建或者使用本地模擬器,本例中,選擇一個已經創建好的:
選擇一個現有的Storage Account:
選擇Open in current Window, 至此,使用VS Code 創建Function 項目的步驟就結束了:
使用Nuget Package Manager安裝IoT Hub Service SDK:
本例子中,需要使用Azure IoT Hub的 Service SDK, 接下來的步驟也是使用VS Code開發 Functions時添加應用程序集的一種通用的方式:
ctrl+shift+p 三個按鍵一起,輸入 Nuget Package Manager: Add Package ,回車
輸入Microsoft.Azure.Devices:
如果右下角出現 獲取失敗,則需要重試,根據網絡情況,可能需要科學上網:
本例中,使用了正式版本:1.20.1
編寫查詢代碼:
查詢代碼如下:
using System;using Microsoft.Azure.WebJobs;using Microsoft.Azure.WebJobs.Host;using Microsoft.Extensions.Logging;using Microsoft.Azure.Devices;namespace SeanIoTTest.Function{ public static class CheckDeviceDisconnect { [FunctionName("CheckDeviceDisconnect")] public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log) { log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); //query from device twin using RegistryManager registryManager = RegistryManager.CreateFromConnectionString("your iot hub string"); var query = registryManager.CreateQuery("SELECT * FROM devices where connectionState='Disconnected'", 100); while (query.HasMoreResults) { var page = query.GetNextAsTwinAsync().Result; foreach (var twin in page) { // do work on twin object log.LogInformation($"Device ID { twin.DeviceId } disconnected"); //save result to servicebus/event hub/db/webhook } } } } }
本地調試;
稍等1分鐘,即可看到,掉線的設備已經列出來,如下圖:
使用VS Code部署Functions:
CTRL+SHIFT+P,輸入 Azure Functions: Deploy to Function APP
本例中,我們新創建一個Function App:
本例中,可以自定義 Function App的名稱:
選擇.Net Core 3.1:
截至到2020年04月, 世紀互聯的Function的操作系統只有Windows,所以此處只能選擇 Windows:
託管類型選擇 App Service Plan,應用程序計劃相當於服務器,Function 相當於服務器上部署的網站,
創建新的應用服務計劃:
本例中,保持應用程序計劃名稱爲默認值:
本例中,選擇S1:這裏實際上決定了”服務器“的規格,具體可參見:https://www.azure.cn/pricing/details/app-service/
我們能在官網文檔中查看到,S1的配置如下:
選擇應用程序計劃要部署的目標資源組:
選擇Storage Account:
本例中,跳過創建Application Insights:
右下角正在創建資源:
部署完成後,可以點擊 Stream logs, 查看雲端的Function運行LOG:
稍等1分鐘,即可查看到 離線的設備:
在Portal中可以看到通過VS Code創建的 相應資源(App Service Plan 和 Functions):
查看Azure Function 的相關信息: