Yandex.Cloud
  • Сервисы
  • Почему Yandex.Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Yandex IoT Core
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Отправка сообщения
    • Подписка устройства или реестра на получение сообщений
    • Просмотр журнала подключений
    • Создание триггера для топика
    • Управление реестрами
      • Получение информации о реестре
      • Создание реестра
      • Изменение реестра
      • Удаление реестра
    • Управление устройствами
      • Управление алиасами топиков
        • Создание алиаса
        • Получение списка алиасов
        • Изменение алиаса
        • Удаление алиаса
      • Получение информации об устройстве
      • Создание устройства
      • Изменение устройства
      • Удаление устройства
    • Управление сертификатами
      • Создание сертификата
      • Управление сертификатами реестра
      • Управление сертификатами устройства
    • Управление паролями
      • Управление паролями реестра
      • Управление паролями устройства
  • Концепции
    • Авторизация
    • Взаимосвязь ресурсов сервиса
    • Параметры подключения MQTT-брокера
    • Отправка сообщений MQTT-брокеру через gRPC
    • Топик
    • Резервное копирование
    • Квоты и лимиты
  • Сценарии использования
    • Все сценарии
    • Работа с помощью Mosquitto
      • Отправить сообщение
      • Подписать устройство или реестр на получение сообщений
    • Работа с Yandex IoT Core с устройства с Android на языке Java
    • Работа с Yandex IoT Core на языке C#
    • Работа с Yandex IoT Core на языке Java
    • Запись данных с устройства в Managed Service for PostgreSQL
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC
      • Обзор
      • DeviceService
      • RegistryService
      • OperationService
    • REST
      • Обзор
      • Device
        • Обзор
        • addCertificate
        • addPassword
        • create
        • delete
        • deleteCertificate
        • deletePassword
        • get
        • list
        • listCertificates
        • listOperations
        • listPasswords
        • update
      • Registry
        • Обзор
        • addCertificate
        • addPassword
        • create
        • delete
        • deleteCertificate
        • deletePassword
        • get
        • list
        • listCertificates
        • listDeviceTopicAliases
        • listOperations
        • listPasswords
        • update
  • Вопросы и ответы
  1. Сценарии использования
  2. Работа с Yandex IoT Core с устройства с Android на языке Java

Работа с Yandex IoT Core с устройства с Android на языке Java

  • Перед началом работы
  • Создайте необходимые ресурсы Yandex IoT Core
    • Создайте реестр и добавьте ему сертификат
    • Создайте устройство и добавьте ему сертификат
  • Подключитесь к Yandex IoT Core
  • Авторизуйтесь в Yandex IoT Core
    • Авторизация с помощью X.509-сертификатов
    • Авторизация по логину и паролю
  • Установите соединение
  • Подпишитесь на топик и принимайте сообщения с данными
  • Отправьте сообщение с данными
  • Завершите соединение

В этом сценарии вы узнаете как подключиться к Yandex IoT Core с устройства Android с помощью библиотеки Paho и языка программирования Java. Данный сценарий предполагает, что вы имеету навыки разработки для операционной системы Android на языке Java в Android Studio.

Примечание

Исходный код, который используется в этом сценарии, доступен на GitHub.

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

  • Отправлять сообщения.
  • Подписывать устройство или реестр на получение сообщений.

Чтобы подключиться к Yandex IoT Core и начать обмен сообщениями:

  • Перед началом работы
  • Создайте необходимые ресурсы Yandex IoT Core
    • Создайте реестр и добавьте ему сертификат
    • Создайте устройство и добавьте ему сертификат
  • Подключитесь к Yandex IoT Core
  • Авторизуйтесь в Yandex IoT Core
    • Авторизация с помощью X.509-сертификатов
    • Авторизация по логину и паролю
  • Установите соединение
  • Подпишитесь на топик и принимайте сообщения с данными
  • Отправьте сообщение с данными
  • Завершите соединение

Перед началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex.Cloud, установите и инициализируйте его.
  2. Скачайте и установите Android Studio — среду разработки для операционной системы Android.

Создайте необходимые ресурсы Yandex IoT Core

Создайте реестр и добавьте ему сертификат

Если у вас уже есть сертификат, перейдите сразу ко второму шагу.

  1. Создайте сертификат для реестра (пропустите этот шаг, если у вас уже есть сертификат реестра):

     $ openssl req -x509 \
         -newkey rsa:4096 \
         -keyout registry-key.pem \
         -out registry-cert.pem \
         -nodes \
         -days 365 \
         -subj '/CN=localhost'
    
  2. Создайте реестр:

    $ yc iot registry create --name my-registry
    
  3. Добавьте сертификат реестру:

    $ yc iot registry certificate add \
    --registry-name my-registry \ # Имя реестра.
    --certificate-file registry-cert.pem # Путь к публичной части сертификата.
    

Создайте устройство и добавьте ему сертификат

Если у вас уже есть сертификат, перейдите сразу ко второму шагу.

  1. (опционально) Создайте сертификат для устройства:

     $ openssl req -x509 \
         -newkey rsa:4096 \
         -keyout device-key.pem \
         -out device-cert.pem \
         -nodes \
         -days 365 \
         -subj '/CN=localhost'
    
  2. Создайте устройство:

    $ yc iot registry create --name my-registry
    
  3. Добавьте сертификат устройству:

    $ yc iot registry certificate add \
    --registry-name my-registry \ # Имя реестра.
    --certificate-file registry-cert.pem # Путь к публичной части сертификата.
    

Подключитесь к Yandex IoT Core

Перед подключением настройте параметры соединения с помощью следующего кода:

String clientId = "YandexIoTCoreAndroidTextClient";  
int connectionTimeout = 60;
int keepAliveInterval = 60;      
MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(getApplicationContext(),"ssl://mqtt.cloud.yandex.net:8883", clientId);

// Настройка параметров соединения.
MqttConnectOptions options = new MqttConnectOptions();
options.setKeepAliveInterval(keepAliveInterval);

В котором:

  • MqttAndroidClient — класс, в котором указываются параметры подключения к Yandex IoT Core. Адрес, порт и идентификатор клиента.
  • MqttConnectOptions — класс для установки параметров соединения. Вы можете оставить настройки по умолчанию, но рекомендуется задать параметр KeepAliveInterval. От его значения зависит частота отправки команд PINGREQ. Чем меньше данный параметр, тем быстрее клиент понимает, что соединение было разорвано нештатным путем. Но для этого чаще отправляются тарифицируемые команды PINGREQ.

Авторизуйтесь в Yandex IoT Core

Есть два способа авторизации:

  • С помощью X.509-сертификатов.
  • По логину и паролю.

Авторизация с помощью X.509-сертификатов

Для такого вида авторизации удобнее всего использовать сертификаты PKCS#12 в PFX-формате. Сгенерировать сертификат в PKCS#12-формате из PEM- сертификатов можно с помощью команды:

openssl pkcs12 -export -in cert.pem -inkey key.pem -out keystore.p12

Для загрузки сертификатов в проекте используйте метод:

private SSLSocketFactory getSocketFactory(final InputStream caCrtFile, final InputStream devCert, final String password)

Загрузка сертификатов происходит в несколько этапов:

  1. Загрузите сертификат, используемый для аутентификации сервера:

    // Загрузка сертификата удостоверяющего центра.
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate caCert = (X509Certificate) cf.generateCertificate(caCrtFile);
    
    // Использование сертификата удостоверяющего центра для аутентификации сервера.
    KeyStore serverCaKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    serverCaKeyStore.load(null, null);
    serverCaKeyStore.setCertificateEntry("ca", caCert);
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(serverCaKeyStore);
    
  2. Загрузите сертификат клиента, используемый для авторизации на сервере:

    KeyStore clientKeystore = KeyStore.getInstance("PKCS12");
    clientKeystore.load(devCert, password.toCharArray());
    

В результате метод возвращает AdditionalKeyStoresSSLSocketFactory:

return new AdditionalKeyStoresSSLSocketFactory(clientKeystore, serverCaKeyStore);

Класс AdditionalKeyStoresSSLSocketFactory является наследником SSLSocketFactory и используется для работы с самоподписными сертификатами. На последнем этапе полученный выше sslSocketFactory нужно передать в параметры соединения:

options.setSocketFactory(sslSocketFactory);

Авторизация по логину и паролю

Так как Yandex IoT Core требует TLS-протокол при авторизации с помощью логина и пароля, инициализируйте класс AdditionalKeyStoresSSLSocketFactory с помощью метода:

private SSLSocketFactory getSocketFactory(final InputStream caCrtFile, final InputStream devCert, final String password)

В качестве devCert передайте значение null. В этом случае будет загружен только сертификат удостоверяющего центра сервера:

// Load CA certificate    
CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate caCert = (X509Certificate) cf.generateCertificate(caCrtFile);

// CA certificate is used to authenticate server
KeyStore serverCaKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
serverCaKeyStore.load(null, null);
serverCaKeyStore.setCertificateEntry("ca", caCert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(serverCaKeyStore);

return new AdditionalKeyStoresSSLSocketFactory(null, serverCaKeyStore);

В настройках соединения укажите логин (идентификатор реестра или устройства) и пароль:

options.setUserName(mqttUserName);
options.setPassword(mqttPassword.toCharArray());

и SSLSocketFactory, полученный из кода выше:

options.setSocketFactory(sslSocketFactory);

Установите соединение

Установите соединение с Yandex IoT Core с помощью следующего кода:

mqttAndroidClient.connect(options,null, new IMqttActionListener() {
   @Override
   public void onSuccess(IMqttToken asyncActionToken) {
   }

   @Override
   public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
   }
});

Подпишитесь на топик и принимайте сообщения с данными

Для обработки полученных данных используйте функцию обратного вызова:

mqttAndroidClient.setCallback(new MqttCallback() {
   @Override
   public void messageArrived(String topic, MqttMessage message) throws Exception {   }
});

Подпишитесь на топик с помощью следующего кода. В методе subscribe нужно указать топик, на который вы хотите подписаться, и уровень качества обслуживания.

IMqttToken subToken = mqttAndroidClient.subscribe(topic, qos);
subToken.setActionCallback(new IMqttActionListener() {
   @Override
   public void onSuccess(IMqttToken asyncActionToken) {
       // Публикация сообщения.
   }

   @Override
   public void onFailure(IMqttToken asyncActionToken,
                         Throwable exception) {
       // Подписка на сообщение не может быть выполнена. Возможно, пользователь не был
       // авторизован для подписки на указанный топик.
       System.out.println("Failed to subscribe");
   }
});

Отправьте сообщение с данными

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

IMqttDeliveryToken publish = mqttAndroidClient.publish("<топик>", new MqttMessage("Your message text.".getBytes()));

Обрабатывайте события об обрыве связи и отслеживайте доставку сообщений с помощью функций обратного вызова:

mqttAndroidClient.setCallback(new MqttCallback() {
   @Override
   public void connectionLost(Throwable cause) {

   }
, MqttMessage message) throws Exception {   }

   @Override
   public void deliveryComplete(IMqttDeliveryToken token) {

   }
});

Завершите соединение

Завершите соединение с Yandex IoT Core с помощью методов:

mqttAndroidClient.disconnect();
mqttAndroidClient.close();

Где:

  • Метод disconnect закрывает соединение с сервером.
  • Метод close освобождает ресурсы класса MqttAndroidClient.
В этой статье:
  • Перед началом работы
  • Создайте необходимые ресурсы Yandex IoT Core
  • Создайте реестр и добавьте ему сертификат
  • Создайте устройство и добавьте ему сертификат
  • Подключитесь к Yandex IoT Core
  • Авторизуйтесь в Yandex IoT Core
  • Авторизация с помощью X.509-сертификатов
  • Авторизация по логину и паролю
  • Установите соединение
  • Подпишитесь на топик и принимайте сообщения с данными
  • Отправьте сообщение с данными
  • Завершите соединение
Language
Вакансии
Политика конфиденциальности
Условия использования
© 2021 ООО «Яндекс.Облако»