Salve ragazzi!
Sto usando la libreria PubSubClient su una ESP8266 per collegarmi ad un MQTT broker.
Il broker sta sulla stessa rete locale su un raspberry.
Se mi collego dal pc desktop tramite client (MQTTX), riceve i messaggi senza problemi, quindi il broker funziona.
Sulla stessa rete ho anche una scheda ESP che però non riesce a collegarsi:
mqtt failed, rc=-2 try again in 5 seconds
l'errore -2 corrisponde a: MQTT_CONNECT_FAILED - the network connection failed
Su google ho cercato di tutto e di più, non ho più pagine dal leggere al riguardo!
Pare sia un problema di rete... eppure dal desktop non ho problemi.
Cosa può essere?
E' successo a qualcuno di voi?
Le sto provando tutte, ma non so proprio come risolvere!
risolto.
la libreria PubSubClient con WiFiClientSecure non funzionava.
Quindi o si utilizza WiFiClient o, come ho fatto io, avendo necessità di WiFiClientSecure per il boit telegram, ho abilitato il broker MQTT su SSL.
Ora non capisco perchè il client si disconnetta dopo ogni messaggio!!!
e scrive sempre "Attempting MQTT connection... " quindi ad ogni giro nuova connessione.
All'avvio mi avvisa di essersi avviato su telegram, ma poi da telegram non risponde più ai comandi. Secondo me è per quello. Se lo commento e riavvio, mi risponde pure ai comandi mandati in precedenza!!!
pulce:
Ora non capisco perchè il client si disconnetta dopo ogni messaggio!!!
Perché la libreria Telegram con tutta probabilità ti chiama il metodo client.stop() e quindi anche lato MQTT perdi la connessione al server.
Dovresti tenere 2 istanze distinte di WiFiClient ammesso che le librerie in questione te lo consentano.
Immagino ci sia anche la possibilità che il broker possa essere configurato per chiudere subito la connessione appena ricevuto il messaggio (ma se senza Telegram, fa quel che ti aspetti, lo escluderei).
P.S.
So che sembra autopromozione, ma se non risolvi, dai un'occhiata a questa mia libreria, in cui la classe va istanziata passandogli poprio il riferimento al client HTTP (generico, quindi va bene WiFi, Ethernet, GSM ).
In questo modo puoi avere un client1 per MQTT (anche non "secure") ed un client2 (per forza "secure") per Telegram... AsyncTelegram2
In effetti senza Telegram mantiene la connessione.
Anzi la perte di Telegram che invia i messaggi va benissimo.
Quello che lo manda in palla è solo parte di "lettura" dei messaggi dal bot.
Infatti se tolgo questo:
if (millis() - bot_lasttime > BOT_MTBS) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
bot_lasttime = millis();
}
Tutto funziona.
Potresti sostituire la libreria con la tua, ma devo vedere quante modifiche al mio codice comporta...
Non è detto che sia necessario, al momento quale stai usando? Ad esempio anche con la UniversalTelegramBot è necessario passare l'istanza del client e quindi è possibile usarne due distinti.
Si, sto usando la liberia UniversalTelegramBot.
Non ho capito cosa intendi però... o forse non ho capito ancora cosa fa la tua liberia perchè la devo ancora guardare
Facendo riferimento all'esempio della libreria Echobot.ino, tu stai usando lo stesso WiFiClientSecure sia per MQTT che per Telegram. Prova a dichiararne un secondo e passi il riferimento di quest'ultimo alla libreria Telegram.
Ora sono dal telefono mi viene un po' complicato buttare giù il codice.
ok, ho dichiarato ed isato un altro client per MQTT e nell console non vedo più queste continue connessioni.
Purtroppo però a quanto pare il problema che avevo (che ho tutt'ora) non dipendeva da quello.
In sostanza all'avvio manda un messaggio su telegram e lo manda senza problemi. Ma se io da telegram mando un comando, lui non fa niente. Il resto, ovvero rilevamento dati da diversi sensori, invio automatico tramite telegram e anche tramite MQTT continua a funzionare.
Proprio non funziona la parte di "lettura" della cosa dei messaggi.
Se lo riavvio togliendo MQTT, risponde pure ai vecchi messaggi che stavano in coda!!!
Strano... Appena sono davanti ad un pc provo a simulare anche io questa situazione (connessione con broker MQTT e Telegram contemporanea) e ti aggiorno.
Allora, ho provato questo sketch e sembra funzionare come dovrebbe. Esegue il publish sul server MQTT di esempio e contemporaneamente riceve/invia messaggi via Telegram, quindi la cosa è tecnicamente fattibile (avevo il dubbio che potessero esserci vincoli a livello di core esp8266).
Quindi in teoria dovrebbe funzionare anche con UniversalTelegramBot.
Si tratta della "fusione" dell'esempio mqtt_esp8266.ino della libreria PubSubClient e l'esempio echoBot.ino della libreria AsyncTelegram2 (il più semplice)
Si cosi sembrerebbe, l'unica differenza evidente (oltre alla libreria usata ovviamente) è che tu usi due WiFiClientSecure, mentre io ho usato un WiFiClientSecure per Telegram ed un WiFiClient per MQTT.
Se non ricordo male la porta 8883 è quella che di default viene impostata per MQTT over websocket. Probabilmente ce l'hai già impegnata e quindi non funziona.
Prova a fare un netstat da riga di comando per avere una panoramica delle connessioni attive.
Ma il problema dovrebbe essere del broker MQTT allora, non dell'ESP.
Ed in effetti funziona. E anche se uso quella porta tramite MQTTX (desktop client), non ho problemi.
Non capisco perchè blocchi Telegram, solo in lettura dei messaggi tra l'altro.
Ad ogni modo va bene anche sulla 1883