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

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

 

Azure雲的Iot-Hub服務dom

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

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

 

準備開發工具

這裏將模擬一個iot設備上行到雲端的demo,因此在着手開始實現以前我們需準備一些必要的環境,以下:spa

一、在Azure上建立一個名爲「myHub」的Iot-Hub服務,並將其的「鏈接字符串」獲取,以備後用。操作系統

二、在」myHub」服務控制檯內建立一個名爲「myDevice」的設備,並將其的「鏈接字符串」獲取,以備後用。3d

三、用VS2017開發工具建立兩個基於.NET Core2的控制檯程序,分別爲:「Production」、「Consume」:code

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

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

 

實現

經過上述的準備後,我們就能夠進入具體的發佈與集成工做了,以下:

一、「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 

 

二、「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 

 

三、分別運行「Production」與「Consume」端後,也可在Azure的Iot-Hub控制檯查看實時報表,以下:

image

image

 

總結

一、經過Azure雲端的Iot-Hub服務能夠很是高效的實現Iot設備的管理與數據採集。

二、在.NetCore2程序中使用由微軟提供的「Microsoft.Azure.Devices.Client」、「Microsoft.Azure.Devices」、「Microsoft.ServiceBus」類庫,能夠很是簡便的在程序中集成Iot-Hub。

 

聲明

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

相關文章
相關標籤/搜索