Azure IoT 技术研究系列3

本文详细介绍了如何利用Azure IoT Hub实现设备与云端的双向通信,包括设备如何注册、发送消息到IoT Hub以及IoT Hub如何接收并处理这些消息。

上篇博文中我们将模拟设备注册到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

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值