Подключиться к общедоступному серверу с помощью pubsubclient

Я использую библиотеку PubSubClient для подписки на сервер с помощью nodemcu. Я протестировал код с помощью cloudMQTT и MQTTlens, и он работал нормально. В дополнение к этому я использовал MQTTlens для проверки соединения mqtt с моим компьютером. Там я не указал имя пользователя и пароль (оставил пустым), и все заработало. Когда я хочу подключиться к общедоступному серверу (например: «tcp://11.111.111.111»), не подключается.

код для nodemcu

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

const char* ssid = "*****";
const char* password =  "****";
const char* mqttServer = "****";
const int mqttPort = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {

  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");

  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");

    if (client.connect("ESP8266Client")) {

      Serial.println("connected");  

    } else {

      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);

    }
  }

  client.publish("topic1", "Hello from ESP8266_tester1");
  client.subscribe("topic1");

}

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived in topic: ");
  Serial.println(topic);

  Serial.print("Message:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

  Serial.println();
  Serial.println("-----------------------");

}

void loop() {
  client.loop();
}

результат от последовательного монитора

результат

Любое предложение приветствуется


person jack jill    schedule 17.07.2019    source источник


Ответы (2)


Если вам действительно не нужны имя пользователя и пароль, не используйте функцию connect, которая их ожидает:

...
if (client.connect("ESP8266Client")) {
...

Я вижу, вы используете довольно общий идентификатор клиента — ESP8266Client. Помните, что все клиенты, подключающиеся к брокеру, должны иметь уникальный идентификатор клиента. Если вы разместите этот скетч на двух разных устройствах, они не смогут подключиться одновременно.

person knolleary    schedule 17.07.2019
comment
тогда какой должна быть функция для подключения без использования client.connect()? - person jack jill; 18.07.2019
comment
Вы читали документацию? Существует несколько функций client.connect(). Используйте тот, который не требует имени пользователя/пароля - точно так, как я показал в своем ответе выше. pubsubclient.knolleary.net/api.html#connect1 - person knolleary; 18.07.2019
comment
это тоже помогло, но настоящая проблема была с IP-адресом, который я предоставил. Спасибо - person jack jill; 19.07.2019

Проблема была с ip, который я предоставил. IP не требует части «tcp://». После удаления код работал хорошо.

person jack jill    schedule 19.07.2019