多協定智慧 IoT 閘道器設計與跨協定效能橋接研究

後續工作規劃 — 從「Demo」升級成「Research」

你已經把整條資料路徑做出來了:四協定模擬 → Priority Queue → Protocol Adapter → n8n → 儲存/告警/視覺化, 在大學部專題裡這是非常完整的成果,工程整合面值得肯定 👍。
接下來這份指南要帶你補上「研究」的骨架:把量錯的效能數據修正讓數據變得真實可比較、設計對照實驗回答研究問題, 最後寫成可以上台口試的報告。

🗺️ 你目前的系統 — 一張圖看懂進度

WiFi · 每1秒 感測值=隨機 ⚠ BLE · 每2秒 感測值=隨機 ⚠ Zigbee · 每3秒 感測值=隨機 ⚠ LoRa · 每10秒 感測值=隨機 ⚠ asyncio 並發模擬 ✅ Priority Queue(緊急插隊 p=0)✅ MQTT Broker(gw/#) ⚠ 公開 broker.emqx.io → 應改本機 Docker Protocol Adapter(跨協定橋接核心) 訂 gw/# → 統一 schema → 發 processed/# | ⚠ 橋接開銷未量化 processed/# HTML 儀表板 ✅ n8n 工作流 ✅ Google Sheets ⚠ 資料遺失 Telegram /Gmail 告警 ✅ InfluxDB →Grafana ✅
已完成 需修正 / 強化 研究骨架待補
綠色=你已經做好的;黃色=目前有問題要修;下面紅框=整個專案還缺的「研究」部分
目前缺的「研究骨架」(這份指南要補的三件事):
效能量測量錯了(量到的是程式內部排隊時間,不是端到端延遲)→ 見「需要修正」
沒有研究問題與對照實驗(系統會跑,但沒有在「比較」什麼)→ 見 Phase ③
沒有正式文件與統計結果(架構圖、方法、數據圖表、討論)→ 見 Phase ⑤

📋 完成度對照表

模組狀態還要做什麼
asyncio 四協定模擬✅ 完成感測值改用真實模型(Phase ②)
Priority Queue✅ 完成量化它對告警延遲的改善(Phase ③)
Protocol Adapter 橋接✅ 完成量化橋接開銷=主要研究貢獻(Phase ③/🏆)
效能量測⛔ 量錯改成端到端量測(需要修正)
MQTT Broker⚠ 需換公開 broker → 本機 Docker(Phase ①)
HTML 儀表板 / n8n / Grafana✅ 完成維持;當作展示與資料蒐集管道
Google Sheets 資料遺失⚠ 待查找出原因=可靠度分析素材(Phase ④)
研究問題 / 對照實驗⛔ 缺設計實驗(Phase ③)
論文 / 口試報告⛔ 缺架構圖+數據圖表+章節(Phase ⑤)

🧭 這份指南怎麼用

先讀這兩頁

「🔧 需要修正」+「📐 真實數據量測」
這是讓你的數字「能用」的前提,最優先。

再照 Phase ①→⑤

五個分頁就是你接下來一學期的工作清單,每頁都有任務、交付物、完成標準。

最後挑一個亮點

「🏆 貢獻亮點」挑一個方向深挖,當作論文的主要貢獻。

🔧 三個一定要先修的問題

這三件事不修,後面的實驗數據都不能用。它們不難改,但很關鍵。

① 效能延遲「量錯了」最重要

你目前(照教材挑戰 2)是在 publish() 前後抓時間。但因為開了 loop_start()paho 的 publish() 是「非阻塞」的—— 它只是把訊息丟進程式內部的佇列就馬上回傳(微秒級),根本還沒送到網路、更沒到對方。 所以你量到的是「丟進佇列的時間」,不是真正的端到端延遲。

t_start t_end(publish 回傳) 你量到的(≈微秒) 送端準備 背景執行緒 真正送出網路 Broker 轉發 對端收到 t_recv ✅ 真正的端到端延遲 = t_recv − t_send
紅色=你現在量的範圍(幾乎是 0);綠色=真正該量的端到端延遲
❌ 現在的寫法(量到排隊時間)
# loop_start() 後 publish 非阻塞
t_start = time.time()
publish(topic, data)   # 立刻回傳
t_end = time.time()
lat = (t_end - t_start)*1000  # ≈ 0.01 ms
✅ 正確:時戳埋進 payload,收端算差
# 送端:送出前埋時間戳
data["t_send"] = time.time()
publish(topic, data)

# 收端(Adapter / 儀表板):
recv = time.time()
e2e_ms = (recv - data["t_send"])*1000
📌 重點:① 送端與收端在同一台電腦時鐘才對得齊(你目前就是,OK);跨機器要先用 NTP 校時。 ② 量「一段時間間隔」用 time.perf_counter()time.time() 準。 ③ 想分段看,可在 Adapter 收 / 發兩端各打一次時戳,拆出「進 Adapter 前」與「Adapter 處理」兩段。

② 感測值是純隨機 → 四協定「沒得比」

現在四個協定都用 random.uniform() 生資料,除了 sleep 間隔不同,本質一模一樣。 但題目是「跨協定效能橋接」——如果協定之間沒有真實差異,就沒有東西可以「比較」,研究就立不起來。

❌ 四協定其實長得一樣
val = random.uniform(20, 40)
await asyncio.sleep(10)
# LoRa 跟 WiFi 只差 sleep 秒數
✅ 給每個協定真實特性(延遲/遺失)
# LoRa:高延遲、會掉封包
await asyncio.sleep(net_delay["lora"])
if random.random() < loss["lora"]:
    continue   # 模擬掉包,不發送

每個協定要套不同的延遲分佈、封包遺失率、抖動(實際數值見「📐 真實數據量測」分頁,並查文獻佐證)。這樣「LoRa vs WiFi 的橋接表現」才有意義。

③ 公開 Broker 量不出可信數據 → 改本機 Docker

你在報告 slide 7 已經發現 home/# 全是「別人的流量=雜訊」。這正是用公開 broker.emqx.io 的副作用:未知的跨流量、限流、不保證送達, 任何效能數字都無法重現。做量測前,一定要改成本機自己跑的 broker。

❌ 公開 broker.emqx.io 陌生人 陌生人 共用 Broker 雜訊+限流+不可重現 ✅ 本機 Docker Broker 本機 Mosquitto 乾淨·封閉·可重現
研究級的量測必須在「乾淨、封閉、可重現」的環境做
# 一行指令在本機跑一個 MQTT broker(裝好 Docker 後)
docker run -d --name mqtt -p 1883:1883 -p 9001:9001 eclipse-mosquitto
# 然後把程式裡的 BROKER 從 "broker.emqx.io" 改成 "localhost"

📐 要量「什麼」、怎麼量才算真實可比較

「研究」跟「Demo」最大的差別,就是你能不能拿出可信、可重現、能互相比較的數字。 這一頁告訴你:① 要量哪些指標 ② 在哪裡量 ③ 每個協定該有的真實特性 ④ 結果長什麼樣。

📍 在管線的「哪裡」量 — 四個量測點

裝置模擬器 Broker Adapter 儀表板/n8n ①送達延遲 ②橋接處理 ③派送延遲 ④ 端到端總延遲(裝置 → 儀表板)
各段都打時戳,就能拆出「橋接到底佔了多少延遲」——這正是你的研究核心

📊 要量的指標(量測維度)

① 延遲 Latency

端到端 ms。不要只看平均,要看中位數 / p95 / p99(最慢的那 5% 才是關鍵)。

② 吞吐量 Throughput

每秒成功處理幾筆(msg/s)。拉高裝置數看上限。

③ 抖動 Jitter

延遲的標準差。越穩定越小,對即時性很重要。

④ 遺失率 Loss

每筆加序號,收端數缺號 → 遺失率(%)。

⑤ 資源 CPU/RAM

psutil 記錄 Adapter 行程的 CPU、記憶體。

⑥ 佇列等待

訊息在 Priority Queue 裡等多久才被取出。

🔑 量測方法學(讓數字可信的三條鐵律): ① 每組設定重複跑 N 次(例如 30 次)取統計,不要只跑一次; ② 一次只改一個變數,其它固定; ③ 全程在本機 Docker broker 上跑。

🌐 每個協定該有的「真實特性」

下面是教科書上各協定的典型數量級,請學生再查 1–2 篇文獻佐證後,把這些數字寫進模擬器的延遲/遺失模型:

協定典型延遲頻寬距離遺失傾向特性
📡 LoRa秒級(~1–10 s)0.3–50 kbps2–15 km省電、長距、有 duty cycle 限制
💙 BLE毫秒~秒~1 Mbps10–100 m短封包、低功耗
🔆 Zigbee~15–30 ms250 kbps10–100 mMesh 多跳、家庭自動化常用
📶 WiFi1–10 ms數十 Mbps↑~50 m高頻寬、較耗電

→ 套進去之後,「LoRa 在橋接後延遲最大、WiFi 最小」這種結論才有真實依據,不是亂數。

📈 結果長什麼樣(範例圖+結果表模板)

平均延遲 (ms) LoRa Zigbee BLE WiFi
範例:四協定橋接後平均延遲比較

你的結果表應該長這樣(每格都是 30 次重複的統計):

協定延遲 p50p95遺失率吞吐
LoRa
BLE
Zigbee
WiFi

把「—」填上真實數字,再配一張長條圖,就是一頁紮實的實驗結果。

把量測做對 + 環境可重現

整個研究的地基。地基不穩,後面全白做。

P0 最優先⏱ 約 1–2 週

🎯 目標

建立一套可信、可重現的量測工具與環境,能正確量出端到端延遲、吞吐、抖動、遺失率、資源使用,並輸出統計(p50/p95/p99)。

✅ 任務清單

📐 量測模組長怎樣(參考骨架)

import statistics, csv, psutil

lat = []           # 收集每筆端到端延遲
recv_seq = set()    # 收到的序號

def on_message(data):
    lat.append((time.time() - data["t_send"])*1000)
    recv_seq.add(data["seq"])

def report(total_sent):
    p = statistics.quantiles(lat, n=100)
    return {
        "p50": statistics.median(lat),
        "p95": p[94], "p99": p[98],
        "loss_%": (1 - len(recv_seq)/total_sent)*100,
        "cpu_%": psutil.cpu_percent(),
    }

📦 交付物 & 完成標準

交付物

① 本機 broker 環境
② 量測模組(輸出 CSV)
③ 一份 baseline 數據表

完成標準

同一組設定連跑兩次,p50/p95 差距 < 10%(代表環境穩定、數字可重現)。

讓「跨協定」變真實

給四個協定各自的脾氣,跨協定比較才有意義。

P1 核心⏱ 約 2 週

🎯 目標

把「隨機數字」升級成「有協定特性的數字」:每個協定有自己的延遲、遺失率、抖動模型。 (進階)至少接一條真實協定路徑來校準,證明你的模擬可信。

🌐 怎麼把真實特性「注入」模擬器

協定參數表 delay / loss / jitter 模擬器發送前 套用該協定的 延遲 + 機率性掉包 發布到 Broker 帶真實協定行為
PROFILE = {
  "lora":   {"delay": (1.0, 3.0), "loss": 0.08},  # 高延遲、8% 掉包
  "zigbee": {"delay": (0.015,0.03),"loss": 0.02},
  "ble":    {"delay": (0.05, 0.2), "loss": 0.01},
  "wifi":   {"delay": (0.001,0.01),"loss": 0.005},
}
# 數值請以「📐 真實數據量測」的表+文獻為準

✅ 任務清單

📦 交付物 & 完成標準

交付物

① 有文獻依據的協定參數表
② 改造後的模擬器
③(進階)一份模擬 vs 真實校準對照

完成標準

四協定跑出來的延遲/遺失明顯不同且符合常識(LoRa 最差、WiFi 最好)。

研究問題 + 對照實驗

這一步是「研究」的靈魂——你到底在「比較」什麼?

P1 核心⏱ 約 2–3 週

❓ 訂出你的研究問題(RQ)

一份研究要先問問題,再用實驗回答。建議從這三題選 1–2 題深入:

RQ1 — 橋接開銷(最推薦,最貼題)

Protocol Adapter 的延遲與資源開銷,如何隨「訊息量 / 協定數」成長?有 Adapter vs 沒 Adapter 差多少?

RQ2 — 優先佇列的效果

Priority Queue 對「緊急告警延遲」改善多少?Priority Queue vs 一般 FIFO 在高負載下的差異?

RQ3 — QoS 的取捨

MQTT QoS 0 / 1 / 2 在「遺失率」與「延遲」之間怎麼權衡?這也能解釋你 Google Sheets 為何掉資料。

🧪 對照實驗怎麼設計

每個實驗都要分清楚三種變數:

自變數你主動改的
(例:裝置數、QoS、有無Adapter)
系統你的閘道器
應變數你量到的
(延遲、遺失、吞吐)

固定變數:其它全部不動(同一台機器、同一 broker、同樣跑 N 次)。

範例:RQ1 對照組設計 對照組 A:不過 Adapter 裝置 → Broker → 儀表板 量端到端延遲 實驗組 B:過 Adapter 裝置 → Broker → Adapter → 儀表板 量端到端延遲 vs
B 減 A = 橋接的純開銷。再把裝置數從 1→10→100 各做一次,畫成曲線。

✅ 任務清單 & 交付物

完成標準

每個 RQ 都有一張「自變數 vs 應變數」的圖,並能用一句話回答它。

壓力測試 + 可靠度分析

找出系統的極限,並解釋資料為什麼會掉。

P2 加分⏱ 約 2 週

📈 Scalability:把它操到壞,找崩潰點

裝置數 / 訊息率一路往上加(1 → 10 → 100 → 1000),看延遲在哪裡開始爆掉、吞吐在哪裡到頂。

裝置數(log)→ 延遲 (ms) 1 10 100 1000 崩潰點 延遲暴增
能指出「我的閘道器在約 N 台裝置後延遲失控」——這就是很有價值的研究發現

🔍 把「資料遺失」查清楚(呼應你 slide 13)

你報告裡提到「Google Sheets 還是會掉資料」。別把它當 bug 帶過——把原因拆開、各佔多少,本身就是一段漂亮的可靠度分析。

可能原因 ① QoS 0

MQTT QoS 0 不保證送達,網路一忙就丟。改 QoS 1 看遺失率變化。

可能原因 ② Buffer 沒清

Code 節點批次緩衝(每 5/7/15 筆),程式結束前最後不滿一批的資料沒送出。

可能原因 ③ 重啟掉資料

n8n / broker 重啟期間的訊息直接消失。

可能原因 ④ API 限流

Google Sheets API 有頻率上限,太密集會被擋。

做法:用「序號數缺號」逐一隔離各原因的貢獻度,畫成「遺失率 vs QoS / 負載」曲線。

✅ 任務 & 完成標準

完成標準

能說出「系統在 ___ 台裝置崩潰」「資料遺失主因是 ___,改 ___ 後降到 ___%」。

文件化 + 口試 / 論文產出

做得再好,寫不出來=沒人看得懂。最後這步把成果變成可交付的報告。

P0 收尾⏱ 約 2–3 週

📄 報告章節結構(照這個寫)

1

緒論

IoT 多協定的問題、為何需要閘道器與橋接、你的目標。

2

相關研究

別人怎麼做 IoT gateway / 協定轉換,你跟他們的差別。

3

系統架構

放你的架構圖、資料流、統一 schema、各模組職責。

4

研究方法

量測點、指標定義、實驗設計、環境(本機 broker、重複 N 次)。

5

實驗結果

RQ 一題一節,每節配圖表+統計。

6

討論

結果代表什麼、為何如此、限制在哪。

7

結論與未來工作

回答 RQ、貢獻、後續可延伸方向。

8

附錄

程式碼、設定檔、完整數據表。

📦 可重現性套件(口試加分關鍵)

README

一步步教別人重現你的實驗。

requirements.txt

鎖定套件版本。

一鍵啟動腳本

docker-compose + 啟動所有模擬器。

設定檔

協定參數、實驗設定集中管理。

原始數據 CSV

每張圖背後的數據都附上。

架構圖 / 截圖

Grafana、n8n flow、儀表板畫面。

🗓️ 整體時程建議(一學期)

需要修正
① 量測與環境
P0
② 跨協定建模
P1
③ 研究問題實驗
P1
④ 壓力與可靠度
P2
⑤ 文件與口試
P0
🎓 範圍校準:以大學部專題而言,做完 修正 + ① + ② + 一個 ③ 的 RQ + ⑤ 就是很扎實、可上台口試的成果; ④ 與 Phase ② 的真實協定校準,是往競賽 / 投稿推的加分項。

🏆 怎麼讓這份專題「有貢獻」

一份研究要講得出「我的貢獻是什麼」。下面四個方向,挑一個深挖當主軸,其它當輔助或未來工作即可。

⭐ 主推方向

★ 量化 Protocol Adapter 的「跨協定橋接開銷」

最貼題目(「效能橋接研究」),而且你已經把 Adapter 做好了,只差「量它」。 回答:橋接增加多少延遲?吃多少資源?隨協定數/負載怎麼成長?瓶頸在哪?——這一條就足以撐起整份論文的主貢獻。

現在:做出 Adapter (工程 Demo) 量化它 變成:橋接開銷的量化研究 (有數據、有結論、有貢獻)

💡 其它可選方向

QoS 自適應

依協定特性自動選 QoS(LoRa 用 0、告警用 1/2),比較固定 QoS 的效能與可靠度。

Edge vs Cloud

Adapter 放本機 vs 放雲端,比較延遲與頻寬成本的取捨。

安全性代價

目前公開 broker 明文傳輸。加 TLS / 認證,量測「加密讓效能掉多少」。

🎯 一句話總結給學生

你的「系統」已經做得很好了 👏。接下來不是再加功能,而是 把它量準(修正)→ 讓數據變真實(① ②)→ 設計實驗回答一個問題(③)→ 寫成報告(⑤)。 把「我做了一個會跑的閘道器」升級成「我用數據證明了關於跨協定橋接的某件事」——這就是 Demo 和 Research 的差別,也是這份專題的終點。