Compartir a través de

使用 IoT 中心将消息从云发送到设备(.NET)

Azure IoT 中心是一项完全托管的服务,可帮助在数百万台设备与解决方案后端之间实现可靠且安全的双向通信。

本文将向您介绍如何操作:

  • 通过 IoT 中心将云到设备的消息从解决方案后端发送到单个设备

  • 在设备上接收云到设备的消息

  • 请从您的解决方案后端请求传递确认(反馈),以确认从物联网中心发送到设备的消息。

注释

本文中所述的功能仅在 IoT 中心的标准层中可用。 有关基本层和标准/免费 IoT 中心层的详细信息,请参阅 为解决方案选择正确的 IoT 中心层和大小

本文结束时,将运行两个 .NET 控制台应用。

注释

IoT 中心通过 Azure IoT 设备 SDK 支持许多设备平台和语言(C、Java、Python 和 JavaScript)。

您可以在 使用 IoT 中心的 D2C 和 C2D 消息传送中找到有关云到设备消息的更多信息。

先决条件

在设备应用中接收消息

在本部分中,修改设备应用以从 IoT 中心接收云到设备的消息。

  1. 在 Visual Studio 的 SimulatedDevice 项目中,将以下方法添加到 SimulatedDevice 类。

     private static async void ReceiveC2dAsync()
     {
         Console.WriteLine("\nReceiving cloud to device messages from service");
         while (true)
         {
             Message receivedMessage = await s_deviceClient.ReceiveAsync();
             if (receivedMessage == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received message: {0}", 
             Encoding.ASCII.GetString(receivedMessage.GetBytes()));
             Console.ResetColor();
    
             await s_deviceClient.CompleteAsync(receivedMessage);
         }
     }
    
  2. Main 方法中添加以下方法,紧跟在 Console.ReadLine() 行前面:

    ReceiveC2dAsync();
    

该方法 ReceiveAsync 在设备接收消息时异步返回接收的消息。 它在可指定超时期限后返回 null 。 在此示例中,使用默认值为 1 分钟。 当应用收到 null 时,它应继续等待新消息。 此要求是该 if (receivedMessage == null) continue 行的原因。

调用 CompleteAsync() 用于通知 IoT 中心该消息已成功处理,并且可从设备队列中安全删除。 设备在处理成功完成时应调用此方法,而不考虑它使用的协议。

在使用AMQP和HTTPS的情况下,尽管不能使用MQTT,设备也可以:

  • 放弃消息,这会导致 IoT 中心在设备队列中保留消息以供将来使用。
  • 拒绝一条消息,这将永久地从设备队列中移除该消息。

如果发生阻止设备完成、放弃或拒绝消息的情况,IoT 中心将在固定超时期限后再次将消息排成队列以供传递。 因此,设备应用中的消息处理逻辑必须是 幂等的,以便多次接收相同的消息会产生相同的结果。

有关云到设备的消息生命周期以及 IoT 中心如何处理云到设备的消息的详细信息,请参阅 从 IoT 中心发送云到设备的消息

注释

使用 HTTPS 而不是 MQTT 或 AMQP 作为传输时,该方法 ReceiveAsync 会立即返回。 使用 HTTPS 的云到设备消息支持的模式是间歇性连接的设备,这些设备不经常检查消息(至少每 25 分钟一次)。 发出更多 HTTPS 接收会导致 IoT 中心限制请求。 有关 MQTT、AMQP 和 HTTPS 支持之间的差异的详细信息,请参阅云到设备通信指南选择通信协议

获取 IoT 中心连接字符串

在本文中,你将创建一个后端服务,用于通过 IoT 中心发送云到设备的消息。 若要发送云到设备的消息,服务需要 服务连接 权限。 默认情况下,每个 IoT 中心都使用名为“服务”的共享访问策略创建,该策略会授予此权限。

若要获取 service策略的 IoT 中心连接字符串,请执行以下步骤:

  1. Azure 门户中,选择 资源组。 选择中心所在的资源组,然后从资源列表中选择中心。

  2. 在 IoT 中心的左侧窗格中,选择 “共享访问策略”。

  3. 在策略列表中,选择“service”策略。

  4. 复制“主连接字符串”并保存该值

显示如何在 Azure 门户中从 IoT 中心检索连接字符串的屏幕截图。

有关 IoT 中心共享访问策略和权限的详细信息,请参阅 访问控制和权限

发送云到设备的消息

在本部分中,你将创建一个 .NET 控制台应用,用于将云到设备消息发送到模拟设备应用。 需要您设备的设备 ID 和 IoT 中心的连接字符串。

  1. 在 Visual Studio 中,选择“ 文件>新建>项目”。 在 “创建新项目”中,选择 “控制台应用”(.NET Framework),然后选择“ 下一步”。

  2. 将项目命名 为 SendCloudToDevice,然后选择“ 下一步”。

    Visual Studio 中“配置新项目”弹出窗口的屏幕截图。

  3. 接受最新版本的 .NET Framework。 选择“ 创建 ”以创建项目。

  4. 在解决方案资源管理器中,右键单击新项目,然后选择“ 管理 NuGet 包”。

  5. “管理 NuGet 包”中,选择“ 浏览”,然后搜索并选择 “Microsoft.Azure.Devices”。 选择“安装”。

    此步骤下载、安装并添加对 Azure IoT 服务 SDK NuGet 包的引用。

  6. using文件的顶部添加以下语句。

    using Microsoft.Azure.Devices;
    
  7. 将以下字段添加到 Program 类。 将 {iot hub connection string} 占位符值替换为之前在 获取 IoT 中心连接字符串中记录的 IoT 中心连接字符串。 将 {device id} 占位符替换为您在 将遥测数据从设备发送到 IoT 中心 快速入门中添加的设备的设备 ID。

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. 将以下方法添加到 Program 类,以向设备发送消息。

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. 最后,将以下行添加到 Main 方法。

    Console.WriteLine("Send Cloud-to-Device message\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    
    Console.WriteLine("Press any key to send a C2D message.");
    Console.ReadLine();
    SendCloudToDeviceMessageAsync().Wait();
    Console.ReadLine();
    
  10. 在解决方案资源管理器中,右键单击解决方案,然后选择 “设置启动项目”。

  11. “常用属性>启动项目”中,选择“多个启动项目”,然后选择 SimulatedDeviceSendCloudToDevice“启动”操作。 选择“确定”,保存所做更改。

  12. F5键。 这两个应用程序都应启动。 选择 SendCloudToDevice 窗口,然后按 Enter。 应会看到设备应用收到的消息。

    设备应用接收消息

接收交付反馈

对于每个云到设备的消息,可以从 IoT 中心请求传递(或过期)确认。 此选项使解决方案后端能够轻松通知、重试或补偿逻辑。 有关云到设备反馈的详细信息,请参阅 IoT 中心的 D2C 和 C2D 消息传送

在本部分中,将修改 SendCloudToDevice 应用以请求反馈,并从 IoT 中心接收反馈。

  1. 在 Visual Studio 的 SendCloudToDevice 项目中,将以下方法添加到 Program 类。

    private async static void ReceiveFeedbackAsync()
    {
         var feedbackReceiver = serviceClient.GetFeedbackReceiver();
    
         Console.WriteLine("\nReceiving c2d feedback from service");
         while (true)
         {
             var feedbackBatch = await feedbackReceiver.ReceiveAsync();
             if (feedbackBatch == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received feedback: {0}",
               string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode)));
             Console.ResetColor();
    
             await feedbackReceiver.CompleteAsync(feedbackBatch);
         }
     }
    

    请注意,此接收模式与用于从设备应用接收云到设备消息的接收模式相同。

  2. 紧接着在 Main 方法 serviceClient = ServiceClient.CreateFromConnectionString(connectionString)中添加以下行。

    ReceiveFeedbackAsync();
    
  3. 若要请求有关传送云到设备消息的反馈,必须在 SendCloudToDeviceMessageAsync 方法中指定属性。 在 var commandMessage = new Message(...); 行之后添加以下行。

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. F5 运行应用。 应会看到这两个应用程序都已启动。 选择 SendCloudToDevice 窗口,然后按 Enter。 应该会看到设备应用收到的消息,几秒钟后, SendCloudToDevice 应用程序会收到反馈消息。

    设备应用接收消息和服务应用接收反馈

注释

为简单起见,本文不实现任何重试策略。 在生产代码中,应实现重试策略,例如指数退避,如 暂时性故障处理中建议的。

后续步骤

本文介绍了如何发送和接收云到设备的消息。