Arduino PubSubClient MQTT не подключается - PullRequest
0 голосов
/ 03 октября 2019

Im Использование библиотек TinyGsmClient, PubSubClient, SoftwareSerial для подключения к серверу по протоколу MQTT.

но с кодом ниже, я пытаюсь подключиться каждые 2 секунды, и всегда он не будет подключен. в mqttConnect метод выведет

"fail"

#define TINY_GSM_MODEM_SIM808
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#define GSM_AUTOBAUD_MIN 9600
#define GSM_AUTOBAUD_MAX 9600

#define TINY_GSM_USE_GPRS true
#define TINY_GSM_USE_WIFI false


SoftwareSerial SerialAT(2, 3); // RX, TX
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);


long lastReconnectAttempt = 0;

void mqttCallback(char* topic, byte* payload, unsigned int len) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("]: ");
  Serial.write(payload, len);
  Serial.println();

  // Only proceed if incoming message's topic matches
  if (String(topic) == "in/tt") {
    mqtt.publish("in\tt", "llp" ? "1" : "0");
  }
}

boolean mqttConnect() {
  Serial.print("Connecting to ");
  Serial.print("broker.hivemq.com");
  boolean status = mqtt.connect("GsmClientTest");
  if (status == false) {
    Serial.println(" fail");
    return false;
  }
  Serial.println(" success");
  mqtt.publish("in/tt", "GsmClientTest started");
  mqtt.subscribe("in/#");
  return mqtt.connected();
}


void setup() {
  Serial.begin(9600);
  delay(100);
  SerialAT.begin(9600);
  delay(3000);
  SerialAT.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  SerialAT.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  SerialAT.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  SerialAT.println("AT+CREG?"); //Check whether it has registered in the network
  updateSerial();


  Serial.println("Initializing modem...");
  modem.init();

  String modemInfo = modem.getModemInfo();
  Serial.print("Modem Info: ");
  Serial.println(modemInfo);

  Serial.print("Waiting for network...");
  Serial.println(" success");

  if (modem.isNetworkConnected()) {
    Serial.println("Network connected");
  }
  mqtt.setServer("broker.hivemq.com", 1883);
  mqtt.setCallback(mqttCallback);
}

void loop() {

  if (!mqtt.connected()) {
    Serial.println("=== MQTT NOT CONNECTED ===");
    // Reconnect every 10 seconds
    unsigned long t = millis();
    if (t - lastReconnectAttempt > 2000L) {
      lastReconnectAttempt = t;
      if (mqttConnect()) {
        lastReconnectAttempt = 0;
      }
    }
    delay(1000);
    return;
  }

  mqtt.loop();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    SerialAT.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(SerialAT.available()) 
  {
    Serial.write(SerialAT.read());//Forward what Software Serial received to Serial Port
  }
}

После запуска этого кода вывод будет выглядеть так:

Инициализация модема ... Информация о модеме: SIM808 R14.18 Ожидание сети ...

success Сеть подключена

=== MQTT NOT CONNECTED === Подключение к broker.hivemq. com fail

=== MQTT NOT CONNECTED === Ошибка подключения к broker.hivemq.com

...