2020.06.14更新:

本文内容仍然可用,但已过时,请参照更新内容Azure IoT Hub 获取设备上下线通知/设备生命周期的案例-利用事件网格事件订阅方式

 

 

本文介绍:

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

 

视频介绍:

您可在B站观看视频介绍:https://www.bilibili.com/video/BV1RK4y1b7Zp/

或在本站观看:

 

图文介绍:

 

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