.NET Core2使用Azure雲上的Iot-Hub服務


基於工業4.0大背景下的工業物聯網是近幾年內熱門的話題,依靠信息化技術企業可以實現數字化轉型,生產可以實現智能化制造,設備可以實現自動化運作。然而,海量的數據采集是整個建設過程的基礎環節,如何處理與利用這海量的數據是信息化技術中最重要的開發工作。那么,基於Azure國內雲端的Iot-Hub服務是提供給開發人員另一個高效的數據處理方案,這里將通過代碼的方式介紹如何將Iot-Hub服務集成到咱們的程序中來。

 

Azure雲的Iot-Hub服務

Internet of things(簡稱Iot)物聯網是新一代信息技術的重要組成部分。Iot-Hub是一個由微軟提供的基於Azure雲上的工業物聯網解決方案,它可以大規模的管理Iot設備,可以與數百萬的 IoT 設備建立雙向通信,且支持各種操作系統和通信協議,另外它還能利用邊緣計算實現更多的開發需要。如下是跟Iot-Hub相關的網址:

Iot-Hub官網(國內):https://www.azure.cn/zh-cn/home/features/iot-hub/

 

准備

這里將模擬一個iot設備上行到雲端的demo,所以在着手開始實現之前咱們需准備一些必要的環境,如下:

1、在Azure上創建一個名為“myHub”的Iot-Hub服務,並將其的“連接字符串”獲取,以備后用。

2、在”myHub”服務控制台內創建一個名為“myDevice”的設備,並將其的“連接字符串”獲取,以備后用。

3、用VS2017開發工具創建兩個基於.NET Core2的控制台程序,分別為:“Production”、“Consume”:

3.1、“Production”用來模擬Iot設備產生數據(運行於設備本地端),並將數據發送到Iot-Hub服務中,需在項目中通過Nuget管理器引用由微軟提供的sdk類庫“Microsoft.Azure.Devices.Client”。

3.2、“Consume”用來從Iot-Hub服務實時獲取數據(運行於服務器雲端),需在項目中通過Nuget管理器引用由微軟提供的sdk類庫“Microsoft.Azure.Devices”、“Microsoft.ServiceBus”。

 

實現

通過上述的准備后,咱們就可以進入具體的發布與集成工作了,如下:

1、“Production”端(運行在本地設備端)用於模擬設備產生數據的代碼如下:

  1 using Microsoft.Azure.Devices.Client;
  2 using Newtonsoft.Json;
  3 using System;
  4 using System.Text;
  5 
  6 namespace Production
  7 {
  8     class Program
  9     {
 10         //聲明一個DeviceClient對象
 11         private static DeviceClient deviceClient = null;
 12         //創建一個定時器
 13         private static System.Timers.Timer timer = new System.Timers.Timer();
 14 
 15         static void Main(string[] args)
 16         {
 17             //設備連接字符串,從設備控制台中獲取
 18             var conn = "HostName=myHub.azure-devices.cn;DeviceId=myDevice;SharedAccessKey=sReB225545Jl4Gw=";
 19             //創建DeviceClient對象的實例
 20             deviceClient = DeviceClient.CreateFromConnectionString(conn, TransportType.Mqtt);
 21             timer.Interval = 5000;
 22             timer.Elapsed += Timer_Elapsed;
 23             timer.AutoReset = true;
 24             timer.Start();
 25             var request = "";
 26             Console.WriteLine("輸入exit則退出,並結束當前程序");
 27             do
 28             {
 29                 request = Console.ReadLine();
 30                 if (request.Equals("exit"))
 31                 {
 32                     Environment.Exit(0);
 33                 }
 34             } while (true);
 35         }
 36 
 37         /// <summary>
 38         /// 定時任務,模擬向Iot-Hub發送設備數據
 39         /// </summary>
 40         /// <param name="sender"></param>
 41         /// <param name="e"></param>
 42         private static async void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 43         {
 44             //創建一條數據
 45             var model = new Info();
 46             model.Timestamp = DateTime.Now;
 47             model.Val = new Random().Next(0, 2000);
 48 
 49             var dataBuffer = JsonConvert.SerializeObject(model);
 50             //將數據封裝到Message對象
 51             var eventMessage = new Message(Encoding.UTF8.GetBytes(dataBuffer));
 52             //通過DeviceClient將數據發送到雲端
 53             await deviceClient.SendEventAsync(eventMessage).ConfigureAwait(false);
 54         }
 55 
 56     }
 57 
 58     /// <summary>
 59     /// 實體對象
 60     /// </summary>
 61     class Info
 62     {
 63         public int Val { get; set; }
 64 
 65         public DateTime Timestamp { get; set; }
 66     }
 67 }
 68 

 

2、“Consume”端(運行在服務器雲端)用於消費來自Iot-Hub的代碼如下:

  1 using Microsoft.Azure.Devices.Common;
  2 using Microsoft.ServiceBus.Messaging;
  3 using System;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace Consume
  8 {
  9     class Program
 10     {
 11         static void Main(string[] args)
 12         {
 13             ReceiveCommands().Wait();
 14         }
 15 
 16         static async Task ReceiveCommands()
 17         {
 18             //iot-hub服務連接字符串
 19             var conn = "HostName=myHub.azure-devices.cn;SharedAccessKeyName=iothubowner;SharedAccessKey=km7jjceOUr+98865=";
 20             //iot-hub服務內的設備名稱
 21             var device = "myDevice";
 22             //創建一個EventHubClient對象
 23             var eventHubClient = EventHubClient.CreateFromConnectionString(conn, "messages/events");
 24             var eventHubPartitionsCount = eventHubClient.GetRuntimeInformation().PartitionCount;
 25             //從指定的設備中獲取數據
 26             var partition = EventHubPartitionKeyResolver.ResolveToPartition(device, eventHubPartitionsCount);
 27             var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.Now);
 28 
 29             while (true)
 30             {
 31                 try
 32                 {
 33                     //從Iot-Hub雲端獲取數據
 34                     var receivedMessage = await eventHubReceiver.ReceiveAsync(TimeSpan.FromSeconds(1));
 35                     if (receivedMessage != null)
 36                     {
 37                         var messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());
 38                         if (!string.IsNullOrEmpty(messageData))
 39                         {
 40                             Console.WriteLine(messageData);
 41                         }
 42                     }
 43                 }
 44                 catch
 45                 {
 46                 }
 47             }
 48         }
 49 
 50     }
 51 }
 52 

 

3、分別運行“Production”與“Consume”端后,也可在Azure的Iot-Hub控制台查看實時報表,如下:

image

image

 

總結

1、通過Azure雲端的Iot-Hub服務可以非常高效的實現Iot設備的管理與數據采集。

2、在.NetCore2程序中使用由微軟提供的“Microsoft.Azure.Devices.Client”、“Microsoft.Azure.Devices”、“Microsoft.ServiceBus”類庫,可以非常簡便的在程序中集成Iot-Hub。

 

聲明

本文為作者原創,轉載請備注出處與保留原文地址,謝謝。如文章能給您帶來幫助,請點下推薦或關注,感謝您的支持!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM