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

ESP8266 - не работает прием собщения из topic'а по MQTT

Yamazaki

New member
Здравствуте!

Пытаюсь наладить передачу сообщений с ESP8266 на андроид клиент и обратно
c espшки сообщения отправляются (просто циферка тикает в глобальной переменной), обратно принимать не хочет
проблема точно не в сервере и не в других элементах
топик отлично виден и с нескольких телефонов, и с PCшного клиента MQTT Explorer

Код практически неизменный из примера, и у всех, у кого работает - что-то очень похожее, потому-то и странно...

(код показан без define'ов)

Код:
int a;

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

тут дефайны

WiFiClient espClient;
PubSubClient client;

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setClient(espClient);
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
 
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(in_led, OUTPUT);
  digitalWrite(in_led, HIGH);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    // If you do not want to use a username and password, change next line to
    if (client.connect("ESP8266Client")) {
    //if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("connected");
     } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Message arrived [");
 Serial.print(topic);
 Serial.print("] ");
 for (int i = 0; i < length; i++) {
  char receivedChar = (char)payload[i];
  Serial.print(receivedChar);
  if (receivedChar == '0')
   digitalWrite(in_led, LOW);
  if (receivedChar == '1')
   digitalWrite(in_led, HIGH);
 }
 Serial.println();
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  // Publishes a random 0 and 1 like someone switching off and on randomly (random(2))
  client.publish(out_topic, String(a).c_str(), true);
  Serial.println(a);
 // client.setCallback(callback);
 // client.subscribe(in_topic);
 if (client.subscribe(in_topic))
 {Serial.println("ok"); } else {Serial.println("error");}
  delay(5000);
  a=a+1;
}
 

Alex Neo

New member
Привет. так у тебя же закомментировала строка subscribe:
C++:
 // client.subscribe(in_topic);
Ты не слушаешь топики а только пишешь туда.
 

Yamazaki

New member
Привет. так у тебя же закомментировала строка subscribe:
дык там client.subscribe вызывается в следующей строке

Код:
if (client.subscribe(in_topic))
 {Serial.println("ok"); } else {Serial.println("error");}
в консоли постоянно возвращает ОК
т.е. как бы подписка происходит, и потому что оно возвращает единицу

у меня ощущение, что проблема где-то в област callback
 

Yamazaki

New member
Ммда, интересным способом решилась проблема
Всё заработало, когда завели собственный выделенный MQTT сервер
до этого на публичном тестовом гоняли, и почему-то не работало, хотя через приложения, как PCшные, так и мобильные, топик читался и публиковался.
 
Сверху Снизу