如何開始建置 MQTT 環境感測器模擬系統
在物聯網 (IoT) 專案中,將感測器數據發送到雲端是第一步。本文將說明如何開始建立一個環境感測器模擬器,將溫度與濕度資料傳送到 MQTT 伺服器 (broker.makdev.net),及 Dahboard 發生作用。我們將介紹兩種最常見的入門方式:使用 Node-RED 軟體模擬,以及使用 Arduino/微控制器硬體實作。及理解Topic 的用法
方法一:使用 Node-RED 快速建立軟體模擬流程
如果您還沒有硬體設備,Node-RED 是最快開始的方式。您可以建立一個視覺化流程,定期產生隨機的溫濕度數據並推送到 MQTT 伺服器。
圖 1:Node-RED MQTT 模擬流程圖 (每 10 秒觸發 -> Function 生成數據 -> 輸出 MQTT)
1. 建立參數化 Function 節點
在 Node-RED 中,透過 Inject 節點設定每 10 秒觸發一次,並透過 Function 節點來自動組合發布主題 (Topic) 並產生隨機的溫濕度資料 [1]。這使得未來更換測試帳號變得非常容易。核心程式碼如下:
// 1. 參數化定義 (未來要換人測試,只要改這三行)
const USER_ID = "your_account"; // 你的租戶 ID
const DEVICE_ID = "device_v1"; // 設備編號
const SENSOR_TYPE = "env"; // 感測器類型
// 2. 自動組合 Topic (嚴格遵守 +/+/+ 規則)
msg.topic = `${USER_ID}/${DEVICE_ID}/${SENSOR_TYPE}`;
// 3. 產生模擬數據
let temp = (Math.random() * (35 - 20) + 20).toFixed(1);
let humi = (Math.random() * (90 - 50) + 50).toFixed(1);
// 4. 設定標準化 Payload
msg.payload = {
"temperature": parseFloat(temp),
"humidity": parseFloat(humi)
};
return msg;
2. 設定輸出格式與 MQTT 伺服器
上述程式碼將會輸出如 {"temperature":23.5,"humidity":56.4} 的 JSON 格式 [1]。最後,將此資料連接至 MQTT Out 節點,並將 Broker 設定為 broker.makdev.net,通訊埠設為 1883,即可完成資料發送 [1]。
方法二:使用 Arduino 進行硬體程式模擬
如果您想透過實際的微控制器來模擬,可以使用 C++ 撰寫程式碼並結合 WiFi (WiFi.h) 與 MQTT (PubSubClient.h) 函式庫 [2]。
圖 2:開發板與 WiFi 網路連線示意
1. 基礎連線設定
首先,您必須設定 wifiClient 與 mqttClient [2],並填寫您的 WiFi SSID、密碼,以及 IoT 平台的 MQTT 帳號密碼,並設定發布主題(請注意將 <your_account> 替換為實際帳號) [3]:
char ssid[] = "your_ssid"; // WiFi SSID
char pass[] = "your_password"; // WiFi 密碼
char username[] = "your_account"; // IoT平台帳號
char password[] = "your_password"; // IoT平台密碼
char mqttServer[] = "broker.makdev.net";
char publishTopic[] = "<your_account>/room1/env"; //修改為您的帳號
程式同時包含自動重連機制 reconnectWiFi() 與 reconnectMQTT() [3],並且於 loop() 迴圈中檢查,確保設備在斷線時能自動恢復連線 [4]。
2. 模擬異常高溫數據 (Grafana 測試用)
為了讓後續在 Grafana 等儀表板上的曲線看起來更真實,程式碼中實作了一個進階的模擬機制 USE_ERROR_TEMPLATE [2, 5]。此機制會每 5 秒發送一次資料,並且每 10 分鐘內會有 5 分鐘處於「異常高溫期」,隨機產生 36.5°C ~ 38.0°C 的高溫 [5]:
// 每 5 秒發送一次 MQTT
if (millis() - lastMQTTSendTime >= MQTT_SEND_INTERVAL) {
lastMQTTSendTime = millis();
#ifdef USE_ERROR_TEMPLATE
// ==========================================
// 模擬異常高溫情況,持續 10 分鐘,每 5 分鐘有 5 分鐘的異常高溫
// ==========================================
if ((millis() % 600000) > 300000) {
// 隨機產生 36.5°C ~ 38.0°C 的異常高溫,讓 Grafana 曲線看起來更真實
temperature = 365 + (random(0, 16)); // 36.5 + 0.0 ~ 1.5
Serial.println("[模擬測試] 目前處於 5 分鐘高溫異常期!");
}
#endif
}
結語與下一步
無論您選擇 Node-RED 還是微控制器硬體,只要確保 Topic 格式正確且成功連上 broker.makdev.net,資料就會源源不絕地送往伺服器。下一步,您可以開始配置您的儀表板(如 Grafana)來訂閱這些主題並進行數據視覺化了!