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