文章總列表

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小結論

    1. 做完這個實驗,我對GET/POST的機制更有把握了
    2. GET適合讀某個東西,GET /?led_op=2來設定LED閃爍,語意上有點怪。優點是容易操控,在實驗原型階段簡單又快速
    3. 以語意來說,POST比較適合用來"設定"LED亮案
    4. 三種可能的HTTP寫法都試一次,都可以達成一樣的效果
    5. 寫這篇文章當下,我還記得HTTP的協定;三個月後忘記了,但我曾經學過,只要三分之一的力氣就想得起來


    HTTP與我 

    1. 用REDHAT 6.0裝Apache Server,瀏覽器顯示It Works。我學PHP基本上都失敗,基本上我只會弄HTML靜態網頁
    2. ARM9 S3C2410板子上面跑Linux,當初裡面有HTTP範例,可以連進網頁開關LED。這其實就是虛擬儀表,當時我不理解有什麼用
    3. ESP32C3有WIFI,但我完全當一般MCU玩了一輪,這是3Y前的事
    4. 用Python Flask,寫網頁分析單車紀錄,跑HTTP好像可以很簡單
    5. 突然發現,有WIFI的單晶片彈性巨大;發現這件事過了20Y了,後知後覺的我

    HTTP與我2

    1. 用C語言寫網頁的體感很特別,得為每個URI(/, /led_on, /led_off, /led_toggle, /led_post)編寫handler function
    2. 瀏覽器來的請求,可能會灌爆緩衝區。這裡一律用snprintf()而不是sprintf()
    3. HTTP回應用C字串一行一行的刻,沒有Python裡好用的模板(template)引擎;轉址回 / 用的303回應,也是一行一行手刻;在C level沒有封裝好的框架,一切都自己來,直面HTTP協定
    4. 有趣的體驗




    留言

    這個網誌中的熱門文章

    STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

    小米掃地機器人S20+ review

    玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN