NKFW第二届
今天最後要教給你們的就是六週上課的集大成!那我們要教什麽呢?
最後就是請你們整合做出一個動態的溫濕度感測器,然後在網頁上呈現
但不用擔心,我們會一步一步的讓你們回憶起這六週教的内容,慢慢引導你們怎麽實作!
我們這裡會使用的工具是以下這兩個協定:
1. EVENTSOURCE
2. EVENTSOURCELISTENER
這兩個是做什麽?簡單來說,就是透過網頁來觸發資料進行傳輸
那要怎麽使用呢?首先我們來看一下 Arduino 基本架構
首先要先加入函式庫:
如何設定觸發傳送的方法呢?就是使用早上講過的server.on()
,透過路徑觸發傳送的方法,就可以以下的設定觸發所使用的路徑:
我們建立了這個 /event 的路徑作為觸發傳送資料的機制,寫法也跟我們在傳 HTML 幾乎一模一樣,
想想看,我們今天原本是傳送string html
,那我們要怎麽包裝傳送資料?
這個時候我們就會用到了 json 這個檔案了!
json 基本上就是一個 dictionary 的概念:
就是我可以設定說濕度:XX,溫度:YY
,然後丟不同的數字進去,在解析 JSON 時,就可以查到說這個變數對應的數值是多少了!
那一樣,讓我們看一下基本架構:
我們首先加入這個 library:
然後宣告我們的物件為 readings:
接著先撰寫好我們的 json 函式:
這個就是取代我們之前string html
成為string json
最後就是如何request->send
這邊要注意的是 /readings
是客戶端觸發的,而後續伺服器才是透過 /events
觸發連續的回傳資料
這裡我們可以看到
路徑改成透過/readings
去進行觸發,那我們在[](AsyncWebServerRequest *request)
就可以觸發我們剛剛寫的函式執行,得出json這個字串。
隨後的 request->send() 這邊的三個參數也就不適用 SPIFFS 的規格去撰寫,而是要用一般格式撰寫。
也就是第一個變數填 status code,第二個填你的 content type,也就是我們在早上有講過的,然後最後就是我們的資料 json
而最後把全部包裝起來的就是:
加入這一行在 setup 裡面,代表現在伺服器有辦法進行 Event 的控制了!
現在看起來這個觸發 /readings 跟 /events 好像沒什麽關係,所以我們來解釋一下 EventSource 的運作原理:
EventSource 會先透過客戶端開啓,伺服器就會開始不斷的傳送訊息給客戶端,所以這裡也代表了我們也需要在 js 做一些處理,
這一行就是在講上面的 new eventsource('some url')
,也就是創建一個新的 EventSource
那這裡的 getReadings
又是什麽呢?getReadings
就是啓動第一次的請求,如下所述:
簡單來説就是將收到的資料要如何進行處理,透過json進行傳輸之後透過parse將資料分割出來
而這裡就是確實去聽 EventSource 的地方,我們將新的資料稱為 new_readings,後面則是定義 e 為 json 字串,然後透過 Parse 去把資料進行分割
最後在持續推送資料到客戶端又是怎麽實作的呢?
我們可以用 loop 來實作,並加上新的 events 函式,這樣就能達到持續傳送資料的機制了
解釋一下 events.send()
兩個函式:
前面就是先把 getSensorReadings
這個函式轉換成event.send
所能使用的陣列(Array),接著定義名稱,最後就是 ID ,這裡是使用本身的 Arduino 的執行時間來做 ID
在講完如何將資料從伺服器傳到客戶端後,我們可以開始規劃如何設計我們最後的計劃
一樣先來說明要做的步驟:
這裡一步一步來,先來回顧一下 Arduino 本身的開發架構:
我們來想想,如果我們想要把之前的功能全部整合進去的話?
我們需要用的函式庫有哪些呢?大家可以嘗試看看填寫以下的填空哦!
我們要先定義物件,我想大家都很熟悉了
啓動 WIFI 我們必須先做三個步驟
我們可以多多想一下
以下是提示!
如果我們想要判別 SPIFFS 有沒有成功裝上去,判別式要如何寫呢?
我們剛剛有提過,怎麽把我們想要的資料包裝成 json,以利我們之後進行資料傳輸,所以我們應該在中括號裡寫什麽?最後需要字串化是什麽呢?
我想大家都很聰明,都知道怎麽在旁邊加裝資料夾
這個也很簡單,就是在 data 資料夾底下把三個檔案創建好!
這裡我們會簡單的給大家一個模板可以直接使用
這邊需要你們使用今天教你們的東西了哦!這邊也會給大家提示!把問號的地方填上!
這邊給一些提示
server.on() 的三個變數代表的意思可以回去看一下