天天看點

ESP8266開發脫坑指南(一、裝置上雲)                                     完整參考代碼

今天來搞一個ESP8266連接配接阿裡雲項目,編譯上傳開發闆成功後發現裝置一直未成功激活上線,ESP8266連接配接上WIFI後有馬上斷開,在檢視序列槽資訊後發現

Connecting to MQTT Server ...
MQTT connect failed, error code:2
No need to try again.
{"id":"123","version":"1.0","method":"thing.event.property.post","params":{"LightSwitch":0}}


中文翻譯:正在連接配接到MQTT伺服器...MQTT連接配接失敗,錯誤代碼:2 ,不需要再試一次。
           

在送出工單後得到的回複是

阿裡雲工程師 ***** 号 :   

你好, 傳回值2表示用戶端辨別符不正确, -4表示使用者名或者密碼錯誤。 請做以下檢查:

1、先檢查一下PubSubClient.h檔案中定義的 MQTT_MAX_PACKET_SIZE的值, 最好要大于1024, MQTT_KEEPALIVE 大于60;

2、檢查一下你的簽名和接入參數的設定,可以參考文檔

https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11186623.6.650.3820619bBWPshh

一波操作之後終于把它“變綠”啦!

ESP8266開發脫坑指南(一、裝置上雲)                                     完整參考代碼
ESP8266開發脫坑指南(一、裝置上雲)                                     完整參考代碼

                                     完整參考代碼

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>

//定義LED燈
#define LED0 D0 

//初始化次态
int redLedState0 = 0;

//初始化現态
int last0 = 0;

//上雲時間現态
unsigned long lastSend = 0;

//你的wifi
#define WIFI_SSID      "智定義科技提示您:此處填寫WIFI名稱"
#define WIFI_PASSWD    "智定義科技提示您:此處填寫WIFI密碼"

//阿裡雲三元組
#define PRODUCT_KEY    "智定義科技提示您:此處填寫 PRODUCT KEY"
#define DEVICE_NAME    "智定義科技提示您:此處填寫 DEVICE NAME"
#define DEVICE_SECRET  "智定義科技提示您:此處填寫 DEVICE SECRET"

//訂閱和釋出時所需的主題
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define ALINK_TOPIC_PROP_POSTRSP "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST "thing.event.property.post"

//建立WiFiClient執行個體
WiFiClient espClient;

//建立MqttClient執行個體
PubSubClient mqttClient(espClient);


//連接配接Wifi
void initWifi(const char *ssid, const char *password)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("WiFi does not connect, try again ...");
    delay(3000);
  }

  Serial.println("Wifi is connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


//監聽雲端下發指令并處理 
void callback(char *topic, byte *payload, unsigned int length)
{
     
    Serial.println();
    Serial.println();
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    Serial.println();
    //雲端下發屬性設定topic = "[/sys/a10PnXZBgsl/7L9EUbLv113EkYkF7fpD/thing/service/property/set]"

    payload[length] = '\0';
    Serial.println((char *)payload);
    //const char *payload = "{"method":"thing.service.property.set","id":"282860794","params":{"LightSwitch":1},"version":"1.0.0"}"


  if (strstr(topic, ALINK_TOPIC_PROP_SET))
    {
        //json解析payload
        StaticJsonBuffer<400> jsonBuffer;
        JsonObject &root = jsonBuffer.parseObject(payload);

        //判斷json解析是否成功
        if (!root.success())
        {   
            Serial.println("parseObject() failed");
        } 
        else
        {
            Serial.println("parseObject() success");

            //redLedState0  = json解析後的"LightSwitch"的值
            redLedState0 = root["params"]["LightSwitch"];

            Serial.print(redLedState0);
            Serial.println(" set  sucess");
            Serial.println();
     
            Serial.print("LED0 State: ");
            Serial.println(redLedState0);
            digitalWrite(LED0, redLedState0);

        }
    }
}

//連接配接Mqtt訂閱屬性設定Topic
void mqttCheckConnect()
{
    bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);

    if (connected)
    {
        Serial.println("MQTT connect succeed!");

        //訂閱屬性設定Topic
        mqttClient.subscribe(ALINK_TOPIC_PROP_SET); 
        Serial.println("subscribe done");
    }
}

// 上報屬性Topic資料
void mqttIntervalPost()
{
    char param[256];
    char jsonBuf[512];
   
    sprintf(param, "{\"LightSwitch\":%d}", digitalRead(LED0));
    sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);
    //jsonBuf = "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":"\{\"LightSwitch\":%d}\"}"

    Serial.println(jsonBuf);

    mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf); 
}


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

    pinMode(LED0, OUTPUT); 
    digitalWrite(LED0, 0); 

    initWifi(WIFI_SSID, WIFI_PASSWD); 

    Serial.println();
    Serial.println();


    mqttCheckConnect(); //初始化首次連結
    mqttIntervalPost(); //上報初始化資料

    Serial.println();
    mqttClient.setCallback(callback); // 回調,監聽雲端下發指令,當ESP8266收到訂閱Topic後調用callback函數
}


void loop()
{
  //每隔1s嘗試連接配接一次雲
  if (millis() - lastSend >= 10000)
    {
        mqttCheckConnect(); 
        lastSend = millis();
    }

    //判斷三燈現态與次态的關系,減少無意義的上報  
    if (last0 != redLedState0)
    {
        last0 = redLedState0;
        
        mqttIntervalPost(); 
        Serial.println();
    }

    mqttClient.loop();
}