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: