zoukankan      html  css  js  c++  java
  • IoT on Azure IoT Hub

    Azure IoT 技术研究系列 

     1.

    物联网技术已经火了很多年了,业界各大厂商都有各自成熟的解决方案。我们公司主要搞新能源汽车充电,充电桩就是我们物联网技术的最大应用,车联网、物联网、

    互联网三网合一。作为Azure重要的Partner和使用者,我们对Azure的IoT方案也是非常期待的,因此,最近计划研究一下Azure的IoT技术,同时将研究的成果分享给大家。

    以本文作为IoT入门的第一篇吧。

    IoT:Internet of Things,即连接一切

    Azure提供了Azure IoT Hub:直译为Azure的物联网中心

    Azure IoT Hub为物联网设备提供注册、管理、沟通交互的云服务。

    可用于管理数十亿物联网设备,提供可靠和安全的云端与设备之间的双向通信支持,每月可处理数以万亿计消息,并简化了与其他Azure服务之间的集成,包括Azure机器学习以及

    Azure流分析等。它是微软Azure IoT Suite的重要组成部分,也是微软物联网战略的重要基础。

    Azure IoT Hub架构和特性:

    1. 大规模可靠的设备到云、云到设备的双向通信

    2. 通过使用安全凭据和访问控制机制确保每个设备的安全性通信(通过设备的安全密钥或者X.509证书)

    3. 支持可扩展的监控设备的连接和标识管理事件

    4. 与其他的Azure服务之间,提供了内置的可选的消息路由

    5. 为主流的开发语言和平台提供了Device Library。http://azure.github.io/azure-iot-sdks/

    架构图:

    从上面这张图我们可以看出:

    • Azure IoT Hub对各种协议的支持:MQTT、AMQP、HTTP、Custom
    • 设备的支持:IP支持的设备、已有的IoT设备、低功耗设备
    • Event-based device-to-cloud ingestion:基于事件的设备到云的通讯,IoT Hub 可支撑来自物联网设备,每秒百万级的事件。这些事件既可以通过事件处理引擎被热处理,同时也可以被存储以备后续的分析。IoT Hub为了保证可靠的事件处理,将事件数据保存7天。
    • Reliable cloud-to-device messaging (or commands). :可靠的云到设备的消息通讯,可视化的云到设备消息管理:后台解决方案可以通过IoT Hub保证消息至少一次发送到物联网单个设备,同时消息支持TTL,消息发送确认和消息过期回执。

    说到这里,我们不禁会想:为什么使用Azure IoT Hub?即:

    Azure IoT Hub解决那些IoT问题:

    1. 设备的认证和安全连接

      每个物联网设备连接到Azure IoT Hub时,需要提供其独有的Security Key

        IoT Hub identity registry 存储了设备的身份和Key

      IoT Hub后端提供了设备的白名单和黑名单机制,控制设备的访问

    2. 监控设备的连接操作:提供了详细的设备身份管理操作日志和连接日志

    3. 全面丰富的Device Library:设备SDK,支持主流的开发语言和平台:.Net Java Node.JS C 都支持

    4. IoT 协议可扩展:MQTT v3.1.1, HTTP 1.1, or AMQP 1.0  支持Custom Protocol

    5. Scale:支持每秒百万级的设备连接和事件

    Azure IoT Hub是如何工作的:

    Azure IoT Hub实现了服务辅助通信(Service-Assisted Communication)模式,调节设备与解决方案后端之间的交互。服务辅助通信的目标是在控制系统(例如 IoT Hub)与

    专用设备(部署在不受信任的物理空间中)之间,建立可信任的双向通信路径(全双工通信)。 这种模式会遵循下列原则:

    1. 安全性优先级最高,高于其他功能

    2. 设备不接受未经请求的网络信息。 设备以仅限出站的方式建立所有连接和路由。 若要让设备从解决方案后端接收命令,设备必须定期启动连接,以检查是否有任何挂起的命令要

    处理。

    3. 设备只能同与它们对等的已知服务(例如 IoT Hub)进行连接或建立路由

    4. 设备和服务之间或设备和网关之间的通信路径在应用程序协议层受到保护

    5. 系统级别的授权和身份验证以每个设备的标识为基础。 它们可让访问凭据和权限近乎实时地撤销。

    6. 对于因为电源或连接性而导致连接不稳定的设备而言,可通过保留命令和设备通知直到设备连接并接收它们,进而促进其双向通信。 IoT 中心为发送的命令维护特定于设备的队

    7. 针对通过网关到特定服务的受保护传输,应用程序有效负载数据会受到单独保护

    这里的服务辅助通信模式,业界已大规模地使用服务辅助通信模式实现推送通知服务,例如 Windows 推送通知服务、Google Cloud Messaging 和 Apple Push Notification 服

    务等,其实就是设备和云端的全双工通信。

    上面介绍了Azure IoT Hub的架构、特性、使用场景、通信协议等等,作为一个简单的入门介绍吧,让大家可以快速了解并入门。

    2.

    继续深入研究,做一个起步示例程序:模拟设备注册到Azure IoT Hub, 设备到云通信,云到设备通信。

    整体篇幅较大,我们先来第一步:将模拟设备注册到Azure IoT Hub。

    首先,我们需要有一个联网的设备,例如树莓派、Win10 IoT设备等等,只要能联网,Azure IoT Hub有编程SDK即可,为了方便演示,本篇中我们做了一个模拟设备:

    TeldPile001,即001号充电桩。

    然后,在正式编码前,需要我们在Azure New Portal中,添加自己的IoT Hub.

    输入名称后,选择定价和缩放级别,这里我们做测试,使用免费的F1即可,同时新建资源组。

    创建完成后,IoTTest即可使用了。

    使用前,我们需要确定两个重要的连接配置:主机名和连接字符串,我们选择“概述”,右侧有个主机名,先复制下来备用。

    然后选择共享访问策略:

    将连接字符串-主秘钥,复制保存下来备用。

    开始编码吧,我们创建一个Console工程叫做“RegisterDevice”,用于设备注册到Azure IoT Hub。同时添加重要的Nuget引用:

    Microsoft.Azure.Devices

    本文测试用的:<package id="Microsoft.Azure.Devices" version="1.2.4" targetFramework="net451" />

    两个核心的Namespace:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Common.Exceptions;

    核心类:Microsoft.Azure.Devices.RegistryManager:设备注册管理器

    我们设计一个方法,添加或者获取设备信息:

    复制代码
     1         /// <summary>
     2         /// 添加或获取设备信息
     3         /// </summary>
     4         /// <returns>Task</returns>
     5         private static async Task AddOrGetDeviceAsync()
     6         {
     7             string deviceId = "TeldPile001";
     8             Device device;
     9             try
    10             {
    11                 device = await registryManager.AddDeviceAsync(new Device(deviceId));
    12             }
    13             catch (DeviceAlreadyExistsException)
    14             {
    15                 device = await registryManager.GetDeviceAsync(deviceId);
    16             }
    17 
    18             Console.WriteLine("生成设备标识: {0}", device.Authentication.SymmetricKey.PrimaryKey);
    19         }
    复制代码

    Main函数:

    复制代码
    1         static void Main(string[] args)
    2         {
    3             var connectionString = "HostName=IoTTest.***-***;SharedAccessKeyName=iothubowner;SharedAccessKey=******";
    4             var registryManager = RegistryManager.CreateFromConnectionString(connectionString);
    5             AddOrGetDeviceAsync().Wait();
    6             Console.ReadLine();
    7         }
    复制代码

    Run,

    可以看到,TeldPile001这个设备已经注册到我们自己的Azure IoT Hub中了。

    以上便是,将设备注册到Azure IoT Hub的介绍,不复杂,微软的设计还是比较赞的,简单、快速、易用。

    继续研究设备到云、云到设备的通信。

    3.

    本文中我们继续深入研究,设备到云、云到设备通信。

    1. 在Azure IoT Hub中接收模拟设备的消息

    读取设备到云消息的Event Hub兼容终结点,使用 AMQP 协议。

    我们新建一个Console控制台工程:IoTServer,添加Nuget引用:WindowsAzure.ServiceBus

    核心的命名空间:using Microsoft.ServiceBus.Messaging;

    核心类:EventHubClient 

    通过EventHubClient创建一个EventHubReceiver,不间断的接收设备侧的消息。

    1         static string connectionString = "HostName=IoTTest.*******;SharedAccessKeyName=iothubowner;SharedAccessKey=***";
    2         static string iotHubD2cEndpoint = "messages/events";
    3         static EventHubClient eventHubClient;

    ReceiveMessagesFromDeviceAsync方法:

    复制代码
     1         /// <summary>
     2         /// 接收设备侧的消息
     3         /// </summary>
     4         /// <param name="partition">分区</param>
     5         /// <param name="ct">取消标识</param>
     6         /// <returns>Task</returns>
     7         private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
     8         {
     9             var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
    10             while (true)
    11             {
    12                 if (ct.IsCancellationRequested) break;
    13                 EventData eventData = await eventHubReceiver.ReceiveAsync();
    14                 if (eventData == null) continue;
    15 
    16                 string data = Encoding.UTF8.GetString(eventData.GetBytes());
    17                 Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data);
    18 
    19                 //防止CPU被占满
    20                 Task.Delay(1).Wait();
    21             }
    22         }
    复制代码

    Main函数中我们将整个IoTServer Run起来:

    复制代码
     1         static void Main(string[] args)
     2         {
     3             Console.WriteLine("Azure IoT Hub 接收消息..., Press Ctrl-C to exit.
    ");
     4             eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
     5 
     6             var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
     7 
     8             CancellationTokenSource cts = new CancellationTokenSource();
     9 
    10             System.Console.CancelKeyPress += (s, e) =>
    11             {
    12                 e.Cancel = true;
    13                 cts.Cancel();
    14                 Console.WriteLine("Exiting...");
    15             };
    16 
    17             var tasks = new List<Task>();
    18             foreach (string partition in d2cPartitions)
    19             {
    20                 tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
    21             }
    22 
    23             Task.WaitAll(tasks.ToArray());
    24         }
    复制代码

    2. 模拟设备发送消息到Azure IoT Hub

    我们同样新建一个Console控制台工程:Device,用于模拟向Azure IoT Hub 发送消息。

    首先添加Nuget引用:Microsoft.Azure.Devices.Client,这个Nuget依赖的Nuget很多,不要着急,慢慢Install吧

    核心的命名空间:

    using Microsoft.Azure.Devices.Client;
    using Newtonsoft.Json;

    核心类:

    Microsoft.Azure.Devices.Client.DeviceClient

    模拟设备往Azure IoT Hub发消息时,用到了设备的Key(唯一标识)和IoT Hub HostName, 上篇博文中提到的主机名:Azure IoT 技术研究系列2-设备注册到Azure IoT Hub

    1         static DeviceClient deviceClient;
    2         static string iotHubUri = "IoTTest.******";          //iot hub hostname
    3         static string deviceKey = "+jDqO+Nu2g************="; //device key

    添加一个循环向Azure IoT Hub发送消息的方法:SendDeviceToCloudMessagesAsync,1s 一条消息

    复制代码
     1         /// <summary>
     2         /// 循环向Azure IoT Hub发送消息
     3         /// </summary>
     4         private static async void SendDeviceToCloudMessagesAsync()
     5         {
     6             double avgWindSpeed = 10; // m/s
     7             Random rand = new Random();
     8 
     9             while (true)
    10             {
    11                 //发送遥测数据
    12                 double currentWindSpeed = avgWindSpeed + rand.NextDouble() * 4 - 2;
    13                 var telemetryDataPoint = new
    14                 {
    15                     deviceId = "TeldPile001",
    16                     windSpeed = currentWindSpeed
    17                 };
    18                 var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
    19                 var message = new Message(Encoding.ASCII.GetBytes(messageString));
    20 
    21                 await deviceClient.SendEventAsync(message);
    22                 Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);
    23 
    24                 //1s 一条
    25                 await Task.Delay(1000);
    26             }
    27         }
    复制代码

    然后,在Main函数中启动模拟设备发送消息:

    复制代码
    1         static void Main(string[] args)
    2         {
    3             Console.WriteLine("模拟设备通信...
    ");
    4             deviceClient = DeviceClient.Create(iotHubUri, new DeviceAuthenticationWithRegistrySymmetricKey("TeldPile001", deviceKey), TransportType.Mqtt);
    5 
    6             SendDeviceToCloudMessagesAsync();
    7             Console.ReadLine();
    8         }
    复制代码

     3. 启动运行测试

    在解决方案上设置双启动项目:Device和IoTServer

    F5 Run:

    可以发现,设备侧消息发送、Azure IoT Hub接收是同步的

    我们查看Azure Portal中的统计:

    总结: 通过这两篇博文,我们研究验证了Azure IoT Hub 注册设备、设备和云之间的通信,感觉整个Azure 的 IoT Hub还是非常好用、易用,比较容易理解和操作,基于PaaS层的IoT Hub,可以做很多有价值的设计和方案。

    4.

    研究介绍一下Azure IoT Hub的使用配额、四个版本/档次的定价和缩放级别。

    首先,我们先看Azure IoT Hub的使用的配额要求

    1. 每个Azure 订阅最多可以有10个IoT Hub和一个免费的IoT Hub(F1 Level)

    2. 每个 IoT 中心预配了特定 SKU 的特定单位数,这个SKU 和单位数目确定可以发送的消息的每日配额上限。同时,SKU 还确定了 IoT 中心对所有操作强制实施的限制。

    3. IoT Hub消息最大保留时间:7天

    4. 设备到云的消息最大256K

    5. 设备到云批量发送消息最大:256K,批量发送消息个数500个

    6. 云到设备的消息最大64K

    7. 云到设备的消息的TTL最大 2天

    然后,Azure IoT Hub提供了四个版本/档次定价和缩放级别?的IoT Hub供用户选择:

    为什么要介绍这个定价和缩放级别? 因为每个级别的使用规模是不同的,这由用户的设备规模、通信消息量级决定。其中:

    F1是免费的,提供给用户开发测试用,每个Azure 订阅只能有一个F1的IoT Hub。

    不同的缩放级别有不同的操作限制.

    这里的操作限制:是指在分钟范围内应用的速率限制,主要是为了避免不当使用。 Azure IoT Hub会尽可能避免返回错误,但如果违反限制太久,就会开始返回异常。

    1. 标识注册表操作(创建、检索、列出、更新、删除):即设备的管理操作:

    F1&S1:1.67/秒/单位(100/分钟/单位) S2:1.67/秒/单位(100/分钟/单位) S3:83.33/秒/单位(5000/分钟/单位)

    2. 设备连接数:

    F1&S1: 最大值为 100/秒或 12/秒/单位    S2: 120/秒/单位                           S3: 6000/秒/单位

    3. 设备到云的发送:

    F1&S1: 1.67/秒/单位(100/分钟/单位)  S2: 1.67/秒/单位(100/分钟/单位)  S3: 83.33/秒/单位(5000/分钟/单位)

    4. 设备到云到接收(Http方式):

    F1&S1: 16.67/秒/单位(1000/分钟/单位)  S2: 16.67/秒/单位(1000/分钟/单位)  S3: 833.33/秒/单位(50000/分钟/单位)

    5. 文件上载:

    F1&S1: 1.67 文件上载通知/秒/单位(100/分钟/单位)

          S2: 1.67 文件上载通知/秒/单位(100/分钟/单位)

          S3: 83.33 文件上载通知/秒/单位(5000/分钟/单位)

    上面是几个重要的计量控制,也是PaaS层IoT服务的计费控制策略,简单了解即可。

    这里有个单位的概念,即IoT Hub Unit,官方是这么解释的:

    An IoT hub unit includes 500 devices, so choosing the number of IoT units means that the total number of devices supported for this hub is the number of units multiplied by 500. For example, if you want the IoT hub to support 1000 devices, you choose 2 units.

    一个IoT Hub 单位包含500个设备,单位的数量决定了支持的设备总数。

    上面这些说明,这对于我们应用选择还是非常重要的。

    https://azure.microsoft.com/zh-cn/blog/iot-hub-throttling-and-you/

    5.

    本文中,我们比较一下Azure IoT Hub和Event Hub,同时启动Azure Event Hub(事件中心)的研究。

    Azure IoT Hub的另一个主要应用场景是从设备侧接收遥测数据。 与 Azure IoT Hub一样,Azure Event Hub是一个事件处理服务,主要用于向云端提供大规模的事件与遥测数据入口,并且具有较低的延迟和较高的可靠性,其有点类似于Kafka作为Hadoop数据入口的场景,唯一不一样的是Azure Event Hub以事件为主要载体和抓手,Kafka更多是各种数据。在我们的实际应用场景中,Kafka作为监控数据、业务数据、设备侧数据的数据缓冲和入口。

    回到正题,Azure IoT Hub和Azure Event Hub的主要不同有哪些:

    1. 通信模式

        Azure IoT Hub:启用设备到云通信(消息传递、文件上传及报告属性)和云到设备之间的通信(直接方法、所需属性、消息传递)

        Azure Event Hub: 仅支持事件引入(通常视为设备到云的方案)

    2. 设备状态管理

        Azure IoT Hub:可存储和查询设备状态信息

        Azure Event Hub: 不支持

    3. 设备通信协议支持

       Azure IoT Hub: 支持 MQTT、基于 WebSockets 的 MQTT、AMQP、基于 WebSockets 的 AMQP 和 HTTP。 此外,IoT 中心还可使用 Azure IoT 协议网关(一种可自定义协议网关实现)以支持自定义协议。

       Azure Event Hub: 支持 AMQP、基于 WebSockets 的 AMQP 和 HTTP。

    4. 安全

       Azure IoT Hub:提供每个设备的标识与可吊销的访问控制权限

       Azure Event Hub: 提供事件中心范围的共享访问策略,通过发布者策略提供有限的权限吊销支持

    5. 弹性伸缩

       Azure IoT Hub:支持数百万个设备同时连接

       Azure Event Hub: 可支持的同时连接数具有更大的限制:根据 Azure 服务总线配额,最多只支持 5,000 个 AMQP 连接,另一方面,支持每个发送的消息指定分区

    6. 设备SDK

       Azure IoT Hub:除直接 MQTT、AMQP 和 HTTP API 外,还为各种平台和语言提供设备 SDK

       Azure Event Hub: 在 .NET、Java、C 以及 AMQP 和 HTTP 发送接口上提供支持

    7. 文件上传

       Azure IoT Hub:支持将文件从设备上载到云

       Azure Event Hub: 不支持

    综上,Azure IoT Hub主要处理设备到云、云到设备之间的通信,而Azure Event Hub处理的是将后期事件引入实时处理引擎,后者比较类似Kafka将数据写入Hadoop再进行大数据分析场景。

  • 相关阅读:
    你能用多长时间停车?
    中国威胁论好像还挺严重的
    热爱生命
    lunix下shell脚本批量获取文件,批量修改文件内容
    sql数据操作的若干心得(二)向表中自动插入自增的ID
    Asp.net开发之旅动态产生控件
    Asp.net开发之旅GridView中嵌入DropDownList的一点心得
    Asp.net开发之旅开发环境
    Asp.net开发之旅简单的引用母版页
    Sql数据操作的若干心得
  • 原文地址:https://www.cnblogs.com/lingdanglfw/p/13985459.html
Copyright © 2011-2022 走看看