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 官网文档查阅:
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 的相关信息: