使用C#与Azure IoT Hub进行通信

在本文中,将探讨如何使用C#和AMQP协议通过Azure IoT Hub进行设备通信。首先,需要了解一些基本概念,包括Azure IoT Hub和AMQP协议。

Azure IoT Hub简介

Azure IoT Hub是一个完全托管的服务,它允许数十亿个IoT设备和应用程序之间进行可靠的双向通信。如果不熟悉Azure IoT Hub,可以在上了解更多信息。要使本项目工作,需要一个Azure账户。如果还没有,可以在上述产品页面上免费注册一个账户。

AMQP协议

AMQP(高级消息队列协议)是一个开放标准,用于在应用程序或组织之间传递业务消息。它是一个国际标准(ISO/IEC 19464),并且是物联网(IoT)领域广泛接受的协议标准之一。可以在或上找到更多信息。

将使用名为AMQP.Net Lite的C#库,这是一个为.NET Framework设计的轻量级AMQP 1.0库。

设置Azure IoT Hub

如果已经设置了Azure IoT Hub,可以跳过这一步。登录到并创建一个IoT Hub实例。创建成功后,需要获取访问密钥。在IoT Hub页面上,导航到“共享访问策略”页面,并获取“iothubowner”策略的连接字符串。

管理IoT Hub

对于IoT Hub的基本管理操作、监控甚至向设备发送数据,应该安装设备资源管理器应用程序,这是Azure IoTC#SDK的一部分。按照readme上的说明下载预构建的设置,或者可以选择克隆仓库并自行构建。

启动设备资源管理器应用程序后,在相应的字段中输入从Azure门户获取的连接字符串,然后点击“更新”按钮。接下来,将创建一个设备。转到“管理”选项卡,点击“创建”按钮。只需要输入设备ID,应用程序将为设备生成随机的认证密钥,无需担心这些。

回到“管理”选项卡视图,点击“SAS令牌”按钮,这将打开一个工具,为该设备创建一个共享访问签名令牌。复制生成的SaS令牌,稍后在C#应用程序中使用。

这里值得提的几个方面是:该令牌是专门为这个设备生成的,属于这个IoT Hub实例,并且在TTL字段中设置的持续时间内有效。可以在阅读更多关于IoT Hub的安全性和访问控制的信息。

IoT Hub客户端硬件

在这个项目中使用了STM32F769IDISCOVERY开发板,它已经刷入了nanoFramework镜像。这将完全适用于任何运行最新nanoFramework镜像并具有网络功能的其他开发板。

C# IoT客户端

假设已经正确设置了Visual Studio,并安装了nanoFramework扩展。从nanoFramework的中获取代码,并在Visual Studio中打开解决方案。解决方案加载后,将Azure.IoTHub设置为启动项目。

接下来编辑Program.cs文件,并替换文件顶部与IoT Hub相关的常量。

const string iotHubName = "my-hub"; const string device = "COFFEEMACHINE001"; const string sasToken = "SharedAccessSignature sr=my-hub.azure-devices.net%2Fdevices%2FCOFFEEMACHINE001&sig=%2FjXfhNvUpxtIM0%2F%2Bb8fCc5l0QWfmEGliSkGqQm3cds4%3D&se=1547902598";

请确保输入的IoT Hub名称完全正确。SaS令牌字符串是“SharedAccessSignature=”之后显示的部分。应用程序将在开发板上的蓝色用户按钮被按下时向IoT Hub发送一个随机温度,并在从IoT Hub接收到消息时输出消息到调试控制台。这展示了AMQP设备双向通信的能力。

继续探索代码,下一个有趣的部分是在工作线程的开始处,IoT Hub设置被解析。可以在看到IoT Hub主机的完整URL是如何计算的。

应用程序使用SASL PLAIN进行身份验证,并使用设备资源管理器工具生成的SaS令牌。这样做的目的是设备密钥永远不会通过线路发送,从而消除了潜在的安全漏洞。

AMQP身份验证的用户名将由设备ID和IoT Hub名称组成,如下所示:

{deviceId}@sas.{iothubname}

密码是上面描述的SaS令牌字符串。确保只输入相关部分,否则身份验证将失败。

这段代码的最后一部分是发送和接收端点。这些是根据以下模式使用设备ID组成的。

发送设备到云的消息: devices/{deviceId}/messages/events 接收云到设备的消息: devices/{deviceId}/messages/devicebound

现在让设置设备以理解具有名为settemp的属性的消息,该属性包含一个整数值,表示新的温度设定点。这是OnMessage和OnAction处理程序的代码。

private static void OnMessage(IReceiverLink receiver, Message message) { // 收到命令 int setTemperature = int.Parse((string)message.ApplicationProperties["settemp"]); OnAction(setTemperature); } private static void OnAction(int setTemperature) { Console.WriteLine($"received new temperature setting: {setTemperature}"); }

最后要提到的是,预期nanoFramework设备已经通过使用网络配置窗口或调整NetworkHelpers类中的相关代码正确配置了其网络接口。

连接到IoT Hub

要看到实际效果,只需在Visual Studio上启动调试会话。C#应用程序将被部署到设备并开始运行。

因为AMQP跟踪级别设置为Frame和Information,可以检查Visual Studio调试输出窗口以了解AMQP连接的情况。

下面突出显示的是:身份验证步骤和附加接收和发送端点。

当用户按钮被点击时,一个AMQP消息被发送到IoT Hub:

IoT Hub设备资源管理器有一个监控功能,可以使用它来观察从设备流向云的数据。转到“数据”选项卡,点击“监控”按钮。

要测试云到设备的通信,请转到“消息到设备”选项卡,在下拉列表中选择设备,添加一个名为settemp的属性,值为70,然后点击“发送”按钮。

消息在IoT Hub上排队,输出显示消息ID。因为设备已连接,消息立即被接收。

这是在Visual Studio调试输出窗口上得到的内容:

这是一个非常简单的演示,展示了如何使用连接到IoT Hub的设备。这里涵盖了基本部分,如身份验证、发送和接收消息。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485