---
name: MQTT 即時通訊與 Topic 規範
description: 定義 Star Cloud 與終端機台 (IoT) 之間的 MQTT 全域通訊拓撲、主題 (Topic) 結構、資料載體 (Payload) 格式與安全性認證機制。
---

# MQTT 即時通訊與 Topic 規範 (MQTT Protocol Specs)

本文件定義機台與 Star Cloud 之間的高併發即時通訊標準。MQTT 主要用於處理高頻率且對即時性要求高的訊息（如心跳、遠端指令），與 HTTP REST API 形成雙軌互補架構。

## 1. 連線基礎設定 (Connection Basics)

### 1.1 Broker 資訊
- **協議版本**：MQTT v3.1.1 (相容性最高)
- **預設埠號**：1883 (TCP / 測試用), 8883 (SSL/TLS / 正式用)
- **Keep-Alive**：建議設定為 30 ~ 60 秒。

### 1.2 身份認證 (Authentication)
機台連線時必須提供以下憑據：
- **Username**：機台編號 (`serial_no`)，例如 `M-001`。
- **Password**：機台正式 Token (`api_token`)，由 B014 API 取得。
- **Client ID**：建議格式為 `SC_{serial_no}_{random_suffix}`，確保唯一性。

---

## 2. 主題架構 (Topic Topology)

我們採用目錄式的層級結構，方便未來進行萬台設備的管理與 ACL 權限切分。

| 主題名稱 (Topic) | 方向 | QoS | 用途說明 |
| :--- | :--- | :--- | :--- |
| `machine/{serial_no}/heartbeat` | 設備 ➜ 雲端 | 0 | 每 10 秒上報心跳、溫度、目前的頁面碼。 |
| `machine/{serial_no}/error` | 設備 ➜ 雲端 | 1 | 發生硬體故障、卡貨或門未關時立即上報。 |
| `machine/{serial_no}/transaction` | 設備 ➜ 雲端 | 1 | 交易完成、出貨結果的回報。 |
| `machine/{serial_no}/command` | 雲端 ➜ 設備 | 1 | 雲端下發的即時指令（出貨、更新、重啟）。 |

---

## 3. 資料載體規範 (Payload Definitions)

所有 Payload 統一採用 **JSON** 格式，字母一律為 **snake_case**。

### 3.1 心跳上報 (Heartbeat) - `machine/{id}/heartbeat`
比照原 B010 邏輯，但去除不必要的 HTTP Header 開銷。

```json
{
  "current_page": 1,
  "firmware_version": "1.0.5",
  "temperature": 25.5,
  "door_status": 0,
  "timestamp": "2026-04-14T09:00:00+08:00"
}
```

### 3.2 異常上報 (Error/Event) - `machine/{id}/error`
比照原 B013 邏輯。

```json
{
  "tid": 12,
  "error_code": "0403",
  "log": "Slot jammed at slot 12",
  "timestamp": "2026-04-14T09:05:00+08:00"
}
```

### 3.3 雲端指令 (Downstream Commands) - `machine/{id}/command`
這是雲端主動下發給機台的訊息，取代原本 B010 Response 的輪詢等待。

```json
{
  "command": "dispense",
  "payload": {
    "slot_no": 5,
    "transaction_id": "T202604140001"
  },
  "message_id": "MSG_123456789"
}
```
**常用指令集：**
- `reboot`: 機台重啟。
- `reload_config`: 重新下載參數 (B014)。
- `reload_products`: 重新同步商品 (B012)。
- `dispense`: 遠端出貨指令 (B055)。

---

## 4. 安全與 QOS 規範

1. **存取控制 (ACL)**：EMQX Broker 必須設定 ACL，禁止機台 A 訂閱機台 B 的 Topic。機台僅能訂閱與發布包含自身 `serial_no` 的路徑。
2. **QoS 策略**：
   - **QoS 0**：適用於高頻率心跳，即使掉一兩次包也不影響系統判斷。
   - **QoS 1**：適用於交易與指令，確保「至少送達一次」。App 端收到指令後應回覆回執。
3. **遺囑訊息 (Last Will and Testament)**：
   機台 Connect 時應設定 Last Will 於 `machine/{serial_no}/heartbeat`，Payload 為 `{"status": "offline"}`。當連線異常中斷時，雲端能立刻得知。

---

## 5. 與 REST API 的同步關係
當 MQTT 通訊正常時，機台應停止定時呼叫 B010 HTTP API。若 MQTT 斷線超過 3 分鐘，則退回 (Fallback) 使用 HTTP 輪詢模式以維持基礎通訊。
