首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Adafruit MQTT库错误连接失败

Adafruit MQTT库错误连接失败
EN

Stack Overflow用户
提问于 2019-08-25 00:31:39
回答 1查看 486关注 0票数 0

Adafruit_MQTT库很棒,但我对它有一个问题。我在NodeMCU (ESP8266)的Arduino中使用它。使用示例代码,一切都很好。(TLS连接- WiFiClientSecure)。用我的方式,当我将主题直接值:"sometopic/abc/adbc"输入param时,一切都是正常的。(硬编码)

代码语言:javascript
复制
//Connect successfuly when i use:
  GLB_MQTTClient = temMQTT;
  Adafruit_MQTT_Publish *temPub = new Adafruit_MQTT_Publish(GLB_MQTTClient, "pubTopic", MQTT_QOS_1);
  Adafruit_MQTT_Subscribe *temSub = new Adafruit_MQTT_Subscribe(GLB_MQTTClient, "sometopic/abc/adbc", MQTT_QOS_1);

但是,我的程序必须检查一些内容,才能从EEPROM中获得MQTT主题,这样它就不能在文件开头初始化变量时分配主题。

因此,我创建了新的指针来初始化MQTT变量的值。则库无法连接到服务器。

代码语言:javascript
复制
#include <Arduino.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Ticker.h>
#include <common.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

//Do something for wifi connection...

WiFiClientSecure GLB_secureClient;
//Init with default value, cuz the library does not have default constructor
Adafruit_MQTT_Client *GLB_MQTTClient = new Adafruit_MQTT_Client(NULL, NULL, NULL, NULL, NULL, NULL);
Adafruit_MQTT_Publish *GLB_MQTT_Publish = new Adafruit_MQTT_Publish(NULL, NULL, MQTT_QOS_1);
Adafruit_MQTT_Subscribe *GLB_MQTT_Subcribe = new Adafruit_MQTT_Subscribe(NULL,NULL,MQTT_QOS_1);

void initNormalConnection()
{
  printf("\n\nAddress of GLB_secureClient: %p\n", &GLB_secureClient);
  printf("Address of GLB_MQTTClient: %p\n", GLB_MQTTClient);
  printf("Address of GLB_MQTT_Publish: %p\n", GLB_MQTT_Publish);
  printf("Address of GLB_MQTT_Subcribe: %p\n", GLB_MQTT_Subcribe);


  GLB_secureClient = WiFiClientSecure();
  GLB_secureClient.setFingerprint(FINGER_PRINT);

  Adafruit_MQTT_Client *temMQTT = new Adafruit_MQTT_Client(&GLB_secureClient, BROKER_HOST, BROKER_PORT);

  GLB_MQTTClient = temMQTT;
  Adafruit_MQTT_Publish *temPub = new Adafruit_MQTT_Publish(GLB_MQTTClient, pubTopic, MQTT_QOS_1);
  Adafruit_MQTT_Subscribe *temSub = new Adafruit_MQTT_Subscribe(GLB_MQTTClient, subTopic, MQTT_QOS_1);

  GLB_MQTT_Publish = temPub;
  GLB_MQTT_Subcribe = temSub;
  GLB_MQTT_Subcribe->setCallback(MQTTCtrCallback);
  GLB_MQTTClient->subscribe(GLB_MQTT_Subcribe);

  printf("\n\nAddress of GLB_secureClient: %p\n", &GLB_secureClient);
  printf("Address of GLB_MQTTClient: %p\n", GLB_MQTTClient);
  printf("Address of GLB_MQTT_Publish: %p\n", GLB_MQTT_Publish);
  printf("Address of GLB_MQTT_Subcribe: %p\n", GLB_MQTT_Subcribe);

  PRINTLN("\ninitNormalConnection");
}

void MQTTConnect()
{
  int8_t ret;
  // Stop if already connected.
  PRINTLN("MQTTConnect");
  if (GLB_MQTTClient->connected())
  {
    PRINTLN("connected");
    return;
  }
  PRINTLN("not connected");

  if (stateSmartConfig || WiFi.status() != WL_CONNECTED)
  {
    return;
  }
  PRINTLN("Connecting to MQTT... ");
  uint8_t retries = 3;
  ret = GLB_MQTTClient->connect();
  PRINT("Connect MQTT result: ");
  PRINTLN(ret);
  while (ret != 0)
  { // connect will return 0 for connected
    ERR_PRINTLN(GLB_MQTTClient->connectErrorString(ret));
    DEBUG_PRINTLN("Retrying MQTT connection in 10 seconds...");
    GLB_MQTTClient->disconnect();
    delay(10000);
    retries--;
    if (retries == 0)
    {
      // basically die and wait for WDT to reset me
      return;
    }
  }
  Serial.println("MQTT Connected!");
}


void setup(){
    //Do something and check config
    initNormalConnection();
 }

void loop()
{

//do somethings

  MQTTConnect();
  GLB_MQTTClient->processPackets(10000);
  if (!GLB_MQTTClient->ping())
  {
    GLB_MQTTClient->disconnect();
  }
}

ret = GLB_MQTTClient->connect()总是使用ret = -1 (连接失败)地址输出:

代码语言:javascript
复制
Address of GLB_secureClient: 0x3ffef170 
Address of GLB_MQTTClient: 0x3fff167c 
Address of GLB_MQTT_Publish: 0x3fff17e4 
Address of GLB_MQTT_Subcribe:0x3fff17f4

Address of GLB_secureClient: 0x3ffef170 
Address of GLB_MQTTClient: 0x3fff27ac 
Address of GLB_MQTT_Publish:  0x3fff220c 
Address of GLB_MQTT_Subcribe: 0x3fff2914

问题是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-11-20 20:43:31

您正在了解如何使用堆。在堆上实例化两次GLB_MQTTClient、GLB_MQTT_Publish、GLB_MQTT_Subcribe,然后出现小内存泄漏,就会丢失指向声明性部分中实例类的指针。只声明一个指针,然后在initNormalConnection()中实例化一个对象。

代码摘录:

代码语言:javascript
复制
WiFiClientSecure GLB_secureClient;
//Init with default value, cuz the library does not have default constructor
Adafruit_MQTT_Client *GLB_MQTTClient;
Adafruit_MQTT_Publish *GLB_MQTT_Publish;
Adafruit_MQTT_Subscribe *GLB_MQTT_Subcribe;

void initNormalConnection()
{
  printf("\n\nAddress of GLB_secureClient: %p\n", &GLB_secureClient);
  printf("Address of GLB_MQTTClient: %p\n", GLB_MQTTClient);
  printf("Address of GLB_MQTT_Publish: %p\n", GLB_MQTT_Publish);
  printf("Address of GLB_MQTT_Subcribe: %p\n", GLB_MQTT_Subcribe);

  GLB_secureClient = WiFiClientSecure();
  GLB_secureClient.setFingerprint(FINGER_PRINT);

  GLB_MQTTClient = new Adafruit_MQTT_Client(&GLB_secureClient, BROKER_HOST, BROKER_PORT);
  GLB_MQTT_Publish = new Adafruit_MQTT_Publish(GLB_MQTTClient, pubTopic, MQTT_QOS_1);
  GLB_MQTT_Subcribe = new Adafruit_MQTT_Subscribe(GLB_MQTTClient, subTopic, MQTT_QOS_1);

  ...`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57642422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档