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

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

项目源代码可访问我的 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3196 引用 • 8215 回帖
  • 实践项目
    6 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 6 关注
  • Windows

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

    227 引用 • 476 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    141 引用 • 946 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖 • 1 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 18 关注
  • JetBrains

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

    18 引用 • 54 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 7 关注
  • PWA

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

    14 引用 • 69 回帖 • 175 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 493 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖
  • NetBeans

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

    78 引用 • 102 回帖 • 704 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 103 关注
  • Access
    1 引用 • 3 回帖 • 3 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 678 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 146 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 487 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • Electron

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

    15 引用 • 136 回帖 • 2 关注
  • Laravel

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

    20 引用 • 23 回帖 • 738 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 82 关注