Отправка сообщений из облака на устройство с помощью Центра Интернета вещей (Java)

Центр Интернета вещей Azure — это полностью управляемая служба, которая обеспечивает надежный и защищенный двунаправленный обмен данными между миллионами устройств и серверной частью решения.

В этой статье показано, как выполнить следующие действия:

  • Отправка сообщений из облака на устройство (C2D) из серверной части решения на одно устройство через Центр Интернета вещей

  • Получение на устройстве сообщений, передаваемых из облака на устройство

  • Запрос из серверной части решения подтверждения доставки (отзыва) для сообщений, отправленных на устройство из Центра Интернета вещей

Примечание

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и стандартных и бесплатных уровнях Центр Интернета вещей см. в статье Выбор подходящего уровня Центр Интернета вещей для решения.

В конце этой статьи вы запустите два консольных приложения Java:

  • HandleMessages— пример приложения устройства, входящего в состав пакета SDK Для Интернета вещей Microsoft Azure для Java, который подключается к Центру Интернета вещей и получает сообщения из облака на устройство.

  • SendCloudToDevice: отправляет сообщение из облака в приложение устройства с помощью Центра Интернета вещей, а затем получает подтверждение о его доставке.

Примечание

В Центре Интернета вещей реализована поддержка для пакетов SDK для многих платформ устройств и языков (C, Java, Python и Javascript). Эти пакеты работают на основе пакетов SDK для устройств Azure IoT.

Дополнительные сведения о сообщениях из облака на устройство см. в статье Отправка сообщений из облака на устройство из Центра Интернета вещей.

Предварительные требования

  • Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

  • Центр Интернета вещей в подписке Azure. Если у вас еще нет центра, выполните действия, описанные в разделе Создание центра Интернета вещей.

  • Устройство, зарегистрированное в центре Интернета вещей. Если вы еще не зарегистрировали устройство, зарегистрируйте его в портал Azure.

  • В этой статье используется пример кода из пакета SDK Для Интернета вещей Azure для Java.

    • Скачайте или клонируйте репозиторий SDK из GitHub на компьютер разработки.
    • Убедитесь, что пакет средств разработки Java SE 8 установлен на компьютере разработки. Щелкните ссылку Java 8 в разделе Долгосрочная поддержка, чтобы скачать все необходимое для работы с JDK 8.
  • Maven 3

  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

Получение строки подключения устройства

В этой статье вы запустите пример приложения, имитирующий устройство, которое получает сообщения из облака на устройство, отправляемые через Центр Интернета вещей. Пример приложения HandleMessages , входящий в состав пакета SDK Для Интернета вещей Microsoft Azure для Java , подключается к Центру Интернета вещей и выступает в качестве имитированного устройства. В примере используется основная строка подключения зарегистрированного устройства в Центре Интернета вещей.

Чтобы получить основную строку подключения для устройства, зарегистрированного в Центре Интернета вещей, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой области Центра Интернета вещей в разделе Управление устройствами выберите Устройства.

  3. В списке устройств выберите соответствующее устройство.

  4. Скопируйте основную строку подключения и сохраните значение.

    Снимок экрана: получение основной строки подключения для устройства, зарегистрированного в Центре Интернета вещей в портал Azure.

Получение сообщений в приложении для устройства

В этом разделе запустите пример приложения для устройства HandleMessages , чтобы получать сообщения C2D, отправленные через Центр Интернета вещей. Откройте новую командную строку и перейдите в папку azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages в папке, в которой вы развернете пакет SDK для Java для Интернета вещей Azure. Выполните следующие команды, заменив {Your device connection string} значение заполнителя строкой подключения устройства, скопированной с зарегистрированного устройства в Центре Интернета вещей.

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

Ниже приведены выходные данные из примера приложения для устройства после успешного запуска и подключения к Центру Интернета вещей:

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...

Метод execute в классе AppMessageCallback возвращает IotHubMessageResult.COMPLETE. Это состояние уведомляет Центр Интернета вещей о том, что сообщение успешно обработано и что сообщение можно безопасно удалить из очереди устройств. Устройство должно возвращать это значение при успешном завершении обработки, независимо от используемого протокола.

Если используется AMQP и HTTPS, но не MQTT, устройство также может:

  • отказаться от сообщения, и тогда Центр Интернета вещей будет хранить сообщение в очереди для последующей обработки.
  • Отклонить сообщение, которое окончательно удаляет его из очереди устройств.

Если по какой-либо причине устройство не сможет завершить обработку сообщения, отказаться от него или отклонить его, Центр Интернета вещей после фиксированного периода ожидания снова поместит сообщение в очередь для доставки. Поэтому логика обработки сообщений в приложении устройства должна быть идемпотентной. Это обеспечит одинаковый результат при многократном получении одного и того же сообщения.

Дополнительные сведения о том, как Центр Интернета вещей обрабатывает сообщения из облака на устройство, включая сведения об их жизненном цикле, см. в этой статье.

Примечание

Если в качестве транспорта вместо MQTT или AMQP используется HTTPS, экземпляр DeviceClient редко проверяет наличие сообщений от Центра Интернета вещей (не чаще, чем каждые 25 минут). Дополнительные сведения о различиях между MQTT, AMQP и HTTPS см. в статьях Руководство по обмену данными между облаком и устройством и Выбор протокола связи.

Получение строки подключения центра Интернета вещей

В этой статье вы создадите серверную службу для отправки сообщений из облака на устройство через Центр Интернета вещей. Для отправки сообщений из облака на устройство службе требуется разрешение service connect. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра Интернета вещей выберите Политики общего доступа.

  3. В списке политик выберите политику службы.

  4. Скопируйте основную строку подключения и сохраните значение.

Снимок экрана: извлечение строки подключения из Центра Интернета вещей на портале Azure.

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Отправка сообщения из облака на устройство

В этом разделе вам предстоит создать консольное приложение Java, которое отправляет сообщения, передаваемые из облака на устройство, в приложение имитации устройства. Вам потребуется идентификатор вашего устройства и строка подключения к Центру Интернета вещей.

  1. Создайте проект Maven send-c2d-messages, выполнив следующую команду в командной строке. Обратите внимание, что это одна длинная команда.

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. В командной строке перейдите к новой папке send-c2d-messages.

  3. Откройте в текстовом редакторе файл pom.xml из папки send-c2d-messages и добавьте зависимость, приведенную ниже, в узел dependencies . Добавление зависимости позволяет использовать в приложении пакет iothub-java-service-client для обмена данными со службой Центра Интернета вещей.

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

    Примечание

    Наличие последней версии пакета iot-service-client можно проверить с помощью поиска Maven.

  4. Сохраните и закройте файл pom.xml.

  5. Откройте в текстовом редакторе файл send-c2d-messages\src\main\java\com\mycompany\app\App.java.

  6. Добавьте в файл следующие инструкции import .

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Добавьте следующие переменные уровня класса в класс App, заменив {yourhubconnectionstring} и {yourdeviceid} значениями, записанными ранее:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. Замените метод main следующим кодом, который подключается к Центру Интернета вещей, отправляет сообщение на устройство, а затем ждет подтверждения о том, что устройство получило и обработало это сообщение.

    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();
      }
    }
    

    Примечание

    Для упрощения в этой статье не реализуются политики повтора. В рабочем коде следует реализовать политики повторных попыток (например, с экспоненциальной задержкой), как указано в статье Обработка временных сбоев.

  9. Чтобы создать приложение send-c2d-messages с помощью Maven, выполните следующую команду в командной строке в папке simulated-device:

    mvn clean package -DskipTests
    

Запуск приложений

Теперь вы готовы к запуску приложений.

  1. В командной строке в папке azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages выполните следующие команды, заменив {Your device connection string} значение заполнителя строкой подключения устройства, скопированной с зарегистрированного устройства в Центре Интернета вещей. На этом шаге запускается пример приложения для устройства, которое отправляет данные телеметрии в Центр Интернета вещей и прослушивает сообщения из облака на устройство, отправляемые из центра:

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

    Снимок экрана: пример приложения устройства, запущенного в окне консоли.

  2. В командной строке в папке send-c2d-messages выполните следующую команду, чтобы отправить сообщение из облака на устройство и дождаться подтверждения обратной связи:

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

    Снимок экрана: пример приложения службы, запущенного в окне консоли.

Дальнейшие действия

Из этой статьи вы научились отправлять и получать сообщения из облака на устройство.