-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha8_ali_iot_demo.ino
149 lines (136 loc) · 4.7 KB
/
a8_ali_iot_demo.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"
#define WIFI_SSID "Rickwan_AP" //wifi名
#define WIFI_PASSWD "wz22334455" //wifi密码
#define PRODUCT_KEY "a1fc6fiPlL2"
#define DEVICE_NAME "MzqRVt6KazICZXjoKolr"
#define DEVICE_SECRET "2oFsQbil3r8ksITskKmW2nYn5Lmg2kjE"
//设备下发命令的set主题
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
//设备上传数据的post主题
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
//设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
//这是post上传数据使用的模板
#define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
int postMsgId = 0; //记录已经post了多少条
Ticker tim1; //这个定时器是为了每5秒上传一次数据
/*------------------------------------------------------------------------------------------*/
WiFiClient espClient; //创建网络连接客户端
PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端
//连接WIFI相关函数
void setupWifi()
{
delay(10);
Serial.println("连接WIFI");
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (!WiFi.isConnected())
{
Serial.print(".");
delay(500);
}
Serial.println("OK");
Serial.println("Wifi连接成功");
}
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
while (!mqttClient.connected()) //再重连客户端
{
Serial.println("reconnect MQTT...");
if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
{
Serial.println("connected");
}
else
{
Serial.println("failed");
Serial.println(mqttClient.state());
Serial.println("try again in 5 sec");
delay(5000);
}
}
}
//mqtt发布post消息(上传数据)
void mqttPublish()
{
if (mqttClient.connected())
{
//先拼接出json字符串
char param[82];
char jsonBuf[178];
sprintf(param, "{\"CurrentTemperature\":%d}", (int)random(0,50)); //我们把要上传的数据写在param里
// sprintf(param, "{\"CurrentTemperature\":%.1f}", (float)random(0,50)); //我们把要上传的数据写在param里
postMsgId += 1;
sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);//ALINK_TOPIC_PROP_SET
//再从mqtt客户端中发布post消息
if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf))
{
Serial.print("Post message to cloud: ");
Serial.println(jsonBuf);
}
else
{
Serial.println("Publish message to cloud failed!");
}
}
}
//收到set主题的命令下发时的回调函数,(接收命令)
void callback(char *topic, byte *payload, unsigned int length)
{
if (strstr(topic, ALINK_TOPIC_PROP_SET))
//如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题)
{
Serial.println("收到下发的命令主题:");
Serial.println(topic);
Serial.println("下发的内容是:");
payload[length] = '\0'; //为payload添加一个结束附,防止Serial.println()读过了
Serial.println((char *)payload);
//接下来是收到的json字符串的解析
DynamicJsonDocument doc(100);
DeserializationError error = deserializeJson(doc, payload);
if (error)
{
Serial.println("parse json failed");
return;
}
JsonObject setAlinkMsgObj = doc.as<JsonObject>();
serializeJsonPretty(setAlinkMsgObj, Serial);
Serial.println();
mqttPublish(); //由于将来做应用可能要获取灯的状态,所以在这里发布一下
}
}
void setup()
{
Serial.begin(115200);
setupWifi();
if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
{
Serial.println("MQTT服务器连接成功!");
};
mqttClient.setCallback(callback); //绑定收到set主题时的回调(命令下发回调)
tim1.attach(5, mqttPublish); //启动每5秒发布一次消息
}
void loop()
{
//检测有没有断线
if (!WiFi.isConnected()) //先看WIFI是否还在连接
{
setupWifi();
}
else //如果WIFI连接了,
{
if (!mqttClient.connected()) //再看mqtt连接了没
{
Serial.println("mqtt disconnected!Try reconnect now...");
Serial.println(mqttClient.state());
clientReconnect();
}
}
//mqtt客户端监听
mqttClient.loop();
}