Mqtt не получается соединиться

Тема в разделе "Arduino & Shields", создана пользователем dibiliti, 26 янв 2020.

  1. dibiliti

    dibiliti Нерд

    Здравствуйте. Подскажите, пожалуйста, использую cloudmqtt.com, данные поступают, всё хорошо. Не получается соединиться с приложения, например MQTT Dasgboard или любого другого. Приложение на секунду может подключиться, потом дисконет. Если отключить ардуинку, телефон подключается. Т.е не получается одновременно подключиться. Подскажите почему?

    Код (C++):
    /*
      Projet d'apprentissage d'un objet connecté (IoT)  pour réaliser une sonde de température
      ESP8266 + DHT22 + LED + MQTT + Home-Assistant
      Projets DIY (http://www.projetsdiy.fr) - Mai 2016
      Licence : MIT
    */

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include "DHT.h"          // Librairie des capteurs DHT

    #define wifi_ssid ""
    #define wifi_password ""

    #define mqtt_server ""
    #define mqtt_user ""      // if exist
    #define mqtt_password ""  //idem

    #define temperature_topic "sensor/temperature"  //Topic temperature
    #define humidity_topic "sensor/humidity"        //Topic humidity

    //Buffer to decode MQTT messages
    char message_buff[100];

    long lastMsg = 0;  
    long lastRecu = 0;
    bool debug = false;  //Display log message if True

    #define DHTPIN D5    // DHT Pin

    // Un-comment you sensor
    //#define DHTTYPE DHT11       // DHT 11
    #define DHTTYPE DHT22         // DHT 22  (AM2302)

    // Create abjects
    DHT dht(DHTPIN, DHTTYPE);    
    WiFiClient espClient;
    PubSubClient client(espClient);

    void setup() {
      Serial.begin(9600);    
      pinMode(D8,OUTPUT);     //Pin 2 for LED
      setup_wifi();           //Connect to Wifi network
      client.setServer(mqtt_server, 11361);    // Configure MQTT connexion
      client.setCallback(callback);           // callback function to execute when a MQTT message  
      dht.begin();
    }

    //Connexion au réseau WiFi
    void setup_wifi() {
      delay(10);
      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 OK ");
      Serial.print("=> ESP8266 IP address: ");
      Serial.print(WiFi.localIP());
    }

    //Reconnexion
    void reconnect() {

      while (!client.connected()) {
        Serial.print("Connecting to MQTT broker ...");
        if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
          Serial.println("OK");
        } else {
          Serial.print("KO, error : ");
          Serial.print(client.state());
          Serial.println(" Wait 5 secondes before to retry");
          delay(5000);
        }
      }
    }

    void loop() {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();

      long now = millis();
      // Send a message every minute
      if (now - lastMsg > 1000 * 60) {
        lastMsg = now;
        // Read humidity
        float h = dht.readHumidity();
        // Read temperature in Celcius
        float t = dht.readTemperature();

        // Oh, nothing to send
        if ( isnan(t) || isnan(h)) {
          Serial.println("KO, Please chez DHT sensor !");
          return;
        }
     
        if ( debug ) {
          Serial.print("Temperature : ");
          Serial.print(t);
          Serial.print(" | Humidity : ");
          Serial.println(h);
        }
        client.publish(temperature_topic, String(t).c_str(), true);   // Publish temperature on temperature_topic
        client.publish(humidity_topic, String(h).c_str(), true);      // and humidity
      }
      if (now - lastRecu > 100 ) {
        lastRecu = now;
        client.subscribe("homeassistant/switch1");
      }
    }

    // MQTT callback function
    // D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
    void callback(char* topic, byte* payload, unsigned int length) {

      int i = 0;
      if ( debug ) {
        Serial.println("Message recu =>  topic: " + String(topic));
        Serial.print(" | longueur: " + String(length,DEC));
      }
      // create character buffer with ending null terminator (string)
      for(i=0; i<length; i++) {
        message_buff[i] = payload[i];
      }
      message_buff[i] = '\0';
     
      String msgString = String(message_buff);
      if ( debug ) {
        Serial.println("Payload: " + msgString);
      }
     
      if ( msgString == "ON" ) {
        digitalWrite(D8,HIGH);
      } else {
        digitalWrite(D8,LOW);
      }
    }
     
  2. DIYMan

    DIYMan Guest

    Предположу, что это ограничения сервиса. Читали тамошние Terms & Conditions?
     
  3. dibiliti

    dibiliti Нерд

    Прошу прощение, разобрался. Надо было выключить
    Use username as clientid
     
    DIYMan нравится это.