我滴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请求