從Arduino透過POST方法傳遞JSON資料給Node.js伺服器程式的補充說明

本文旨在補充《超圖解物聯網IoT實作入門》第3章「接收與處理POST資料」一節,說明從Arduino控制板以POST方法傳送JSON資料給Node.js網站伺服器解析的程式寫法。

使用ESP8266控制板,經由Wi-Fi無線網路以POST方法傳遞JSON資料的語法,和本文不同,實作方式請參閱《超圖解物聯網IoT實作入門》第12章「使用POST方法傳遞JSON資料」一節(12-44頁)。

若要使用GET方法,從Arduino傳送JSON資料給Node.js網站伺服器程式,請參閱這一篇留言

單純使用Arduino解析或包裝JSON資料,可採用Arduino JSON程式庫,相關說明請參閱這一篇留言

使用POST方法傳送資料給網站伺服器

假設用戶端(瀏覽器)傳遞一個「點餐」的表單資料給swf.com.tw網站,而處理此表單資料的伺服器端程式叫做“order.js”:

從瀏覽器以POST方法傳送表單資料

在背地裡,瀏覽器將傳遞如下的HTTP訊息和資料給網站伺服器(註:實際的HTTP訊息通常更複雜):

POST請求的HTTP協議內容

透過HTML表單網頁傳遞資料時,我們的程式不用理會背後的HTTP訊息,瀏覽器會搞定一切。但若採用「Arduino程式」取代「瀏覽器」,直接從Arduino程式傳遞資料,那麼,與網站伺服器通訊的HTTP訊息,就必須寫在Arduino程式裡面。

從Arduino以POST方式傳送JSON資料

假設要透過Arduino乙太網路程式,以POST方法傳遞JSON格式的溫濕度資料給位於192.168.1.25的網站伺服器,HTTP訊息可以寫成:

以POST方法傳遞JSON格式的溫濕度資料的HTTP訊息

對應的Arduino乙太網路程式如下(client是EthernetClient物件):

Arduino乙太網路POST程式

傳遞POST命令的HTTP協議,只有下列資訊是必要的:

  • 下達命令的方法敘述(POST)
  • 內容類型
  • 內容長度
  • 資料

因此,上面的HTTP訊息可簡短地寫成這樣:

以《超圖解物聯網IoT實作入門》第3章的DHT11Client_2.ino檔為例,讀者可以把其中的loop()和httpSend()函式改成:

接收並解析經POST方法傳送的JSON資料的Node.js程式

超圖解物聯網IoT實作入門》第3章的post.js程式(位於form資料夾)已經包含引用處理POST資料的body-parser模組,因此底下的程式以它為藍本,請在post.js裡的處理「其他所有資源請求」的敘述(亦即,app.get(‘*’))之前,加入底下的程式片段:

請先執行此post.js程式,再啟動Arduino板,即可在命令列(終端機)視窗看到類似下圖的結果:

執行Node.js程式接收與解析JSON

2 thoughts on “從Arduino透過POST方法傳遞JSON資料給Node.js伺服器程式的補充說明

    1. hi chi:

      JSON是一種描述資訊的語法,常用於網路訊息交換,跟電腦系統或微控器沒有關聯。JSON和書本2-20頁提到的CSV與XML格式一樣,都是文字格式。

      我們通常不會在JSON或XML裡面夾帶圖檔,而是在訊息中描述圖檔所在位置,就像HTML網頁透過底下的標籤指令,告訴瀏覽器到伺服器的”/img”路徑下載”pict.png”圖檔,而不是把圖檔直接包夾在HTML裡面。

      <img src=”/img/pict.png”>

      如果要夾帶圖檔,必須先把圖像轉換成文字編碼(Base64編碼),才能附加到文字訊息當中。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *