2 устройства + брокер и топики

Доброго дня, всем форумчанам!

Появилась очередная загвоздка. Вводные: два устройства на esp8266. Подключаю их к брокеру. С каждого устройства отправляю статус online/offline. В клиенте на смартфоне, при поочерёдном включении устройств, виджеты топиков отрабатывают штатно. Но, когда включены два устройства сразу, там просто вакханалия, они работают сразу оба, перебивая друг друга. Топики прописаны разные, брокер один.

Я же правильно понимаю, что один брокер может передавать сигналы от разных устройств, но создаются разные каналы, в зависимости от названия топиков? Почему тогда так происходит?

1-ое устройство:

const char* mqttTopicDeviceStatus = "dist/dev/st"; // топик статуса устройства
const char* mqttDeviceStatusOn = "online";    
const char* mqttDeviceStatusOff = "offline";
const int   mqttDeviceStatusQos = 1;
const bool  mqttDeviceStatusRetained = true;

2-ое устройство:

const char* mqttTopicDeviceStatus = "aqa/device/status"; // топик статуса устройства
const char* mqttDeviceStatusOn = "online";   // статус устройства 
const char* mqttDeviceStatusOff = "offline"; // статус устройства
const int   mqttDeviceStatusQos = 1;
const bool  mqttDeviceStatusRetained = true;

А имена у них разные?

ммм… а разве имя устройству задаётся? ну и если быть совсем точнее, одно esp8266, другое esp-12e

Да, и в порту происходит постоянное подключение к брокеру если два устройства подключены одновременно:

14:25:25.230 -> Попытка MQTT подключения...успешно
14:25:25.494 -> Попытка MQTT подключения...успешно
14:25:25.794 -> Попытка MQTT подключения...успешно
14:25:26.063 -> Попытка MQTT подключения...успешно

Я в брокере уже прописал второго пользователя, и устройства имеют разных пользователей, но не помогает (

А как авторизация проходит?

Если вы про часть кода то так:

const char* mqtt_server = "m5.wqtt.ru"; // Имя сервера MQTT
const int mqtt_port = 12346;            // Порт для подключения к серверу MQTT  
const char* mqtt_clientId = "xxx";      // определяем ID
const char* mqtt_user = "yyy";     // Логин от сервера 
const char* mqtt_pass = "zzz";     // Пароль от сервера 

const char* mqttTopicDeviceStatus = "aqa/device/status"; // топик статуса устройства
const char* mqttTopicTime = "aqa/device/time";           // топик времени устройства    
const char* mqttTopicBrightness = "aqa/light/channel";   // топик уровня яркости 

const char* mqttDeviceStatusOn = "online";   // статус устройства 
const char* mqttDeviceStatusOff = "offline"; // статус устройства
const int   mqttDeviceStatusQos = 1;
const bool  mqttDeviceStatusRetained = true;

.
.
.
.


void setup() {
.
.
.

  WiFi.begin(ssid, password); // Подключение к WiFi             
  while (WiFi.status() != WL_CONNECTED) { 
    delay(500);
    Serial.print("."); 
  }
  Serial.println("\nWiFi подключен");
  
  configTime(TZ_INFO, "pool.ntp.org", "time.google.com"); // Настройка времени  
  client.setServer(mqtt_server, mqtt_port);               // Настройка MQTT  
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Попытка MQTT подключения...");
    if (client.connect(mqtt_clientId, mqtt_user, mqtt_pass, mqttTopicDeviceStatus, mqttDeviceStatusQos, mqttDeviceStatusRetained, mqttDeviceStatusOff)) {
      Serial.println("успешно");
      client.publish(mqttTopicDeviceStatus, mqttDeviceStatusOn, mqttDeviceStatusRetained); 
    } else {
      Serial.print("ошибка, rc=");
      Serial.print(client.state());
      Serial.println(" ждем 5 сек...");
      delay(5000);
    }
  }
}

в обоих устройствах код один.

Вот это имя. И если

то, соответственно, и имя одно

1 лайк

Да, согласен - клиент ид один или разный?

Понимаю о чём вы. Клиент один, но, я пытался второму устройству назначить другой ID клиент он же в смартфоне фигурирует как брокер, и тогда это устройство в смартфоне вообще не работает. В смартфоне этот брокер постоянно переподключается…

Но, всё же, разве брокер не должен работать со многими устройствами разделяя лишь топики?

Ну а само название Client ID тебе ни о чем не говорит?)

Уже понимаю, что clientId = имя устройства, по нему происходит подключение. Я просто не до конца понимаю саму механику. Как я её понимаю - так почему-то не работает.

Как я вижу и как есть:

-Есть брокер на wqtt.ru. Он без всяких названий, просто выдаёт адрес, порт, логин, пароль. Собственно это прописывается в коде.

- В коде первого устройства clientId обозначаю как “DDD”, свои топики. В телефоне я создаю брокера с названием, ну чтоб проще было “DDD”, в нём же указываю clientId = “DDD”, логин и пароль авторизации. Вписываю топики в виджеты, выбирая этот брокер. Всё работает.

-для подключения второго устройства я тоже использую этот брокер (сервис) только в устройстве clientId уже обозначаю как “AAA”, логин и пароль от второго пользователя этим брокером. В телефоне создаю новый брокер “AAA”, с clientId = “ААА ” и авторизацией второго пользователя. Топики, отличающиеся от топиков 1-го устройства, прописываю в виджеты, выбираю брокер “AAA”. Вот только этот брокер “AAA” не подключается, происходят постоянные переподключения.

Что это? Сервис имеет ограничения? Или мне нужно создавать еще один брокер, для передачи данных? Но на сайте нет возможности создавать еще брокеры, только пользователей к имеющемуся.

Я не знаю как работает это (могу только оперировать данными своего опыта). Принимающее устройство может разделять целевое устройство по многим признакам. Это может быть ID, это может быть пара логин/пароль, это может быть совокупность этих данных. Как именно работают принимающая сторона, наверное, можно узнать в документации принимающей стороны…

Clientid это уникальный идентификатор конкретной железки, соответвенно каждое устройство должно таким обладать.

Неправильно. ClientID это УНИКАЛЬНЫЙ идентификатор, и он должен быть разным у ESP, у телефона и любого другого устройства, который вы подключаете к брокеру. Связывание происходит по имени топика

1 лайк

Возьми любую малинку - апельсинку, поставь mosquitto и будет тебе счастье иметь свой MQTT сервер. Будешь делать всё быстро и качественно. А ещё поставь MQTTExplorer, подключись к MQTT серверу и промониторь что происходит на сервере при подключении второй еспэшки.

Спасибо, конечно, но вы переоцениваете мои способности ))

Спасибо! Теперь почти всё становится на свои места. Может даже бы удалось проверить, но одна esp-шка, по ходу сдохла, её не определяет пк.

Только остаётся вопрос: в первом моём проекте ID в телефоне и в esp-шке были одинаковыми. Как это работало тогда?:thinking:

Видимо для телефона этот параметр не существеннен.