vshymanskyy / TinyGSM

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

MQTT not working on my ESP32 project #457

Closed Hammerschmidt closed 4 years ago

Hammerschmidt commented 4 years ago

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

What type of issues is this?

[ ] Request to support a new module

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

What are you working with?

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

#define TINY_GSM_MODEM_SIM808 //My Moden
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <HardwareSerial.h>

#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.h>
  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";
const char gprsUser[] = "datatem";
const char gprsPass[] = "datatem";

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

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

#define START_TOPIC "myTopic/esp1/start"

long lastMsg = 0;

char startMSG[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 mqttConnect() {

  while (!client.connected()) {
    Serial.print("MQTT connecting to ");
    Serial.print(broker);
    Serial.print("... ");
    /* client ID */
    String clientId = "nitens-test01";
    /* connect now */
    if (mqtt.connect(clientId.c_str(), mqttUser, mqttPassword)) {
      Serial.println("connected");
      /* subscribe topic with default QoS 0*/
      mqtt.subscribe(START_TOPIC, 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);
    }
  }

}

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

  setupGSM(); 
  mqttConnect(); //Connect my MQTT
#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);  
  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 (startMSG, 20, "%x", startProgram);
  mqtt.publish(START_TOPIC, startMSG);

  Serial.print(startProgram);

  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");

}

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.

Expected result

Recieve a byte 187 from MQTT.

Actual result

My MQTT doesn't connect.

Debug and AT command log

Setup GSM... A 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 T+CREG?

+CREG: 0,2

OK AT+CREG?

+CREG: 0,2

OK T+CREG?

+CREG: 0,2

OK AT+CREG?

+CREG: 0,2

OK AT+CREG?

+CREG: 0,2

OK T+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

OK AT+SAPBR=2,1 SAPBR: 1,1,"10.64.71.138"

OK AT+CGATT=1

OK AT+C 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 AT+CIPRXGET=4,0

+CIPRXGET: 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","0.0.0.0",0

ERROR failed, status code =-2try again in 5 seconds T+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","0.0.0.0",0

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

SRGDamia1 commented 4 years ago

It looks like you're trying to make the MQTT connection before you set the broker. So it's trying (and of course failing) to connect to a null broker (0.0.0.0). You need to move the MQTT broker set up section of your code to before the connection.