--
參考資源
- ESP8266 connects to the free public MQTT broker
- MQTT教學(六):使用PubSubClient程式庫開發Arduino MQTT應用
- ESP8266 连接到免费的公共 MQTT 服务器
- ESP8266: Connecting to MQTT broker
- HOW TO PUBLISH WHILE SUBSCRIBING IN MQTT PROTOCOL WHILE USING ESP8266?
- mqtt_meshblu_send_receive.ino
--
發送及訂閱
一樣先使用免費公開的 test.mosquitto.org 實驗
目標是定時往上發送資料並且訂閱控制 LED 的主題,LED 一樣是 Onboard 的 D4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#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); } |
--
Windows MQTT Client
免安裝,測試結果正常。發送 LED 控制到 ESP8266 訂閱
--
Publish 最大字串長度 128 限制
MQTT 發送預設有 128 個字元的限制,
1 2 3 |
// client.setCallback(callback); // client.setBufferSize(1024); // client.setSocketTimeout(1); |
--
範例
--
5,622 total views, 1 views today