針對世紀互聯Azure IoT Hub的一種設備下線通知方案

本文介紹:

世紀互聯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中獲取設備下線的方案,方案是開放的,其中的組件也是可以替換的,可根據實際業務架構進行調整。

img-cbfbfce8-6fc9-439d-8717-c3c38f64f9c2.png

 

本方案並不是一種值得推薦的方案,只是在當前的狀況下(世紀互聯暫不支持原生的設備下線通知)的一種能滿足需求的方法。

主要原理是:

定時從“設備孿生”中查詢掉線的設備;

將查詢邏輯封裝到Azure Functions 中(可選);

 

同時在這類場景中,對於可預知的設備關機,比如設備是一臺電視機頂盒,通常會通過遙控器關機,則可以在關機前發送一條特定的消息,通知雲端某臺設備要關機了,以達到較爲實時的下線通知。

對於可能存在突然斷電等情況的設備下線,則可以使用本文的方式。

 

 

重點步驟:

在Azure Portal的IoT Hub控制檯體驗查詢語句:

SELECT * FROM C WHERE connectionState='Disconnected'

img-74843adc-fd2b-4b1f-a22d-755b1a7e7a6b.png

查詢結果會自動展示出來:

img-32c36c32-6325-4114-8727-079580feaff3.png

創建Azure Function 來託管查詢代碼:

使用VS Code 創建Function:

在VS Code中鍵入 CTRL+SHIFT+P 三個按鍵,輸入 Azure Functions: Create new project

img-bae44fcb-9732-4586-a86b-e692d0bf0470.png

本例中使用C#:

img-6a07575d-cf28-4490-a3fb-bff69200d270.png

選擇TimerTirgger 定時觸發的方式執行Functions:

img-55667f99-b358-4a85-8bc9-b321a40450b6.png

輸入Function的名稱,這裏可以自定義:

img-7811163a-b9d8-4ecf-9b70-7d89768dd751.png

設置命名空間,C#項目的通用設置,這裏可以自定義:

img-c96b0bef-5a75-4805-9ed9-173b97012cf4.png

 

設置定時觸發的規則:

本例中,將下圖的5 改成1,表示每隔1分鐘執行1次 ,

img-d382f8a6-8472-41bc-a613-ea9c257e15f9.png

 

參考的NCRONTAB表達式如下:

img-bf00b12d-9c2e-46db-be2f-d70b849629b1.png

可在Azure 官網文檔查閱:

https://docs.azure.cn/zh-cn/azure-functions/functions-bindings-timer?tabs=csharp#ncrontab-expressions

Function 執行需要使用一個Storage Account,可以選擇已經創建好的或者新建或者使用本地模擬器,本例中,選擇一個已經創建好的:

 

img-b4125f4b-7f82-45d6-9f65-17ee847d9c00.png

選擇一個現有的Storage Account:

img-68aea388-28d2-48f4-999e-60be1f705ab0.png

選擇Open in current Window, 至此,使用VS Code 創建Function 項目的步驟就結束了:

img-bdb23f67-484b-4e78-b731-ca0e1197f10e.png

 

 

使用Nuget Package Manager安裝IoT Hub Service SDK:

 

本例子中,需要使用Azure IoT Hub的 Service SDK, 接下來的步驟也是使用VS Code開發 Functions時添加應用程序集的一種通用的方式:

ctrl+shift+p 三個按鍵一起,輸入 Nuget Package Manager: Add Package ,回車

img-290f21fc-471a-4848-88f8-be1c99902dad.png

輸入Microsoft.Azure.Devices:

img-077b86a5-41d8-43ce-a038-bbdc29070e7c.png

如果右下角出現 獲取失敗,則需要重試,根據網絡情況,可能需要科學上網:

img-0b0185ef-a897-4b2f-babd-cf9051938b85.png

本例中,使用了正式版本:1.20.1

img-b5206b14-07f0-4ede-8ed4-f507d07289a8.png

 

編寫查詢代碼:

查詢代碼如下:

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                    

                }
            }
        }
    }
}
 
本地調試;

img-d7b900dc-cb7b-449b-a1e9-db166bee9cd4.png

 

稍等1分鐘,即可看到,掉線的設備已經列出來,如下圖:

img-47ec1896-9d69-4c95-aa45-63c645163ceb.png

使用VS Code部署Functions:

CTRL+SHIFT+P,輸入 Azure Functions: Deploy to Function APP

img-f88197e9-f0b9-4702-bd74-a847c0b59a09.png

 

本例中,我們新創建一個Function App:

img-6f140b4e-3c6e-4c14-87b9-273dd7b6ba05.png

本例中,可以自定義 Function App的名稱:

img-2fae573b-00c6-42e5-8d1d-3911690734fe.png

 

選擇.Net Core 3.1:

img-89322af8-dcf9-4128-b19a-2510c50fcd58.png

 

截至到2020年04月, 世紀互聯的Function的操作系統只有Windows,所以此處只能選擇 Windows:

img-85ac61aa-706c-452e-a852-a191c44cd6ed.png

託管類型選擇 App Service Plan,應用程序計劃相當於服務器,Function 相當於服務器上部署的網站,

img-a035594a-9e56-4b00-bfc7-1acf47fd3ac0.png

 

創建新的應用服務計劃:

img-84f02b24-11d7-488a-b388-67d8f655e7c6.png

本例中,保持應用程序計劃名稱爲默認值:

img-8230164a-b85c-41df-a653-9612d546c128.png

 

本例中,選擇S1:這裏實際上決定了”服務器“的規格,具體可參見:https://www.azure.cn/pricing/details/app-service/

img-3095239a-4d4b-4d56-aa6f-4be7dedaf812.png

我們能在官網文檔中查看到,S1的配置如下:

img-1c101c02-e57b-47a3-9a00-d318c16531fd.png

 

選擇應用程序計劃要部署的目標資源組:

img-bc4c0f63-878e-48b3-9ebc-18b78b0af0f6.png

 

選擇Storage Account:

img-4972f564-38fb-4cf0-8807-3c2f7f8c873f.png

本例中,跳過創建Application Insights:

img-fa998df3-f691-44aa-834b-53dfc2f6e297.png

右下角正在創建資源:

img-559e657c-863c-4e7b-8970-e0edbef23518.png

部署完成後,可以點擊 Stream logs, 查看雲端的Function運行LOG:

img-a9217591-3acc-4c08-89d9-82929baed0bb.png

 

稍等1分鐘,即可查看到 離線的設備:

img-703ad027-74eb-41f8-9ddf-562a5a2b1bd5.png

 

在Portal中可以看到通過VS Code創建的 相應資源(App Service Plan 和 Functions):

img-d84222ef-2f10-488c-b98d-5a00e6488338.png

 

 

 

查看Azure Function 的相關信息:

img-70c4920f-3944-4d23-ac70-d718c00fa5d7.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章