资讯详情

java物联网第三天 智慧农业物联网

1.脚手架

随着国内IT随着职业生涯的兴起,越来越多的合作伙伴也致力于发展这个薪水相对较高的行业。许多学生通过培训或观看视频自学进入零基础。工作一两年后,他们发现自己的基础太弱,想要进一步提高自己的能力 困难。

市场上有两种视频教程:第一种是纯理论,如框架、算法、虚拟机等;另一种是Demo各级项目,如各大培训机构的项目课程。经过这么多年的工作,我学到了很多视频教程,并与许多毕业三年左右的程序员进行了交流。然而,我还没有找到一套特别好的教程,这可以让我的朋友从零基础到高级继续学习。在工作中,他们还反馈视频教程堆积了各种高技术,但在实际开发中,大多数技术都没有使用,即使使使用,也不像教程那样使用。在面试中,你和夸夸谈了十分钟,面试官说,你是如何在项目中使用这种技术的,使用时有什么问题?遇到这样的问题,大多数学生直接熄火,完全不知所措,为什么,因为他没有在项目中使用技术,只是看文档,视频,只是遵循教程Demo。如何将技术与业务相结合,应该是大多数学生工作中最薄弱的环节。甚至有些学生会抱怨公司使用的技术不新,认为业务不重要。但我想纠正的是,技术的出现最初是为了服务于业务,离开业务谈论技术就是玩流氓。

早在两年前,我就有了这样的想法。既然国内环境造成了面试修地球、上班拧螺丝的情况,那么脱敏后能不能和大家分享一下自己做的真实项目,让大家在学习的同时有一个真实的项目环境来改善呢?因此,有从0开始使用Java做"智能农业物联网"》课程的诞生。

学习本课程的基本要求:有Java基础,学习Spring,SpringMVC,Mybatis做过简单项目以上的学生可以学习框架。但这并不意味着这门课程是一门入门课程。对于有开发经验的学生来说,物联网产业是一个日出产业,也是未来十年发展的蓝海。然后我相信,有实体经济支持的行业永远不会像互联网行业那样有大泡沫,也永远不会让你工作不安全。对于对物联网相关工作感兴趣的学生来说,本课程也非常适合所有想从各个方面提高自己的学生。

我从12年开始接触物联网项目,做过智能养猪场、智能农场、猪联网、云医疗等相关项目,也做过互联网行业。我以为我积累了很多经验教训,所以我会在课程中分享这些知识。

同时,在本课程中,我不仅是产品、设计、开发、运营和维护,也是客户。我将从项目的整个生命周期中介绍给您,并有相关的着陆计划。这样,学生的愿景就会扩大,而不仅仅局限于这亩三分土地的发展。

这门课的亮点:我只能说,很多亮点。

核心如下:产品经理眼中的产品、数据库设计、如何将需求变成代码、如何与物联网设备互动、如何启动项目、如何在需求变化后不与产品撕裂。

看,我不会只让你知道那些高大的技术点。我向你学习如何做一个完美的产品!

在这门课程中,你会看到太多与其他教程不同的地方。你看不到的Demo水平案例,你看到的绝对是一个工业水平的实现计划。我也希望通过这门课程,学生们能进一步升华他们的视野,你站的高度,你从不同的角度看问题,将决定你未来成长的上限。

对于本课程的成长建议:本课程的录音将持续很长一段时间,是的,你是对的,很长一段时间,我的期望,至少在年底之前,为什么安排,因为我想分享太多的内容,我不想也不想结束,所以,你可以得到足够大的收获,他没有尽头。

最终效果:在业务中学习技术点,通过技术点使业务更加美观!

希望你不仅能通过专门的课程获得知识,还能成为未来的好朋友。谢谢你!

1.物联网产业前景-政府重视政府

阿里云有IoT-万物互联

新西兰技术移民

8.环境建设脚手架

备选:小白(java基础,懂javaweb常见框架的开发ssm,ssh),联系我们的项目,学习。git你不懂,会有的git入门,svn介绍网上建立的源代码管理平台github,gitee(码云);

课程的特点是全面的。只要你想学习所有的知识点,我们就可以介绍它们。介绍的风格必须接近实际战斗。我说的可能不同于在线教程,但我说的一定是我在项目中使用过的方式。我指的是实际战斗。

我说的不一定高,但一定是最实用的。符合现阶段项目的技术栈,包括人员对新技术的掌握。

脚手架:https://gitee.com/zhang.w/boot-backend

从版本控制库中拉代码:

1.安装配置jdk环境,maven环境,本地git软件,idea

2.注册码云账号

3.通过开发工具导出项目

4.建设项目是标准SPringBoot项目

9.生产水平SpringBoot项目入门

1.导入脚手架后,需要找到他的使用文件和sql脚本

2.打开数据库管理软件,导入脚本

3.运行main函数

10.依控制-pom文件介绍

SpringBoot项目的特点是协议大于配置,配置文件不多,还有一些SpringBoot会维护一个配置bean,之前spring开发基本都是xml配置,在SpringBoot中,简化了xml配置,并不是说没有,如果你需要配置,可以使用配置bean。本讲座的配置主要是maven的pom文件。maven’用来做jar包管理,对应我们项目开发的一般组件,看看有什么jar包?

spring-boot-starter-parent起步依赖,SpringBoot有两个大版本,1.X,2.X,这两个版本有一些区别,有一些类在升级到2.X我们开发的最新版本被删除,建议您升级到最新版本

11.项目中applicaiton.yml详细说明配置文件

YAML Ain’t a Markup Language

springboot不再使用项目配置文件xml使用的方法yml格式,当前springboot配置还有另一种格式,applicaiton.properties,但是后一种格式的可读性太差,不建议使用

12.完成第一次增删改查

代码生成器:从dao-service-controller-html-js-css

前端用的layui

需要有数据库的表,只要有数据库的表,就可以生成代码,生成的代码可以直接运行

代码生成器生成后,需要将每个文件复制到相应的目录中

虽然代码已经生成,但由于我们的权限框架,看不到效果shiro控制,必须正确shiro配置可以找到相应的功能

13.权限配置-Shiro配置入门

系统设置-菜单-添加新菜单

系统设置-角色权访问该菜单

此时因为ehcache生效了,每次用户登录会从数据库把当前用户拥有的角色权限都取出来,放在缓存里,当你修改了权限后,他不会更新缓存,所以需要手动退出登录,再登录一次,让ehcache缓存成为最新的

2.Redis部分知识概述

2.1.2Redis分析项目的地位和使用场景

2.1.3Redis安装-win-linux-mac

windows安装教程:https://www.cnblogs.com/tommy-huang/p/6093813.html

windows版本下载:https://github.com/MicrosoftArchive/redis/releases

linux建议使用安装yum方式:https://www.cnblogs.com/rslai/p/8249812.html

linux安装编译方法:https://www.cnblogs.com/wuguiyunwei/p/7026315.html

mac安装:跟linux安装一样

2.1.4Redis客户端命令行redis-cli操作

https://www.cnblogs.com/kongzhongqijing/p/6867960.html

https://www.runoob.com/redis/redis-commands.html

如何连接redis服务器:redis-cli ip地址 端口号 集群需要单独配置参数-c

最大的使用场景是运维

2.1.5Java连接Redis-Jedis简介

原文:https://blog.csdn.net/yz357823669/article/details/78752950

源码:https://github.com/RisingSunYZ/test_redis

Redis基于Java的客户端SDK收集

2.1.6RedisPlus图形客户端-支持集群访问

开源地址:https://gitee.com/MaxBill/RedisPlus

下载地址:https://pan.baidu.com/s/1ETwWnEj4rbsE1S3GlYHlWg

2.1.7Redis跟SpringBoot整合-注方式使用Redis

2.1.8Redis跟SpringBoot整合-RedisTemplate使用Redis

2.1.9.1使用Redis实现一个分布式

2.1.9.2使用Redis实现一个分布式锁操作演示

2.1.10Redis高可用方案-哨兵模式-SpringBoot整合

哨兵是用来放哨的,能实时监控我们redis集群的状态,保证redis服务器不会挂掉

​ 搭建:https://blog.csdn.net/Zer01ne/article/details/83010407

Redis哨兵配置的作用是可以发现redis的主从节点的位置,以及他们当前运行的状态

一主二从三哨兵模式,三个哨兵保证了哨兵本身是高可用的,再去监控其他redis的状态

​ 整合:https://blog.csdn.net/Mars13889146832/article/details/79534981

通过JedisSentinelPool获取到Jedis,对外提供缓存服务

2.1.10Redis高可用方案-RedisCluster-SpringBoot整合

​ 搭建:https://www.cnblogs.com/wuxl360/p/5920330.html

redis-trib.rb  create  --replicas  1  192.168.31.245:7000 192.168.31.245:7001  192.168.31.245:7002 192.168.31.210:7003  192.168.31.210:7004  192.168.31.210:7005

​ 整合:https://blog.csdn.net/qq_30905661/article/details/80859407

2.1.11Redis高可用方案-云上的服务

阿里云,腾讯云,华为云,AWS

云服务商都提供了对于Redis的解决方案,就是可以直接花钱买安装好Redis的服务器,并且对外提供服务

云服务商的机器的稳定性要比自建机房更可靠

2.1.12Redis高可用方案-公私混合云

随着对混合云了解的增多,人们不难发现,看似完美的混合云也有诸多痛点。

一是如何统一管理多个不同的云平台。在混合云场景下,企业常常采用多个公有云或私有云平台,这样不仅造成基础设施资源池多样化,还使得异构资源环境面临着同时管理物理机、虚拟化的局面。此外,合适的管理工具的缺乏,也给平台管理人员带来非常大的压力和工作量。

二是如何更好进行云网融合。对于用户而言,当前混合云业务面临的最大问题之一便是云计算资源和网络资源的申请、计费、运维处于彼此割裂状态,这在一定程度上也影响了用户的体验。

三是如何开展混合云的相关应用。混合云并不是简单的把公有云和私有云堆砌在一起,而是通过两者的碰撞,产生1+1>2的价值。可以说,混合云就像打太极拳,将公有云、私有云打通,使两者无缝衔接,让数据在云中按需流动。例如,如何实现虚拟资源在异构虚拟化资源池之间迁移效率的最大化是混合云应用时需要考虑的问题之一。

2.1.13Redis在生产中不得不重视的几个运维问题

  • 使用 keys * 把库堵死,——建议使用别名把这个命令改名
  • 超过内存使用后,部分数据被删除——这个有删除策略的,选择适合自己的即可
  • 没开持久化,却重启了实例,数据全掉——记得非缓存的信息需要打开持久化
  • RDB 的持久化需要 vm.overcommit_memory=1,否则会持久化失败
  • 没有持久化情况下,主从,主重启太快,从还没认为主挂的情况下,从会清空自己的数据——人为重启主节点前,先关闭从节点的同步

  • 了解清楚业务数据流是怎么样的流向

  • 结合 Redis 监控查看 QPS、缓存命中率、内存使用率等信息

  • 确认机器层面的资源是否有异常

  • 故障时及时上机,使用 redis-cli monitor 打印出操作日志,然后分析(事后分析此条失效)

  • 和研发沟通,确认是否有大 Key 在堵塞(大 Key 也可以在日常的巡检中获得)

  • 和组内同事沟通,确实是否有误操作

  • 和运维同事、研发一起排查流量是否正常,是否存在被刷的情况

  • 更多的排查需要对线上系统的分析。

  • 根据不同业务选择数据类型,有必要时对数据结构进行审核,减少数据冗余
  • 精简键名和键值,控制键值的大小
  • 使用前缀管理好 key,防止key的重名导致value被覆盖
  • 使用 scan 代替 keys,将遍历 Redis DB 中所有 key 的操作放到客户端来做
  • 避免使用 O(N) 复杂度的命令
  • 配置使用 ziplist 来优化 list
  • 合理配置 maxmemory
  • 数据量大的情况,做好 key 和 value 的压缩
  • 利用管道,批量处理命令
  • 根据不同业务选择短链接或者长链接
  • 定期使用 redis-cli --big-keys 检测大 Key

2.1.14Redis面试题详解

面试不能脱离业务聊架构,这是耍流氓。

一定要结合你的业务场景,原则就是面试官问的每一个问题都要说,我在开发过程中遇到了这样的问题,是如何解决的?如果某个问题不会,直接就说在生产中没有遇到过,但是我可以说一下思路。

建议大家看这个面试题,但是不要背,准备一点实际的业务

3.系统设计

4.数据库设计

​ 表设计,有些表及它中间包含的数据都是系统运行所必须的,每个系统都差不多,在脚手架工程中一般都会包含。这些表的结构大致不会变化,而且跟你使用的开发语言无关。

​ 表的命名是有规范的,通常来说,根据前缀区别不同的模块,表名一般是下划线。

​ 介绍这样的一些基础表:

sys_file_info:id是文件的md5,这样可以保证同一个文件只会被上传一次,程序在上传的时候如果没有上传成功,并且是因为数据库的主键冲突,这时就要根据该文件的md5值去数据库查询,把已经存在的文件的path或url取出来返回给上传方。path和url的区别,主要是因为系统设计了两套上传逻辑,分别是本地上传和云存储。

sys_logs:日志,日志表会记录一些比较重要的操作。使用日志表的方式比较特殊,用到了spring的aop面向切面的思想,不需要你手动去new,只需要通过切面加自定义的注解,你的某个方法如果想要被记录日志,可以直接在方法上面加一个日志注解,这样,当这个方法被调用的时候,就会顺便往日志表中插一条记录。我们线上的项目的日志打印功能通常都是关闭的,因为磁盘空间永远不够,如果你以debug的方式在线上启动项目,就我们这个业务量不是很大的系统,每天产生的日志文件大概有7GB,我们买的阿里云服务器,磁盘通常都不会太大,当你有一天发现你的系统突然无法访问,也没用被别人攻击,一定去检查一下,是否你的磁盘满了。而且日志表的作用很多,也可以记录一些跟业务相关的比较中亚的信息,例如,我们项目中的物联网采集设备,在开机的时候会发送一条启动成功的信息,每个半分钟会发送一条心跳信息,但这些信息我们在项目里面没有必要去处理,但是有的时候系统会不稳定,需要查看这些日志,来判断是因为什么原因导致系统出问题。开始的时候,是通过开发人员后台查询打印出来的的日志判断是否正常,这样非常不方便,后面开发了一个功能,把这些启动信息,心跳信息都存在日志表中,客户可以在界面直接查看设备是否正常。

权限相关表:不管用什么权限框架,表结构基本一样《用户user、角色role、权限permission》,以及他们之间的多对多映射关系表。在系统中使用非常灵活,对系统的扩展帮助非常大。通过对权限的灵活控制,可以实现很多你想要的业务逻辑,而不需要写一行代码。

stb_area:全国区域规划表

sys_ys7_account:系统要使用其他第三方的系统的一些功能,这时候第三方的系统也需要账号密码登录,为了让我们的系统能顺利地交付给客户使用,这样的第三方系统的账号信息我也可以通过界面维护

t_dict:数据字典表,性别、状态、民族、国籍、组织机构

t_mail ,t_mail_to:系统用来发送邮件的

weixin_*:是跟公众号开发相关的

定时任务表:QRTZ_*:这是使用定时框架quartz所需要的表,通常来说,在网上找的资料,使用quartz框架实现定时任务,不需要数据库表。quartz的表结构的非常重要的作用就在于可以实现分布式的定时任务。

例如:有十个相同的项目被部署,每个项目中都有一段相同的定时任务逻辑,那如果在到达这个执行时间时,这些任务都应该被执行吗?没有必要所有的任务都执行,只需要有一个任务执行成功就可以了,所以我们把任务执行的状态信息保存起来,刚你要去执行某一个任务的时候,先去查看这个状态,如果是 可以执行的状态,那就执行,并且把状态修改为不可执行。其他任务来的时候一看状态不可执行,就继续进行下一次等待。其实,这就是分布式锁,只不过是通过数据库的方式实现的。

https://blog.csdn.net/jiangyu1013/article/details/79882868

t_job:也是quartz框架中需要的一张表,这张表可以记录当前系统所有的定时任务执行情况,并且有可视化的界面进行维护。你可以去动态的指定某个方法什么时候被执行,以及他执行的次数。

Ps:定时任务框架还有SpringTask,我们在项目中也用到了,但没有相关表被使用。

4.8.物联网业务相关表

基地:农场

通知:

设备相关

设计思路:分了两个大的阶段,第一阶段,我们做的是沙盘演示功能,沙盘上面的传感器可以记录温度,湿度,风速,风向等信息,可以进行远程控制,可以显示每个设备的近一段时间的数据折线图。因为这些信息的度量单位,数值上的差异是很大的,统计信息需要根据不同的设备分别进行,而且任务要求时间比较急,客户的意思是先做一个简单的出来(此处客户给我挖了坑),所以我把这些信息都单独建了表,把采集过来的信息根据设备类型直接入库,然后再去做后续的显示,参加了展览会,取得了很大的成功(客户获得了数十个订单);第二阶段,需求变化比较大,因为通过分析发现,采集来的数据除了数值和单位不同,其他信息都是相同的,所以我就进行了数据表的合并,放到了设备采集表中进行统一记录,但是并没有把原来的分表删除,因为考虑到数据量很大的情况下,对应每种设备还是可以单独记录的。

设计中需要注意的问题:对于需求的变更,因为不知道客户需要的到底是什么,会出现某个功能可能已经开发的差不多了,又需要多加字段,造成开发量的增加。还有因为设计的时候不可能考虑的很周到,必然会出现一些字段的变化,也会造成工作量的增加。大家在进行工作量预估的时候,一定要把这些因素都考虑进去。

4.9.数据库管理软件-Navicat使用

Navicat的版本比较多,我们通常会使用可以连接多种数据库的版本Premium。

在公司里面需要连接oracle,mysql,sqlserver,采用这个客户端比较方便。

通过逆向数据库到模型的功能,可以查看表的设计图,如果表与表之间有外键,此处可以看到他们的关联关系,类似于PowerDesinger的界面

这个工具也能帮助我们执行excel数据的导入导出,生成报表

5.业务模块

数据的采集需要物联网设备与web后台进行交互,交互的方式需要一个中介,中介的作用是一个消息队列,可以接收物联网设备的传递过来的信息,并且转发给web设备。中介的实现方式很多种,可以自己搭建对应的平台,也可以采用第三方的平台,从技术实现的难易程度和成本控制上来说,花钱采用第三方的是最经济实惠的。而从技术选型上来说,我们跟设备端的工程师确定共同的一个平台。一期采用的是开发快平台,负责数据采集后的传递,他的功能很强大,在数据传递中不需要考虑粘包,拆包问题。二期准备把平台换成阿里云的,因为阿里云的更稳定,更可靠的。平台本身不会对数据库做任何的处理,只负责消息的收发,硬件程序员将采集的数据发送到平台,而web端对对应的端口进行监听,监听到数据就进行处理,否则一直等待。

任意的第三方平台的接入,考虑的最多的就是对于多语言的支持能力,对于问题的解决速度,以及api的更新要保持节奏。

开发快平台:http://www.kaifakuai.com/

找到到开发者指南:http://developer.kaifakuai.com/

找到开发者工具:微信,A-SDK,HAM,L-SDK,S-SDK

S-SDK 开发向导:http://developer.kaifakuai.com/ssdk/SSDK-Tutorial.html

5.2.2.传感器与开发快交互

很多的云平台都会有一些活动,赠送一些免费的开发板,让你使用它的平台。接下来去购买响应的智能感应设备,这些设备包含温湿度传感器,土壤温湿度、酸碱度、电导率传感器,风速风向传感器,光照传感器,购买回来之后可以安装到开发板上进行测试,每个传感器,板子都有对应的使用说明书,《 型温湿度变送器使用说明书》,参数的说明,对设备的安装教程,配置软件安装及使用。对于开发人员来说,通信协议非常关键。常见问题及解决办法。

我们的板子需要一台能联网的设备向外发送数据,可以采用安卓系统

传感器安装板子上,板子再去跟安卓系统交互,安卓通过有线或无线信号把数据发送出去,发送到开发快的平台上。

5.2.3.Web程序与开发快交互

安卓的操作需要下载使用A-SDK,具体操作方式见操作手册

Java的操作:

​ 1)下载jar包,并且把他安装在本地的maven仓库

maven安装jar包到本地
mvn install:install-file -DgroupId=com.beidouapp -DartifactId=SSDK -Dversion=4.0.2.0 -Dfile=/Users/szz/IdeaProjects/intelligent_agriculture1/intelligent_agriculture/src/main/resources/lib/SSDK-Release-4.0.2.0.jar -Dpackaging=jar

​ 2)根据手册

BaseConfig.java存放开发快的参数的

这些参数都需要大家自己注册一个账号,会免费提供给你

DOMAIN:这个开发快的平台ip

UID

RECEIVE_UID

申请uid:就是一个添加用户的

ETClientAddUser.java用来添加uid

5.2.5.S-SDK开发快开发向导指引

5.2.6.S-SDK跟SpringBoot的整合

1)把开发快提供的api的main函数变成SpringBoot的bean

2)SpringBoot的配置文件

3)导入开发快依赖jar包

注意:现在是自己发自己收,实际上要跟开发快另一端的硬件做交互

​ 硬件发程序收:需要一个一直存在的监听器

​ 程序发硬件收:需要一个控制硬件的入门按钮

5.3.1.沙盘演示及重点知识提要

​ 硬件发送传感器的数据,程序接收到数据进行解码处理,存入数据库,并且在页面上做演示

​ 程序发送远程控制的指令,硬件接收到指令,并且执行相应的操作

需要学习的内容:如何去设计硬件与程序之间的通信协议、页面布局、对硬件传递过来的数据进行解码、对解码的数据处理并存入数据库、再从数据库把数据查询出来按照规定的格式发送到前端、前端接收到数据并且用echarts渲染出来、程序给硬件发指令;

5.3.2.LayUI入门-一个很丑的沙盘控制页面布局

脚手架工程用的前端框架就是layui,需要对layui做入门

建议大家还是采用bootstrap进行布局

对于苹果的手机的自适应问题,后续再讲

5.3.4.如何去设计硬件与程序之间的通信协议

硬件跟程序之间通信就是传递的byte数组,所以需要定义规则进行解析,这里的规则指的就是协议。

协议是由硬件工程师跟软件开发一起制定的

农业项目通信格式(沙盘专用),沙盘采购的传感器跟后续使用的传感器不是一个厂商,所以协议需要单独定制

5.3.5.沙盘数据库表的设计

同一个数据库中,不同的传感器设计出来的表结构除了单位不同,其他都是类似的,同学们可以会考虑把这些数据都放在一张表中,但请不要这样做,因为随着数据量的增加,迟早都要进行数据库的分库分表,为了业务的扩展性,不要放到一起。数据采集15秒就会上报一次。数据库的记录会增长的很快。

5.3.6.对硬件传递过来的数据进行解码(难点)

1)硬件传递过来的数据是byte数组

2)需要我们转换成16进制,

3)然后按通信规则进行解析

demo其实消息在发送前已经转换成了16进制数,所有发送出去的已经是16进制了。接收端只需要new String就能转换回16进制了。

开发快的demo提供了byte[]转16进制String的方法toChangeByHex

但是,我们在开发中,硬件工程师并没有把byte[]转换为16进制,所以,我们在接收到消息后,需要先调用toChangeByHex方法进行转换,然后再进行解析

16进制数打印出来显示的是10进制,但是协议中定义的是0x格式,你可以在程序中定义0x25这样的16进制,但是打印出来也是10进制

System.out.println(0x7b);//打印结果是123

5.3.7.对解码的数据处理并存入数据库

GY39协议说明书

我们定义的协议integers数组的第三个元素指定了我们发送来的数据类型

0x45:温度,气压,湿度,海拔

0x15:光照

跟硬件通信的时候必须遵守协议,协议可以自己定义,但一般传感器的厂商会提供一份解析的文档,通过文档,你就清楚地知道传递过来的数据的每一位分别代表什么。也会告诉你哪几位是什么传感器的值,而且会告诉你计算公式,通过计算公式,在程序里面进行计算,解析,最终存到数据库。

5.3.8.从数据库把数据查询出来按照规定的格式发送到前端

什么叫规定的格式?我怎么知道规定的格式是什么?

根据原型图,发现页面需要显示温度,湿度,pm2.5,气压四种传感器的折线图,折线图包含x轴和y轴,通常x轴代表时间段,每十分钟一个数据,y轴就是需要显示的数据。为了让页面显示十分钟一次,代表十分钟会采集一次数据。

需求深化的挖掘:可以给页面提供一些数据,这些数据的采集间隔是十分钟。页面不可能把设备所有时间段的数据都显示出来,只能显示最近一段时间,什么叫最近?

这个最近需要跟产品进行沟通,看到底在页面显示几条,注意美观度。我们的项目中显示了十条。该怎么给前端显示十条数据呢?

怎么写sql语句?

只需要提供当前时间点之前的10条数据即可

@GetMapping("/findAll")
@ApiOperation(value = "获取最近10个温度数据")
public List<Temperature> findAll() { 
        
    System.out.println("异步定时访问了数据库:"+new Date());
    return temperatureDao.findAll();
}

SELECT

FROM ( SELECT * FROM t_temperature t ORDER BY t.ddatetime DESC LIMIT 10 ) t2 ORDER BY t2.ddatetime

里层表示我们要去从结果集中取最近时间段的10条数据,desc对时间进行逆序排列,limit 10表示只取十条

外层对取出来的逆序数据进行正排

111 20 2018-10-21 00:00:21 11111 2018-10-21 00:00:21 2018-10-21 00:00:21 112 20 2018-10-21 00:00:51 11111 2018-10-21 00:00:51 2018-10-21 00:00:51 113 20 2018-10-21 00:01:06 11111 2018-10-21 00:01:06 2018-10-21 00:01:06 114 20 2018-10-21 00:01:36 11111 2018-10-21 00:01:36 2018-10-21 00:01:36 115 20 2018-10-21 00:01:51 11111 2018-10-21 00:01:51 2018-10-21 00:01:51 116 20 2018-10-21 00:02:06 11111 2018-10-21 00:02:06 2018-10-21 00:02:06 117 20 2018-10-21 00:02:22 11111 2018-10-21 00:02:22 2018-10-21 00:02:22 118 20 2018-10-21 00:02:37 11111 2018-10-21 00:02:37 2018-10-21 00:02:37 119 20 2018-10-21 00:02:52 11111 2018-10-21 00:02:52 2018-10-21 00:02:52 121 25 2018-12-22 23:57:34 11111 2018-12-29 09:28:30 2018-12-29 09:28:30

有了结果集直接发送到前端,在前端进行显示即可

5.3.9.前端接收到数据并且用echarts渲染出来

1)前端发送ajax请求,从后端把数据取回来

​ $.get(url1, null, a, “json”);

数据如何在页面不刷新的情况下自动更新,需要一个定时任务,定时去后端拿数据

var intvalTime=1500000000;//全局定时任务时间,一般情况下设置为10分钟去后台取一次数据

//重复执行某个方法
window.setInterval("$.get(url1, null,a,'json');", intvalTime);

2)要对数据进行处理,处理成echarts需要的格式

ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

https://echarts.baidu.com/

3)把数据交给echarts,进行展示

<!--温度-->
<script type="text/javascript">
    var intvalTime=1500000000;//全局定时任务时间,一般情况下设置为10分钟去后台取一次数据

    var option1 = { 
        
        tooltip: { 
        
            trigger: 'axis'
        },
        title: { 
        
            text: '温度(℃)' //标题
        },

        grid: { 
        
            left: '3%',
            right: '7%',
            bottom: '3%',
            containLabel: true
        },
        toolbox: { 
        
            show: true,
            feature: { 
        
                mark: { 
        show: true},
                dataView: { 
        show: true, readOnly: false},
                magicType: { 
        show: true, type: ['line', 'bar']},
                restore: { 
        show: true},
                saveAsImage: { 
        show: true}
            }
        },
        calculable: true,
        xAxis: { 
        
            type: 'category',
            boundaryGap: false,
            data: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        },
        yAxis: { 
        
            type: 'value',
            axisLabel: { 
        
                formatter: '{value}'
            }
        },
        series: [
            { 
        
                name: '湿度',
                type: 'line',
                stack: '总量',
                smooth: true,
                data: [12, 13, 40, 43, 59, 63, 71, 82, 83, 90],
                markPoint: { 
        
                    data: [
                        { 
        type: 'max', name: '最大值'},
                        { 
        type: 'min', name: '最小值'}
                    ]
                },
                markLine: { 
        
                    data: [
                        { 
        type: 'average', name: '平均值'}
                    ]
                }
            }
        ]
    };


    // 基于准备好的dom,初始化echarts实例
    var temperatureChart = echarts.init(document.getElementById('temperatureChartMain'));
    // 使用刚指定的配置项和数据显示图表。
    temperatureChart.setOption(option1);
    var url1 = "../temperatures/findAll";
    var times1 = [];    //时间数组(实际用来盛放X轴坐标值)
    var temperatures = [];    //温度数组(实际用来盛放Y坐标值)

    var a = function (data, status) { 
        
        if (data != null) { 
        
            times1 = [];
            temperatures = [];
            for (var i = 0; i < data.length; i++) { 
        
                times1.push(data[i].timeStr);
                temperatures.push(data[i].t);
            }
            //之前option中legend和 XAxis的data,series 为空,所以现在将数据填充进去
            temperatureChart.setOption({ 
                //加载数据图表
                xAxis: { 
        
                    data: times1
                },
                series: [{ 
        
                    type: 'line',
                    data: temperatures
                }]
            });
        }
    };

    //第一次打开页面去调用,a代表回调函数
    $.get(url1, null, a, "json");

    //重复执行某个方法
    window.setInterval("$.get(url1, null,a,'json');", intvalTime);

</script>
<!--温度-->

5.3.10.程序给硬件发指令实现对传感器的远程控制

1)前端向后端发请求

开关

<tr style="margin: 0 auto;text-align:center">
    <td>
        <form class="layui-form" action="" name="temperatureForm">
            <div class="layui-form-item">
                <label class="layui-form-label"><i class="layui-icon layui-icon-set" style="font-size: 25px; color: #1E9FFF;"></i>&nbsp;灌溉泵</label>
                <input lay-filter="alert_shade_net" type="checkbox" name="alert_shade_net" lay-skin="switch" lay-text="开启|关闭" id="alert_shade_net">
            </div>
        </form>
    </td>
</tr>
//使用layui的form组件
layui.use('form', function () { 
        
    var form = layui.form;
    
});
//监听遮光网传感器开关
form.on('switch(alert_shade_net)', function (data) { 
        
    var alert_value = this.checked ? '1' : '2';

    $.ajax({ 
        
        type: 'post',
        url: '/remote_control/switch/shade_net/' + alert_value,
        beforeSend: function (

标签: d酸碱度传感器ph模块4传感器重复性的正负id压缩型传感器传感器889dtr200温度变送器无线空气温湿度变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台