
- Published on
- ·6 min read
Flutter × WiFi:跟 IoT 裝置對話
- Authors

- Name
- Bert / DOTUNE
- Developer
BLE 篇 處理的是藍牙——通訊層、橋接層、Platform Channel、FFI,整篇在搞「Flutter 怎麼跟硬體用藍牙通訊」。門檻不低,但搞定之後,很多 IoT 裝置的下一步是:藍牙配對完,切 WiFi。
這就是這篇要講的:BLE 把裝置接上區網之後,Flutter 怎麼跟它對話。
答案是純 Dart。http、mqtt_client、web_socket_channel,import 就能用。不需要 Platform Channel、不需要 FFI。裝置已經在那個區網裡了,Flutter 跟它就是 IP 對 IP。
BLE 跟 WiFi——複習一下
這兩個在 IoT 世界是互補的,不是競爭的:
| BLE | WiFi | |
|---|---|---|
| 功耗 | 極低,鈕扣電池撐數月 | 高,通常要插電 |
| 距離 | 近(同一個房間) | 遠(整個區網範圍) |
| 頻寬 | 低,位元組級 | 高,能傳影像和音訊 |
| 網路 | 點對點配對 | 透過路由器,走 TCP/IP |
| 適合 | 穿戴式、感測器、隨身裝置 | 家電、監視器、固定裝置 |
大多數 IoT 裝置是 BLE + WiFi 雙模——BLE 負責發現和配對,WiFi 負責日常通訊。這是目前最常見的設計。
用什麼協定通訊——三條路線
WiFi 連上之後,Flutter 跟裝置在同一個區網裡。接下來只有一個問題:用什麼協定傳資料?
HTTP / REST
最簡單。裝置跑一個輕量 HTTP server(ESP32 上用 Arduino framework 幾行 code 就起來了),Flutter 用 http package 發 GET/POST,跟呼叫後端 API 一模一樣。
適合:間歇性指令(開燈、關門、查詢溫度),不需要即時雙向。
MQTT
IoT 的事實標準。架構是 broker 在中間——裝置訂閱 topic、App 也訂閱 topic,資料透 broker 轉發。Flutter 端用 mqtt_client package,幾十行 Dart 就能接上。
適合:感測器定時 push 資料、App 需要即時收到更新、多裝置之間的訊息同步。
你需要一個 MQTT broker。可以用公有雲(HiveMQ、EMQX Cloud)、可以在區網自己架(Raspberry Pi 跑 Mosquitto)。
WebSocket
如果你需要持續的雙向連線、低延遲、而且不想掛 MQTT broker——WebSocket 是一條中間路線。Flutter 端用 web_socket_channel,裝置端大多數嵌入式框架都有 WebSocket library。
適合:即時控制(遙控車、機器人)、需要雙向 streaming 但不是感測器定時上報的場景。
BLE + WiFi 的配對流程
發現裝置是 BLE 的事。標準流程:
- App 透過 BLE 掃到裝置
- BLE 連線後,App 把 WiFi SSID 和密碼傳給裝置
- 裝置連上 WiFi router,拿到 IP
- 裝置斷開 BLE,之後所有通訊走 WiFi
這在智慧燈泡、智慧插座、印表機、掃地機器人上面幾乎是標配。Flutter 端——BLE 的部分走 BLE 篇,WiFi 的部分走這篇,各司其職。
總結——比 BLE 簡單,但還是要選
| HTTP / REST | MQTT | WebSocket | |
|---|---|---|---|
| 即時性 | 低(輪詢) | 高(push) | 高(雙向) |
| 需要額外伺服器 | 裝置自己跑 HTTP server | 需要 MQTT broker | 裝置自己跑 WS server |
| Flutter 端難度 | 最簡單 | 中等 | 中等 |
| 適合 | 指令型(開關、查詢) | 感測器定時上報 | 即時雙向控制 |
WiFi 這條路,Flutter 端的 code 門檻確實比 BLE 低很多。但選擇還是存在的——協定選錯,後面的擴充性會被卡住。
這個系列目前有兩篇:BLE 篇 處理近距離低功耗通訊,WiFi 篇處理區網高頻寬通訊。
附:純 WiFi 裝置——少見但還是有
如果你的 IoT 裝置真的不走 BLE——例如它直接連 WiFi、或用有線區網——那發現裝置就得自己想辦法。三種常見做法:
mDNS / Bonjour:裝置在區網廣播 hostname(my-iot-device.local),Flutter 端用 multicast_dns package 掃到。iOS 的 Bonjour、Android 的 NSD 底層都是 mDNS,最通用。
SSDP:走 UPnP 生態的裝置(智慧電視、NAS、印表機)用 SSDP 廣播。Flutter 端用 ssdp package。mDNS 更通用、SSDP 更特定。
直接連 IP / 掃 port:區網小、裝置少的情況下,手動輸入 IP 或用最暴力的方式掃 subnet 的特定 port。不優雅但能動。