只要是擠身於 IoT 裝置的開發者行列, 對於資料的傳輸通訊上, 似乎最近大多談的都是採用目前最火熱的 MQTT 資料傳輸的通訊技術。 這點筆者我本身並不反對這個論述, 畢竟, 若對於身為 Client 端裝置的開發者而言, 在網路上就可取得現成的程式碼套件或Client 端工具來將資料送至雲端的 MQTT Server。所以, 以開發的技術上而言, 簡單快速難度不高, 自然就廣受採用。
但問題是即使輕鬆地解決了用戶端在資料發佈與訂閱問題, 那接收與儲存資料的後台伺服器呢?那才是需要較大的工程與網路資源, 這就不是所有的開發者所能建置的了。因此, 才會有很多雲端數據平台在這物聯網的時代裡, 如雨後春筍般的問市, 例如 ThingSpeak, ThingsBoard, Dweet.io, IDEAS Chain… 等等。然而, 這些服務若想免費使用它, 通常會有時間與資料量的限制。因此一些進階的開發者, 就又會想著自己架設一個 MQTT Server, 這或許是個辦法, 但卻是一個大費周章讓架構變更複雜化, 成本變高的辦法。因為, 它通常就又需要多一台主機或多一片開發板, 才能有效率無時差的扮演好 MQTT Server 的工作。
*** 若您有興趣, 想知道我是如何用相當簡單的方法, 就能處理好上述數據平台的 MQTT 資料傳輸協議的, 可參考以下文章的連結***
- So Easy MicroPython — MQTT ThingSpeak, IoT
- So Easy MicroPython — MQTT ThingsBoard, IoT
- So Easy MicroPython — MQTT IDEASChain, IoT data platform
所以, 對於一般在自己網路內, 且 ESP8266 / ESP32 本身一張開發板就能搞定的工作, 我通常就會直接採用 HTTP 的架構來做資料傳輸, 用 2~3 行指令就能在 MCU 內架設一個達成資料傳輸工作的網路伺服器, 不佔什麼資源卻依然可以控制用戶端的裝置。
*** 若 MQTT 的通訊協議不是您目前的選項, 若您有興趣, 也可以參考以下文章的連結, 看看我是如何用 HTTP 的方式, 透過 RESTful API 的方式, 也一樣能處理好上述數據平台的資料傳送與接收。***
下載與安裝函式庫
首先, 必須先上傳下面的函式庫到 MCU 板子上:
- MyWebServer : 架設與管理網站伺服器的函式庫
- MyWifi: 無線網路連線的函式庫 (不需要, 如果你的程式碼中已能自行連上網路時)
***如果您尚不熟悉或想知道我是如何將函式庫上傳至 MCU 的, 那麼您應該會有興趣參考我的另一篇文章 “如此簡單 MicroPython — ESP8266/ESP32 MCU 檔案管理”. ***
當你的 MCU 能連上網後, 只須程式碼中加上下面幾行指令, 基本上, 你的網站伺服器就已在 ESP8266 或 ESP32 架好了, 並可以開始接受從網路上傳來的指令, 例如像 DEMO 影片中的測試方式直接從瀏覽器輸入, 或由你的程式碼中送出 HTTP 的 request, 或甚至直接透過手機的 App 來控制。如果你只要很快速的進行測試, 或不會或不想撰寫 HTML 網頁程式的話, 我個人認為使用手機下載的現成免費 App 來下達指令給網站伺服器, 是一種最方便快速地方法。因為, 我的遠控小車, 智慧音箱與燈具, 除了 MQTT 的方式外, 最快的方式我都是如此運作的。
# 架設網站伺服器
from MyWebServer import myWebServer
my_web = myWebServer(伺服器的IP, 80) # port 80 的 Web Server
my_web.start # 啟動 Web Server 服務
while True:
cmds_dict = my_web.listen # 監聽是否有 client 送來的指令集
if len(cmds_dict) > 0:
print("透過HTTP方式傳來的控制指令:", type(cmds_dict), cmds_dict)
my_web.refresh("") # 送出一個空白網頁, 避免無限等待
不相信嗎 ? 看看以下的 DEMO 影片, 短短 19 行程式碼含註解, 就能讓 ESP8266 連上 WiFi, 架好 Web Server, 然後還能解析瀏覽器送來的控制指令。
完整原始程式碼:
from MyWifi import myWifi
my_wifi = myWifi("YOUR_WIFI_SSID", "YOUR_WIFI_PWD")
my_wifi.connect()# 架設網站伺服器
from MyWebServer import myWebServer
my_web = myWebServer(my_wifi.getIP(), 80) # port 80 的 Web Server
my_web.start # 啟動 Web Server 服務
while True:
cmds_dict = my_web.listen # 監聽是否有 client 送來的指令集
if len(cmds_dict) > 0:
print("透過HTTP方式傳來的控制指令:", type(cmds_dict), cmds_dict)
my_web.refresh("") # 送出一個空白網頁, 避免無限等待
*** 如果您想知道如何用很簡單的 2~3 行指令, 就能讓 MCU (ESP8266/ESP32) 快速連上 WiFi AP, 那麼您應該會有興趣參考我的另一篇文章 “如此簡單 MicroPython — WiFi 無線網路連網, MCU as IoT”. ***
關於發送 HTTP 指令的手機 App
基本上, 在 App 商店中搜尋可以找到一拖拉庫的免費 App, 來作為發送控制指令的終端裝置。例如, 我常用的
*** 同樣的程式碼上傳到您的 ESP8266 / ESP32, 之後不論您是用瀏覽器輸入, 或其他程式或裝置送出 HTTP 的 request, 或甚至透過手機的 App 來控制都可以遠端的控制您的裝置, 重點是一行程式碼都不需要更改。***
如此而已, 就是這麼簡單, 希望能對你有發生了一點點小幫助 !
作者:Yungger 勇哥
若覺得此文真對您有幫助, 點點左上方的拍手圖示, 鼓勵一下。若還想 請喝杯咖啡 鼓勵一下勇哥的繼續創作, 也感謝 😘 😘 !!