ESP32的HTTP server
緣起
ESP32C3有WIFI可以用,他的SDK裡面也自帶HTTP服務器,在裡頭架個網頁,瀏覽器就是單晶片的虛擬儀表。虛擬儀表能任意調整,增減元件,非常好用
- 顯示資訊,本來要OLED螢幕,現在有大片的瀏覽器
- 操作按鈕,本來要實體按鍵,在網頁放超連結,或輸入表單就有
HTTP通訊協定
Mozilla Developer Network介紹HTTP非常清楚。瀏覽器和ESP32主要靠GET/POST兩大命令
- GET
- GET /
- 抓index page,也就是首頁
- GET /?led_op=2
- 抓index page,同時傳遞led_op=2(代表閃爍)
- GET /led_toggle
- 用某個講好的名字GET,連線到這裡就閃爍LED
- POST
- POST /led_post
- 用某個講好的名字,然後再傳遞led_op=2
"telnet"命令能和遠端主機連線,輸入會原封不動送給ESP32,回應也看得到。所以上述所有命令都用telnet實驗一輪,確定會動,換成瀏覽器也會有信心
HTTP通訊協定,標準的GET
telnet連接板子的port 80;直接下GET命令,確實看到回應。綠色框框顯示虛擬儀表
HTTP通訊協定,標準的GET帶參數
模擬GET命令後面的路徑,後面接問號加key1=val1&key2=val2額外加上參數
- get /?led_op=2
- 問號後面的代表設定led_op變數為2
- 我定義led_op=2代表toggle,亮燈變暗燈,暗燈變亮燈,下面範例能讓LED閃爍
- 因為是GET /,所以照樣顯示原本的頁面
HTTP通訊協定,GET /led_toggle
在ESP32韌體設定/led_toggle這個路徑,連進去韌體讓LED閃爍,並且通知瀏覽器導向回/
GET方式(上面三種)像寄出明信片,基本上都展現在GET後面的字串,可能是指向不同resource,或是加上?led_op=2傳遞額外參數
HTTP通訊協定,POST
POST傳輸實況如下圖,大紅框是信封,信封帶上各種meta資料,裡面最重要的紀錄是"content-Length: 8"。然後小紅框才是信件內容把led_op=2八個字元。手敲整個HTTP header不大容易,黑暗執行緒的建議,從Chrome的後台直接複製一份來做實驗最快
ESP32收到HTTP POST後,確實把LED閃爍,然後通知導向回/
HTTP小結論
- 做完這個實驗,我對GET/POST的機制更有把握了
- GET適合讀某個東西,GET /?led_op=2來設定LED閃爍,語意上有點怪。優點是容易操控,在實驗原型階段簡單又快速
- 以語意來說,POST比較適合用來"設定"LED亮案
- 三種可能的HTTP寫法都試一次,都可以達成一樣的效果
- 寫這篇文章當下,我還記得HTTP的協定;三個月後忘記了,但我曾經學過,只要三分之一的力氣就想得起來
HTTP與我
- 用REDHAT 6.0裝Apache Server,瀏覽器顯示It Works。我學PHP基本上都失敗,基本上我只會弄HTML靜態網頁
- ARM9 S3C2410板子上面跑Linux,當初裡面有HTTP範例,可以連進網頁開關LED。這其實就是虛擬儀表,當時我不理解有什麼用
- ESP32C3有WIFI,但我完全當一般MCU玩了一輪,這是3Y前的事
- 用Python Flask,寫網頁分析單車紀錄,跑HTTP好像可以很簡單
- 突然發現,有WIFI的單晶片彈性巨大;發現這件事過了20Y了,後知後覺的我
留言