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
這段程式碼是用來**發送 MQTT 訊息**到指定的主題。讓我詳細解釋各個部分:

## 函數結構
```javascript
mqttClient.publish(topic, message, options, callback)
```

## 參數說明

### 1. `topic`
- MQTT 主題名稱,類似「頻道」的概念
- 例如:`"home/lock/control"` 或 `"device/123/command"`
- 訂閱同一主題的客戶端會收到這個訊息

### 2. `JSON.stringify(message)`
- 將 JavaScript 物件轉換成 JSON 字串
- 例如:`{command: "unlock", user: "admin"}` → `'{"command":"unlock","user":"admin"}'`
- MQTT 只能傳送字串或二進位資料,不能直接傳送物件

### 3. `{ qos: 1 }`
- **QoS (Quality of Service)** 服務品質等級
- **QoS 0:** 最多傳一次(可能丟失)
- **QoS 1:** 至少傳一次(確保送達,但可能重複)
- **QoS 2:** 恰好傳一次(最可靠但最慢)
- 這裡選擇 QoS 1,確保重要指令不會丟失

### 4. 回調函數 (Callback)
```javascript
function(error) {
if (error) {
// 發送失敗處理
console.error('發送 MQTT 消息失敗:', error);
alert('發送命令失敗');
} else {
// 發送成功處理
console.log('MQTT 消息發送成功:', command);
}
}
```

## 執行流程
1. **發送訊息:** 將 JSON 格式的指令發送到指定主題
2. **等待回應:** 等待 broker 確認是否成功接收
3. **結果處理:**
- **成功:** 在控制台記錄成功訊息
- **失敗:** 顯示錯誤訊息並彈出警告

## 實際應用範例
假設這是智慧門鎖控制:
```javascript
topic = "home/frontdoor/control"
message = { command: "unlock", userId: "12345", timestamp: "2025-06-21T10:30:00Z" }
```
發送後,訂閱此主題的門鎖設備就會收到解鎖指令並執行。

## 為什麼用 QoS 1?
對於門鎖這類安全性重要的設備,確保指令送達比速度更重要,所以選擇 QoS 1 來保證訊息不會丟失。