针对世纪互联Azure IoT Hub的一种设备下线通知方案

Chloe ·
更新时间:2024-11-13
· 872 次阅读

本文介绍: 世纪互联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 官网文档查阅:

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

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 的相关信息:

云计算实战 原创文章 74获赞 7访问量 9452 关注 私信 展开阅读全文
作者:云计算实战



IoT azure

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章