Azure IoT 技術研究系列3-設備到雲、雲到設備通信

来源:http://www.cnblogs.com/tianqing/archive/2017/04/18/6726081.html
-Advertisement-
Play Games

上篇博文中我們將模擬設備註冊到Azure IoT Hub中:我們得到了設備的唯一標識。 Azure IoT 技術研究系列2-設備註冊到Azure IoT Hub 本文中我們繼續深入研究,設備到雲、雲到設備通信。 1. 在Azure IoT Hub中接收模擬設備的消息 讀取設備到雲消息的Event H ...


上篇博文中我們將模擬設備註冊到Azure IoT Hub中:我們得到了設備的唯一標識。

Azure IoT 技術研究系列2-設備註冊到Azure IoT Hub

本文中我們繼續深入研究,設備到雲、雲到設備通信。

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.\n");
 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("模擬設備通信...\n");
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,可以做很多有價值的設計和方案。

 

周國慶

2017/4/18


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、基本概念 主機 初始化發送,產生時鐘信號和終止發送的器件 從機 被主機定址的器件 發送器 發送數據到匯流排的器件 接收器 從匯流排接收數據的器件 多主機 同時有多於一個主機嘗試控制匯流排 但不破壞報文 仲裁 是一個在有多個主機同時嘗試控制匯流排,但只允許其中一個控制匯流排並使報文不被破壞的過程 同步 兩個 ...
  • 1、在 CentOS 系統中添加 openresty 資源庫sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo 2、安裝 openrestysudo yum install ope ...
  • 線上上閱讀文檔的時候,有沒有想將它抓取到本地,以備沒有網的時候閱讀只需? 先上指令: 你會看到如下的頁面: 過段時間,就會抓取完成,併在本地生成了一個相關聯的目錄。 這個命令就是 wget。它是開發者在Linux下麵非常喜歡使用的下載指令。經常,我們會看到一些技術文檔在指導你下載安裝包的時候,也會用 ...
  • etc etcetera[ɛtsɛtərə]縮寫 等等的意思 放置一些其他文件 ...
  • 介紹: Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYER ...
  • 1.在www.ailiyun.com上下載所需文件以CentOS為例,現將文件下下來 2.兩種掛載方式。 第一種,點旁邊的help文件 按照阿裡的提示完成操作。現將/etc/yum.repos.s/CentOS-Base.repo 備份(相當於更改尾碼名)。 再下載新的CentOS。有可能會提示wg ...
  • 添加命名空間 using System.Xml; 我自己的代碼(添加其中的節點) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("userTable.xml")); XmlNode root = xmlDoc.S ...
  • 2017-04-18 1 public class VisualTargetPresentationSource : PresentationSource 2 { 3 public VisualTargetPresentationSource(HostVisual hostVisual) 4 { 5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...