Поделиться через


Руководство по быстрому старту: публикация и подписка на сообщения MQTT в пространстве имен Grid событий с помощью Azure CLI

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

В этой статье вы используете Azure CLI для:

  • Создайте пространство имен Event Grid и включите брокер MQTT.
  • Создайте подресурсы, такие как клиенты, группы клиентов и пространства тем.
  • Предоставьте клиентам доступ к публикации и подписке на тематические пространства.
  • Публикация и получение сообщений MQTT.

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

Предпосылки

  • Если вы не знакомы с Сеткой событий, ознакомьтесь с общими сведениями о сетке событий перед началом работы с этим руководством.
  • Зарегистрируйте поставщик ресурсов сетки событий в соответствии с инструкциями, описанными в разделе "Регистрация поставщика ресурсов сетки событий".
  • Убедитесь, что в брандмауэре открыт порт 8883. В этом руководстве используется протокол MQTT, который взаимодействует через порт 8883. Этот порт может быть заблокирован в некоторых корпоративных и образовательных сетевых средах.
  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье "Начало работы с Azure Cloud Shell".
  • Если вы предпочитаете запускать справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, попробуйте запустить Azure CLI в контейнере Docker. Дополнительные сведения см. в разделе "Запуск Azure CLI" в контейнере Docker.
  • Если вы используете локальную установку, войдите в Azure CLI с помощью az login команды. Чтобы завершить процесс проверки подлинности, выполните действия, которые отображаются в терминале. Сведения о других параметрах входа см. в статье "Проверка подлинности в Azure с помощью Azure CLI".
  • Когда вас попросят, установите расширение Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в статье "Управление расширениями Azure CLI".
  • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
  • Для этой статьи требуется версия 2.53.1 или более поздняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
  • Для создания отпечатка и проверки подлинности подключения клиента требуется сертификат клиента X.509.
  • Просмотрите команды CLI пространства имен сетки событий.

Создайте пример клиентского сертификата и его отпечаток

Если у вас еще нет сертификата, можно создать пример сертификата с помощью шага CLI. Рассмотрите возможность установки вручную для Windows.

После успешной установки с помощью шага CLI откройте окно командной строки в папке профиля пользователя (Win+R type %USERPROFILE%).

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

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. Чтобы создать сертификат для клиента, используйте созданные файлы центра сертификации (ЦС). Убедитесь, что в команде используется правильный путь к файлам сертификатов и секретов.

    step certificate create client1-authnID client1-authnID.pem client1-authnID.key --ca .step/certs/intermediate_ca.crt --ca-key .step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
    
  3. Чтобы просмотреть отпечаток, введите команду step.

    step certificate fingerprint client1-authnID.pem
    

Создайте пространство имен

Используйте эту команду для создания пространства имен. Обновите команду, указав вашу группу ресурсов и имя пространства имен.

az eventgrid namespace create --resource-group {Resource Group} --name {Namespace Name} --topic-spaces-configuration "{state:Enabled}"

Чтобы упростить это краткое руководство, создайте пространство имен с минимальными свойствами. Дополнительные сведения о сети, безопасности и параметрах на других вкладках см. в статье "Создание пространств имен и управление ими".

Создание клиентов

Используйте эту команду для создания клиента. Обновите команду, указав вашу группу ресурсов и имя пространства имен.

az eventgrid namespace client create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Client Name} --authentication-name client1-authnID --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[Client Thumbprint]}"
  • Чтобы упростить это краткое руководство, используйте совпадение отпечатков пальцев для аутентификации. Инструкции по использованию цепочки сертификатов ЦС X.509 для проверки подлинности клиента см. в разделе "Проверка подлинности клиента с помощью цепочки сертификатов".
  • Для этого упражнения используйте группу по умолчанию $all client , которая включает все клиенты в пространстве имен. Дополнительные сведения о создании пользовательских групп клиентов с помощью клиентских атрибутов см. в разделе "Группы клиентов".

Создание пространств разделов

Используйте эту команду для создания пространства тем. Обновите команду, указав вашу группу ресурсов, имя пространства имен и имя темы.

az eventgrid namespace topic-space create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Topicspace Name} --topic-templates ['contosotopics/topic1']

Создание привязок разрешений

Используйте команду az eventgrid, чтобы создать первое связывание разрешений для разрешения издателя. Обновите команду, указав группу ресурсов, имя пространства имен и имя привязки разрешений.

az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}

Используйте эту команду для создания второй привязки разрешений. Обновите команду, указав группу ресурсов, имя пространства имен и имя привязки разрешений. Эта привязка разрешений для подписчиков.

az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}

Публикация и подписка на сообщения MQTT

Следующий пример кода — это простой издатель .NET, который пытается подключиться к пространству имен, публиковать в него сообщения и подписываться на тему MQTT. Вы можете изменить код для ваших требований и запустить его в Visual Studio или другом средстве разработки.

Чтобы запустить этот код, необходимо установить пакет MQTTnet (версия 4.1.4.563) из NuGet. В Visual Studio щелкните правой кнопкой мыши имя проекта в обозревателе решений, перейдите к разделу "Управление пакетами NuGet" и найдите MQTTnet. Выберите пакет MQTTnet и установите его.

Замечание

Следующий пример кода предназначен только для демонстрационных целей и не предназначен для использования в рабочей среде.

Пример кода C# для подключения клиента, публикации и подписки на сообщение MQTT в разделе

Это важно

Обновите пути к файлам сертификата клиента и ключа в формате pem в зависимости от расположения этих файлов. Кроме того, убедитесь, что имя аутентификации клиента и информация о теме соответствуют вашей конфигурации.

using MQTTnet.Client;
using MQTTnet;
using System.Security.Cryptography.X509Certificates;

string hostname = "{Your Event Grid namespace MQTT hostname}";
string clientId = "client1-session1";  //client ID can be the session identifier.  A client can have multiple sessions using username and clientId.
string x509_pem = @" client certificate cer.pem file path\client.cer.pem";  //Provide your client certificate .cer.pem file path
string x509_key = @"client certificate key.pem file path\client.key.pem";  //Provide your client certificate .key.pem file path

var certificate = new X509Certificate2(X509Certificate2.CreateFromPemFile(x509_pem, x509_key).Export(X509ContentType.Pkcs12));

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

var connAck = await mqttClient!.ConnectAsync(new MqttClientOptionsBuilder()
    .WithTcpServer(hostname, 8883)
    .WithClientId(clientId)
    .WithCredentials("client1-authnID", "")  //use client authentication name in the username
    .WithTls(new MqttClientOptionsBuilderTlsParameters()
    {
        UseTls = true,
        Certificates = new X509Certificate2Collection(certificate)
    })

    .Build());

Console.WriteLine($"Client Connected: {mqttClient.IsConnected} with CONNACK: {connAck.ResultCode}");

mqttClient.ApplicationMessageReceivedAsync += async m => await Console.Out.WriteAsync($"Received message on topic: '{m.ApplicationMessage.Topic}' with content: '{m.ApplicationMessage.ConvertPayloadToString()}'\n\n");

var suback = await mqttClient.SubscribeAsync("contosotopics/topic1");
suback.Items.ToList().ForEach(s => Console.WriteLine($"subscribed to '{s.TopicFilter.Topic}' with '{s.ResultCode}'"));

while (true)
{
    var puback = await mqttClient.PublishStringAsync("contosotopics/topic1", "hello world!");
    Console.WriteLine(puback.ReasonString);
    await Task.Delay(1000);
}

Вы можете реплицировать и изменить один и тот же код для нескольких клиентов для публикации и подписки между клиентами.

Примеры кода см. в этом репозитории GitHub.