之前利用点灯科技的库来使小爱同学控制LED的过程中,我们大略提到了一下MQTT的整体流程,由于其MQTT服务器是由点灯科技提供的,所以对其中的很多连接细节,我们并不知道,本节我们准备通过搭建本地的MQTT服务器,然后通过MQTT Client向MQTT服务器发送控制命令,来控制我们的LED灯。
首先,我们需要启动MQTT服务器,启动方式我们就不需要多说了,之前章节有讲解,启动完毕之后,其连接地址为:192.168.43.2:1883,切记连接地址不可写成127.0.0.1,否则无法连接成功。
然后,开始进行编码操作,具体编码内容如下:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define JDQ 16
const char* MQTT_SERVER = "192.168.43.2";
const int MQTT_PORT = 1883;
const char* MQTT_USRNAME = "addmin";
const char* MQTT_PASSWD = "public";
const char* TOPIC = "home/devices/onoff/";
const char* CLIENT_ID = "scy-mqtt-client"; //当前设备的clientid标志
const char* ssid = "cxsr"; //待连接WIFI
const char* password = "scy251147";//待连接WIFI密码
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
/**
* 连接wifi
*/
void setupWifi(){
delay(100);
Serial.println("Startup");
pinMode(JDQ, OUTPUT);
WiFi.mode(WIFI_STA);//设置模式为STA
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {//等待WiFi连接成功
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(CLIENT_ID)) {
Serial.println("connected");
// 连接成功时订阅主题
client.subscribe(TOPIC);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic); // 打印主题信息
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // 打印主题内容
}
if ((char)payload[0] == '1') {
digitalWrite(JDQ, HIGH); // 亮灯
Serial.print(" 开灯");
} else {
digitalWrite(JDQ, LOW); // 熄灯
Serial.print(" 关灯");
}
Serial.println();
}
void setup() {
Serial.begin(115200);
pinMode(JDQ, OUTPUT);
setupWifi();
client.setServer(MQTT_SERVER, MQTT_PORT); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
client.setCallback(callback); //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
需要说明的是,在执行过程中,将会先进行联网操作,然后进行连接MQTT服务端的操作,这俩操作都进行完毕之后,我们就可以通过MQTT Client来进行控制了。
代码烧写完毕后,通过串口调试窗口,我们可以看到具体的连接情况:
之后,我们打开本地的MQTT Client,连接到home/devices/onoff/主题,连接成功后,发送控制代码:
这里我发送了1,代表打开继电器,也就是开灯操作,可以看到,灯被我们打开了:
当发送0的时候,代表继电器关闭,灯就关了,如图:
这时候,我们的串口监视器上,可以看到打印的日志如下:
是不是很好用呢?
来源:oschina
链接:https://my.oschina.net/u/4352934/blog/4254040