esp8266物聯網開發四:MQTT再論部控

之前利用點燈科技的庫來使小愛同學控制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來進行控制了。

代碼燒寫完畢後,通過串口調試窗口,我們可以看到具體的連接情況:

image

之後,我們打開本地的MQTT Client,連接到home/devices/onoff/主題,連接成功後,發送控制代碼:

image

這裏我發送了1,代表打開繼電器,也就是開燈操作,可以看到,燈被我們打開了:

image

當發送0的時候,代表繼電器關閉,燈就關了,如圖:

image

image

這時候,我們的串口監視器上,可以看到打印的日誌如下:

image

 

如果掉線了,具有掉線重連功能:

 

 

是不是很好用呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章