Как ИСПОЛЬЗОВАТЬ ПРОСТРАНСТВО ИМЕН СЕТКИ СОБЫТИЙ MQTT HOSTNAME НА ESP32 ИЛИ ESP32 ОНЛАЙН, КАК WOKWI, для отправки таких данных, как температура или влажность, с помощью датчика DHT22

Я экспериментирую с ESP32 или ESP32 онлайн, например, WOKWI, используя датчики DHT22 для отправки данных, таких как температура и влажность, на приемник MQTT, например, MQTTx.

прямо сейчас я экспериментирую с использованием сетки событий, особенно пространства имен сетки событий, используя там поддержку MQTT Broker. После того, как я включил брокера и установил общедоступное соединение, могу ли я использовать имя хоста MQTT для моего ESP32 или ESP32 ONLINE, как в WOKWI?

мне просто нужен простой esp32 с датчиком dht22, отправляющим данные, такие как температура и влажность, клиенту MQTT, например, MQTTx.

нужно ли для этого использовать другой ресурс в Azure? Или просто используете пространство имен сетки событий Azure?

я пробовал такую ​​же документацию:

`#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFiClientSecure.h>

// Wi-Fi settings
const char* ssid = "Wokwi-GUEST";
const char* password = "";

// Azure Event Grid settings
const char* mqttBroker = "eventgrid1.southeastasia-1.ts.eventgrid.azure.net";
const int mqttPort = 8883;
const char* eventGridTopic = "Topics/topic1";
const char* username = "client1-authnID";
const char* deviceID = "client1-sessionID1";

// TLS/SSL client setup
WiFiClientSecure wifiClient;
PubSubClient mqttClient(wifiClient);

// Certificates
const char* caCert = "";

const char* clientCert = R"KEY(
-----BEGIN CERTIFICATE-----
MIIB7jCCAZSgAwIBAgIRAM86q1LIwWpvhSCeqIxrTmowCgYIKoZIzj0EAwIwRjEZ
MBcGA1UEChMQTXF0dEFwcFNhbXBsZXNDQTEpMCcGA1UEAxMgTXF0dEFwcFNhbXBs
ZXNDQSBJbnRlcm1lZGlhdGUgQ0EwHhcNMjMwNjE2MDYyNjMzWhcNMjMwOTI0MDYy
NjMwWjAaMRgwFgYDVQQDEw9jbGllbnQxLWF1dGhuSUQwWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAASa8R2ZS4wE2c5GU6MApWM/u9F7/Qo1DRhS6VPsr2za0OTXuO9C
hOE3tpxu8G3/rsyM4bPj9I6DAZMebHXbbX/To4GOMIGLMA4GA1UdDwEB/wQEAwIH
gDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFKkhXgJe
Id1zDD5sESQi3ABs33WIMB8GA1UdIwQYMBaAFIeMEpJCsKRfq+HjhXmE0uVfubMP
MBoGA1UdEQQTMBGCD2NsaWVudDEtYXV0aG5JRDAKBggqhkjOPQQDAgNIADBFAiAq
sZYheFfVrlgNk6De060blPZkrim13yrJRmRo1WUMiAIhAPZ6R+5Hyl5sGB4m8HYh
9mHEl+qVZauee8HGu9IWyKYq
-----END CERTIFICATE-----
)KEY";

const char* clientKey = R"KEY(
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIAb/hcl7cXX8gHH8gjlhXjcaj8pTonHP+MzqcS2rHY13oAoGCCqGSM49
AwEHoUQDQgAEmvEdmUuMBNnORlOjAKVjP7vRe/0KNQ0YUulT7K9s2tDk17jvQoTh
N7acbvBt/67MjOGz4/SOgwGTHmx1221/0w==
-----END EC PRIVATE KEY-----
)KEY";

void setup() {
  Serial.begin(115200);
  delay(2000);

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Load CA certificate, client certificate, and client key
  wifiClient.setCACert(caCert);
  wifiClient.setCertificate(clientCert);
  wifiClient.setPrivateKey(clientKey);

  // Set MQTT server and port
  mqttClient.setServer(mqttBroker, mqttPort);

  // Set MQTT callback function
  mqttClient.setCallback(callback);

  // Connect to MQTT broker
  connectToMqttBroker();
}

void loop() {
  if (!mqttClient.connected()) {
    // Reconnect to MQTT broker if the connection is lost
    connectToMqttBroker();
  }
  mqttClient.loop();

  // Publish message to Event Grid
  publishEvent();

  // Delay before publishing the next event
  delay(5000);
}

void connectToMqttBroker() {
  while (!mqttClient.connected()) {
    Serial.println("Connecting to MQTT broker...");

    if (mqttClient.connect(username, deviceID,"")) {
      Serial.println("Connected to MQTT broker");
    } else {
      Serial.print("Failed, rc = ");
      Serial.print(mqttClient.state());
      Serial.println(" Retrying in 5 seconds...");
      delay(5000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  // Handle incoming MQTT messages here if needed
}

void publishEvent() {
  // Create the event message
  DynamicJsonDocument eventMessage(256);
  eventMessage["id"] = "1";
  eventMessage["subject"] = "Example Event";
  eventMessage["eventType"] = "example.event";
  JsonObject eventData = eventMessage.createNestedObject("data");
  eventData["key"] = "value";

  // Serialize the event message to a JSON string
  String jsonMessage;
  serializeJson(eventMessage, jsonMessage);

  // Publish the event message to Event Grid
  mqttClient.publish(eventGridTopic, jsonMessage.c_str());
}`

но всегда получаю такую ​​проблему:

Failed, rc=-2 Retrying in 5 seconds...

Подключение к MQTT-брокеру...

вы можете использовать брокер MQTT Azure Event Grid для обработки вашего решения, где ESP32 будет публиковать данные телеметрии датчика по этой теме, а клиент MQTTx может подписаться на эту тему. Этот сценарий был успешно протестирован с продуктами M5Stack, такими как AtomS3Lite (ESP32-S3) и AtomLite (ESP32-PICO), с использованием nanoFramework (C#).

Roman Kiss 12.04.2024 18:37

Могу ли я получить документацию, сэр, или источник, который я могу использовать для решения своей проблемы??

Ahmad Mudzakkir 14.04.2024 03:11

взгляните на клиентскую библиотеку MQTT для .Net nanoFramework: github.com/nanoframework/nanoFramework.m2mqtt/tree/…

Roman Kiss 14.04.2024 15:22

Перед написанием кода для ESP32 я рекомендую использовать клиентский инструмент MQTTx для обеих сторон, таких как издатель и подписчик, для проверки вашего подключения к брокеру MQTT Azure Event Grid и т. д.

Roman Kiss 14.04.2024 15:40

Если вы посмотрите мой код, можете ли вы сказать мне, в чем основная проблема, сэр?

Ahmad Mudzakkir 14.04.2024 16:35

Пробовали ли вы использовать клиент MQTTx для подключения и публикации некоторых данных по теме на основе параметров (сертификат, имя пользователя и т. д.), используемых в вашем коде?

Roman Kiss 14.04.2024 17:27

Да, но без кода. Я использую MQTTx с включенным TLS и ввожу сертификат, и все отлично публикует и подписывает данные. Но с кодом это ошибка, как и в приведенном выше коде.

Ahmad Mudzakkir 14.04.2024 18:12

Мое условие, которое я должен использовать с кодом на esp32 для подключения к пространству имен сетки событий Azure в моем имени хоста MQTT.

Ahmad Mudzakkir 14.04.2024 18:12
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Этот пост - краткая презентация netty-websocket-http1 - альтернативной netty/java реализации RFC6455 - протокола WebSocket.
0
8
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ниже приведен рабочий пример клиента MQTT ESP32-S3 для публикации нажатой кнопки в теме брокера MQTT Azure Event Grid. Издатель написан с использованием .NET nanoFramework.

using Iot.Device.Button;
using nanoFramework.M2Mqtt;
using nanoFramework.M2Mqtt.Messages;
using nanoFramework.Networking;
using nanoFramework.Runtime.Native;
using System;
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;

namespace NFAppM5StampS3_MQTT_Broker
{
    public class Program
    {
        static string ssid = "xxxxxx";
        static string password = "xxxxxx";
        //
        static string deviceId = "device2";
        static string username = "device2";
        static string brokerHostName = "xxxxxx.westeurope-1.ts.eventgrid.azure.net";
        static string pub_topic = "abc/test/button";
        //
        static MqttClient device = null;
        static int pinButton = 0;
        

        public static void Main()
        {
            int counter = 0;
            Debug.WriteLine("Hello from nanoFramework!");
            GpioButton buttonM5 = new GpioButton(buttonPin: pinButton);

            try
            {
                #region Connect to WiFi
                CancellationTokenSource cs = new(60000);
                if (WifiNetworkHelper.ScanAndConnectDhcp(ssid, password, requiresDateTime: true, token: cs.Token))
                    Debug.WriteLine($"Wifi ready - {ssid}");
                else
                    throw new Exception($"Wifi is not connected.");
                #endregion

                #region MQTT Connection
                var clientCert = new X509Certificate2(client_cert, client_key, "");
                device = new MqttClient(brokerHostName, 8883, true, null, clientCert, MqttSslProtocols.TLSv1_2);
                device.ProtocolVersion = MqttProtocolVersion.Version_5;
                device.Settings.ValidateServerCertificate = false;  //no CA signed server! 
                var ret = device.Connect(deviceId, username, "");
                if (ret != MqttReasonCode.Success)
                {
                    Debug.WriteLine($"MQTT ERROR connecting: {ret}");
                    device.Disconnect();
                    throw new Exception("Device failed to connect it");
                }
                Debug.WriteLine(">>> Device is connected");
                #endregion
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.InnerException?.Message ?? ex.Message);
                Thread.Sleep(5000);
                Power.RebootDevice();
            }

            #region ButtonPress          
            buttonM5.Press += (sender, e) =>
            {
                Debug.WriteLine("The Button has been pressed");
                string payload = $"{{\"counter\":{counter++}}}";
                device.Publish(pub_topic, Encoding.UTF8.GetBytes(payload), "application/json; charset=utf-8", null);
            };
            #endregion

            Thread.Sleep(Timeout.Infinite);            
        }

        #region Certificates
        private const string client_cert = @"-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----";

        private const string client_key = @"-----BEGIN EC PRIVATE KEY-----
....
-----END EC PRIVATE KEY-----";
        #endregion
    }
}

В следующем фрагменте экрана показан клиентский инструмент MQTTx подписчика с получением по теме, где кнопка опубликовала сообщение:

а следующий фрагмент экрана показывает сообщения сетки событий, полученные по этой теме и перенаправленные подписчикам AEG.

Отметим, что получение телеметрических данных с датчиков — это несложная работа. Его можно публиковать в AEG MQTT Broker по таймеру каждую минуту.

Обновлять:

Ниже приведен файл packages.config, используемый в приведенном выше коде:

<?xml version = "1.0" encoding = "utf-8"?>
<packages>
  <package id = "nanoFramework.CoreLibrary" version = "1.15.5" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.Iot.Device.Button" version = "1.2.536" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.M2Mqtt" version = "5.1.123" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.Runtime.Events" version = "1.11.15" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.Runtime.Native" version = "1.6.12" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Collections" version = "1.5.31" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Device.Gpio" version = "1.1.38" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Device.Wifi" version = "1.5.81" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.IO.Streams" version = "1.1.59" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Net" version = "1.10.77" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Text" version = "1.2.54" targetFramework = "netnano1.0" />
  <package id = "nanoFramework.System.Threading" version = "1.1.32" targetFramework = "netnano1.0" />
</packages>

Хорошо, сэр, я попробую воспользоваться вашей помощью

Ahmad Mudzakkir 17.04.2024 03:21

Могу ли я использовать это на вокви, сэр?

Ahmad Mudzakkir 21.04.2024 04:37

В приведенном выше примере используется nanoframework.net, где разработчики C# могут использовать свою IDE (Microsoft Visual Studio, ...) для встроенных приложений на микроконтроллерах, таких как ESP32 и т. д. Вам необходимо проверить, поддерживает ли симулятор Wokwi .Net нанофреймворк.

Roman Kiss 21.04.2024 14:29

Esp32 и ESP32-S3 одинаковы, верно? Но ESP32-S3 имеет больше возможностей, чем обычный esp32. Вместо этого у меня есть esp32. Могу ли я использовать это в обычном esp32?

Ahmad Mudzakkir 27.04.2024 18:25

Да, вы можете использовать его.

Roman Kiss 27.04.2024 21:23

Могу ли я увидеть вашу документацию по вашему коду выше? может быть, ваш github или файл, который я вижу. Я хочу увидеть менеджер пакетов nuget и подробную информацию о вашей конфигурации.

Ahmad Mudzakkir 30.04.2024 20:39

см. файл packages.config, добавленный в мой ответ.

Roman Kiss 30.04.2024 21:06

Другие вопросы по теме