ESP32 MQTT 實作:感測資料穩定送進系統,斷線重連與離線暫存怎麼做

恆遠數位編輯團隊約 24 分鐘閱讀
ESP32 MQTT 實作文章封面:Wi-Fi 感測節點把資料穩定送進系統,斷線重連、離線暫存與量產檢查
複製引文

ESP32 MQTT 的做法很直接:ESP32 用內建的 Wi-Fi 連上網路,再用 MQTT 用戶端把感測資料發布到 broker,後端系統訂閱同一個 topic,把資料收進資料庫。範例程式半小時就能跑起來,要在工廠裡穩定跑一整年,還得多做五件事:斷線自動重連、網路斷掉時先把資料暫存、每筆資料帶設備自己量到的時間、供電要夠穩、每台設備有唯一身分。這篇就照這五件事拆開講。

我們把 ESP32 Wi-Fi 模組和溫度感測器接進系統的經驗裡,程式寫不出來的情況很少見,麻煩幾乎都出現在上線後第二週:某台設備半夜斷線就再也沒回來、看板上一段時間的溫度整個空白、補傳回來的資料時間全部擠在同一秒。MQTT 協定本身很穩,問題出在設備端程式沒把「網路一定會斷」當成前提。

如果你還不熟 broker、topic、QoS 這些名詞,建議先看 MQTT 是什麼,那篇用工廠的例子把基本觀念講完了;帳號與加密的設定則在 MQTT 三層防禦架構。這篇專心講設備端:ESP32 這一頭的程式和硬體要怎麼做,資料才會穩穩進系統。

MQTT 在工業現場已經是主流選擇。Eclipse 基金會 2022 年的物聯網與邊緣開發者調查 裡,有 49% 的受訪者把 MQTT 列為工業物聯網最偏好的通訊協定。設備數量也還在長,IoT Analytics 的統計 估計 2025 年底全球連網的物聯網設備約 211 億台。設備越多,每一台「斷線後能不能自己回來」就越重要,因為沒有人能一台一台去按重開。

ESP32 MQTT 架構速覽:五個穩定關鍵一張表看完

先講結論:一個能上線的 ESP32 MQTT 節點,程式分成四層:讀感測器、排隊暫存、MQTT 連線管理、設備健康回報。下表是全文的濃縮版,每一列對應後面一個段落。

要解決的事

沒處理會怎樣

做法重點

斷線重連

設備斷一次就永遠離線,要人去拔插頭

非阻塞重連加退避時間,連不上太久就自動重開機

離線暫存

網路斷掉那段時間的資料直接消失

記憶體環形佇列,資料不能掉的再寫進快閃記憶體

時間戳

補傳的資料時間全擠在一起,稼動率算錯

開機先對 NTP,每筆帶設備量測時間與流水號

供電

Wi-Fi 發射瞬間電壓掉下去,設備反覆重開

足額的 5V 電源,記錄開機次數抓出問題設備

設備身分

兩台用同一個 client ID,互相把對方踢下線

client ID 用 MAC 位址產生,每台有自己的帳號

整條資料路線長這樣。左邊是 ESP32 裡面的流程,右邊是 broker 之後的系統端:

圖表載入中…

重點在中間那個佇列:量到的資料一律先進佇列,連線正常就送出去,斷線就留在裡面等。讀感測器的程式完全不用管網路狀態,兩邊互不卡住。

資料進了系統之後,才是工廠真正用得到的部分:看板、異常通知、產能分析。我們做的 生產力管理系統 就是這一段,為傳統製造業建立生產可見性與異常管理,現場資料穩不穩,直接決定看板上的數字能不能信。手上已經有一批 ESP32 想接進系統,可以直接 加 LINE 問我們,把設備型號和想看的資料丟過來。

ESP32 MQTT 感測節點的硬體清單

一個節點最少五樣東西:ESP32 開發板、感測器、電源、外殼,以及現場的無線網路。下表是我們規劃時的起手清單,「選擇重點」那一欄是最常被省略、事後最難補的地方。

項目

常見選擇

選擇重點

主控板

ESP32-DevKitC、ESP32-S3、ESP32-C3 開發板

量產改用有 NCC 認證的模組版本,天線位置要能露出外殼

溫濕度感測

SHT3x、SHT4x 系列(I2C 介面)

精度與耐溫範圍看現場,靠近熱源要選高溫型探頭

高溫或液體溫度

DS18B20 防水探頭、K 型熱電偶加 MAX31855

熱電偶要搭專用轉換晶片,不能直接接 ESP32 腳位

電源

5V 1A 以上的變壓器、24V 轉 5V 降壓模組

電流要留餘裕,Wi-Fi 發射時的瞬間電流很大

外殼

塑膠防塵盒、IP65 防水盒

金屬盒會擋 Wi-Fi 訊號,要用塑膠盒或外接天線

現場網路

工業用無線基地台、IoT 專用 SSID

多數 ESP32 只吃 2.4GHz,設備網段跟辦公網段分開

板子怎麼選:經典 ESP32、S3、C3 差在哪

做感測節點,經典款 ESP32 或較新的 ESP32-C3 就夠用,兩者都有 Wi-Fi 和藍牙,價格也低。ESP32-S3 運算比較強,也內建 USB,適合同一塊板子還要接螢幕或做簡單的影像處理。要跑攝影機、做邊緣 AI 就是另一個等級的晶片了,可以參考 ESP32-P4 入門指南 和 ESP32 機械手臂視覺辨識 兩篇。

還有一件事常被忽略:ESP32 多數型號只支援 2.4GHz Wi-Fi,工廠如果把基地台設成只發 5GHz,設備會連不上。Espressif 的 ESP32-C5 才開始支援雙頻,採購前先確認現場網路的設定,比買回來再退貨省事得多。

ESP32 MQTT 程式重點:Arduino 用 PubSubClient,ESP-IDF 用 ESP-MQTT

一句話分工:做概念驗證、團隊熟 Arduino,用 PubSubClient;要上正式產線、需要 QoS 1 和 TLS 加密,用 Espressif 官方的 ESP-MQTT。兩套差在下面這幾點:

比較項目

PubSubClient(Arduino)

ESP-MQTT(ESP-IDF 官方)

發布的 QoS

只能發 QoS 0

QoS 0、1、2 都能發

訂閱的 QoS

QoS 0 或 1

QoS 0、1、2

訊息大小

含標頭預設 256 bytes,用 setBufferSize 調大

緩衝區大小可在設定裡調整

斷線重連

要自己寫

內建,預設 10 秒後自動重試

未確認的訊息

沒有暫存機制

QoS 1、2 訊息放在 outbox,重連後重送

TLS 加密

搭配 WiFiClientSecure

設定 broker.verification.certificate

MQTT 5.0

不支援

支援

適合

概念驗證、少量設備

正式產線、需要可靠送達

PubSubClient 的限制寫在它的 GitHub 說明頁:只能發布 QoS 0,訊息含標頭預設上限 256 bytes,keepalive 預設 15 秒。JSON 稍微長一點就會超過 256 bytes,這時 publish 會直接回傳 false,很多人卡在這裡好幾個小時找不到原因,記得在 setup 裡呼叫 setBufferSize 調大。

Arduino 版:不會卡住主程式的重連寫法

PubSubClient 官方範例的重連函式是 while 迴圈加 delay(5000),連不上就整個卡在那裡,感測器也跟著停止讀值。正式用要改成非阻塞:每一輪 loop 檢查一次,時間到了才試,失敗就把等待時間拉長。

C++
#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "factory-iot";
const char* WIFI_PASS = "********";
const char* MQTT_HOST = "192.168.10.20";
const uint16_t MQTT_PORT = 1883;

WiFiClient net;
PubSubClient mqtt(net);
String clientId;
String statusTopic = "factory1/line2/oven03/status";
unsigned long lastTry = 0;
unsigned long retryMs = 5000;

void connectMqtt() {
  // 遺囑訊息:設備沒說再見就斷線時,broker 代發 offline(retain)
  if (mqtt.connect(clientId.c_str(), "node-oven03", "********",
                   statusTopic.c_str(), 1, true, "offline")) {
    mqtt.publish(statusTopic.c_str(), "online", true);
    retryMs = 5000;
  } else {
    Serial.printf("MQTT 連線失敗 state=%d\n", mqtt.state());
    retryMs = min(retryMs * 2, 60000UL);   // 5、10、20、40、60 秒
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.setAutoReconnect(true);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  clientId = "esp32-" + WiFi.macAddress();
  clientId.replace(":", "");
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setBufferSize(512);   // 預設 256 bytes,JSON 長一點就不夠
  mqtt.setKeepAlive(30);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED && !mqtt.connected()) {
    if (millis() - lastTry > retryMs + random(0, 3000)) {
      lastTry = millis();
      connectMqtt();
    }
  }
  mqtt.loop();
  // 讀感測器、送出佇列另外用 millis() 排程,不要用 delay() 卡住 loop
}

幾個細節要注意。client ID 用 MAC 位址產生,保證每台不同:MQTT 3.1.1 規格 寫明,同一個 client ID 再連進來,broker 必須把舊的那條連線踢掉,兩台設備用同一個 ID 就會無限互踢。遺囑訊息(Last Will)設成 retain,設備不告而別時 broker 會代發 offline,後台一眼就看得到誰掉線。等待時間加一點隨機數,避免 broker 重開時幾百台設備同一秒擠進來。

ESP-IDF 版:讓官方元件幫你重連和重送

ESP-MQTT 把連線管理都包好了。從 ESP-IDF 6.0 開始,它搬出主程式庫成為獨立元件,用 idf.py add-dependency espressif/mqtt 加進專案,完整設定見 ESP-MQTT 官方文件。下面是加上 TLS、帳密與遺囑訊息的最小設定:

C++
#include "mqtt_client.h"

extern const char ca_pem_start[] asm("_binary_ca_pem_start");

static void mqtt_event_handler(void *arg, esp_event_base_t base,
                               int32_t event_id, void *event_data)
{
    esp_mqtt_event_handle_t event = event_data;
    switch ((esp_mqtt_event_id_t)event_id) {
    case MQTT_EVENT_CONNECTED:
        esp_mqtt_client_publish(event->client, "factory1/line2/oven03/status",
                                "online", 0, 1, 1);
        break;
    case MQTT_EVENT_DISCONNECTED:
        // 不用自己寫重連,client 預設 10 秒後自動重試
        break;
    default:
        break;
    }
}

void mqtt_start(void)
{
    const esp_mqtt_client_config_t cfg = {
        .broker.address.uri = "mqtts://broker.factory.local:8883",
        .broker.verification.certificate = ca_pem_start,
        .credentials.client_id = "esp32-oven03",
        .credentials.username = "node-oven03",
        .credentials.authentication.password = "********",
        .session.keepalive = 30,
        .session.last_will.topic = "factory1/line2/oven03/status",
        .session.last_will.msg = "offline",
        .session.last_will.qos = 1,
        .session.last_will.retain = 1,
    };
    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&cfg);
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
    esp_mqtt_client_start(client);
}

官方文件寫得很清楚:用 esp_mqtt_client_publish 發 QoS 0,斷線時會直接失敗;發 QoS 1 或 2,訊息會留在 outbox 直到收到確認,重連後依序重送。要注意 outbox 預設放在記憶體裡,設備斷電重開就沒了,所以下一段講的離線暫存還是要做。

ESP32 MQTT 斷線重連:從錯誤代碼找原因

先講結論:連不上的時候先印出 state(),多數問題看代碼就知道往哪查。下表是 PubSubClient 的回傳值和我們排查的順序。

state() 回傳值

意思

先查什麼

-4

連線逾時,broker 沒在時間內回應

broker 負載、網路延遲、keepalive 設定

-3

連線中斷

Wi-Fi 訊號、broker 有沒有重啟、有沒有別台用同一個 client ID

-2

TCP 連線失敗

broker 位址與連接埠、防火牆、DNS

-1

用戶端主動斷線

程式哪裡呼叫了 disconnect

1

協定版本不被接受

broker 的協定版本設定

2

client ID 被拒絕

ID 的格式與長度

3

伺服器暫時無法使用

broker 服務狀態

4

帳號或密碼錯誤

帳密內容、有沒有特殊字元

5

沒有權限

broker 的存取控制設定

主程式卡太久,broker 會先把你踢掉

MQTT 規格規定,broker 在 keepalive 時間的 1.5 倍內沒收到設備任何封包,就要把連線當成斷了。PubSubClient 預設 keepalive 15 秒,主程式只要有一段卡超過二十多秒(例如讀感測器逾時、一次寫一大段快閃記憶體),broker 就會把設備踢掉。所以 loop 裡不要放長時間的 delay,耗時的工作要拆小,每一小段之間都讓 mqtt.loop() 有機會跑。

連不上太久就重開機

現場最難查的是「連不上也不報錯」的情況。PubSubClient 的 GitHub 上有一則 ESP32 跑二十分鐘後就一直回 -2、只能重開機才恢復 的回報,討論到最後也沒有一個標準答案。我們的做法很務實:程式裡加一個計時器,Wi-Fi 或 MQTT 連續斷超過十分鐘,就呼叫 ESP.restart() 重開機,再搭配硬體看門狗,防止程式本身卡死。

圖表載入中…

重開機次數一定要記下來回報。某台設備一天重開十幾次,代表供電或訊號有問題,要派人去現場看,光靠程式是修不好的。

離線暫存:網路斷掉的那段時間,資料要放哪裡

一句話:短時間斷線靠記憶體佇列撐,長時間斷線或資料一筆都不能掉的,再寫進快閃記憶體。幾種放法比較如下:

放哪裡

容量

斷電後

適合

RAM 環形佇列

經典 ESP32 有 520KB SRAM,實際可用的少很多

消失

幾分鐘到一兩小時的短斷線

RTC 記憶體(RTC_DATA_ATTR)

幾 KB

深度睡眠時保留,斷電消失

電池節點在兩次醒來之間暫存幾筆

快閃記憶體(LittleFS)

幾百 KB 到數 MB

保留

長時間斷線、資料一筆都不能掉

ESP-MQTT outbox

依設定

預設在記憶體,斷電消失

連線短暫抖動時的 QoS 1 重送

記憶體佇列怎麼寫

下面是最簡單的環形佇列,量到的資料先 enqueue,連上線後在 loop 裡呼叫 flushQueue 慢慢補送:

C++
struct Reading { uint32_t ts; uint32_t seq; float value; };

const int QSIZE = 600;          // 每 10 秒一筆,大約撐 100 分鐘
Reading q[QSIZE];
int head = 0, count = 0;

void enqueue(const Reading& r) {
  q[(head + count) % QSIZE] = r;
  if (count < QSIZE) count++;
  else head = (head + 1) % QSIZE; // 滿了就丟掉最舊的一筆
}

void flushQueue() {
  int sent = 0;
  while (count > 0 && mqtt.connected() && sent < 20) {   // 每輪最多補 20 筆
    char buf[96];
    const Reading& r = q[head];
    snprintf(buf, sizeof(buf), "{\"ts\":%lu,\"seq\":%lu,\"t\":%.1f}",
             (unsigned long)r.ts, (unsigned long)r.seq, r.value);
    if (!mqtt.publish("factory1/line2/oven03/temperature", buf)) break;
    head = (head + 1) % QSIZE;
    count--;
    sent++;
  }
}

滿了就丟最舊的一筆,這是刻意的選擇:現場斷線太久時,最新的資料比最舊的資料有用。補傳時每一輪限制筆數,避免一恢復連線就把幾百筆一次灌進 broker,後端和其他設備都會被拖慢。

publish 回傳 true 不代表送到了

這是最常見的誤解。PubSubClient 只能發 QoS 0,publish 回傳 true 只代表資料寫進了網路連線,broker 有沒有收到並不保證,斷線前最後那幾筆常常就是這樣不見的。資料一筆都不能少的場景(例如報工數量)有兩種做法:改用 ESP-MQTT 發 QoS 1;或維持 QoS 0,讓後端用流水號比對,發現跳號就請設備從快閃記憶體補傳那一段。

不管哪一種,後端都要用「設備代號加流水號」去重,因為 QoS 1 本身就可能送到兩次。快閃記憶體也有寫入壽命,每筆量測都直接寫進去,很快就會寫壞。比較好的做法是先在記憶體累積,斷線超過一段時間才整批寫入,恢復連線補傳完再清掉。

時間戳與供電:ESP32 MQTT 資料準不準的兩個暗坑

時間戳要用設備量到的時間

ESP32 沒有靠電池維持的時鐘,每次開機時間都從 1970 年起算,一定要先對網路時間。Arduino 環境用 configTzTime 一行就能設定時區與 NTP 伺服器,台灣可以用國家時間與頻率標準實驗室的 time.stdtime.gov.tw。

C++
#include <time.h>

bool timeReady = false;

void syncClock() {
  configTzTime("CST-8", "time.stdtime.gov.tw", "pool.ntp.org");
  struct tm t;
  timeReady = getLocalTime(&t, 10000);   // 最多等 10 秒
}

uint32_t nowEpoch() {
  time_t now;
  time(&now);
  return timeReady ? (uint32_t)now : 0;  // 0 代表時間還沒對好
}

時間還沒對好之前量到的資料,ts 填 0,後端看到 0 就改用收到的時間並加上註記,不要讓它混進正常資料。每筆資料我們建議長這樣:

JSON
{"dev":"oven03","ts":1792459320,"seq":10482,"boot":17,"t":182.4,"rssi":-67,"fw":"1.3.0"}

seq 是流水號,後端靠它判斷重複和漏掉;boot 是開機次數,存在 NVS 裡每次開機加一,看得出設備有沒有反覆重開;rssi 是 Wi-Fi 訊號強度,經驗上長期低於 -75 dBm 就容易斷線,要考慮移動基地台或加外接天線;fw 是韌體版本,量產後才知道哪幾台還在舊版。時間戳和流水號一開始沒放,之後要補就得每台重燒一次,這是最不划算的返工。

供電不穩,設備就會自己重開

ESP32 的 Wi-Fi 發射瞬間電流可以到兩百多毫安,用電腦 USB 孔或品質差的變壓器供電,電壓一掉就會觸發晶片的低電壓保護,序列埠會印出 Brownout detector was triggered,接著重開、重連,循環不停。現場看起來像「網路很爛」,追到最後常常是電源。

供電方式

優點

要注意

5V USB 變壓器

便宜、好取得

選 1A 以上,插座位置要固定,避免被誤拔

24V 轉 5V 降壓

跟控制箱共用電源,比較穩

降壓模組電流要夠,接線交給合格電工

PoE 供電

一條網路線同時供電與連線,可改走有線網路

要 PoE 交換器與有網路孔的板子,成本較高

電池加深度睡眠

不用拉電源線

睡眠時 Wi-Fi 會斷,每次醒來都要重連,只適合幾分鐘量一次

電池節點的取捨,ESP-IDF 睡眠模式文件 寫得很明白:深度睡眠與淺睡眠都不會維持 Wi-Fi 連線,只有 RTC 記憶體裡用 RTC_DATA_ATTR 標記的變數能保留下來。每次醒來都要重新連 Wi-Fi、連 broker,連線花的時間往往比量測本身長,所以工廠裡有插座的地方,我們一律建議插電。

從 3 台到 300 台:ESP32 MQTT 量產前要想好的事

先講結論:桌上三台跑得好,跟產線三百台跑得好,中間差的是「不用到現場就能管」的能力。下表是我們在量產前會逐項確認的清單。

項目

沒做的後果

建議做法

Wi-Fi 帳密寫死在程式裡

換基地台密碼就要每台重燒

用配網流程(ESP-IDF 的 Wi-Fi provisioning 或 WiFiManager)在現場設定

全部設備共用一組 MQTT 帳號

一台被拆走,全部設備都要換密碼

每台獨立帳號或憑證,broker 設存取控制

沒有遠端更新

修一個 bug 要跑遍每台設備

規劃 OTA(ESP-IDF 有 esp_https_ota),更新失敗要能退回舊版

topic 隨手取

設備一多沒人看得懂

照「廠區/產線/設備/資料類型」分層命名

沒有健康回報

設備掛了要等人發現看板空白

定時送心跳、訊號強度、開機次數,加上遺囑訊息

資料格式沒版本

改欄位後舊設備的資料解析錯誤

payload 帶韌體版本,後端依版本解析

另一個常被問到的是 PLC。很多機台的資料在 PLC 裡,要用 Modbus 或 OPC UA 才讀得出來,這段通常由設備商或系統整合商處理,他們用閘道器把數值轉成 MQTT 送出來,我們負責 broker 之後的系統端。ESP32 適合補的是機台本身沒有的資料:環境溫濕度、加裝的電流感測、人員按鈕報工。用同一類晶片做人員端應用的例子,可以看 NFC 加 ESP32 打卡系統。

ESP32 MQTT 專案自己做還是找人做?

先講結論:幾台設備做概念驗證,有韌體背景的同事自己來就好;要接進 MES、讓主管每天看同一面看板、資料要拿來算稼動率和追溯,系統端就值得找人做好。分工可以參考這張表:

階段

設備規模

自己做得到

建議找人的部分

概念驗證

1 到 5 台

韌體、broker、簡單看板

通常不需要

產線試點

10 到 50 台

韌體與硬體安裝

資料庫設計、去重與補傳邏輯、告警規則

正式導入

50 台以上

現場日常維護

串接 MES 或 ERP、權限、報表、OTA 與監控平台

預算最容易漏的是佈線與現場安裝。我們估價時會把軟體、硬體、佈線三塊拆開,佈線以市場行情來說每點大約 1,000 到 2,500 元,拆法細節在 MES 系統價格怎麼算。要比較套裝、系統整合商、客製開發三種廠商,可以看 MES 廠商怎麼選;感測資料往上接工單與報工、整套製造執行系統怎麼規劃,則在 客製化 MES 開發完整指南 有完整說明。

我們不太贊成中小工廠一開始就買整套 IoT 平台。平台適合已經清楚要收哪些資料的工廠,多數中小工廠的第一步,是先搞清楚哪幾個數字真的有人在看。拿一條產線、十幾顆 ESP32 跑兩個月,先證明資料有用,再決定要擴大成 工廠管理系統 還是串進 生產履歷系統,比一次買到位省錢得多。整體導入的順序可以參考 台灣製造業智慧製造導入指南。

如果你手上已經有幾台 ESP32 在跑,想把它們變成穩定的系統,我們很樂意 聽你聊聊現場的情況,或直接 加 LINE 把設備清單和想看的數字丟過來。這個值不值得做、從哪一段開始最划算,我們會直接告訴你,真的要動手再談範圍跟費用。

ℹ️我們做過這件事

這篇講的設備端做法,來自我們實際把 ESP32 Wi-Fi 模組、溫度感測器、掃碼槍、標籤機和 3D 列印機透過 MQTT 串進系統的經驗,目前累積 40+ 企業客製案落地。

工廠類的系統可以參考我們做的 生產力管理系統:為傳統製造業建立生產可見性、異常管理與產能效益分析。PLC、OPC UA、Modbus 這類機台端的整合通常由設備商負責,我們專心把 broker 之後的系統做好。

看到這裡,如果你也在想「這些感測資料要怎麼變成看板和報表」,我們很樂意 聽你聊聊現在的情況,一起看看從哪一條產線開始最合適。

ℹ️我們怎麼看

接下來幾年,ESP32 這類便宜的 Wi-Fi 晶片會成為工廠補資料的標準工具,寫一個送 MQTT 的程式只會越來越容易,AI 也能幫你生出大部分的韌體。拉開差距的會是兩件事:設備端有沒有把斷線、補傳、時間戳當成基本功,以及系統端能不能把資料變成報工、稼動率和告警。我們選擇把力氣放在系統端,設備端用一套固定的檢查清單把關。

給工廠老闆一個判斷方法:拿一台設備,拔掉基地台電源十分鐘再插回去,看資料有沒有補回來、時間對不對、設備有沒有自己回到線上。三項都過,這套設備端就可以擴大;有一項沒過,先修好再加台數,台數越多,問題越難收。

QESP32 MQTT 該用 Arduino 還是 ESP-IDF?

概念驗證、團隊熟 Arduino,用 PubSubClient 最快上手;要進正式產線、需要 QoS 1 可靠送達、TLS 加密或 MQTT 5.0,建議用 Espressif 官方的 ESP-MQTT 元件,它內建自動重連與 outbox 重送。

QESP32 MQTT 一直斷線怎麼辦?

先印出 PubSubClient 的 state() 看錯誤代碼,再依序檢查:每台設備的 client ID 是否唯一、主程式有沒有用 delay 卡住導致 keepalive 逾時、Wi-Fi 訊號強度、供電是否足夠。程式端要寫非阻塞重連,斷線太久就自動重開機。

QPubSubClient 可以用 QoS 1 嗎?

發布只能用 QoS 0,訂閱可以用 QoS 0 或 1。設備端要發 QoS 1,可以改用 ESP-IDF 的 ESP-MQTT;或維持 QoS 0,由後端用流水號檢查有沒有漏號,再請設備補傳。

QESP32 MQTT 可以加密嗎?

可以。Arduino 搭配 WiFiClientSecure 並載入 CA 憑證,ESP-IDF 在 broker.verification.certificate 填入憑證,連線改用 mqtts 與 8883 埠。正式環境建議一律加密,1883 埠不要開在網際網路上。

QESP32 MQTT 可以用 MicroPython 寫嗎?

可以,MicroPython 有 umqtt.simple 與 umqtt.robust 模組,適合教學和快速驗證。要量產時,建議評估記憶體用量與長時間運作的穩定性,再決定要不要改用 C/C++。

Q斷線期間的資料會不會不見?

沒做暫存就會不見。建議量到的資料先放進記憶體佇列,連線恢復後再補送;資料一筆都不能掉的場景,斷線久了要寫進快閃記憶體。每筆資料都要帶設備量測時間與流水號,補傳回來的資料才排得對。

分享文章
恆

AUTHOR

恆遠數位編輯團隊

查看作者頁

留言(0)

尚無留言,成為第一個留言的人吧!

需要網站系統架設或軟體開發?

無論是品牌官網、客製化系統還是應用程式,我們的團隊擁有豐富經驗,歡迎聯繫我們,讓專業為您的事業加分。