完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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/参数2Springboot 的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 的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请求 |
|
|
|
只有小组成员才能发言,加入小组>>
3133 浏览 9 评论
2830 浏览 16 评论
3340 浏览 1 评论
8713 浏览 16 评论
3933 浏览 18 评论
9550浏览 3评论
888浏览 3评论
461浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
459浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2179浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 17:55 , Processed in 0.976252 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号