Entender e usar dispositivos gêmeos no Hub IoTUnderstand and use device twins in IoT Hub

Dispositivos gêmeos são documentos JSON que armazenam informações do estado do dispositivo, incluindo metadados, configurações e condições.Device twins are JSON documents that store device state information including metadata, configurations, and conditions. O Hub IoT do Azure mantém um dispositivo gêmeo para cada dispositivo que você conecta ao Hub IoT.Azure IoT Hub maintains a device twin for each device that you connect to IoT Hub.

Observação

Os recursos descritos neste artigo estão disponíveis apenas na camada standard do IoT Hub.The features described in this article are available only in the standard tier of IoT Hub. Para obter mais informações sobre as camadas básicas e standard do IoT Hub, consulte escolher a camada certa do IoT Hub.For more information about the basic and standard IoT Hub tiers, see Choose the right IoT Hub tier.

Este artigo descreve:This article describes:

  • A estrutura do dispositivo gêmeo: marcas, propriedades desejadas e relatadas.The structure of the device twin: tags, desired and reported properties.
  • As operações que os aplicativos e back-ends de dispositivo podem executar em dispositivos gêmeos.The operations that device apps and back ends can perform on device twins.

Use os dispositivos gêmeos para:Use device twins to:

  • Armazene os metadados específicos do dispositivo na nuvem.Store device-specific metadata in the cloud. Por exemplo, o local de implantação de uma máquina de vendas.For example, the deployment location of a vending machine.

  • Relate informações de estado atual, como recursos disponíveis e condições do aplicativo do dispositivo.Report current state information such as available capabilities and conditions from your device app. Por exemplo, um dispositivo é conectado ao hub IoT via celular ou Wi-Fi.For example, a device is connected to your IoT hub over cellular or WiFi.

  • Sincronize o estado dos fluxos de trabalho de longa execução entre o aplicativo do dispositivo e o aplicativo do back-end.Synchronize the state of long-running workflows between device app and back-end app. Por exemplo, quando a solução de back-end especifica a nova versão do firmware para instalação, e o aplicativo do dispositivo relata os diversos estágios do processo de atualização.For example, when the solution back end specifies the new firmware version to install, and the device app reports the various stages of the update process.

  • Consultar os metadados, a configuração ou o estado do seu dispositivo.Query your device metadata, configuration, or state.

Veja as Diretrizes de comunicação do dispositivo para nuvem para obter orientação sobre o uso de propriedades reportadas, mensagens do dispositivo para nuvem ou upload do arquivo.Refer to Device-to-cloud communication guidance for guidance on using reported properties, device-to-cloud messages, or file upload.

Veja as Diretrizes de comunicação da nuvem para dispositivo para obter orientação sobre o uso de propriedades desejadas, métodos diretos ou mensagens da nuvem para dispositivo.Refer to Cloud-to-device communication guidance for guidance on using desired properties, direct methods, or cloud-to-device messages.

Dispositivos gêmeosDevice twins

Dispositivos gêmeos armazenam informações relacionadas ao dispositivo que:Device twins store device-related information that:

  • O dispositivo e os back-ends podem usar para sincronizar a configuração e as condições do dispositivo.Device and back ends can use to synchronize device conditions and configuration.

  • A solução que o back-end pode usar para consultar e direcionar operações de execução longa.The solution back end can use to query and target long-running operations.

O ciclo de vida de um dispositivo gêmeo está vinculado à identidade do dispositivo correspondente.The lifecycle of a device twin is linked to the corresponding device identity. Os dispositivos gêmeos são criados e excluídos implicitamente quando uma identidade de dispositivo é criada ou excluída no Hub IoT.Device twins are implicitly created and deleted when a device identity is created or deleted in IoT Hub.

Um dispositivo gêmeo é um documento JSON que inclui:A device twin is a JSON document that includes:

  • Marcas.Tags. Uma seção do documento JSON que o back-end de solução pode ler e na qual pode gravar.A section of the JSON document that the solution back end can read from and write to. As marcas não ficam visíveis para os aplicativos do dispositivo.Tags are not visible to device apps.

  • Propriedades desejadas.Desired properties. Usado junto com as propriedades relatadas para sincronizar a configuração de dispositivo ou condições.Used along with reported properties to synchronize device configuration or conditions. O back-end da solução pode definir as propriedades desejadas e o aplicativo de dispositivo pode lê-las.The solution back end can set desired properties, and the device app can read them. O aplicativo do dispositivo também pode receber notificações de alterações nas propriedades desejadas.The device app can also receive notifications of changes in the desired properties.

  • Propriedades reportadas.Reported properties. Usado junto com as propriedades desejadas para sincronizar a configuração de dispositivo ou condições.Used along with desired properties to synchronize device configuration or conditions. O aplicativo de dispositivo pode definir as propriedades relatadas e o back-end da solução pode lê-las e consultá-las.The device app can set reported properties, and the solution back end can read and query them.

  • Propriedades de identidade do dispositivo.Device identity properties. A raiz do documento JSON do dispositivo gêmeo contém as propriedades somente leitura da identidade do dispositivo correspondente armazenada no registro identidade.The root of the device twin JSON document contains the read-only properties from the corresponding device identity stored in the identity registry.

Captura de tela das propriedades do dispositivo gêmeo

O seguinte exemplo mostra um documento JSON de dispositivo gêmeo:The following example shows a device twin JSON document:

{
    "deviceId": "devA",
    "etag": "AAAAAAAAAAc=", 
    "status": "enabled",
    "statusReason": "provisioned",
    "statusUpdateTime": "0001-01-01T00:00:00",
    "connectionState": "connected",
    "lastActivityTime": "2015-02-30T16:24:48.789Z",
    "cloudToDeviceMessageCount": 0, 
    "authenticationType": "sas",
    "x509Thumbprint": {     
        "primaryThumbprint": null, 
        "secondaryThumbprint": null 
    }, 
    "version": 2, 
    "tags": {
        "$etag": "123",
        "deploymentLocation": {
            "building": "43",
            "floor": "1"
        }
    },
    "properties": {
        "desired": {
            "telemetryConfig": {
                "sendFrequency": "5m"
            },
            "$metadata" : {...},
            "$version": 1
        },
        "reported": {
            "telemetryConfig": {
                "sendFrequency": "5m",
                "status": "success"
            },
            "batteryLevel": 55,
            "$metadata" : {...},
            "$version": 4
        }
    }
}

No objeto raiz estão as propriedades de identidade do dispositivo e os objetos de contêiner para tags, além das propriedades reported e desired.In the root object are the device identity properties, and container objects for tags and both reported and desired properties. O contêiner properties tem alguns elementos somente leitura ($metadata, $etag e $version) descritos nas seções Metadados de dispositivo gêmeo e Simultaneidade otimista.The properties container contains some read-only elements ($metadata, $etag, and $version) described in the Device twin metadata and Optimistic concurrency sections.

Exemplo da propriedade reportadaReported property example

No exemplo anterior, o dispositivo gêmeo contém uma propriedade batteryLevel que é reportada pelo aplicativo do dispositivo.In the previous example, the device twin contains a batteryLevel property that is reported by the device app. Essa propriedade torna possível a consultar e operação em dispositivos com base no último nível da bateria reportado.This property makes it possible to query and operate on devices based on the last reported battery level. Outros exemplos incluem os recursos de dispositivo de relatórios de aplicativo de dispositivo ou as opções de conectividade.Other examples include the device app reporting device capabilities or connectivity options.

Observação

As propriedades relatadas simplificam cenários nos quais o back-end da solução está interessado no último valor conhecido de uma propriedade.Reported properties simplify scenarios where the solution back end is interested in the last known value of a property. Use as mensagens do dispositivo para nuvem se o back-end da solução precisar processar telemetria do dispositivo na forma de sequências de eventos com carimbo de data/hora, como uma série temporal.Use device-to-cloud messages if the solution back end needs to process device telemetry in the form of sequences of timestamped events, such as time series.

Exemplo da propriedade desejadaDesired property example

No exemplo anterior, as propriedades relatadas e desejadas do dispositivo gêmeo telemetryConfig são usadas pelo aplicativo do dispositivo e pelo back-end da solução para sincronizar a configuração de telemetria para o dispositivo em questão.In the previous example, the telemetryConfig device twin desired and reported properties are used by the solution back end and the device app to synchronize the telemetry configuration for this device. Por exemplo:For example:

  1. O back-end da solução define a propriedade desejada com o valor de configuração desejado.The solution back end sets the desired property with the desired configuration value. Aqui está a parte do documento com o conjunto de propriedades desejado:Here is the portion of the document with the desired property set:

    "desired": {
        "telemetryConfig": {
            "sendFrequency": "5m"
        },
        ...
    },
    
  2. O aplicativo do dispositivo é notificado sobre a alteração imediatamente, se estiver conectado, ou na primeira reconexão.The device app is notified of the change immediately if connected, or at the first reconnect. Em seguida, o aplicativo do dispositivo reporta a configuração atualizada (ou uma condição de erro usando a propriedade status).The device app then reports the updated configuration (or an error condition using the status property). Esta é a parte das propriedades reportadas:Here is the portion of the reported properties:

    "reported": {
        "telemetryConfig": {
            "sendFrequency": "5m",
            "status": "success"
        }
        ...
    }
    
  3. O back-end da solução pode acompanhar os resultados da operação de configuração em vários dispositivos consultando os dispositivos gêmeos.The solution back end can track the results of the configuration operation across many devices by querying device twins.

Observação

Os snippets anteriores são exemplos, otimizados para facilitar a leitura, de uma forma de codificar uma configuração de dispositivo e seu status.The preceding snippets are examples, optimized for readability, of one way to encode a device configuration and its status. O Hub IoT não impõe um esquema específico para as propriedades desejadas e reportadas do dispositivo gêmeo nos dispositivos gêmeos.IoT Hub does not impose a specific schema for the device twin desired and reported properties in the device twins.

Você pode usar gêmeos para sincronizar operações de longa execução, como atualizações de firmware.You can use twins to synchronize long-running operations such as firmware updates. Para obter mais informações sobre como usar propriedades para sincronizar e acompanhar uma operação de longa duração entre dispositivos, confira Usar propriedades desejadas para configurar dispositivos.For more information on how to use properties to synchronize and track a long running operation across devices, see Use desired properties to configure devices.

Operações de back-endBack-end operations

O back-end da solução funciona no dispositivo gêmeo usando as seguintes operações atômicas, expostas por meio de HTTPS:The solution back end operates on the device twin using the following atomic operations, exposed through HTTPS:

  • Recuperar dispositivo gêmeo por ID.Retrieve device twin by ID. Essa operação retorna o documento do dispositivo gêmeo, incluindo marcas e propriedades do sistema desejadas e reportadas.This operation returns the device twin document, including tags and desired and reported system properties.

  • Atualizar parcialmente o dispositivo gêmeo.Partially update device twin. Essa operação permite que o back-end da solução atualize parcialmente as marcações ou propriedades desejadas em um dispositivo gêmeo.This operation enables the solution back end to partially update the tags or desired properties in a device twin. A atualização parcial é expressa como um documento JSON que adiciona ou atualiza qualquer propriedade.The partial update is expressed as a JSON document that adds or updates any property. As propriedades definidas como null foram removidas.Properties set to null are removed. O exemplo a seguir cria uma nova propriedade desejada com o valor {"newProperty": "newValue"}, substitui o valor existente de existingProperty por "otherNewValue" e remove otherOldProperty.The following example creates a new desired property with value {"newProperty": "newValue"}, overwrites the existing value of existingProperty with "otherNewValue", and removes otherOldProperty. Nenhuma outra alteração é feitas nas propriedades desejadas ou marcas existentes:No other changes are made to existing desired properties or tags:

    {
         "properties": {
             "desired": {
                 "newProperty": {
                     "nestedProperty": "newValue"
                 },
                 "existingProperty": "otherNewValue",
                 "otherOldProperty": null
             }
         }
    }
    
  • Substituir propriedades desejadas.Replace desired properties. Esta operação permite que o back-end da solução substitua completamente todas as suas propriedades desejadas existentes e substitui um novo documento JSON por properties/desired.This operation enables the solution back end to completely overwrite all existing desired properties and substitute a new JSON document for properties/desired.

  • Substituir marcas.Replace tags. Esta operação permite que o back-end da solução substitua completamente todas as marcas existentes e substitui um novo documento JSON por tags.This operation enables the solution back end to completely overwrite all existing tags and substitute a new JSON document for tags.

  • Receba notificações gêmeas.Receive twin notifications. Esta operação permite que o back-end de solução seja notificado quando o gêmeo é modificado.This operation allows the solution back end to be notified when the twin is modified. Para fazer isso, sua solução de IoT precisa para criar uma rota e definir a Fonte de Dados como twinChangeEvents.To do so, your IoT solution needs to create a route and to set the Data Source equal to twinChangeEvents. Por padrão, nenhuma dessas rotas existe previamente, então nenhuma notificação gêmea é enviada.By default, no such routes pre-exist, so no twin notifications are sent. Se a taxa de alteração for alta demais ou então por outros motivos como falhas internas, o Hub IoT poderá enviar apenas uma notificação contendo todas as alterações.If the rate of change is too high, or for other reasons such as internal failures, the IoT Hub might send only one notification that contains all changes. Portanto, se o aplicativo precisar de auditoria e registro em log confiável de todos os estados intermediários, será necessário usar mensagens de dispositivo para nuvem.Therefore, if your application needs reliable auditing and logging of all intermediate states, you should use device-to-cloud messages. A mensagem de notificação gêmea inclui propriedades e corpo.The twin notification message includes properties and body.

    • PropriedadesProperties

      NomeName ValorValue
      $content-type$content-type aplicativo/jsonapplication/json
      $iothub-enqueuedtime$iothub-enqueuedtime Hora em que a notificação foi enviadaTime when the notification was sent
      $iothub-message-source$iothub-message-source twinChangeEventstwinChangeEvents
      $content-encoding$content-encoding utf-8utf-8
      deviceIddeviceId ID do dispositivoID of the device
      hubNamehubName Nome do Hub IoTName of IoT Hub
      operationTimestampoperationTimestamp Carimbo de data/hora ISO8601 da operaçãoISO8601 timestamp of operation
      iothub-message-schemaiothub-message-schema deviceLifecycleNotificationdeviceLifecycleNotification
      opTypeopType "replaceTwin" ou "updateTwin""replaceTwin" or "updateTwin"

      As propriedades do sistema de mensagens são fixadas previamente com o símbolo $.Message system properties are prefixed with the $ symbol.

    • BodyBody

      Esta seção inclui todas as alterações gêmeas em um formato JSON.This section includes all the twin changes in a JSON format. Ele usa o mesmo formato que um patch, com as diferenças de que ele pode conter todas as seções gêmeas: marcas, properties.reported, properties.desired e também de que ele contém os elementos "$metadata".It uses the same format as a patch, with the difference that it can contain all twin sections: tags, properties.reported, properties.desired, and that it contains the “$metadata” elements. Por exemplo,For example,

      {
        "properties": {
            "desired": {
                "$metadata": {
                    "$lastUpdated": "2016-02-30T16:24:48.789Z"
                },
                "$version": 1
            },
            "reported": {
                "$metadata": {
                    "$lastUpdated": "2016-02-30T16:24:48.789Z"
                },
                "$version": 1
            }
        }
      }
      

Todas as operações anteriores dão suporte à Simultaneidade otimista e exigem a permissão ServiceConnect, conforme definido no artigo Controlar acesso ao Hub IoT.All the preceding operations support Optimistic concurrency and require the ServiceConnect permission, as defined in Control access to IoT Hub.

Além dessas operações, o back-end da solução pode:In addition to these operations, the solution back end can:

Operações de dispositivoDevice operations

O aplicativo do dispositivo opera no dispositivo gêmeo usando as seguintes operações atômicas:The device app operates on the device twin using the following atomic operations:

  • Recuperar dispositivo gêmeo.Retrieve device twin. Esta operação retorna o documento de dispositivo de documentos (incluindo as propriedades do sistema desejadas e reportadas) para o dispositivo conectado no momento.This operation returns the device twin document (including desired and reported system properties) for the currently connected device. (As marcas não são visíveis para os aplicativos do dispositivo.)(Tags are not visible to device apps.)

  • Atualizar parcialmente as propriedades reportadas.Partially update reported properties. Essa operação permite a atualização parcial das propriedades reportadas do dispositivo conectado no momento.This operation enables the partial update of the reported properties of the currently connected device. Esta operação usa o mesmo formato de atualização JSON que a solução de back-end usa para uma atualização parcial de propriedades desejadas.This operation uses the same JSON update format that the solution back end uses for a partial update of desired properties.

  • Observar as propriedades desejadas.Observe desired properties. O dispositivo conectado no momento pode optar por ser notificado sobre atualizações para as propriedades desejadas quando elas ocorrem.The currently connected device can choose to be notified of updates to the desired properties when they happen. O dispositivo recebe a mesma forma de atualização (substituição total ou parcial) executada pelo back-end da solução.The device receives the same form of update (partial or full replacement) executed by the solution back end.

Todas as operações anteriores exigem a permissão DeviceConnect, conforme definido no Controlar acesso ao Hub IoT.All the preceding operations require the DeviceConnect permission, as defined in Control Access to IoT Hub.

Os SDKs do dispositivo IoT do Azure facilitam o uso das operações anteriores em várias linguagens e plataformas.The Azure IoT device SDKs make it easy to use the preceding operations from many languages and platforms. Para obter mais informações sobre os detalhes dos primitivos do Hub IoT para sincronização de propriedades desejadas, consulte Fluxo de reconexão do dispositivo.For more information on the details of IoT Hub primitives for desired properties synchronization, see Device reconnection flow.

Formato de marcas e propriedadesTags and properties format

Marcas, propriedades desejadas e propriedades reportadas são objetos JSON com as seguintes restrições:Tags, desired properties, and reported properties are JSON objects with the following restrictions:

  • Todas as chaves em objetos JSON são cadeias de caracteres UNICODE UTF-8 de 64 bytes que diferenciam maiúsculas de minúsculas.All keys in JSON objects are case-sensitive 64 bytes UTF-8 UNICODE strings. Os caracteres permitidos excluem caracteres de controle UNICODE (segmentos C0 e C1) e ., $ e SP.Allowed characters exclude UNICODE control characters (segments C0 and C1), and ., $, and SP.

  • Todos os valores em objetos JSON podem ser dos seguintes tipos de JSON: booliano, número, cadeia de caracteres, objeto.All values in JSON objects can be of the following JSON types: boolean, number, string, object. Não há permissão para matrizes.Arrays are not allowed. O valor máximo dos inteiros é 4503599627370495 e o valor mínimo dos inteiros é -4503599627370496.The maximum value for integers is 4503599627370495 and the minimum value for integers is -4503599627370496.

  • Todos os objetos JSON em marcações, propriedades desejadas e reportadas podem ter uma profundidade máxima de 5.All JSON objects in tags, desired, and reported properties can have a maximum depth of 5. Por exemplo, o seguinte objeto é válido:For instance, the following object is valid:

    {
         ...
         "tags": {
             "one": {
                 "two": {
                     "three": {
                         "four": {
                             "five": {
                                 "property": "value"
                             }
                         }
                     }
                 }
             }
         },
         ...
    }
    
  • Todos os valores de cadeia de caracteres podem ter no máximo 512 bytes de comprimento.All string values can be at most 512 bytes in length.

Tamanho do dispositivo gêmeoDevice twin size

O Hub IoT impõe um limite de tamanho de 8 KB em cada um dos valores totais respectivos de tags, properties/desired e properties/reported, excluindo elementos somente leitura.IoT Hub enforces an 8KB size limitation on each of the respective total values of tags, properties/desired, and properties/reported, excluding read-only elements.

O tamanho é calculado pela contagem de todos os caracteres, exceto caracteres de controle UNICODE (segmentos C0 e C1) e espaços que estão fora das constantes da cadeia de caracteres.The size is computed by counting all characters, excluding UNICODE control characters (segments C0 and C1) and spaces that are outside of string constants.

O Hub IoT rejeita com erro todas as operações que podem aumentar o tamanho desses documentos acima do limite.IoT Hub rejects with an error all operations that would increase the size of those documents above the limit.

Metadados do dispositivo gêmeoDevice twin metadata

O Hub IoT mantém o carimbo de data e hora da última atualização de cada objeto JSON nas propriedades desejadas e reportadas do dispositivo gêmeo.IoT Hub maintains the timestamp of the last update for each JSON object in device twin desired and reported properties. Os carimbos de data e hora estão em UTC e são codificados no formato ISO8601YYYY-MM-DDTHH:MM:SS.mmmZ.The timestamps are in UTC and encoded in the ISO8601 format YYYY-MM-DDTHH:MM:SS.mmmZ.

Por exemplo:For example:

{
    ...
    "properties": {
        "desired": {
            "telemetryConfig": {
                "sendFrequency": "5m"
            },
            "$metadata": {
                "telemetryConfig": {
                    "sendFrequency": {
                        "$lastUpdated": "2016-03-30T16:24:48.789Z"
                    },
                    "$lastUpdated": "2016-03-30T16:24:48.789Z"
                },
                "$lastUpdated": "2016-03-30T16:24:48.789Z"
            },
            "$version": 23
        },
        "reported": {
            "telemetryConfig": {
                "sendFrequency": "5m",
                "status": "success"
            },
            "batteryLevel": "55%",
            "$metadata": {
                "telemetryConfig": {
                    "sendFrequency": "5m",
                    "status": {
                        "$lastUpdated": "2016-03-31T16:35:48.789Z"
                    },
                    "$lastUpdated": "2016-03-31T16:35:48.789Z"
                },
                "batteryLevel": {
                    "$lastUpdated": "2016-04-01T16:35:48.789Z"
                },
                "$lastUpdated": "2016-04-01T16:24:48.789Z"
            },
            "$version": 123
        }
    }
    ...
}

Essas informações são armazenadas em cada nível (não apenas nas folhas da estrutura JSON) a fim de preservar as atualizações que removem chaves de objeto.This information is kept at every level (not just the leaves of the JSON structure) to preserve updates that remove object keys.

Simultaneidade otimistaOptimistic concurrency

Marcas, propriedades desejadas e reportadas oferecem suporte à simultaneidade otimista.Tags, desired, and reported properties all support optimistic concurrency. Marcas tem uma Etag, de acordo com RFC7232, que representa a representação JSON da marca.Tags have an ETag, as per RFC7232, that represents the tag's JSON representation. Você pode usar ETags em operações de atualização condicionais do back-end da solução para garantir a consistência.You can use ETags in conditional update operations from the solution back end to ensure consistency.

As propriedades desejadas e reportadas do dispositivo gêmeo não têm as ETags, mas um valor $version com garantia de ser incremental.Device twin desired and reported properties do not have ETags, but have a $version value that is guaranteed to be incremental. De forma semelhante a uma ETag, a versão pode ser usada pela parte de atualização para impor a consistência das atualizações.Similarly to an ETag, the version can be used by the updating party to enforce consistency of updates. Por exemplo, um aplicativo de dispositivo para uma propriedade relatada ou o back-end de solução para uma propriedade desejada.For example, a device app for a reported property or the solution back end for a desired property.

Versões também são úteis quando um agente observador (por exemplo, o aplicativo do dispositivo que observa as propriedades desejadas) deve reconciliar corridas entre o resultado de uma operação de recuperação e uma notificação de atualização.Versions are also useful when an observing agent (such as the device app observing the desired properties) must reconcile races between the result of a retrieve operation and an update notification. A seção Fluxo de reconexão do dispositivo fornece mais informações.The Device reconnection flow section provides more information.

Fluxo de reconexão do dispositivoDevice reconnection flow

O Hub IoT não preserva notificações de atualização de propriedades desejadas para dispositivos desconectados.IoT Hub does not preserve desired properties update notifications for disconnected devices. Acontece que um dispositivo que está se conectando deve recuperar o documento completo de propriedades desejadas, além de se inscrever para receber notificações de atualização.It follows that a device that is connecting must retrieve the full desired properties document, in addition to subscribing for update notifications. Considerando a possibilidade de corridas entre notificações de atualização e recuperação completa, o seguinte fluxo deve ser garantido:Given the possibility of races between update notifications and full retrieval, the following flow must be ensured:

  1. O aplicativo de dispositivo conecta-se a um Hub IoT.Device app connects to an IoT hub.
  2. O aplicativo de dispositivo se inscreve para as notificações de atualização de propriedades desejadas .Device app subscribes for desired properties update notifications.
  3. O aplicativo de dispositivo recupera o documento completo para as propriedades desejadas.Device app retrieves the full document for desired properties.

O aplicativo de dispositivo pode ignorar todas as notificações com $version menor ou igual à versão do documento recuperado completo.The device app can ignore all notifications with $version less or equal than the version of the full retrieved document. Essa abordagem é possível porque o Hub IoT garante que as versões sempre aumentam.This approach is possible because IoT Hub guarantees that versions always increment.

Observação

Essa lógica já está implementada nos SDKs do dispositivo IoT do Azure.This logic is already implemented in the Azure IoT device SDKs. Essa descrição será útil somente se o aplicativo de dispositivo não puder usar qualquer um dos SDKs do dispositivo IoT do Azure, e deve programar a interface MQTT diretamente.This description is useful only if the device app cannot use any of Azure IoT device SDKs and must program the MQTT interface directly.

Material de referência adicionalAdditional reference material

Outros tópicos de referência no Guia do desenvolvedor do Hub IoT incluem:Other reference topics in the IoT Hub developer guide include:

Próximas etapasNext steps

Agora que você aprendeu sobre dispositivos gêmeos, pode ser interessante ler os seguintes tópicos do Guia do desenvolvedor do Hub IoT:Now you have learned about device twins, you may be interested in the following IoT Hub developer guide topics:

Para experimentar alguns dos conceitos descritos neste artigo, consulte os tutoriais do Hub IoT a seguir:To try out some of the concepts described in this article, see the following IoT Hub tutorials: