Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
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 (англ.)
      • Overview
      • DeviceDataService
      • DeviceService
      • RegistryDataService
      • RegistryService
      • OperationService
    • REST (англ.)
      • Overview
      • DeviceData
        • Overview
        • publish
      • Device
        • Overview
        • addCertificate
        • addPassword
        • create
        • delete
        • deleteCertificate
        • deletePassword
        • get
        • getByName
        • list
        • listCertificates
        • listOperations
        • listPasswords
        • update
      • RegistryData
        • Overview
        • publish
      • Registry
        • Overview
        • addCertificate
        • addPassword
        • create
        • delete
        • deleteCertificate
        • deletePassword
        • get
        • getByName
        • list
        • listCertificates
        • listDeviceTopicAliases
        • listOperations
        • listPasswords
        • update
  • Вопросы и ответы
  1. Практические руководства
  2. Работа с Yandex IoT Core на языке C#

Работа с Yandex IoT Core на языке C#

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

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

Примечание

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

После подключения вы сможете:

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

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

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

Подготовьтесь к работе

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

Создайте необходимые ресурсы 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. Посмотрите список реестров, в которых можно создать устройство, или создайте новый реестр.

  3. Создайте устройство:

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

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

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

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

// Настройка TLS-соединения
MqttClientOptionsBuilderTlsParameters tlsOptions = new MqttClientOptionsBuilderTlsParameters
{
  SslProtocol = SslProtocols.Tls12,
  UseTls = true
};

// Подключение обработчика для валидации сервера
tlsOptions.CertificateValidationCallback += CertificateValidationCallback;

// Настройка параметров соединения
var options = new MqttClientOptionsBuilder()
    .WithClientId($"Test_C#_Client_{Guid.NewGuid()}")
    .WithTcpServer(MqttServer, MqttPort)
    .WithTls(tlsOptions)
    .WithCleanSession()
    .WithCredentials(id, password)
    .WithKeepAlivePeriod(TimeSpan.FromSeconds(90))
    .WithKeepAliveSendInterval(TimeSpan.FromSeconds(60))
    .Build();

var factory = new MqttFactory();
IMqttClient mqttClient = factory.CreateMqttClient();

// Подключение обработчика события о получении данных
mqttClient.UseApplicationMessageReceivedHandler(DataHandler);

// Подключение обработчика события о соединении с Yandex IoT Core
mqttClient.UseConnectedHandler(ConnectedHandler);

// Подключение обработчика события о потери связи с Yandex IoT Core
mqttClient.UseDisconnectedHandler(DisconnectedHandler);

Где:

  • MqttClientOptionsBuilderTlsParameters — класс, в котором указываются параметры использования TLS при подключении к Yandex IoT Core.
  • MqttClientOptionsBuilder — класс-конструктор для установки параметров соединения. Вы можете оставить настройки по умолчанию, но рекомендуется задать параметры WithKeepAlivePeriod и WithKeepAliveSendInterval. От значения этих параметров зависит:
    • Частота отправки команд PINGREQ.

    • Время реакции клиента на обрыв соединения.

      Чем меньше значения указанных параметров, тем быстрее клиент понимает, что соединение было разорвано нештатным путем. Но для этого чаще отправляются тарифицируемые команды PINGREQ.

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

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

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

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

При авторизации с помощью X.509-сертификатов удобнее всего использовать сертификаты PKCS#12 в PFX-формате. Чтобы сгенерировать сертификат в PKCS#12-формате из PEM-сертификатов, выполните команду:

openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem

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

X509Certificate2 certificate = new X509Certificate2(certPath);

Сертификат клиента, применяемый для авторизации на сервере, указывается при настройке TLS-соединения:

X509Certificate2 certificate = new X509Certificate2(certPath);
List<byte[]> certificates = new List<byte[]>();
certificates.Add(certificate.Export(X509ContentType.SerializedCert));

// Настройка TLS-соединения
MqttClientOptionsBuilderTlsParameters tlsOptions = new MqttClientOptionsBuilderTlsParameters
{
  Certificates = certificates,
  SslProtocol = SslProtocols.Tls12,
  UseTls = true
};

Сертификат, применяемый для аутентификации сервера, используется в обработчике для валидации сервера:

private static X509Certificate2 rootCrt = new X509Certificate2("rootCA.crt");

private static bool CertificateValidationCallback(X509Certificate cert, X509Chain chain, SslPolicyErrors errors, IMqttClientOptions opts)
{
  try
  {
    if (errors == SslPolicyErrors.None)
    {
      return true;
    }

    if (errors == SslPolicyErrors.RemoteCertificateChainErrors)
    {
      chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
      chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
      chain.ChainPolicy.ExtraStore.Add(rootCrt);

      chain.Build((X509Certificate2)rootCrt);
      // Сравнение отпечатков сертификатов
      var res = chain.ChainElements.Cast<X509ChainElement>().Any(a => a.Certificate.Thumbprint == rootCrt.Thumbprint);
      return res;
    }
  }
  catch { }

  return false;
}

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

При авторизации по логину и паролю в Yandex IoT Core требуется TLS-протокол. Для этого используйте класс MqttClientOptionsBuilderTlsParameters:

// Настройка TLS-соединения
MqttClientOptionsBuilderTlsParameters tlsOptions = new MqttClientOptionsBuilderTlsParameters
{
  SslProtocol = SslProtocols.Tls12,
  UseTls = true
};

// Подключение обработчика для валидации сервера
tlsOptions.CertificateValidationCallback += CertificateValidationCallback;

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

// Настройка параметров соединения
var options = new MqttClientOptionsBuilder()
    .WithClientId($"Test_C#_Client_{Guid.NewGuid()}")
    .WithTcpServer(MqttServer, MqttPort)
    .WithTls(tlsOptions)
    .WithCleanSession()
    .WithCredentials(id, password)
    .WithKeepAlivePeriod(TimeSpan.FromSeconds(90))
    .WithKeepAliveSendInterval(TimeSpan.FromSeconds(60))
    .Build();

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

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

mqttClient.ConnectAsync(options, CancellationToken.None);

Подпишитесь на топик и получайте сообщения

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

...
  mqttClient.UseApplicationMessageReceivedHandler(DataHandler);
...

private Task DataHandler(MqttApplicationMessageReceivedEventArgs arg)
{
  return Task.CompletedTask;
}

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

mqttClient.SubscribeAsync(topic, qos);

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

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

mqttClient.PublishAsync(topic, "Ваш текст сообщения.", qos);

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

...
  mqttClient.UseConnectedHandler(ConnectedHandler);
  mqttClient.UseDisconnectedHandler(DisconnectedHandler);
...

private Task ConnectedHandler(MqttClientConnectedEventArgs arg)
{
  return Task.CompletedTask;
}

private static Task DisconnectedHandler(MqttClientDisconnectedEventArgs arg)
{
  return Task.CompletedTask;
}

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

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

mqttClient.DisconnectAsync();

Была ли статья полезна?

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