谁能比我白痴? 花了整整一下午时间把 整个代码翻译了一边把重点的地方都有说明。这次应当没有啥问题了吧。
[pre]//应用库文件
#include <ESP8266WiFi.h> // 自带库 不用安装
#include <PubSubClient.h> // 在项目-》加载库中 查找 PubSubClient 向下拉找到 PubSubClient by Nick O`Leary 进行安装
#include <ArduinoJson.h> // 在项目-》加载库中 查找 ArduinoJson 第一个就是 ArduinoJson by Benoit Blanchon 进行安装
#define LED_PIN D4
/* 修改1 开始------------------------------------------ */
#define WIFI_SSID "HuiKeDianNaoFuWu" // WIFI的名称
#define WIFI_PASSWD "13488214252" // WIFI的密码
/* 修改1 结束------------------------------------------ */
/* 修改2 开始------------------------------------------ */
#define PRODUCT_KEY "a1cBSuDEqL0" // 产品密钥 所在位置 阿里云->物联网平台->设备管理->产品->ProductKey
#define DEVICE_NAME "LED_She_Bei" // 设备名称 所在位置 阿里云->物联网平台->设备管理->设备->DeviceName/备注名称 下面那个名字
#define DEVICE_SECRET "r0457Kve61oDC5EsbCS0O4iXpWrXA0E0" // 设备密钥 所在位置 阿里云->物联网平台->设备管理->设备->查看->右上角 DeviceSecret
#define REGION_ID "cn-shanghai" // 地区ID 不需要修改
/* 修改2 结束------------------------------------------ */
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com" // MQTT_服务器
#define MQTT_PORT 1883 // MQTT_端口
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY // MQTT_用户名称 这是由 DEVICE_NAME "&" PRODUCT_KEY 这两个参数组成的,这两个参数在上面有。
/* 修改3 ------------------------------------------ */
#define CLIENT_ID "LED_She_Bei|securemode=3,signmethod=hmacsha1,timestamp=1575099760|"
//参数具体说明在这里 https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11174283.2.44.2b351668mRnKcK
// CLIENT_ID 是由三部分组成的,分别clientId securemode signmethod
//clientId 为设备的ID信息。可取任意值,长度在64字符以内。建议使用设备的MAC地址或SN码。
//securemode 为安全模式,TCP直连模式设置为securemode=3,TLS直连为securemode=2。
//signmethod 为算法类型,支持hmacmd5和hmacsha1
#define MQTT_PASSWD "65E493A5E6AABBAF1DAE7EDD6A4C2ACABA08BA66"
//MQTT_PASSWD 是用一个工具算出来的 下载地址为:https://files.alicdn.com/tpsservice/88413c66e471bec826257781969d1bc7.zip?spm=a2c4g.11186623.2.21.70045800E7MImP&file=88413c66e471bec826257781969d1bc7.zip
/* 修改3 end--------------------------------------- */
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}" // 链接体格式
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post" // 链接主题文章
unsigned long Zui_Hou_Hao_Miao = 0; // 最后毫秒 这个是上次执行动作的时间
WiFiClient espClient; // 实例化 WIFIClient 为 esp客户端
PubSubClient client(espClient); // 发布一个子客户端 客户端(esp客户端)
void setup() { //██████████████████████████████████████████████
pinMode(LED_PIN, OUTPUT); // 管脚模式(LED管脚,输入);
Serial.begin(115200); // 串口.启动(115200);
Serial.println("演示开始"); // 串口.打印(WiFi.本地IP);
Lian_Jie__WIFI(); // 连接_WIFI
}
void loop() { //██████████████████████████████████████████████
//这段代码的作用是:每5秒 检查一下MQTT连接情况 并 上服消息
if (millis() - Zui_Hou_Hao_Miao >= 5000) { // 如果 当前毫秒 减去 最后毫秒 大于等于 5秒
Zui_Hou_Hao_Miao = millis(); // 最后毫秒 等于 当前毫秒
Jian_Cha__MQTT_Lian_Jie(); // 检查_MQTT_连接
Shang_Bao_Xiao_Xi(); // 上报消息
}
client.loop(); // 客户.循环();
//这段代码的作用是:检查引脚当前情况
if (digitalRead(LED_PIN) == HIGH) { // 如果 (数字读取(LED引脚 等于 高)
Serial.println("检测到引脚为 高 电平!"); // 串口.打印(检测到引脚为高电平!);
delay(2000); // 延时(2秒)
} else if (digitalRead(LED_PIN) == LOW) { // 如果 (数字读取(LED引脚 等于 高)
Serial.println("检测到引脚为 低 电平!"); // 串口.打印(检测到引脚为高电平!);
delay(2000); // 延时(2秒)
} else { // 否则
Serial.println("未检测到引脚情况"); // 串口.打印(未检测到引脚情况);
delay(2000); // 延时(2秒)
}
}
void Lian_Jie__WIFI() { // 连接_WIFI
WiFi.mode(WIFI_STA); // WIFI.模式(站点)
WiFi.begin(WIFI_SSID, WIFI_PASSWD); // WiFi.开始(WIFI_名称,WIFI_密码)
while (WiFi.status() != WL_CONNECTED) { // 循环判断 (WIFI.状态 不等于 连接)
delay(1000); // 延时(1秒)
Serial.println("WiFi未连接"); // 串口.打印("WiFi未连接");
} // 如果 (WIFI.状态 等于 连接) 则执行下面的语句
Serial.println("连接到AP"); // 串口.打印("连接到AP");
Serial.println("IP地址: "); // 串口.打印("IP地址: ");
Serial.println(WiFi.localIP()); // 串口.打印(WiFi.本地IP);
client.setServer(MQTT_SERVER, MQTT_PORT); // 客户端.设置服务器(MQTT_服务器,MQTT_端口) 这两个变量上面有
client.setCallback(Hui_Diao); // 客户端.设置回调(回调)
}
void Jian_Cha__MQTT_Lian_Jie() { // 检查_MQTT_连接
while (!client.connected()) { // 循环判断(不等于 客户端.连接)
Serial.println("正在连接到MQTT服务器。。。"); // 串口.打印("正在连接到MQTT服务器。。。");
if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD)) {// 如果(客户端.连接(客户端ID,MQTT_用户名称,MQTT_密码)) //MQTT连接服务器所需要的三个参数具体说明在这里 https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11174283.2.44.2b351668mRnKcK
Serial.println("MQTT已连接!"); // 串口.打印("MQTT已连接!");
} else { // 否则
Serial.print("MQTT连接错误:"); // 串口.打印("MQTT连接错误:");
Serial.println(client.state()); // 串口.打印(客户端.状态);
delay(5000); // 延时(5秒)
}
}
}
void Hui_Diao(char *topic, byte *payload, unsigned int length) { // 回调
Serial.print("消息已到达 ["); // 串口.打印("消息已到达 [");
Serial.print(topic); // 串口.打印(话题);
Serial.print("] "); // 串口.打印("] ");
payload[length] = '\0'; // 有效载荷[长度] 等于 '\0'
Serial.println((char *)payload); // 串口.打印(有效载荷);
}
void Shang_Bao_Xiao_Xi() { // 上报消息
char param[32]; // 声明一个char变量 名称为 参数 字符数组 长度为32字节 char类型为一个字节 char*是变量,值可以改变, char[]是常量,值不能改变。char[]对应的内存区域总是可写,char*指向的区域有时可写,有时只读
char jsonBuf[128]; // 声明一个char变量 名称为 JSONBUF格式 字符数组 长度为128字节 char类型为一个字节
sprintf(param, "{\"引脚状态\":%d}", digitalRead(LED_PIN)); // 把格式数据写成串(参数,"{\"引脚状态\":%d}",读取引脚(LED_引脚))
sprintf(jsonBuf, ALINK_BODY_FORMAT, param); // 把格式数据写成串(JSONBUF格式,链接体格式,参数)
Serial.println(jsonBuf); // 串口.打印(JSONBUF格式);
boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); // 声明一个布尔型变量 名字为 D 等于 客户端.发布(链接主题文章,JSONBUF格式)
Serial.println("出版说明: 0=失败 ; 1=成功"); // 串口.打印("出版:0=失败;1=成功");
Serial.println("出版情况: " + String(d));
}[/pre] |