单片机学习小组
直播中

南风一号

8年用户 979经验值
擅长:EMC/EMI设计
私信 关注

STM32+ESP8266怎么会上传数据呢

STM32+ESP8266上传数据是怎么回事呢?
STM32+ESP8266怎么会上传数据呢?

回帖(1)

曹昆

2022-1-18 09:20:32
      STM32+ESP8266上传数据是怎么回事呢?STM32+ESP8266相信大家都很熟悉,但是STM32+ESP8266上传数据是怎么回事呢,下面就让小编带大家一起了解吧。
  STM32+ESP8266上传数据,其实就是使用HTTP协议发送GET或POST请求访问服务器,大家可能会很惊讶STM32+ESP8266怎么会上传数据呢?但事实就是这样,小编也感到非常惊讶。
成果展示

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.1rn
Accept-Language: zh-CN,zh;q=0.9rn
Host:{服务器ip}rn
rn换行
  要注意的是我这里换行是方便讲解,最终在ESP8266中是一整行字符串换行用的转移字符"rn",并且最后必须加上一个换行

敲黑板,划重点
GET在STM32中实现

知道HTTP请求写法之后就是要在STM32中组装参数并用ESP8266发送出去
STM32传给8266的字符串就是下面的写法,8266使用TCP方式连接服务器并发送这个字符串就可以实现一次GET访问
"GET /STM32/stm32esp8266/weather/123/456 HTTP/1.1rnAccept-Language: zh-CN,zh;q=0.9rnHost:192.168.3.8rnrn"  
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.1rn
Host: {服务器ip}:{项目部署端口}rn
Content-Type: application/json;charset=utf-8rn
Content-Type: text/plainrn
Content-Length:{下面JSON长度包括大括号}rn
cache-control: no-cachern
{JSON}

敲黑板,划重点
POST+JSON在STM32中实现

和get方式一样也是写成字符串让8266发送


有几点要注意
1.JSON串中的KEY与VALUE值都要用双引号引上,不然发送会失败,后台会报错
  如: {"10001":"%d","10002":"%d","10003":"%d"}
2.使用JSON要注意的是要加上Content-Length:XX参数,含义是发送JSON字符串长度,而这个长度包括JSON的大括号

到目前为止使用STM32+ESP8266使用HTTP协议发送数据的方法已经讲完了

最后分享一下我开发时
展示一下我STM32的代码


这个是第一次项目成功接收8266发送的POST请求









举报

更多回帖

发帖
×
20
完善资料,
赚取积分