在本文中,将探讨如何使用C#和AMQP协议通过Azure IoT Hub进行设备通信。首先,需要了解一些基本概念,包括Azure IoT Hub和AMQP协议。
Azure IoT Hub是一个完全托管的服务,它允许数十亿个IoT设备和应用程序之间进行可靠的双向通信。如果不熟悉Azure IoT Hub,可以在上了解更多信息。要使本项目工作,需要一个Azure账户。如果还没有,可以在上述产品页面上免费注册一个账户。
AMQP(高级消息队列协议)是一个开放标准,用于在应用程序或组织之间传递业务消息。它是一个国际标准(ISO/IEC 19464),并且是物联网(IoT)领域广泛接受的协议标准之一。可以在或上找到更多信息。
将使用名为AMQP.Net Lite的C#库,这是一个为.NET Framework设计的轻量级AMQP 1.0库。
如果已经设置了Azure IoT Hub,可以跳过这一步。登录到并创建一个IoT Hub实例。创建成功后,需要获取访问密钥。在IoT Hub页面上,导航到“共享访问策略”页面,并获取“iothubowner”策略的连接字符串。
对于IoT Hub的基本管理操作、监控甚至向设备发送数据,应该安装设备资源管理器应用程序,这是Azure IoTC#SDK的一部分。按照readme上的说明下载预构建的设置,或者可以选择克隆仓库并自行构建。
启动设备资源管理器应用程序后,在相应的字段中输入从Azure门户获取的连接字符串,然后点击“更新”按钮。接下来,将创建一个设备。转到“管理”选项卡,点击“创建”按钮。只需要输入设备ID,应用程序将为设备生成随机的认证密钥,无需担心这些。
回到“管理”选项卡视图,点击“SAS令牌”按钮,这将打开一个工具,为该设备创建一个共享访问签名令牌。复制生成的SaS令牌,稍后在C#应用程序中使用。
这里值得提的几个方面是:该令牌是专门为这个设备生成的,属于这个IoT Hub实例,并且在TTL字段中设置的持续时间内有效。可以在阅读更多关于IoT Hub的安全性和访问控制的信息。
在这个项目中使用了STM32F769IDISCOVERY开发板,它已经刷入了nanoFramework镜像。这将完全适用于任何运行最新nanoFramework镜像并具有网络功能的其他开发板。
假设已经正确设置了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类中的相关代码正确配置了其网络接口。
要看到实际效果,只需在Visual Studio上启动调试会话。C#应用程序将被部署到设备并开始运行。
因为AMQP跟踪级别设置为Frame和Information,可以检查Visual Studio调试输出窗口以了解AMQP连接的情况。
下面突出显示的是:身份验证步骤和附加接收和发送端点。
当用户按钮被点击时,一个AMQP消息被发送到IoT Hub:
IoT Hub设备资源管理器有一个监控功能,可以使用它来观察从设备流向云的数据。转到“数据”选项卡,点击“监控”按钮。
要测试云到设备的通信,请转到“消息到设备”选项卡,在下拉列表中选择设备,添加一个名为settemp的属性,值为70,然后点击“发送”按钮。
消息在IoT Hub上排队,输出显示消息ID。因为设备已连接,消息立即被接收。
这是在Visual Studio调试输出窗口上得到的内容:
这是一个非常简单的演示,展示了如何使用连接到IoT Hub的设备。这里涵盖了基本部分,如身份验证、发送和接收消息。