针对世纪互联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


猜你喜欢

转载自blog.51cto.com/10117438/2492299
IOT