我滴Java老本行來嘍 啦啦啦啦啦啦啦
STM32+ESP8266上傳資料是怎么回事呢?STM32+ESP8266相信大家都很熟悉,但是STM32+ESP8266上傳資料是怎么回事呢,下面就讓小編帶大家一起了解吧,
STM32+ESP8266上傳資料,其實就是使用HTTP協議發送GET或POST請求訪問服務器,大家可能會很驚訝STM32+ESP8266怎么會上傳資料呢?但事實就是這樣,小編也感到非常驚訝,
這就是關于STM32+ESP8266上傳資料的事情了,大家有什么想法呢,歡迎在評論區告訴小編一起討論哦!??ヽ(°▽°)ノ?完結撒花!
誒呀你還在啊,結束了,后面什么都沒有了
真的! 點頭 真的!! 肯定
在我們趕到小編家里的時候只剩下這篇文章了
前言
我是JavaWeb程式員 我是JavaWeb程式員 我是JavaWeb程式員
寫STM32只是愛好,主業還是開發后臺程式
這篇文章主要講使用GET與POST方式發送資料有什么不同以及優缺點,并且使用Springboot作為服務端接收并展示資料
希望幫助有類似想法的開發人員與愛好者減少查找資料浪費的時間
具體如何撰寫STM32控制ESP8266的驅動以及發送程式可以看我之前寫的文章
[STM32] Stm32f103c8t6+ESP8266-01s+DHT11 實作向服務器上傳溫濕度資料
目錄
成果展示
5分鐘間隔采集的溫度資料
一分鐘間隔采集的溫度資料
5分鐘間隔采集的濕度資料
1分鐘間隔采集的濕度資料
關于Springboot
資料發送方式
GET訪問方式
GET在STM32中實作
POST+JSON訪問方式
POST+JSON在STM32中實作
成果展示
5分鐘間隔采集的溫度資料

一分鐘間隔采集的溫度資料

5分鐘間隔采集的濕度資料

1分鐘間隔采集的濕度資料

上述頁面都是前端使用Echarts展示的
關于Springboot
本篇提到Springboot的篇幅比較少,但我還是想說服務端很重要,物聯網說白了就是小設備聯網上傳下載資料,真正做決策的還是發送指令的服務端
我接觸到的一部分人都是向網路除錯助手之類的模擬server發送資料,雖然能看到接收到資料,但實際上資料并沒有被存盤下來,也并不能使用這些資料
這就是我搭建客戶端的原因,并且我是JavaWeb開發,對后臺非常熟悉,正好把軟硬體組合到一起
ESP8266通過TCP方式連接Springboot服務端上傳資料
服務端使用Springboot專案開發,前端使用Echarts展示資料曲線,資料庫用的mysql
資料每30秒上傳一次,服務端會分別保存1分鐘全天1440點資料,5分鐘288點資料,15分鐘96點資料,30分鐘48點資料,共四種顆粒度
資料庫設計時考慮了很多,首先是對表中域數考慮的比較多,因為一張表的域超過100個就會影響查詢效率,而由于我是橫表存盤資料最小的顆粒度是1分鐘一個值,全天就是1440個值,并且五分鐘也有288個值,最終結論是減少域的使用提升性能,資料過長就轉而增加資料存盤條數,就可以既滿足資料庫性能也能滿足所有顆粒度存盤,比如1440個資料,會拆分成多條資料存入資料庫,當然實際情況是一分鐘一入庫,具體怎樣入庫這個邏輯有些復雜,邏輯性很強不易分享,可以根據自己程式自由設計
具體后臺設計根據自己需求可以對資料進行監測并告警之類,那就是自己自由發揮了
資料發送方式
ESP8266使用HTTP協議發送請求訪問服務器并上傳資料
HTTP協議我這里就不講了,我對概念類的知識不會太深入的了解,而且網上這類知識很好找到
這里主要講講ESP3266如何發送GET與POST請求
GET訪問方式
GET有多種方式,這里使用的是在URL中拼接引數 如: IP:埠/路由/引數1/引數2
當然你也可以用另一種如: IP:埠/路由?引數名1=引數1&引數名2=引數2
都是可以的,服務端程式與只要HTTP訪問方式按照使用的方式拼接好就可以訪問
Springboot 的controller中撰寫GET訪問方法

推薦使用postman先熟悉http的訪問方式
選擇GET方式并在utl后面用"/"分隔引數

Send一下狀態碼200 說明可以訪問
狀態碼: 200 服務器接收到回應 400引數有誤 404無法訪問
后臺列印

后臺接收到資料,說明該訪問方法沒有問題
那么怎么用單片機訪問這個地址呢
這就用到postman的工具了

點擊Code可以看到http的訪問代碼,這個就是瀏覽器訪問一個地址背后所有引數
我們只需要輸入地址訪問,而其余的引數都是瀏覽器幫我們添加的,這里就可以看到訪問地址背后還需要什么引數

除了Cookie之外都是我們要用的,再加上Host地址
GET /STM32/stm32esp8266/weather/123/456 HTTP/1.1
Accept-Language: zh-CN,zh;q=0.9
Host:192.168.3.8
轉成模板就是:
GET {專案路由地址} HTTP/1.1\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Host:{服務器ip}\r\n
\r\n換行
要注意的是我這里換行是方便講解,最終在ESP8266中是一整行字串換行用的轉移字符"\r\n",并且最后必須加上一個換行
敲黑板,劃重點
GET在STM32中實作
知道HTTP請求寫法之后就是要在STM32中組裝引數并用ESP8266發送出去
STM32傳給8266的字串就是下面的寫法,8266使用TCP方式連接服務器并發送這個字串就可以實作一次GET訪問
"GET /STM32/stm32esp8266/weather/123/456 HTTP/1.1\r\nAccept-Language: zh-CN,zh;q=0.9\r\nHost:192.168.3.8\r\n\r\n"
GET方式講完了
接下來是我目前階段推薦的資料上傳方式
POST+JSON訪問方式
因為GET方式需要在URL里面無限拼接引數
導致添加新的傳感器資料后不止單片機要重新燒錄新的代碼,
連服務器上的接收資料的Springboot專案也要在接收方法添加新增引數,維護起來費時費力

舉個例子就是這樣,每增加一個引數都要修改服務端代碼,麻煩不說也不好維護
而POST+JSON是將資料按照JSON鍵值對方式組裝好再整體的發給服務端,服務端根據JSON的鍵值進行遍歷執行引數對應的方法
這樣就算是增加傳感器增加發送引數,只需要在JSON中添加即可,無需再修改服務端代碼
Springboot 的controller中撰寫POST訪問方法

服務器接收一個JSON格式的鍵值對引數,并用for回圈遍歷出引數,再傳給處理業務邏輯的方法
服務端的接收方法知道了,那單片機怎么發送JSON呢?(這個問法顯著我好傻啊,哪有自問自答的呢)
同樣先在postman工具上模擬一次POST+JSON發送

使用postman發送JSON



這里展示隨便加減JSON串的引數,無需像GET方式考慮一對一
因為統一將資料寫入JSON中,不必像GET方法需要單片機與服務端引數一對一來接收
同樣使用postman的Cide工具查看HTTP訪問代碼

稍稍改動一下
POST /STM32/stm32esp8266/weathermirror? HTTP/1.1
Host: 192.168.8.108:8085
Content-Type: application/json;charset=utf-8
Content-Type: text/plain
Content-Length:38
cache-control: no-cache
{"temperature":"123","humidity":"456"}
POST+JSON方式模板
POST {專案路由地址}? HTTP/1.1\r\n
Host: {服務器ip}:{專案部署埠}\r\n
Content-Type: application/json;charset=utf-8\r\n
Content-Type: text/plain\r\n
Content-Length:{下面JSON長度包括大括號}\r\n
cache-control: no-cache\r\n
{JSON}
敲黑板,劃重點
POST+JSON在STM32中實作
和get方式一樣也是寫成字串讓8266發送
POST {專案路由地址}? HTTP/1.1\r\nHost: {服務器ip}:{專案部署埠}\r\nContent-Type: application/json;charset=utf-8\r\nContent-Type: text/plain\r\nContent-Length:{下面JSON長度包括大括號}\r\ncache-control: no-cache\r\n{JSON}
有幾點要注意
1.JSON串中的KEY與VALUE值都要用雙引號引上,不然發送會失敗,后臺會報錯
如: {\"10001\":\"%d\",\"10002\":\"%d\",\"10003\":\"%d\"}
2.使用JSON要注意的是要加上Content-Length:XX引數,含義是發送JSON字串長度,而這個長度包括JSON的大括號
到目前為止使用STM32+ESP8266使用HTTP協議發送資料的方法已經講完了
真完結撒花??ヽ(°▽°)ノ?
最后分享一下我開發時
展示一下我STM32的代碼

這個是第一次專案成功接收8266發送的POST請求

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264887.html
標籤:其他
