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

Problems with MQTT on my ESP32 project #461

Closed Hammerschmidt closed 3 years ago

Hammerschmidt commented 3 years ago

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

What type of issues is this?

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

What are you working with?

Modem: BK-SIM808 Main processor board: ESP32 TinyGSM version: 0.10.9 Code:

define TINY_GSM_MODEM_SIM808 //My Moden

include

include

include

define SerialMon Serial

define DUMP_AT_COMMANDS

define TINY_GSM_USE_GPRS true

// Just in case someone defined the wrong thing..

if TINY_GSM_USE_GPRS && not defined TINY_GSM_MODEM_HAS_GPRS

undef TINY_GSM_USE_GPRS

undef TINY_GSM_USE_WIFI

define TINY_GSM_USE_GPRS false

define TINY_GSM_USE_WIFI true

endif

if TINY_GSM_USE_WIFI && not defined TINY_GSM_MODEM_HAS_WIFI

undef TINY_GSM_USE_GPRS

undef TINY_GSM_USE_WIFI

define TINY_GSM_USE_GPRS true

define TINY_GSM_USE_WIFI false

endif

HardwareSerial SerialGSM(1);

ifdef DUMP_AT_COMMANDS

include

StreamDebugger debugger(SerialGSM, SerialMon); TinyGsm modem(debugger);

else

TinyGsm modem(SerialGSM);

endif

TinyGsmClient client(modem); //PubSubClient client(mqtt_broker, mqtt_port, gsmClient); PubSubClient mqtt(client);

// Your GPRS credentials, if any const char apn[] = "inlog.claro.com.br"; //inlog.claro.com.br const char gprsUser[] = "datatem"; //datatem const char gprsPass[] = "datatem"; //datatem

const char broker = "tailor.cloudmqtt.com"; const char mqttUser = "psw"; const char* mqttPassword = "psw"; const uint8_t mqtt_port = 16206;

byte programStart = 187; char line = '\n';

define TOPIC_START "myTopic/esp1/start"

long lastMsg = 0;

char msgStart[20];

uint32_t lastReconnectAttempt = 0;

void mqttCallback(char topic, byte payload, unsigned int length) { SerialMon.print("Message received: "); SerialMon.println(topic);

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

}

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

setupGSM();

if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE

// The XBee must run the gprsConnect function BEFORE waiting for network! modem.gprsConnect(apn, gprsUser, gprsPass);

endif

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

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

if TINY_GSM_USE_GPRS

// GPRS connection parameters are usually set after network registration 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"); }

endif

// MQTT Broker setup mqtt.setServer(broker, mqtt_port);
//mqttConnect(); mqtt.setCallback(mqttCallback);

}

void loop() { if (!mqtt.connected()) { mqttConnect(); } / this function will listen for incomming subscribed topic-process-invoke receivedCallback /

mqtt.loop(); / we measure temperature every 3 secs we count until 3 secs reached to avoid blocking program if using delay()/

snprintf (msgStart, 20, "%x", programStart); mqtt.publish(TOPIC_START, msgStart);

Serial.print(programStart);

delay(3000);

}

void setupGSM() { SerialMon.println("Setup GSM...");

SerialGSM.begin(9600, SERIAL_8N1, 17, 16, false); delay(3000);

SerialMon.println(modem.getModemInfo());

if (!modem.restart()) { SerialMon.println("Restarting GSM Modem failed"); delay(10000); ESP.restart(); return; }

if (!modem.waitForNetwork()) { SerialMon.println("Failed to connect to network"); delay(10000); ESP.restart(); return; }

if (!modem.gprsConnect(apn, gprsUser, gprsPass)) //"claro.com.br", "claro", "claro" { SerialMon.println("GPRS Connection Failed"); delay(10000); ESP.restart(); return; } SerialMon.println("Setup GSM Success");

}

void mqttConnect() {

while (!client.connected()) { Serial.print("MQTT connecting to "); Serial.print(broker); Serial.print("... ");

String clientId = "my-test01";

if (mqtt.connect(clientId.c_str(), mqttUser, mqttPassword)) {
  Serial.println("connected");

  mqtt.subscribe(TOPIC_START, 0);

} else {
  Serial.print("failed, status code =");
  Serial.print(mqtt.state());
  Serial.println("try again in 5 seconds");
  /* Wait 5 seconds before retrying */
  delay(5000);
}

}

}

Scenario, steps to reproduce

My MQTT doesn't work, I don't know why, my GSM moden works (see my debug section), but my MQTT doesn't send any data. In my debug console I see the MQTT address (34.199.33.81) but I don't understand what is happening.

Expected result

Recieve a byte 187 from MQTT.

Actual result

My MQTT doesn't connect.

Debug and AT command log

Setup GSM... ATI

SIM808 R14.18

OK SIM808 R14.18 AT

OK AT&W

OK AT+CFUN=0

+CPIN: NOT READY

OK AT+CFUN=1,1

OK AT

OK ATE0

OK AT+CMEE=0

OK AT+CLTS=1

OK AT+CBATCHK=1

OK AT+CPIN?

ERROR AT+CPIN?

+CPIN: READY

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? DST: 0

+CIEV: 10,"72405","CLARO BR","", 0, 0

+CREG: 0,2

OK AT+CREG?

+CREG: 0,1

OK AT+CIPSHUT

SHUT OK AT+CGATT=0

OK AT+SAPBR=3,1,"Contype","GPRS"

OK AT+SAPBR=3,1,"APN","inlog.claro.com.br"

OK AT+SAPBR=3,1,"USER","datatem"

OK AT+SAPBR=3,1,"PWD","datatem"

OK AT+CGDCONT=1,"IP","inlog.claro.com.br"

OK AT+CGACT=1,1

OK AT+SAPBR=1,1

ERROR AT+SAPBR=2,1

+SAPBR: 1,3,"0.0.0.0"

OK AT+CGATT=1

OK AT+CIPMUX=1

OK AT+CIPQSEND=1

OK AT+CIPRXGET=1

OK AT+CSTT="inlog.claro.com.br","datatem","datatem"

OK AT+CIICR

OK AT+CIFSR;E0

10.64.71.138

OK AT+CDNSCFG="8.8.8.8","8.8.4.4"

OK Setup GSM Success Waiting for network...AT+CREG?

+CREG: 0,1

OK success AT+CREG?

+CREG: 0,1

OK Network connected Connecting to inlog.claro.com.brAT+CIPSHUT

SHUT OK AT+CGATT=0

OK AT+SAPBR=3,1,"Contype","GPRS"

OK AT+SAPBR=3,1,"APN","inlog.claro.com.br"

OK AT+SAPBR=3,1,"USER","datatem"

OK AT+SAPBR=3,1,"PWD","datatem" OK AT+CGDCONT=1,"IP","inlog.claro.com.br"

OK AT+CGACT=1,1

OK AT+SAPBR=1,1

OK AT+SAPBR=2,1

+SAPBR: 1,1,"10.64.71.138"

OK AT+CGATT=1

OK AT+CIPMUX=1

OK AT+CIPQSEND=1

OK AT+CIPRXGET=1

OK AT+CSTT="inlog.claro.com.br","datatem","datatem" OK AT+CIICR

OK AT+CIFSR;E0

10.64.71.138

OK AT+CDNSCFG="8.8.8.8","8.8.4.4"

OK success AT+CGATT?

+CGATT: 1

OK AT+CIFSR;E0

10.64.71.138

OK GPRS connected AT+CIPRXGET=4,0

+CIPRXGET: 4,0,0

OK AT+CIPSTATUS=0

+CIPSTATUS: 0,,"","","","INITIAL"

OK MQTT connecting to tailor.cloudmqtt.com... AT+CIPCLOSE=0,1

ERROR AT+CIPSSL=0

ERROR AT+CIPSTART=0,"TCP","tailor.cloudmqtt.com",78

OK ailed, status code =-2try again in 5 seconds AT+CIPRXGET=4,0

+CIPRXGET: 4,0,0

OK AT+CIPSTATUS=0

+CIPSTATUS: 0,0,"TCP","34.199.33.81","78","CLOSED"

OK MQTT connecting to tailor.cloudmqtt.com... AT+CIPCLOSE=0,1

ERROR AT+CIPSSL=0

ERROR AT+CIPSTART=0,"TCP","tailor.cloudmqtt.com",78

OK ailed, status code =-2try again in 5 seconds AT+CIPRXGET=4,0

+CIPRXGET: 4,0,0

OK AT+CIPSTATUS=0

+CIPSTATUS: 0,0,"TCP","34.199.33.81","78","CLOSED"