title: esp8266连接到阿里云平台
date: 2022-08-17 09:51:22
categories: 教程
arduino连接到阿里云平台简易使用教程
/*
连接阿里云平台的简易教程
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "aliyun_mqtt.h"
unsigned long lastMs = 0;
#define PRODUCT_KEY "h671fF2aMUu" //阿里云IoT平台设备三元组信息
#define DEVICE_NAME "project1" //阿里云IoT平台设备三元组信息
#define DEVICE_SECRET "f1d468e72ecc1f5c398e68f563eceecd"//阿里云IoT平台设备三元组信息
#define DEV_VERSION "1.0.0" //固件版本信息
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0.0\",\"method\":\"%s\",\"params\":%s}" //MQTT消息数据的标准格式
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post" //物模型通信Topic-设备属性上报(本地设备客户端发布消息)
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set" //物模型通信Topic-设备属性设置(云端虚拟设备客户端发布消息,本地设备客户端订阅消息)
#define ALINK_METHOD_PROP_POST "thing.event.property.post" //设备属性上报的主题,本地设备(ESP8266)向阿里云IOT平台发布消息时使用
#define ALINK_TOPIC_DEV_INFO "/ota/device/inform/" PRODUCT_KEY "/" DEVICE_NAME "" //基础通信Topic-设备上报固件升级信息
WiFiClient espClient;
PubSubClient mqttClient(espClient);
//连接WiFi
void connect_wifi()
{
WiFi.mode(WIFI_STA);
WiFi.begin("loushangyu", "12345678");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi已连接");
}
//连接到阿里云平台
void connectAliyun()
{
while (!mqttClient.connected())
{
while(connect_aliyun_mqtt(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
{
Serial.println("MQTT连接成功");
mqttClient.subscribe(ALINK_TOPIC_PROP_SET);
Serial.println("订阅成功");
uploadDeviceVersion();
}
}
}
//上报本地信息
void intervalPost()
{
char param[512];
char jsonBuf[1024];//用来存放ESP8266将要PUBLISH到服务器的消息
sprintf(param, "{\"LightSwitch\":%d,\"temperature\":%d,\"Humidity\":%d}", 1, 12, 12); //将要上报的数据格式化后写入param字符串中
sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);//将要上报的数据加上主题,一起被格式化成标准报文格式后,写入jsonBuf字符串中
Serial.println(jsonBuf);//串口输出将要上传的报文
mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
}
//上报设备版本信息
void uploadDeviceVersion()
{
char param[512];
sprintf(param,"{\"id\":123,\"params\":{\"version\":\"%s\"}}",DEV_VERSION);
Serial.println(param);
mqttClient.publish(ALINK_TOPIC_DEV_INFO,param);
}
//接收到阿里云平台的消息
void receive_message(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))
{
/*
创建一个静态JSON对象,用于存储接收到的消息 StaticJsonBuffer
*/
StaticJsonBuffer<200> jsonBuffer;
/*
创建最外层的json对象:root对象
解析JSON数据,并存储到JsonObject对象中
*/
JsonObject &root = jsonBuffer.parseObject(payload);
/*
接下来是解析数据的过程,
解析出来的数据就是控制本地固件设备运行的数据
例如灯的打开或者关闭,温度的设置,湿度的设置等等
例如:led灯的控制
lightSwitchLocal存储云端开关设置量,
如果为1,则表示打开灯,如果为0,则表示关闭灯
LightSwitch是云端设置的设备名
*/
// %%可以在这个部分设置传递函数将值传递到函数后进行使用,这里便开始了对固件进行控制的编程步骤
int lightSwitchLocal = root["params"]["LightSwitch"];
/*
此处可以设置本地设备的控制函数,例如:
if (lightSwitchLocal == 1)
{
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
*/
/*
判断是否数据解析成功,不成功就return
*/
if(!root.success())
{
Serial.println("数据解析失败");
return;
}
}
}
void setup()
{
Serial.begin(115200);
/*
1. 连接WiFi 函数为 connect_wifi()
*/
connect_wifi();
/*
2. 接收来自阿里云平台的消息
*/
mqttClient.setCallback(receive_message);
}
void loop()
{
if (millis()-lastMs>=5000)//millis()函数返回自 Arduino 板开始运行当前程序以来经过的毫秒数。此数字将在大约 50 天后溢出(返回到零)。
{
lastMs=millis();
connectAliyun();
intervalPost();
}
mqttClient.loop();
}
/*
## 物联网教程
1. 首先应该先连接到wifi中,esp8266不支持5g频段,所以需要连接到2.4G频段 connect_wifi()
2. 设置时间函数,每隔一段时间上报一次数据 millis()-lastMs>=5000r每五秒上报一次数据
3. 连接到阿里云平台,上报数据 connectAliyun()
3.1 通过阿里云平台创建的产品对阿里云平台进行连接
3.2 订阅阿里云平台的主题,接收阿里云平台的消息 mqttClient.subscribe(ALINK_TOPIC_PROP_SET)
3.3 上报设备版本号 uploadDeviceVersion() 在连接号阿里云平台之后进行上传
3.4 定时上报数据 intervalPost() 在连接号阿里云平台之后进行上传
4. 接收阿里云平台的消息 receive_message() 在连接号阿里云平台之后进行接收 receive_message()函数在setup()函数中被调用,mqttClient.setCallback(receive_message)
*/