Arduino MKRGSM 1400在连接到MQTT时崩溃

Arduino MKRGSM 1400在连接到MQTT时崩溃,arduino,mqtt,Arduino,Mqtt,我有一个关于Arduino MKRGSM 1400和MQTT的问题 我使用下面的代码通过SIM卡将MKRGSM连接到internet,然后将其连接到Docker上安装的HiveMQ代理。即使代码编译时没有任何错误,但一旦我将其上传到我的板上,它就会崩溃。一旦它崩溃,我必须完全重置我的板。我在VS代码中使用Arduino IDE和Platform.io尝试了这段代码,两者都给出了相同的结果 在我连接MQTT之前,主板成功连接到互联网,DHT11传感器能够毫无问题地读取湿度和温度值 我对Arduin

我有一个关于Arduino MKRGSM 1400和MQTT的问题

我使用下面的代码通过SIM卡将MKRGSM连接到internet,然后将其连接到Docker上安装的HiveMQ代理。即使代码编译时没有任何错误,但一旦我将其上传到我的板上,它就会崩溃。一旦它崩溃,我必须完全重置我的板。我在VS代码中使用Arduino IDE和Platform.io尝试了这段代码,两者都给出了相同的结果

在我连接MQTT之前,主板成功连接到互联网,DHT11传感器能够毫无问题地读取湿度和温度值

我对Arduino不太在行,这是我第一次尝试自己使用MQTT

有人知道为什么代码不仅不起作用,而且使我的电路板崩溃吗? 提前谢谢

//Includes
#include <PubSubClient.h>
#include <MKRGSM.h>
#include "DHT.h"
#include <Adafruit_Sensor.h>

//Var declaration
//SIM-internet connection
GSMClient net;
GPRS gprs;
GSM gsmAccess;

const char pin[]      = "my pin";
const char apn[]      = "my apn";
const char login[]    = "my login";
const char password[] = "my password";

//MQTT connection
PubSubClient client;
const String serialNumber = "1";
const String mqtt_server = "server_ip";
const String topic = "/prototype/" + serialNumber;

//DHT sensor PIN declaration
#define DHTPIN 2  //DHT is pinned on 2
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

void connect() {
//SIM not connected
    bool connected = false;
    Serial.print("Connecting to cellular network.");

//SIM connecting
    while (!connected) {
    if ((gsmAccess.begin(pin) == GSM_READY) &&
        (gprs.attachGPRS(apn, login, password) == GPRS_READY)) {
        //SIM connected
        connected = true;
        Serial.print("Connected to cellular network.");
    }
    else {
        //If SIM doesn't connect
        Serial.print(".");
        delay(1000);
        }
    }
}

void setup() {
    Serial.begin(9600);

    //Connect to Docker MQTT
    client.setServer(mqtt_server.c_str(), 8086);
    client.connect(serialNumber.c_str());
    Serial.print("MQTT connection state: ");
    Serial.println(client.state());

    //Start DHT 11
    dht.begin();
}

void loop() {
    delay(10000);

    //Get DHT values
    float humidty = dht.readHumidity();
    float temperature = dht.readTemperature();

    //Create JSON out of values and send it.
    const String json = "{\"temperature\": " + String(temperature, 2) + ", \"humidity\": " + String(humidty) + " }";
    Serial.println(json);
    client.publish(topic.c_str(), json.c_str());

    //Check if MQTT connection is holding.
    Serial.print("MQTT connection state: ");
    Serial.println(client.state());

    //Reconnect if MQTT connection is lost.
    if (!client.connected()) {
    Serial.println("MQTT disconnected! Trying reconnect.");
    client.connect("whatever");
  }

}

如评论中所述

您从未调用连接功能,因此从未设置GSM网络


然后,您可能需要使用GSMClient初始化PubSubClient,以便它知道如何访问网络。

您没有在循环函数中调用client.loop,因此MQTT客户端没有任何时间处理事情。此外,您还应该编辑问题,以包括来自应用程序的串行跟踪,这样我们就有一半的机会猜猜它在哪里坠毁。首先,谢谢你的快速反应。我想发布序列跟踪,但没有。代码上载完成,然后我收到一个Windows通知,说明我的设备已损坏。我必须上传一个干净的Arduino脚本来修复它。它与任何其他脚本一起工作都没有问题。再次检查,您没有调用连接函数或初始化PubSubClient,因此您将永远无法访问第一个Serial.println callYup,就是这样。谢谢你的帮助。