之前利用點燈科技的庫來使小愛同學控制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的時候,代表繼電器關閉,燈就關了,如圖:
這時候,我們的串口監視器上,可以看到打印的日志如下:
如果掉線了,具有掉線重連功能:
是不是很好用呢?