NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

1、先到PubSubClient.h文件中通过报错内容“-2“,找到MQTT_CONNECT_FAILED语句

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

2、再到PubSubClient.cpp文件中找到MQTT_CONNECT_FAILED的相关内容

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

3、通过else语句找到上层的if语句内容得知result最终返回值应该是0:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

4、误打误撞,最终是换了个wifi解决了这个报错问题,所以可以追究else语句的内容:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

5、查询了”this->ip”的定义,找到这个函数定义:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

6、根据setServer()函数传入的IPAddress ip值,可以查询到:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

7、到这里好像没什么头绪了,于是回去看看了arduino.ino引入的头文件:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

8、于是到AliyunIoTSDK.h文件那找SetServer()函数相关的内容,看到了这条解析,据此可以推断,是wifi连接不稳定导致的!

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

9、这是换个wifi连接后串口输出的数据:

NodeMcu连接阿里云物联网平台遇到MQTT Connect err : -2 该如何解决

 

自此,解决掉”MQTT Connect err : -2 “的问题!

附上Arduino.ino代码:

#include <ESP8266WiFi.h>
static WiFiClient espClient;

#include <AliyunIoTSDK.h>

#define PRODUCT_KEY     "a1zdD6Vo6IT"//替换自己的PRODUCT_KEY
#define DEVICE_NAME     "MY09s59vXPhFF76Z9nus"//替换自己的DEVICE_NAME
#define DEVICE_SECRET   "mMrQ7qbp3KVCDVRDGXUfLvBL38dEDmRI"//替换自己的DEVICE_SECRET
#define REGION_ID       "cn-shanghai"//默认cn-shanghai

#define WIFI_SSID       "space"//替换自己的WIFI
#define WIFI_PASSWD     "12345678."//替换自己的WIFI

const int trigPin = 5;  //D1
const int echoPin = 4;  //D2

int duration;
int distance;

unsigned long lastMs = 0;

//wifi 连接
void wifiInit(const char *ssid, const char *passphrase)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, passphrase);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("WiFi not Connect");
  }
  Serial.println("Connected to AP");
}

int UltrasonicFirst()
{
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);
    distance= duration*0.034/2;
    
    return distance;

}


void setup()
{
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT);
    
  Serial.begin(115200);

  //连接到wifi
  wifiInit(WIFI_SSID, WIFI_PASSWD);

  //初始化 iot,需传入 wifi 的 client,和设备产品信息
  AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

}

void loop()
{
  AliyunIoTSDK::loop();//必要函数

  if (millis() - lastMs >= 2000)//每2秒发送一次
  {
    lastMs = millis();

    //发送超声波检测数值到云平台
    AliyunIoTSDK::send("Ultrasonic", UltrasonicFirst());
  }
}