ESP8266連接阿里云物聯(lián)網(wǎng)平臺(tái)(Arduino方式)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我們上一篇網(wǎng)文已經(jīng)介紹了mini D1 WiFi模塊,具體參見下面鏈接:
下面網(wǎng)文介紹了如何在阿里云生活物聯(lián)網(wǎng)平臺(tái)創(chuàng)建一個(gè)智能設(shè)備:
本文我們利用之前創(chuàng)建的測(cè)試設(shè)備的三元組信息:
"product_key": "a1xHkDRtfRl",
"device_name": "ZNFS0001",
"device_secret": "xnOe5VcOkvXFTBAZaik4hz7y67t7IUhI"
使用Arduino的方式快速連接阿里云物聯(lián)網(wǎng)平臺(tái)。
文中提到的 AliyunIoTSDK 這個(gè) Arduino 庫,可以在 Arduino 庫商店里搜索到(搜索 AliyunIoTSDK)


AliyunIoTSDK可以幫助你快速連接阿里云 IoT 平臺(tái),通過和阿里云物聯(lián)網(wǎng)開發(fā)平臺(tái)配合,可快速實(shí)現(xiàn)各種硬件應(yīng)用,包括了很上層的封裝,無需自己解析數(shù)據(jù)體,綁定事件即可,在ESP8266平臺(tái)充分測(cè)試(NodeMCU 1.0)
AliyunIoTSDK庫,除了上面在Arduino庫商店里直接搜索外,還可以手動(dòng)把 github 上的項(xiàng)目 clone 下來,放到 Arduino 的 library 庫下。
github 地址:https://github.com/xinyu198736/arduino-aliyun-iot-sdk
拷貝上面網(wǎng)址上的測(cè)試代碼:Usage使用示例

隨意命名文件名,保存代碼文件:

設(shè)備管理器中查看當(dāng)前ESP8266 WiFi所占用的串口號(hào):

Arduino中選擇對(duì)應(yīng)的串口號(hào):

填寫三元組和WiFi信息:

點(diǎn)擊“√”對(duì)號(hào)對(duì)工程進(jìn)行編譯:

編譯后出錯(cuò):

添加:ArduinoJson庫

再次編譯仍舊報(bào)錯(cuò):

錯(cuò)誤信息如下所示:
Arduino:1.8.8 (Windows 10), 開發(fā)板:"WeMos D1 R1, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 115200" 構(gòu)建選項(xiàng)已變更,全部重新構(gòu)建 C:\Users\juban\Documents\Arduino\libraries\AliyunIoTSDK\src\AliyunIoTSDK.cpp:3:26: fatal error: PubSubClient.h: No such file or directory #include^ compilation terminated. exit status 1 為開發(fā)板 WeMos D1 R1 編譯時(shí)出錯(cuò)。 在文件 -> 首選項(xiàng)開啟 “編譯過程中顯示詳細(xì)輸出”選項(xiàng) 這份報(bào)告會(huì)包含更多信息。
因?yàn)锳liyunIoTSDK庫,底層連接依據(jù) PubSubClient 庫,所以繼續(xù)安裝:PubSubClient庫。

缺少:SHA256庫,繼續(xù)安裝:SHA256庫


“AWS-SDK-ESP8266”庫。

再次編譯,成功。

編譯并下載程序,上傳固件至mini D1 WiFi模塊。

上傳成功之后顯示如下:

arduino上阿里云所需要用到的四個(gè)庫文件。PubSubClient,ArduinoJson,AliyunIoTSDK,Crypto(SHA256)。
PubSubClient.h,是發(fā)布/訂閱功能的頭文件;
SHA256.h,是加密功能的頭文件(Crypto里面已有包含這個(gè)了);
ArduinoJson.h,是支持Json數(shù)據(jù)格式的頭文件;
AliyunIoTSDK.h,是阿里云SDK的頭文件。
打開Arduino軟件,工具-->串口監(jiān)視器,可以查看模塊打印輸出的信息:

這個(gè)串口號(hào)換了,不是上面的COM7了,因?yàn)槲腋鼡Q了USB口,所以串口號(hào)變化了。
下面是在PubSubClient.h文件中關(guān)于錯(cuò)誤類型的定義:

報(bào)錯(cuò)MQTT Connect err : -2,說明MQTT沒有連接。
解決方法是更改PubSubClient.h文件中的兩個(gè)宏MQTT_MAX_PACKET_SIZE和MQTT_KEEPALIVE,將其改大點(diǎn),比如改成1024和60。


修改后,重新下載程序,然后看到可以正常上傳數(shù)據(jù)了。

登錄生活物聯(lián)網(wǎng)平臺(tái)--飛燕平臺(tái)
生活物聯(lián)網(wǎng)平臺(tái):https://living.aliyun.com/#/
查看飛燕平臺(tái),正常應(yīng)該可以看到設(shè)備上線了。

點(diǎn)擊上圖中設(shè)備右邊的“查看”,然后進(jìn)入下面的運(yùn)行狀態(tài)頁面,可以看到我們上傳的當(dāng)前溫度:26℃。

與下面我們代碼中設(shè)置的值是一致的,進(jìn)而說明上傳屬性值成功。
在“設(shè)備調(diào)試”頁面,我們選擇調(diào)試設(shè)備為“ZNFS0001”,然后選擇一個(gè)調(diào)試功能,然后選擇方法,然后點(diǎn)擊發(fā)送指令,我們可以在實(shí)時(shí)日志中查看到下發(fā)數(shù)據(jù)的日志,說明下發(fā)數(shù)據(jù)成功。

此時(shí)查看WiFi模塊的打印信息,可以看到模塊收到了服務(wù)器下發(fā)的數(shù)據(jù)包。
{"method":"thing.service.property.set","id":"2028064192","params":{"PowerSwitch":0},"version":"1.0.0"}

我們只需要能夠正確解析上面的數(shù)據(jù)包內(nèi)容,解析出{"PowerSwitch":0},然后單片機(jī)就可以針對(duì)此內(nèi)容做相應(yīng)的動(dòng)作。
上面“設(shè)備調(diào)試”中下發(fā)的數(shù)據(jù),其實(shí)過程跟手機(jī)App中點(diǎn)擊某個(gè)的按鈕的動(dòng)作邏輯是一樣的,至此走通了設(shè)備屬性的上傳及設(shè)備的無線控制。
之后的內(nèi)容,我們將針對(duì)“智能風(fēng)扇”的具體設(shè)計(jì),實(shí)現(xiàn)STM32+ESP8266整體與阿里云進(jìn)行數(shù)據(jù)交互。
完整代碼如下:
// 引入 wifi 模塊,并實(shí)例化,不同的芯片這里的依賴可能不同 #includestatic WiFiClient espClient; // 引入阿里云 IoT SDK #include // 設(shè)置產(chǎn)品和設(shè)備的信息,從阿里云設(shè)備信息里查看 #define PRODUCT_KEY "a1xHkDRtfRl" #define DEVICE_NAME "ZNFS0001" #define DEVICE_SECRET "xnOe5VcOkvXFTBAZaik4hz7y67t7IUhI" #define REGION_ID "cn-shanghai" // 設(shè)置 wifi 信息 #define WIFI_SSID "XXXXXX" #define WIFI_PASSWD "XXXXXXXX" void setup() { Serial.begin(115200); // 初始化 wifi wifiInit(WIFI_SSID, WIFI_PASSWD); // 初始化 iot,需傳入 wifi 的 client,和設(shè)備產(chǎn)品信息 AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID); // 綁定一個(gè)設(shè)備屬性回調(diào),當(dāng)遠(yuǎn)程修改此屬性,會(huì)觸發(fā) powerCallback // PowerSwitch 是在設(shè)備產(chǎn)品中定義的物聯(lián)網(wǎng)模型的 id AliyunIoTSDK::bindData("PowerSwitch", powerCallback); // 發(fā)送一個(gè)數(shù)據(jù)到云平臺(tái),CurrentTemperature 是在設(shè)備產(chǎn)品中定義的物聯(lián)網(wǎng)模型的 id AliyunIoTSDK::send("CurrentTemperature", 26); } void loop() { AliyunIoTSDK::loop(); } // 初始化 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"); } // 電源屬性修改的回調(diào)函數(shù) void powerCallback(JsonVariant p) { int PowerSwitch = p["PowerSwitch"]; if (PowerSwitch == 1) { // 啟動(dòng)設(shè)備 } }