设为首页 收藏本站
查看: 1007|回复: 0

[经验分享] Azure IoT 技术研究系列3-设备到云、云到设备通信

[复制链接]

尚未签到

发表于 2017-6-30 06:56:44 | 显示全部楼层 |阅读模式
  上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识。
  Azure IoT 技术研究系列2-设备注册到Azure IoT Hub
  本文中我们继续深入研究,设备到云、云到设备通信。
  1. 在Azure IoT Hub中接收模拟设备的消息
  读取设备到云消息的Event Hub兼容终结点,使用 AMQP 协议。
  我们新建一个Console控制台工程:IoTServer,添加Nuget引用:WindowsAzure.ServiceBus
DSC0000.png

  核心的命名空间: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吧
DSC0001.png

  核心的命名空间:
  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
DSC0002.png

  F5 Run:
DSC0003.png

DSC0004.png

  可以发现,设备侧消息发送、Azure IoT Hub接收是同步的
  我们查看Azure Portal中的统计:
DSC0005.png

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389527-1-1.html 上篇帖子: docker4dotnet #4 使用Azure云存储构建高速 Docker registry 下篇帖子: C# Azure 存储-Blob
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表