在上一节中,介绍了如何加载相关的库,值得注意的是,不一定越新的库越好,之前遇到过一版,一直连接不上,实际上是库函数封装的和阿里云接口对不上;
此外注意的是,你需要将代码中的SSID、PASSWORD、MQTT_SERVER、DEVICE_ID、PRODUCT_KEY和DEVICE_SECRET替换为你自己的WiFi名称、密码、MQTT服务器地址、设备ID、产品Key和设备Secret。
此外,你还需要在你的阿里云物联网平台中创建一个设备,然后将该设备的连接信息(包括MQTT服务器地址,设备ID、产品Key和设备Secret)填写到代码中的相应位置。
最后,你需要替换代码中的“your_topic”为你要订阅的MQTT主题;
具体介绍看注释;
关于,阿里云物联网平台中建立工程,在后续的文章会一步一步介绍;
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi连接参数
const char* SSID = "你的WiFi名称";
const char* PASSWORD = "你的WiFi密码";
// 阿里云MQTT连接参数
const char* MQTT_SERVER = "你的MQTT服务器地址";
const int MQTT_PORT = 1883;
const char* DEVICE_ID = "你的设备ID";
const char* PRODUCT_KEY = "你的产品Key";
const char* DEVICE_SECRET = "你的设备Secret";
// MQTT客户端
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
// WiFi连接回调函数
void WiFiEvent(WiFiEvent_t event) {
switch(event) {
case WIFI_EVENT_STAMODE_GOT_IP:
Serial.print("WiFi connected, IP address: ");//打印状态查看
Serial.println(WiFi.localIP());//打印状态查看
mqttClient.setServer(MQTT_SERVER, MQTT_PORT);
break;
case WIFI_EVENT_STAMODE_DISCONNECTED:
Serial.println("WiFi disconnected");//打印状态查看
break;
default:
break;
}
}
关于具体函数意义,可以去Arduino路径下------> libraries里面的,用Notepad++或者TXT打开查看;
// MQTT连接回调函数
void MQTTEvent(char* topic, byte* payload, unsigned int length) {
Serial.print("Received message on topic: ");//打印状态查看
Serial.print(topic);//打印状态查看
Serial.print(". Message: ");//打印状态查看
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
Serial.begin(115200);
// 连接WiFi
WiFi.disconnect();
WiFi.mode(WIFI_STA);//宏定义好了,不需要改
WiFi.onEvent(WiFiEvent);
WiFi.begin(SSID, PASSWORD);
// 连接MQTT
while (!mqttClient.connected()) {
// 生成设备连接信息
long timestamp = (long)(millis() / 1000);
char client_id[100];
sprintf(client_id, "%s|%d|securemode=3,signmethod=hmacsha1|", DEVICE_ID, timestamp);
char username[100];
sprintf(username, "%s&%s", PRODUCT_KEY, DEVICE_ID);
char password[100];
sprintf(password, "hmacsha1|%s|%d|12345", DEVICE_SECRET, timestamp);
// 连接MQTT
if (mqttClient.connect(client_id, username, password)) {
Serial.println("MQTT connected");
mqttClient.subscribe("your_topic"); // 订阅MQTT主题
mqttClient.setCallback(MQTTEvent); // 设置MQTT回调函数
} // 连接MQTT
if (mqttClient.connect(client_id, username, password)) {
Serial.println("MQTT connected");
mqttClient.subscribe("your_topic"); // 订阅MQTT主题
mqttClient.setCallback(MQTTEvent); // 设置MQTT回调函数
} else {
Serial.print("MQTT connection failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}
void loop() {
mqttClient.loop(); // 处理MQTT消息
}
也可前往官网查看;