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

Flutter × WiFi:跟 IoT 裝置對話

Authors
  • avatar
    Name
    Bert / DOTUNE
    Developer

BLE 篇 處理的是藍牙——通訊層、橋接層、Platform Channel、FFI,整篇在搞「Flutter 怎麼跟硬體用藍牙通訊」。門檻不低,但搞定之後,很多 IoT 裝置的下一步是:藍牙配對完,切 WiFi。

這就是這篇要講的:BLE 把裝置接上區網之後,Flutter 怎麼跟它對話。

答案是純 Dart。httpmqtt_clientweb_socket_channel,import 就能用。不需要 Platform Channel、不需要 FFI。裝置已經在那個區網裡了,Flutter 跟它就是 IP 對 IP。


BLE 跟 WiFi——複習一下

這兩個在 IoT 世界是互補的,不是競爭的:

BLEWiFi
功耗極低,鈕扣電池撐數月高,通常要插電
距離近(同一個房間)遠(整個區網範圍)
頻寬低,位元組級高,能傳影像和音訊
網路點對點配對透過路由器,走 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 的事。標準流程:

  1. App 透過 BLE 掃到裝置
  2. BLE 連線後,App 把 WiFi SSID 和密碼傳給裝置
  3. 裝置連上 WiFi router,拿到 IP
  4. 裝置斷開 BLE,之後所有通訊走 WiFi

這在智慧燈泡、智慧插座、印表機、掃地機器人上面幾乎是標配。Flutter 端——BLE 的部分走 BLE 篇,WiFi 的部分走這篇,各司其職。


總結——比 BLE 簡單,但還是要選

HTTP / RESTMQTTWebSocket
即時性低(輪詢)高(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。不優雅但能動。