• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Ищу специалиста по работе с MQTT брокером Yandex IOT Core

maxics

New member
На основе этого проекта https://github.com/AlexandrSurkov/YandexCloudAirMonitor/tree/master сделан скетч для ESP32. Настроен доступ в Yandex IoT Core. Создан реестр, а в нём устройство. Задан пароль. Сертификаты не генерил. Модуль соединяется с IoT Core, но я не вижу данных и не совсем понимаю как подписаться на топик. Нужна помощь в организации приема и отображения данных в мониторинге. Также написание простенького приложения на C# для приема отправляемых данных на ПК. Размер вознаграждения обсуждаем в лс.
 

Atom

Member
Не силен в Yandex IoT core, но в коде явно написано
Код:
const char* yandexIoTCoreDeviceId = "<Yandex IoT Core Cloud Device ID>";
const char* mqttpassword = "<Yandex IoT Core Device pawssword>";

то есть на Yandex IoT core нужно регистрироваться и тогда они сгенерят Yandex IoT Core Cloud Device ID. Его вколбасить в код. добавить еще Yandex IoT Core Device pawssword который задается там же. Вот и вся магия.

ПС: если это не единичный датчик какой либо погоды для всех, а планируется много датчиков и исполнительных устройств, то стоит посмотреть в сторону чего то более локально централизованного, типа МК под tasmota или ESPhome, homeassistance или domoticz. Там есть варианты подключений уже и клоудов, телеграммов и прочей муйни.
 

maxics

New member
Спасибо за ответ! Собственно всё так и сделал. Зарегистрировался. Попробовал пример яндекса на C#, отправил с одного ПК и другим принял текст, но вот, когда я отправляю ESP8266 код ниже, то тем же самым примером на C# я ничего не принимаю...

Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // MQTT Client

const char* ssid = "ANSI";
const char* password = "1234567890";

const char* mqttserver = "130.193.44.244"; //mqtt.cloud.yandex.net
const char* yandexIoTCoredeviceId = "are7hmr4sf1i6107n5ak";
const char* mqttpassword = "ANSIaz12345!.!";
const int mqttport=8883;

String topicCommands = String("$devices/")+String(yandexIoTCoredeviceId)+String("/commands/#");
String topicEvents = String("$devices/")+String(yandexIoTCoredeviceId)+String("/events/");

const char* test_root_ca = \
"-----BEGIN CERTIFICATE-----\n \
MIIFGTCCAwGgAwIBAgIQJMM7ZIy2SYxCBgK7WcFwnjANBgkqhkiG9w0BAQ0FADAf\
MR0wGwYDVQQDExRZYW5kZXhJbnRlcm5hbFJvb3RDQTAeFw0xMzAyMTExMzQxNDNa\
Fw0zMzAyMTExMzUxNDJaMB8xHTAbBgNVBAMTFFlhbmRleEludGVybmFsUm9vdENB\
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgb4xoQjBQ7oEFk8EHVGy\
1pDEmPWw0Wgw5nX9RM7LL2xQWyUuEq+Lf9Dgh+O725aZ9+SO2oEs47DHHt81/fne\
5N6xOftRrCpy8hGtUR/A3bvjnQgjs+zdXvcO9cTuuzzPTFSts/iZATZsAruiepMx\
SGj9S1fGwvYws/yiXWNoNBz4Tu1Tlp0g+5fp/ADjnxc6DqNk6w01mJRDbx+6rlBO\
aIH2tQmJXDVoFdrhmBK9qOfjxWlIYGy83TnrvdXwi5mKTMtpEREMgyNLX75UjpvO\
NkZgBvEXPQq+g91wBGsWIE2sYlguXiBniQgAJOyRuSdTxcJoG8tZkLDPRi5RouWY\
gxXr13edn1TRDGco2hkdtSUBlajBMSvAq+H0hkslzWD/R+BXkn9dh0/DFnxVt4XU\
5JbFyd/sKV/rF4Vygfw9ssh1ZIWdqkfZ2QXOZ2gH4AEeoN/9vEfUPwqPVzL0XEZK\
r4s2WjU9mE5tHrVsQOZ80wnvYHYi2JHbl0hr5ghs4RIyJwx6LEEnj2tzMFec4f7o\
dQeSsZpgRJmpvpAfRTxhIRjZBrKxnMytedAkUPguBQwjVCn7+EaKiJfpu42JG8Mm\
+/dHi+Q9Tc+0tX5pKOIpQMlMxMHw8MfPmUjC3AAd9lsmCtuybYoeN2IRdbzzchJ8\
l1ZuoI3gH7pcIeElfVSqSBkCAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB\
/wQFMAMBAf8wHQYDVR0OBBYEFKu5xf+h7+ZTHTM5IoTRdtQ3Ti1qMBAGCSsGAQQB\
gjcVAQQDAgEAMA0GCSqGSIb3DQEBDQUAA4ICAQAVpyJ1qLjqRLC34F1UXkC3vxpO\
nV6WgzpzA+DUNog4Y6RhTnh0Bsir+I+FTl0zFCm7JpT/3NP9VjfEitMkHehmHhQK\
c7cIBZSF62K477OTvLz+9ku2O/bGTtYv9fAvR4BmzFfyPDoAKOjJSghD1p/7El+1\
eSjvcUBzLnBUtxO/iYXRNo7B3+1qo4F5Hz7rPRLI0UWW/0UAfVCO2fFtyF6C1iEY\
/q0Ldbf3YIaMkf2WgGhnX9yH/8OiIij2r0LVNHS811apyycjep8y/NkG4q1Z9jEi\
VEX3P6NEL8dWtXQlvlNGMcfDT3lmB+tS32CPEUwce/Ble646rukbERRwFfxXojpf\
C6ium+LtJc7qnK6ygnYF4D6mz4H+3WaxJd1S1hGQxOb/3WVw63tZFnN62F6/nc5g\
6T44Yb7ND6y3nVcygLpbQsws6HsjX65CoSjrrPn0YhKxNBscF7M7tLTW/5LK9uhk\
yjRCkJ0YagpeLxfV1l1ZJZaTPZvY9+ylHnWHhzlq0FzcrooSSsp4i44DB2K7O2ID\
87leymZkKUY6PMDa4GkDJx0dG4UXDhRETMf+NkYgtLJ+UIzMNskwVDcxO4kVL+Hi\
Pj78bnC5yCw8P5YylR45LdxLzLO68unoXOyFz1etGXzszw8lJI9LNubYxk77mK8H\
LpuQKbSbIERsmR+QqQ==\
-----END CERTIFICATE-----\n";

WiFiClientSecure  net;
PubSubClient client(net);
BearSSL::X509List x509(test_root_ca);

#define DEBUG_SERIAL Serial
#define DEBUG_SERIAL_BAUDRATE 115200

void connect() {
  delay(5000);
  DEBUG_SERIAL.print("Conecting to wifi ...");
  while (WiFi.status() != WL_CONNECTED) {
    DEBUG_SERIAL.print(".");
    delay(1000);
  }
  DEBUG_SERIAL.println(" Connected");
  net.setInsecure();
  DEBUG_SERIAL.print("Connecting to Yandex IoT Core as");
  DEBUG_SERIAL.print(yandexIoTCoredeviceId);
  DEBUG_SERIAL.print(" ...");
  while (!client.connect("Esp8266Client", yandexIoTCoredeviceId, mqttpassword)) {
    DEBUG_SERIAL.print(".");
    delay(1000);
  }
  DEBUG_SERIAL.println(" Connected");
  if (client.publish(topicEvents.c_str(), yandexIoTCoredeviceId)) {
      DEBUG_SERIAL.println("Publish ok");
    }
    else {
      DEBUG_SERIAL.println("Publish failed");
    }
  DEBUG_SERIAL.println("Subscribe to: ");
  DEBUG_SERIAL.print(topicCommands.c_str());
  client.subscribe(topicCommands.c_str());
}

void setup() {
  DEBUG_SERIAL.begin(DEBUG_SERIAL_BAUDRATE);
  delay(10);
  DEBUG_SERIAL.println("Device started");
  WiFi.begin(ssid, password);
  client.setServer(mqttserver, mqttport);
  client.setCallback(messageReceived);
  client.setBufferSize(1024);
  client.setKeepAlive(15);
  connect();
}

void messageReceived(char* topic, byte* payload, unsigned int length) {
  String topicString = String(topic);
  DEBUG_SERIAL.print("Message received. Topic: ");
  DEBUG_SERIAL.println(topicString.c_str());
  String payloadStr = "";
  for (int i=0;i<length;i++) {
    payloadStr += (char)payload[i];
  }
  DEBUG_SERIAL.print("Payload: ");
  DEBUG_SERIAL.println(payloadStr);
}

void loop() {
  // put your main code here, to run repeatedly:
  client.loop();
  if (!client.connected()) {
    connect();
  }
}
 

Atom

Member
Спасибо за ответ! Собственно всё так и сделал. Зарегистрировался. Попробовал пример яндекса на C#, отправил с одного ПК и другим принял текст, но вот, когда я отправляю ESP8266 код ниже, то тем же самым примером на C# я ничего не принимаю...
"Не понимаю" и "не работает" разные фразы с разным значением и следствием.
Указанный код не совместим с С# в прямом виде.
В нем устаноавливается SSL Socket по адресу записанному в mqttserver, на порт в переменной mqttport.
Такое соединение является шифрованным. Поэтому в тексте указан заранее сгенерипрованный сертификат в переменной test_root_ca. Когда сертификат "протухнет" (у каждорго сертификата есть срок годности), нужно будет генерить новый и перепрограммировать железку, что не есть хорошо.


Далее скетч выполняет функцию setup() для возмождности настройки переменных, а затем без устали вызывает lookup(), выполняя тем обработку процесса. Это зло идущее от arduino, потому как новички в такой процесс не врубаются и все воспринимают как магию. И тут как раз и видна разница между C# - отсуствует секция финализации, где освобождаются ресурсы и прочие вещи типа отключения соединения. Ведь для железки это без надобности - такое поведение ей никчему, а вот для нормалной программы обязательно, иначе вызовед выжырание памяти в лучшем случае, БСОД в худшем.
 

maxics

New member
Я не говорю, что этот код совместим с C#. Пример из C# был взят лишь для подписки на топик и получения сообщений от яндекс клауд. Так вот, когда я отправляю сообщения железкой (пример кода привел), я не получаю эти сообщения. Пробовал подписываться на топик с помощью MQTT.fx. Сообщения не приходят. Что я делаю не так?
 

Atom

Member
пример кода ниочем не говорит. Устройство можети выкидывать исключение как по поводу нехватки памяти, так и коряво используемых переменных.

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

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