JAVA 实践项目 --- 树莓派信息自动化采集后入库项目 (四)

本贴最后更新于 2460 天前,其中的信息可能已经沧海桑田

项目源代码可访问我的 github:https://github.com/Spacider/Gather-and-store
如果觉得好的话请给个 star 哦~

开发 IDE: IDEA 2018.03 JDK 1.8
开发环境: macOS 10.13.6 (如 windows 请对项目中部分路径进行改写)
数据库: Oracle 11g


第三阶段:从日志文件中采集并发送数据

在 JAVA 实践项目---树莓派信息自动化采集后入库项目(三)中写到将数据写入日志文件中,接下来我们就要从日志文件中数据取出来并发送给 Server 端。
imagepng

此层项目结构为
imagepng


接下来开始看代码:
1.采集模块:

  • 定义一个 Gather 借口
public interface Gather { /** * 采集模块接口实现 * 对 src 下日志进行处理,一行日志封装成一个 Environment 对象或者两个 Environment 对象 * 所有采集到的对象封装到集合中 * @return */ Collection<Environment> gather(); }
  • 有了接口之后再定义个包为 Impl,专门用来放实现类,在 Impl 下定义一个类为 GatherImpl,它实现了 Gather 接口。
public final class GatherImpl implements Gather { }

在实现类中写一个采集的主方法:

public Collection<Environment> gather(){ }

写方法实现之前想到一个问题:如果客户端发送到服务器的过程中出现意外怎么办?数据是否会丢失?会不会发送错行?
在经过考虑以后,想出一个解决方案:

使用 RandomAccessFile 流,它有一个 seek() 方法可以跳过之前已经读取过的字节数,这样的话我们每发送一次,就把已经发送的字节数储存在一个文件中,每次都读取这个文件,保证现在发的是上一次的末尾。

代码实现:

  • 读取储存文件,如果文件不存在,说明第一次运行,则创造一个新文件:
Properties properties = new Properties(); File positionFile = new File(“/Users/wjh/Desktop/FirstProject/src/main/resources/FilePostion.properties”); if (!positionFile.exists()){ positionFile.createNewFile(); } properties.load(new FileReader(positionFile)); String FilePostion = properties.getProperty("FilePostion");
  • 跳过已经读取的字节数,并通过 String 类的 split 方法拆分字符串
while ((str = raf.readLine()) != null) { // 运用 | 来拆分字符串 String[] stringList = str.split("\\|"); getenv(stringList); } // 将最后的位数写回文件 properties.setProperty("FilePostion" , position+""); pw = new PrintWriter(positionFile); properties.store(pw,null);

getenv 方法的作用是根据所传入的拆分后的字符串来生成新的对象并返回,这里在实际与树莓派交互过程中出现了脏数据的情况,通过 if 语句来筛选出正确数据,实现:

private void getenv(String[] stringList){ String sensorAddress = stringList[3]; int FinalDate = 0; FinalDate = Integer.parseInt(stringList[6].substring(0, 4), 16); if (sensorAddress.equals("16")) { if (stringList[6].length() != 10){ System.out.println("得到的数据为脏数据, 温度湿度错误数据:" + stringList[6]); }else { /** * 温度计算公式:value(int) float Temperature = ((float)value*0.00268127)- 46.85; * 湿度:value(int) float Humidity = ((float)value*0.00190735)-6; */ // 生成温度对象,并添加到 list 中 float Temperature = (float) ((FinalDate * 0.00268127) - 46.85); environmentList.add(SetNameAndData(stringList, "温度", Temperature)); // 生成湿度对象,并添加到 list 中 FinalDate = Integer.parseInt(stringList[6].substring(4, 8), 16); float Humidity = (float) ((FinalDate * 0.00190735) - 6); environmentList.add(SetNameAndData(stringList, "湿度", Humidity)); } }else if (sensorAddress.equals("256")){ if (stringList[6].length() != 6) { System.out.println("得到的数据为脏数据, 光照错误数据:" + stringList[6]); }else{ environmentList.add(SetNameAndData(stringList, "光照强度", FinalDate)); } }else if (sensorAddress.equals("1280")){ if (stringList[6].length() != 6) { System.out.println("得到的数据为脏数据, 二氧化碳错误数据:" + stringList[6]); }else{ environmentList.add(SetNameAndData(stringList, "二氧化碳", FinalDate)); } }else{ System.out.println("得到的数据错误"); } }

SetNameAndData 方法为不同的 Enviroment 对象封装名字和数据:

private Environment SetNameAndData(String[] stringList, String name ,float Data){ String sensorAddress = stringList[3]; Environment envir = new Environment(); try { envir.setSrcID(stringList[0]); envir.setDstID(stringList[1]); envir.setDevID(stringList[2]); envir.setSensorAddress(sensorAddress); envir.setCount(Integer.parseInt(stringList[4])); envir.setCmd(Integer.parseInt(stringList[5])); envir.setStatus(Integer.parseInt(stringList[7])); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Timestamp ts = new Timestamp(format.parse(stringList[8]).getTime()); envir.setGather_date(ts); envir.setName(name); envir.setData(Data); } catch (ParseException e) { logger.error("设置名字和数据失败"); } return envir; }

在 GatherImpl 的 gather() 方法中写一个打印语句:

for (Environment environment : environmentList) { System.out.println(environment); }

写到这里,你就可以通过:

public static void main(String[] args) { GatherImpl gather = new GatherImpl(); gather.gather(); }

来进行测试,最后打印出 environment 对象集说明书写正确。


2.发送模块

  • 同样,定义一个接口为 EnvClient:
public interface EnvClient extends WossModel { /** * 发送采集模块采集的集合对象 */ void send(Collection<Environment> col); }
  • 有了接口以后写它的实现类 EnvClientImpl,它有一个很简单的功能,就是把上文封装好的对象发给服务器:
public class EnvClientImpl implements EnvClient { public void send(Collection<Environment> col) { } }

代码:

socket = new Socket(host,port); os = socket.getOutputStream(); oos = new ObjectOutputStream(os); // 运用对象流把生成的对象发给 Server 端 oos.writeObject(col); oos.flush();

写好这一切以后,定义这一阶段的的主入口,把内容串起来:

public final class ClientMain { /** * 集合 Client 并提供向外的入口 * 通过采集所获得的 list 发给 Server */ public static void ClientSendMain(){ ConfigurationImpl configuration = new ConfigurationImpl(); Gather gather = configuration.getGather(); List<Environment> environmentList = (List <Environment>) gather.gather(); configuration.getClient().send(environmentList); } }
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • 实践项目
    6 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OnlyOffice
    4 引用 • 18 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • Anytype
    3 引用 • 31 回帖 • 28 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 168 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 37 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 70 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 712 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 7 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 662 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 757 回帖 • 1 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    229 引用 • 476 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 739 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 62 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 251 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 265 关注