Esp8266【NodeMCU】連接阿里雲服務器
使用EsP8266(NodeMCU)連接阿里雲服務器,並在服務器控制檯點亮板載LED燈,進行數據上傳和下傳的測試。關於Esp8266引腳介紹https://blog.csdn.net/weixin_45488643/article/details/105974842自行查看。
創建阿里雲產品
功能定義:
先選擇編輯草稿,纔可以看到最下面的布爾值那個。
添加設備
Esp8266代碼
需要使用的庫文件ESP8266WiFi、PubSubClient、ArduinoJson可以直接在Arduino 編譯器裏面下載。
#include <ESP8266WiFi.h>
/* 依賴 PubSubClient 2.4.0 */
#include <PubSubClient.h>
/* 依賴 ArduinoJson 5.13.4 */
#include <ArduinoJson.h>
#define SENSOR_PIN LED_BUILTIN //定義的板載LED燈
/* 修改1 ------------------------------------------ */
/* 連接您的WIFI SSID和密碼 */
#define WIFI_SSID "tsy_B5AC58" //自己wifi名稱
#define WIFI_PASSWD "19980208" //自己wifi密碼
/* 修改1 end--------------------------------------- */
/* 修改2 ------------------------------------------ */
/* 設備證書信息*/
#define PRODUCT_KEY "aXXXXXXXXX" //在自己阿里雲裏面查看
#define DEVICE_NAME "Light" //創建設備名稱,修改成自己的
#define DEVICE_SECRET "snXXXXXXXXXXXXXXXXXXXXXXXwhc" //ProductSecret 修改成自己的
#define REGION_ID "cn-shanghai" //如果使用的是華東2(上海)服務器,不需要修改
/* 修改2 end--------------------------------------- */
/* 線上環境域名和端口號,不需要改 */
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
/* 修改3 ------------------------------------------ */
#define CLIENT_ID "esp8266|securemode=3,signmethod=hmacsha1,timestamp=1234567890|"//可以不用修改使用,也可以修改成自己想要的
// 請使用以上說明中的加密工具或參見MQTT-TCP連接通信文檔加密生成password。
// 加密明文是參數和對應的值(clientIdesp8266deviceName${deviceName}productKey${productKey}timestamp1234567890)按字典順序拼接
// 密鑰是設備的DeviceSecret
#define MQTT_PASSWD "7A23C1CXXXXXXXXXXXXXXXXXXXXXXXXXXDCEDD54" //修改成自己的,生成方式後面簡介。
/* 修改3 end--------------------------------------- */
#define ALINK_BODY_FORMAT "{\"id\":\"QingYeMuRong\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/user/update/"
unsigned long lastMs = 0;
WiFiClient espClient;
PubSubClient client(espClient);
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);
//直接使用函數,對收到的服務器數據解析 ,這部分函數使用可以見我上一篇博客。
DynamicJsonDocument doc(1024);
deserializeJson(doc,(char *)payload);
JsonObject obj = doc.as<JsonObject>();
String sensor = obj["params"];
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Motion absent!");
Serial.println("Qingyemurong");//測試代碼
Serial.println(sensor);
//DynamicJsonDocument doc(1024);
deserializeJson(doc,sensor);
String LightSwitch = obj["LightSwitch"];
Serial.println("Qingyemurong");//測試代碼
Serial.println(LightSwitch);
if(LightSwitch=="1") //根據收到的值,控制LED燈
{
digitalWrite(LED_BUILTIN, LOW);
}
if(LightSwitch=="0")
{
digitalWrite(LED_BUILTIN, HIGH);
}
}
void wifiInit()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("espClient [");
client.setServer(MQTT_SERVER, MQTT_PORT); /* 連接WiFi之後,連接MQTT服務器 */
client.setCallback(callback);//接收數據
}
void mqttCheckConnect()
{
while (!client.connected())
{
Serial.println("Connecting to MQTT Server ...");
if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
{
Serial.println("MQTT Connected!");
}
else
{
Serial.print("MQTT Connect err:");
Serial.println(client.state()); //重新連接
delay(5000);
}
}
}
void mqttIntervalPost()
{
char param[32];
char jsonBuf[128];
/* 修改4 ------------------------------------------ */
sprintf(param, "{\"AlarmState\":%d}", digitalRead(LED_BUILTIN));//讀取LED燈引腳狀態
/* 修改4 end--------------------------------------- */
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
Serial.println(jsonBuf);
boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); // 上報數據
Serial.print("publish:0 失敗;1成功");
Serial.println(d);
}
void setup()
{
//初始化保存獲取到的數據的數組,並把內存置爲0
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
/* initialize serial for debugging */
Serial.begin(115200);
Serial.println("Demo Start");
client.setCallback(callback); //用於接收服務器接收的數據
wifiInit();
}
// the loop function runs over and over again forever
void loop()
{
if (millis() - lastMs >= 5000)
{
lastMs = millis();
mqttCheckConnect();
/* 上報消息心跳週期 */
mqttIntervalPost();
}
client.loop(); //MUC接收數據的主循環函數。
/*
if (digitalRead(LED_BUILTIN) == HIGH) {
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Motion detected!");
delay(2000);
}
else {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Motion absent!");
delay(2000);
}
*/
}
MQTT_PASSWD密碼生成工具
下載鏈接https://wwa.lanzous.com/iix24dru58d
軟件解壓後,用瀏覽器打開sign.html。輸入相關信息,可生成MQTT_PASSWD。
修改PubSubClient.h文件(不修改無法連接Mqtt服務器)
我自己文件路徑:
要修改的部分:
設備測試
阿里雲IOT平臺發送數據和Esp8266接收端口顯示:
關燈測試
開燈測試:
點亮LED: