Enviar mensagens da cloud para o dispositivo com Hub IoT (Java)

Hub IoT do Azure é um serviço totalmente gerido que ajuda a permitir comunicações bidirecionais fiáveis e seguras entre milhões de dispositivos e uma solução de back-end.

Este artigo mostra-lhe como:

  • Enviar mensagens de cloud para dispositivo (C2D) a partir do back-end da solução para um único dispositivo através de Hub IoT

  • Receber mensagens da cloud para o dispositivo num dispositivo

  • Pedir a confirmação da entrega (feedback), a partir do back-end da solução, para mensagens enviadas para um dispositivo a partir de Hub IoT

Nota

As funcionalidades descritas neste artigo só estão disponíveis no escalão padrão de Hub IoT. Para obter mais informações sobre as camadas de Hub IoT básicas e padrão/gratuitas, consulte Escolher o escalão de Hub IoT adequado para a sua solução.

No final deste artigo, vai executar duas aplicações de consola Java:

  • HandleMessages: uma aplicação de dispositivo de exemplo incluída com o SDK IoT do Microsoft Azure para Java, que se liga ao hub IoT e recebe mensagens da cloud para o dispositivo.

  • SendCloudToDevice: envia uma mensagem da cloud para o dispositivo para a aplicação do dispositivo através de Hub IoT e, em seguida, recebe a confirmação da entrega.

Nota

Hub IoT tem suporte do SDK para muitas plataformas e idiomas de dispositivos (C, Java, Python e JavaScript) através dos SDKs de dispositivos IoT do Azure.

Para saber mais sobre as mensagens da cloud para o dispositivo, consulte Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Pré-requisitos

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Um hub IoT na sua subscrição do Azure. Se ainda não tiver um hub, pode seguir os passos em Criar um hub IoT.

  • Um dispositivo registado no hub IoT. Se ainda não registou um dispositivo, registe um no portal do Azure.

  • Este artigo utiliza código de exemplo do SDK do Azure IoT para Java.

    • Transfira ou clone o repositório do SDK do GitHub para o seu computador de desenvolvimento.
    • Certifique-se de que o Java SE Development Kit 8 está instalado no seu computador de desenvolvimento. Certifique-se de que seleciona Java 8 em Suporte de longo prazo para aceder às transferências do JDK 8.
  • Maven 3

  • Certifique-se de que a porta 8883 está aberta na firewall. O exemplo de dispositivo neste artigo utiliza o protocolo MQTT, que comunica através da porta 8883. Esta porta pode ser bloqueada em alguns ambientes de rede empresarial e educacional. Para obter mais informações e formas de resolver este problema, veja Ligar ao Hub IoT (MQTT).

Obter a cadeia de ligação do dispositivo

Neste artigo, vai executar uma aplicação de exemplo que simula um dispositivo, que recebe mensagens da cloud para o dispositivo enviadas através da sua Hub IoT. A aplicação de exemplo HandleMessages incluída com o SDK IoT do Microsoft Azure para Java liga-se ao seu hub IoT e atua como o seu dispositivo simulado. O exemplo utiliza a cadeia de ligação primária do dispositivo registado no hub IoT.

Para obter a cadeia de ligação primária de um dispositivo registado no hub IoT, siga estes passos:

  1. Na portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos onde o hub está localizado e, em seguida, selecione o seu hub na lista de recursos.

  2. No painel esquerdo do hub IoT, em Gestão de Dispositivos, selecione Dispositivos.

  3. Na lista de dispositivos, selecione o dispositivo adequado.

  4. Copie a cadeia de ligação Primária e guarde o valor.

    Captura de ecrã que mostra como obter a cadeia de ligação primária de um dispositivo registado no hub IoT no portal do Azure.

Receber mensagens na aplicação do dispositivo

Nesta secção, execute a aplicação de dispositivo de exemplo HandleMessages para receber mensagens C2D enviadas através do hub IoT. Abra uma nova linha de comandos e navegue para a pasta azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages , na pasta onde expandiu o SDK Java do Azure IoT. Execute os seguintes comandos, substituindo o valor do {Your device connection string} marcador de posição pela cadeia de ligação do dispositivo que copiou do dispositivo registado no hub IoT.

mvn clean package -DskipTests
java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"

O resultado seguinte é da aplicação de dispositivo de exemplo depois de ter iniciado e ligado com êxito ao seu hub IoT:

5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
     
Starting...
Beginning setup.
Successfully read input parameters.
Using communication protocol MQTT.
2023-05-23 09:51:06,062 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,187 DEBUG (main) [com.microsoft.azure.sdk.iot.device.ClientConfiguration] - Device configured to use software based SAS authentication provider
2023-05-23 09:51:06,187 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,202 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.5
Successfully created an IoT Hub client.
Successfully set message callback.
2023-05-23 09:51:06,205 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
2023-05-23 09:51:06,218 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/#
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/# was acknowledged
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details

CONNECTION STATUS UPDATE: CONNECTED
CONNECTION STATUS REASON: CONNECTION_OK
CONNECTION STATUS THROWABLE: null

The connection was successfully established. Can send messages.
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
2023-05-23 09:51:07,408 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
Opened connection to IoT Hub. Messages sent to this device will now be received.
Press any key to exit...

O execute método na AppMessageCallback classe devolve IotHubMessageResult.COMPLETE. Este estado notifica Hub IoT que a mensagem foi processada com êxito e que a mensagem pode ser removida em segurança da fila do dispositivo. O dispositivo deve devolver este valor quando o processamento for concluído com êxito, independentemente do protocolo que estiver a utilizar.

Com AMQP e HTTPS, mas não MQTT, o dispositivo também pode:

  • Abandone uma mensagem, o que resulta em Hub IoT manter a mensagem na fila do dispositivo para consumo futuro.
  • Rejeitar uma mensagem, que remove permanentemente a mensagem da fila do dispositivo.

Se ocorrer algo que impeça o dispositivo de concluir, abandonar ou rejeitar a mensagem, Hub IoT colocará a mensagem novamente em fila após um período de tempo limite fixo. Por este motivo, a lógica de processamento de mensagens na aplicação do dispositivo tem de ser idempotente, para que receber a mesma mensagem várias vezes produza o mesmo resultado.

Para obter mais informações sobre o ciclo de vida das mensagens da cloud para o dispositivo e como Hub IoT processa mensagens da cloud para o dispositivo, consulte Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Nota

Se utilizar HTTPS em vez de MQTT ou AMQP como transporte, a instância DeviceClient verifica se existem mensagens de Hub IoT com pouca frequência (um mínimo de 25 em 25 minutos). Para obter mais informações sobre as diferenças entre o suporte MQTT, AMQP e HTTPS, veja Orientação de comunicações da cloud para dispositivo e Escolha um protocolo de comunicação.

Obter a cadeia de ligação do hub IoT

Neste artigo, vai criar um serviço de back-end para enviar mensagens da cloud para o dispositivo através do seu Hub IoT. Para enviar mensagens da cloud para o dispositivo, o seu serviço precisa da permissão de ligação do serviço . Por predefinição, todas as Hub IoT são criadas com uma política de acesso partilhado denominada serviço que concede esta permissão.

Para obter a cadeia de ligação Hub IoT para a política de serviço, siga estes passos:

  1. Na portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos onde o hub está localizado e, em seguida, selecione o seu hub na lista de recursos.

  2. No painel do lado esquerdo do hub IoT, selecione Políticas de acesso partilhado.

  3. Na lista de políticas, selecione a política de serviço .

  4. Copie a cadeia de ligação Primária e guarde o valor.

Captura de ecrã que mostra como obter a cadeia de ligação do Hub IoT no portal do Azure.

Para obter mais informações sobre Hub IoT políticas e permissões de acesso partilhado, veja Controlo de acesso e permissões.

Enviar uma mensagem da cloud para o dispositivo

Nesta secção, vai criar uma aplicação de consola Java que envia mensagens da cloud para o dispositivo para a aplicação de dispositivo simulado. Precisa do ID do dispositivo do seu dispositivo e da cadeia de ligação do hub IoT.

  1. Crie um projeto maven denominado send-c2d-messages com o seguinte comando na linha de comandos. Tenha em atenção que este comando é um comando único e longo:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Na linha de comandos, navegue para a nova pasta send-c2d-messages.

  3. Com um editor de texto, abra o ficheiro pom.xml na pasta send-c2d-messages e adicione a seguinte dependência ao nó de dependências . Adicionar a dependência permite-lhe utilizar o pacote iothub-java-service-client na sua aplicação para comunicar com o seu serviço hub IoT:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-service-client</artifactId>
      <version>1.7.23</version>
    </dependency>
    

    Nota

    Pode verificar a versão mais recente do iot-service-client utilizando a pesquisa Maven.

  4. Guarde e feche o ficheiro pom.xml.

  5. Com um editor de texto, abra o ficheiro send-c2d-messages\src\main\java\com\mycompany\app\App.java.

  6. Adicione as seguintes declarações de importação ao ficheiro:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Adicione as seguintes variáveis de nível de classe à classe App , substituindo {yourhubconnectionstring} e {yourdeviceid} pelos valores que anotou anteriormente:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. Substitua o método principal pelo seguinte código. Este código liga-se ao seu hub IoT, envia uma mensagem para o seu dispositivo e, em seguida, aguarda uma confirmação de que o dispositivo recebeu e processou a mensagem:

    public static void main(String[] args) throws IOException,
        URISyntaxException, Exception {
      ServiceClient serviceClient = ServiceClient.createFromConnectionString(
        connectionString, protocol);
    
      if (serviceClient != null) {
        serviceClient.open();
        FeedbackReceiver feedbackReceiver = serviceClient
          .getFeedbackReceiver();
        if (feedbackReceiver != null) feedbackReceiver.open();
    
        Message messageToSend = new Message("Cloud to device message.");
        messageToSend.setDeliveryAcknowledgement(DeliveryAcknowledgement.Full);
    
        serviceClient.send(deviceId, messageToSend);
        System.out.println("Message sent to device");
    
        FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000);
        if (feedbackBatch != null) {
          System.out.println("Message feedback received, feedback time: "
            + feedbackBatch.getEnqueuedTimeUtc().toString());
        }
    
        if (feedbackReceiver != null) feedbackReceiver.close();
        serviceClient.close();
      }
    }
    

    Nota

    Para simplificar, este artigo não implementa uma política de repetição. No código de produção, deve implementar políticas de repetição (como o backoff exponencial), conforme sugerido no artigo Processamento Transitório de Falhas.

  9. Para criar a aplicação send-c2d-messages com o Maven, execute o seguinte comando na linha de comandos na pasta simulated-device:

    mvn clean package -DskipTests
    

Executar as aplicações

Está agora pronto para executar as aplicações.

  1. Numa linha de comandos na pasta azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages , execute os seguintes comandos, substituindo o valor do {Your device connection string} marcador de posição pela cadeia de ligação do dispositivo que copiou do dispositivo registado no seu hub IoT. Este passo inicia a aplicação de dispositivo de exemplo, que envia telemetria para o seu hub IoT e escuta as mensagens da cloud para o dispositivo enviadas a partir do seu hub:

    java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"
    

    Captura de ecrã da aplicação de dispositivo de exemplo em execução numa janela da consola.

  2. Numa linha de comandos na pasta send-c2d-messages , execute o seguinte comando para enviar uma mensagem da cloud para o dispositivo e aguarde pela confirmação de comentários:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    Captura de ecrã a mostrar a aplicação de serviço de exemplo em execução numa janela da consola.

Passos seguintes

No artigo, aprendeu a enviar e receber mensagens da cloud para o dispositivo.