Работа с Yandex IoT Core на языке C#
В этом сценарии вы узнаете, как подключиться к Yandex IoT Core с помощью библиотеки Paho
Примечание
После подключения вы сможете:
Чтобы подключиться к Yandex IoT Core и начать обмен сообщениями:
- Создайте необходимые ресурсы Yandex IoT Core:
- Подключитесь к Yandex IoT Core.
- Аутентифицируйтесь в Yandex IoT Core:
- Установите соединение.
- Подпишитесь на топик и получайте сообщения.
- Отправьте сообщение.
- Завершите соединение}.
Перед началом работы
- Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
- Скачайте и установите среду разработки для платформы .Net. Например, Microsoft Visual Studio
.
Создайте необходимые ресурсы Yandex IoT Core
Создайте реестр и добавьте ему сертификат
Если у вас уже есть сертификат, начните со второго шага.
-
Создайте сертификат для реестра (пропустите этот шаг, если у вас уже есть сертификат реестра):
openssl req -x509 \ -newkey rsa:4096 \ -keyout registry-key.pem \ -out registry-cert.pem \ -nodes \ -days 365 \ -subj '/CN=localhost'
-
Создайте реестр:
yc iot registry create --name my-registry
-
Добавьте сертификат реестру:
yc iot registry certificate add \ --registry-name my-registry \ # Имя реестра. --certificate-file registry-cert.pem # Путь к публичной части сертификата.
Создайте устройство и добавьте ему сертификат
Если у вас уже есть сертификат, начните со второго шага.
-
(опционально) Создайте сертификат для устройства:
openssl req -x509 \ -newkey rsa:4096 \ -keyout device-key.pem \ -out device-cert.pem \ -nodes \ -days 365 \ -subj '/CN=localhost'
-
Посмотрите список реестров, в которых можно создать устройство, или создайте новый реестр.
-
Создайте устройство:
yc iot device create --registry-name my-registry --name my-device
-
Добавьте сертификат устройству:
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-сертификатов удобнее всего использовать сертификаты PKCS#12
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();