vshymanskyy / TinyGSM

A small Arduino library for GSM modules, that just works
GNU Lesser General Public License v3.0
1.94k stars 719 forks source link

ESP32 TTGO T-Call, SIM800L, mosquitto MQTT - won't connect #471

Closed ykolerov closed 3 years ago

ykolerov commented 3 years ago

[x] I have read the Troubleshooting section of the ReadMe

[ ] Request to support a new module [ ] Bug or problem compiling the library [x] Bug or issue with library functionality (ie, sending data over TCP/IP) [x] Question or request for help

Modem: SIM800L R14.18 Main processor board: ESP32 TTGO T-Call v1.3 TinyGSM version: 0.10.9 Code:

#define TINY_GSM_MODEM_SIM800 #define SerialMon Serial #define SerialAT Serial1

// See all AT commands, if wanted #define DUMP_AT_COMMANDS

// Define the serial console for debug prints, if needed #define TINY_GSM_DEBUG SerialMon

const char apn[] = "internet.mts.ru"; const char gprsUser[] = ""; const char gprsPass[] = "";

// real IP goes here const char* broker = "ip.ip.ip.ip";

#include <TinyGsmClient.h> #include <PubSubClient.h>

#ifdef DUMP_AT_COMMANDS #include <StreamDebugger.h> StreamDebugger debugger(SerialAT, SerialMon); TinyGsm modem(debugger); #else TinyGsm modem(SerialAT); #endif

TinyGsmClient client(modem); PubSubClient mqtt(client);

uint32_t lastReconnectAttempt = 0;

boolean mqttConnect() { SerialMon.print("Connecting to "); SerialMon.print(broker);

boolean status = mqtt.connect("GsmClientName");

if (status == false) { SerialMon.println(" fail"); return false; } SerialMon.println(" success");

return mqtt.connected(); }

void setup() { SerialMon.begin(115200); delay(10);

pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(23, OUTPUT);

digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(23, HIGH);

SerialAT.begin(115200, SERIAL_8N1, 26, 27);

delay(6000);

SerialMon.println("Initializing modem..."); //modem.restart(); modem.init();

SerialMon.print("Waiting for network..."); if (!modem.waitForNetwork()) { SerialMon.println(" fail"); delay(10000); return; } SerialMon.println(" success");

if (modem.isNetworkConnected()) { SerialMon.println("Network connected"); }

SerialMon.print(F("Connecting to ")); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" fail"); delay(10000); return; } SerialMon.println(" success");

if (modem.isGprsConnected()) { SerialMon.println("GPRS connected"); }

mqtt.setServer(broker, 1883); }

void loop() {

if (!mqtt.connected()) { SerialMon.println("=== MQTT NOT CONNECTED ==="); // Reconnect every 10 seconds uint32_t t = millis(); if (t - lastReconnectAttempt > 10000L) { lastReconnectAttempt = t; if (mqttConnect()) { lastReconnectAttempt = 0; } } delay(100); return; }

mqtt.loop(); }

Scenario, steps to reproduce

Hi all, I'm using the above code and a mosquitto MQTT server with no ssl or login/password. The server is up and running, I can connect to it using other MQTT clients.

According to the serial monitor, the board/modem connects to GPRS succesfully and starts connecting to the MQTT server. It looks to me that AT log indicates the connection was successful, but the code returns false in mqtt.connect(). The log has one weird line after AT+CIPSEND=0,27 - it contains three strange symbols after ">" (I changed them to dots), then "MQTT" string, then again three strange symbols, and then "GsmClientName" string.

Can anyone please help figure out what's wrong?

Expected result

mqtt.connect() returns true

Actual result

mqtt.connect() returns false

Debug and AT command log

AT OK ATE0 OK AT+CMEE=2 OK AT+GMM SIMCOM_SIM800L OK [6049] ### Modem: SIMCOM SIM800L [6049] ### Modem: SIMCOM SIM800L AT+CLTS=1 OK AT+CBATCHK=1 OK AT+CPIN? +CPIN: READY OK ATI SIM800 R14.18 OK Modem Info: SIM800 R14.18 Waiting for network...AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,2 OK AT+CREG? +CREG: 0,1 OK success AT+CREG? +CREG: 0,1 OK Network connected Connecting to internet.mts.ru AT+CIPSHUT SHUT OK AT+CGATT=0 OK AT+SAPBR=3,1,"Contype","GPRS" OK AT+SAPBR=3,1,"APN","internet.mts.ru" OK AT+CGDCONT=1,"IP","internet.mts.ru" OK AT+CGACT=1,1 *PSUTTZ: 2020,12,9,12,57,4,"+12",0 [11762] ### Network time and time zone updated. DST: 0 [11762] ### Daylight savings time state updated. +CIEV: 10,"25001","MTS RUS","MTS RUS", 0, 0 OK AT+SAPBR=1,1 OK AT+SAPBR=2,1 +SAPBR: 1,1,"10.44.68.152" OK AT+CGATT=1 OK AT+CIPMUX=1 OK AT+CIPQSEND=1 OK AT+CIPRXGET=1 OK AT+CSTT="internet.mts.ru","","" OK AT+CIICR OK AT+CIFSR;E0 10.44.68.152 OK AT+CDNSCFG="8.8.8.8","8.8.4.4" OK success AT+CGATT? +CGATT: 1 OK AT+CIFSR;E0 10.44.68.152 OK GPRS connected AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,,"","","","INITIAL" OK === MQTT NOT CONNECTED === Connecting to ip.ip.ip.ipAT+CIPCLOSE=0,1 +CME ERROR: operation not allowed AT+CIPSSL=0 OK AT+CIPSTART=0,"TCP","ip.ip.ip.ip",1883 OK 0, CONNECT OK AT+CIPSEND=0,27 >...MQTT... GsmClientName DATA ACCEPT:0,27 AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CONNECTED" OK AT+CIPCLOSE=0,1 0, CLOSE OK fail AT+CIPRXGET=4,0 +CIPRXGET: 4,0,0 OK AT+CIPSTATUS=0 +CIPSTATUS: 0,0,"TCP","ip.ip.ip.ip","1883","CLOSED" OK === MQTT NOT CONNECTED ===

SRGDamia1 commented 3 years ago

Well, in your mqttConnect() function in your code you're trying to connect to your MQTT broker using the client named "GsmClientName", so that's why you're seeing that line.
boolean status = mqtt.connect("GsmClientName"); The weird symbols you get are because the MQTT protocol doesn't use all normally printed characters, so they're expected.

It looks to me from your code like you did successfully connect to the broker's IP and sent the MQTT connection request but the server never responded. Could you see on the server side that you weren't connected? Does your broker require a different client name/user/password?

All this library does is provide the TCP connection for the MQTT communication. The MQTT commands themselves are all on PubSubClient.

ykolerov commented 3 years ago

Thank you. The root cause was in the cell operator. I switched to another operator, everything worked.