VSCode+PlatformIo IDE實現Wemos D1 Mini(ESP8266)接入阿里雲物聯網平臺

阿里雲物聯網平臺端設置

雲端設備接入整體流程圖

這個圖我是上傳的原圖,如果看不清可以下載後放大查看細節。或者ctrl+"+"來放大屏幕查看。查看完只需ctrl+"0"即可復原。
在這裏插入圖片描述

賬號註冊

阿里雲物聯網IOT平臺網址

  • 因爲是阿里的產品,所以註冊時候挺方便,可以直接用淘寶賬號登錄。
  • 點擊產品->物聯網->物聯網設備接入
    在這裏插入圖片描述
  • 點擊立即開通,進如控制檯。
    在這裏插入圖片描述

新建產品

  • 在控制檯左側菜單選擇設備管理->產品標籤。因爲之前我已經建立過產品並進行了測試,所以我的這個頁面會顯示之前創建的產品。如果你是第一次進入,則這個位置中產品的列表欄應該是空的。
    在這裏插入圖片描述
  • 點擊右側創建產品按鈕,對你所要創建的產品名稱等信息進行設置。填寫完畢,點擊完成後,產品創建完成。在之前的產品列表頁面就會顯示出你剛創建的這個產品
    在這裏插入圖片描述

產品的功能定義

  • 在產品列表中選擇你剛創建的產品,點擊查看按鈕,進入剛剛創建的產品的詳情頁。
    在這裏插入圖片描述
  • 在上述操作進入的新界面中,選擇功能定義標籤,在自定義功能一欄中點擊添加功能按鈕。
    在這裏插入圖片描述
  • 這個上雲的實驗是通過一個開關量來控制板載燈的亮滅。開光是布爾型的。功能名稱是自己命名的(當然阿里雲裏提供了很多默認的功能名稱供選擇)。
    在這裏插入圖片描述
  • 上述操作完成後,在定義功能區就會增加一個新的屬性,後續如果需要對該屬性進行修改,點擊該屬性右側編輯按鈕即可。至此,產品的創建完成。
    在這裏插入圖片描述
  • 設備的設置

產品設置完成後,需要創建設備來關聯之前的產品。

  • 點擊控制檯左側的設備標籤。在設備列表的右側點擊添加設備按鈕。
    在這裏插入圖片描述
  • 添加設備對話框中,你需要關聯一個你之前創建的產品。
    在這裏插入圖片描述
  • DeviceName這一項可以不填,由阿里爲你默認生成,點擊“確認”按鈕後,完成設備的添加。
    在這裏插入圖片描述
  • 這個部分要特別注意,設備添加後,如果從未接入過雲,則會顯示“未激活”。只有在第一次連通成功後,纔會切換成“在線/離線”狀態。我的應爲已經創建過了,所以缺少一個初次創建時顯示的設備三碼(ProduntKey、DeviceName、DeviceSecret)頁面。那個不是很重要。因爲上雲用的三碼可以通過設備右側的查看按鈕隨時得到。
    在這裏插入圖片描述
  • 點擊查看按鈕後的頁面顯示。下圖中的三碼,後續Wemos D1 Mini中還要使用。到這裏,WemosD1Mini上雲的雲端設置就完成了,接下來進入代碼編寫階段。
    在這裏插入圖片描述

VSCode(hacklab)端設置

程序端流程圖

這個思維導圖是邊測試邊記錄下來的,怕自己會忘記整體流程。在最初完成的時候,Wemos D1 Mini始終無法連上阿里雲,串口顯示aliyunMqqt連接失敗。重新粘貼設備的三碼,並沒有問題,找不到問題的癥結在哪裏。所以考慮下載一個支持aliyunMqqt的獨立Mqtt客戶端測試下,但是下載下來還沒有用,忽然意識到是我對josn的內存沒有進行設置。在platform.ini中增加了相關的設置後。Wemos D1Mini成功上雲。我覺得這是個不錯的測試思路。所以在思維導圖中保留這個部分的思考過程。
在這裏插入圖片描述

在VSCode裏新建一個Arduino工程

  • 上一篇文章中已經介紹了關於 Vscode+PlatformIod基本環境搭建、使用,包括庫搜索的初探。如果對這個部分不是很熟悉,可以參見上一篇帖子,這裏就不重複描述了。下面是電梯可以直達。
    VSCode+PlatformIo IDE實現arduino IOT嵌入式編程—Wemos D1 Mini點亮板載LED燈
  • 打開VSCode,點擊左側小螞蟻圖標,在新打開的頁面中選擇“+New Project”
    在這裏插入圖片描述
    -新建一個工程,放在了默認路徑。你也可以通過去掉Location位置的選項來將程序存入你自己指定的路徑。點擊完成進入新的空工程。
    在這裏插入圖片描述

platform.ini文件中添加庫

  • 在新建的空工程中選擇platformio.ini文件。之後我們添加的各種庫需要粘貼在這裏。
    在這裏插入圖片描述

添加ArduinoJson庫

  • 搜索打開ArduinoJson庫。
    在這裏插入圖片描述
  • 找到ArduinoJosn庫的安裝信息
    在這裏插入圖片描述
  • 複製ArduinoJosn庫的安裝信息
    三種方式中選擇一種進行復制即可。但是在上雲過程中,發現使用最新版的庫有個變量的名稱改變了。所以最終選擇了官方示例中的[email protected]版本。在這裏插入圖片描述

添加AliyunMqttArduino

這個庫的添加方式和上述的ArduinoJosn庫安裝雷同,只是這個選擇最新的版本即可。

platformio.ini文件內容。

但是在初次編譯上傳後,WemosD1Mini始終更無法連接上Ali的mqtt。報255錯誤。後來上網查到別人的代碼中還有一段對於MQTT內存大小的設置。將那部分代碼加入後,上雲成功。

lib_deps =
[email protected]
[email protected]
#設定MQTT包的參數
-D MQTT_MAX_PACKET_SIZE=512
-D MQTT_KEEPALIVE=60

main.c文件中添加應用程序


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

// Wifi名稱和密碼,你WemosD1Mini上網時需要接入的Wifi賬號和密碼
#define WIFI_SSID "xxxxxxxxxxx"
#define WIFI_PASSWD "xxxxxxxxxxxx"

// LP的設備三元組(PK/DN/DS)根據你雲端創建的設備三碼進行更改
#define PRODUCT_KEY "xxxxxxxxxxxxxx"
#define DEVICE_NAME "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxx"

// Alink協議格式和Topic定義 這個部分是固定格式不用進行修改
#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.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);

    if (strstr(topic, ALINK_TOPIC_PROP_SET))
    {
        StaticJsonBuffer<200> jsonBuffer;
        JsonObject &root = jsonBuffer.parseObject(payload);
        if (!root.success())
        {
            Serial.println("parseObject() failed");
        } else {
            Serial.println("parseObject() success");
            //下一步對收到的雲端指令進行處理
        }
    }
}

//連接Mqtt
void mqttCheckConnect()
{
    bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
    if (connected) {
        Serial.println("MQTT connect succeed!");
        // client.subscribe(ALINK_TOPIC_PROP_POSTRSP);
        mqttClient.subscribe(ALINK_TOPIC_PROP_SET); // 訂閱屬性設置Topic
        Serial.println("subscribe done");
    }
}

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

    initWifi(WIFI_SSID, WIFI_PASSWD); // 連接Wifi

    mqttClient.setCallback(callback); // 設置回調監聽雲端下發的指令
}

void loop() {
    mqttCheckConnect(); // MQTT上雲
    mqttClient.loop();

    delay(3000); // 每1秒連接一次
}

程序編譯上傳到設備

  • 編譯程序
  • 初次運行的時候,系統會自動安裝庫。以後就不會有下面的提示了。在這裏插入圖片描述
  • 編譯成功
    在這裏插入圖片描述
  • 上傳程序
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 修改VSCode+platformio 默認串口波特率
    上傳程序成功後,IDE會默認打開串口監視器。但是其中顯示的信息卻是亂碼。觀察發現,原來IDE內嵌的串口波特率默認爲9600。而程序中則採用的115200。查閱相關文獻,發現需要在platformio.ini文件中增加相關代碼:

monitor_baud = 115200
在這裏插入圖片描述

上雲成功

打開阿里物聯網控制檯,發現之前的設備已經激活,並顯示在線,設備上雲成功。後續的文章將會完善這個設備的功能。

  1. 在雲端添加mqtt的相關topic功能
  2. 添加CallBack中的代碼來實現對雲端命令的處理。
  3. 增加相應的App開發。實現手機通過阿里雲控制WemosD1Mini端板載燈的亮滅。
    估計下個帖子就可以文成上述內容。敬請期待。
    在這裏插入圖片描述

參考文獻

【1】mqtt客戶端
http://www.jensd.de/apps/mqttfx/1.7.0/
【2】mqttfx使用說明
https://yq.aliyun.com/articles/592279
【3】如何更改VSCode+platformio中的串口波特率
http://cn.voidcc.com/question/p-qspluxbj-ue.html
【4】阿里物聯網5月10日最新更新文檔
https://help.aliyun.com/document_detail/117458.html?spm=5176.11485173.0.0.379559afQuC1Gf
【5】創建產品設備的官方教程
https://help.aliyun.com/document_detail/73728.html?spm=a2c4g.11186623.6.560.795d42a4qTAgBx
【6】hacklab官網說明
https://gaic.alicdn.com/doc/hacklab/bx0tqw.html
【7】阿里雲IOT開發者社區
https://dev.iot.aliyun.com/demo
【8】【起源計劃】使用IoT Studio開發一個簡單的端到端物聯網應用解決方案(溫溼度監控)
https://dev.iot.aliyun.com/demo/detail/734642

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章