MQTT Broker - PubSubClient

Odpovědět
BigSandy
Příspěvky: 181
Registrován: 23 zář 2017, 07:09
Reputation: 0

MQTT Broker - PubSubClient

Příspěvek od BigSandy » 17 úno 2021, 12:26

Zdravím.
By mně zajimalo kde je problem?

Pokus 1

Kód: Vybrat vše

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid, password);
//***************************************************************
// připojime se k wifi
  Serial.println("Přiojuji se WiFi");  
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   }
   Serial.println("Connected to the WiFi network");
 
   client.setServer(mqttServer, mqttPort);
 
   while (!client.connected()) {
    Serial.println("připojuji se k MQTT");
    //***************************************
    if (client.connect("ESP", mqttUser, mqttPassword )) {
        Serial.println("Jsme připojeni k MQTT");  
       } 
       else 
       {
        Serial.print("Nepodařilo se připojit k MQTT ");
        Serial.print(client.state());
        delay(2000);
       }
    }
} 
void loop() {
  client.publish("data", "Test MQTT");
  Serial.println("Test MQT"); 
  delay(5000); 
}

Kód: Vybrat vše

12:01:04.220 -> připojuji se k MQTT
12:01:04.266 -> Jsme připojeni k MQTT
12:01:04.314 -> Test MQT
12:01:09.179 -> Test MQT
12:01:14.181 -> Test MQT
Pokus 2

Kód: Vybrat vše

void setup() {
  Serial.begin(9600);
  t.every(60 * 1000UL, odesli); // nastavi časovač na 1 minutu
  WiFi.begin(ssid, password);

  Serial.println("connected");  
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Přiojuji se WiFi");
   }
   Serial.println("Jsme připojení k WiFi");
 
   client.setServer(mqttServer, mqttPort);
   
   while (!client.connected()) {
    Serial.println("připojuji se k MQTT");
    //***************************************
    if (client.connect("ESP", mqttUser, mqttPassword )) {
        Serial.println("Jsme připojeni k MQTT");  
       } 
       else 
       {
        Serial.print("Nepodařilo se připojit k MQTT ");
        Serial.print(client.state());
        delay(2000);
       }
    }
} 
void loop() {
   t.update();   
}
void odesli()
{
  if (client.publish("data", "Test MQTT 1")) 
    {
     Serial.println("Data Test MQTT 1");
    }
    else {
        Serial.println("MQTT Broker neni připojen, připojuji");
        client.connect("ESP", mqttUser, mqttPassword );
        delay(10);
        client.publish("data", "Test MQTT 1");
    }
  }

Kód: Vybrat vše

12:07:17.560 -> připojuji se k MQTT
12:07:17.607 -> Jsme připojeni k MQTT
12:08:13.212 -> MQTT Broker neni připojen, připojuji
12:09:13.178 -> MQTT Broker neni připojen, připojuji
Oba příklady jsou funkční a na raspi odeslana data přijimam.
Proč ale v druhem přikladu se mi broker odpojuje a musím ho vždy připojit?

BigSandy
Příspěvky: 181
Registrován: 23 zář 2017, 07:09
Reputation: 0

Re: MQTT Broker - PubSubClient

Příspěvek od BigSandy » 17 úno 2021, 18:19

Tak jsem zjistil. že problem je jen, když se vola ta funkce přes ten timer.

Kód: Vybrat vše

t.every(60 * 1000UL, odesli); 
Když volam tu funkci přimo z void loop, tak ok.

jankop
Příspěvky: 801
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: MQTT Broker - PubSubClient

Příspěvek od jankop » 20 úno 2021, 10:38

Kdysi, když jsem pracoval s jakýmsi Tickerem, tak jsem se dočetl, že funkce jím volaná musí být úplně kraťoučká, protože jinak se zanedbá obsluha WiFi.
Musíš použít princip, že funkce SensorFlagSet() volaná Timerem musí vypadat jenom takhle:

Kód: Vybrat vše

bool SensorFlag = false;
void SensorFlagSet(void) {
  SensorFlag = true;
}
A funkci, kterou potřebuješ, pak voláš:

Kód: Vybrat vše

void loop(void) {
  ...
  if (SensorFlag) {
  SensorFlag = false;
  TvojeFunkce();
  }
   ...  
}  

ondraN
Příspěvky: 545
Registrován: 08 srp 2019, 20:01
Reputation: 1

Re: MQTT Broker - PubSubClient

Příspěvek od ondraN » 20 úno 2021, 17:02

Pokud by to nefungovalo, je třeba proměnnou definovat takhle

Kód: Vybrat vše

volatile bool SensorFlag = false;
To řekne překladači aby se nesnažil proměnnou optimalizovat.

BigSandy
Příspěvky: 181
Registrován: 23 zář 2017, 07:09
Reputation: 0

Re: MQTT Broker - PubSubClient

Příspěvek od BigSandy » 24 úno 2021, 08:43

Já se zas na netu dočet, že pokud je klient nějakou dobu neaktivní, tak ho servr vykopne.
V prvním příkladě mam delay(5000) tak to je pry ok.
V druhem přikladu mam nastaven čas minutu, což už je pry hodně a dostane kopanec.
Do void loop patří client.loop, prý příkaz udržuje spojení mezi klientem a servrem.
A funguje to.
I když to mám funkční nějak mi furt vrta v hlavě jedna věc.
Mam to připojene do routru na adrese 192.168.135.
Je to připojene do raspi přes MQTT a komunikuje.
Když však vezmu tablet a kouknu na sitě, mám tam ESPWebServer.
Proč?
https://pastebin.com/Ycy8g7xE

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti