xasdfg 2020-04-25
之前利用点灯科技的库来使小爱同学控制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的时候,代表继电器关闭,灯就关了,如图:
这时候,我们的串口监视器上,可以看到打印的日志如下:
是不是很好用呢?