如何设置 IoT 中心云到设备消息的默认 TTL 为分钟级别

问题描述

在文档使用 IoT 中心发送和接收消息中,描述云到设备(CloudToDevice, 以下简称 C2D)消息的默认 TTL 最小可以设置为 1 分钟:

portal

然而 Azure 门户预览上,默认值为 1 小时,无法设置为分钟级别:

portal-2

实现方案

C2D 消息的默认 TTL 确实可以设置为最小 1 mins,但是目前只能通过代码实现,而无法通过 Azure 门户预览来操作。目前,使用代码可以通过两种方式操作:

  • 发送 C2D 消息的时候,可以指定某条 / 某几条消息里的 ExpiryTimeUtc 属性为您需要过期的时间,例如:

    var commandMessage = new Message(
        Encoding.ASCII.GetBytes("Cloud to device message."));
    commandMessage.ExpiryTimeUtc = System.DateTime.UtcNow.AddMinutes(1);
    messageToSend.setExpiryTimeUtc(expireDate);
    
  • 可以通过设置 CloudToDevice 里的 DefaultTtlAsIso8601 属性来设置默认 TTL,这种方法是为整个 IoT 中心下所有设备的 C2D 的消息设置为同一默认 TTL。

    var iothubClient = new IotHubClient(
    new Uri("https://management.chinacloudapi.cn/"), 
    tokenCredential, 
    new RetryDelegatingHandler());
    iothubClient.SubscriptionId = subscriptionId;
    
    var iothubResource = iothubClient.IotHubResource;
    
    // get iothub description
    var resourceDescription = iothubResource.Get(rgName, resourceName);
    Console.WriteLine(resourceDescription.Name);
    
    // set C2D message default ttl to 1 minute
    resourceDescription.Properties.CloudToDevice.DefaultTtlAsIso8601 = TimeSpan.FromMinutes(1);
    
    try
    { 
        // commit the change                 
        iothubResource.CreateOrUpdate(rgName, resourceName, resourceDescription);
        Console.WriteLine("Update successfully!");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    Console.WriteLine("Press ENTER to exit!");
    Console.ReadLine();