#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
//
const char* ssid = "ssid";
const char* password = "passowrd";
const char *mqtt_broker = "test.mosquitto.org";
const int mqtt_port = 1883;
WiFiClient wifi;
PubSubClient client(wifi);
// 設定用戶端ID
const char clientID[] = "hoyo_esp8266";
// 設定主題名稱
const char topic[] = "Hoyo/ESP8266";
// 儲存訊息的字串變數
String msgStr = "";
// 儲存字元陣列格式的訊息字串(參閱下文說明)
char json[25];
void reconnect() {
// 若目前沒有和伺服器相連,則反覆執行直到連結成功…
while (!client.connected()) {
// 指定用戶端ID並連結MQTT伺服器
// client.connect(clientID, mqtt_username, mqtt_password))
if (client.connect(clientID)) {
Serial.println("connected");
// 成功連線訂閱主題
client.subscribe("esp8266/test");
}
else {
// 若連線不成功,則顯示錯誤訊息
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// 等候5秒,再重新嘗試連線。
delay(5000);
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
char inData[256];
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
inData[i] = (char)payload[i];
Serial.print((char) payload[i]);
}
DynamicJsonDocument doc(1024);
deserializeJson(doc, inData);
JsonObject obj = doc.as<JsonObject>();
// Serial.println(obj);
String led = obj["LED"];
if (led == "0") digitalWrite(D4, HIGH);
if (led == "1") digitalWrite(D4, LOW);
Serial.println(led);
Serial.println();
Serial.println("-----------------------");
}
void setup() {
Serial.begin(9600);
pinMode(D4, OUTPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("WiFi connected");
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
}
void loop() {
// 確認用戶端是否已連上伺服器
if (!client.connected()) {
// 若沒有連上,則執行此自訂函式。
reconnect();
}
// 更新用戶端狀態
client.loop();
// 建立MQTT訊息(JSON格式的字串)
msgStr = msgStr + "{\"temp\":" + 10 + ",\"humid\":" + 20 + "}";
// 把String字串轉換成字元陣列格式
msgStr.toCharArray(json, 25);
// 發布MQTT主題與訊息
client.publish(topic, json);
// 清空MQTT訊息內容
msgStr = "";
delay(2000);
}