物联网专业课程设计:温室监控系统——移动终端篇(LineChart、SQLite

这个程序是本科课程设计写的程序,因为最近在复习java和C#,故把以前的东西拿出来看看,顺便写个博客 。
此程序的功能描述:通过手机端可以直接观察到温室的各项实时参数,并且可以通过曲线图直观地分析该温室最近一段时间的环境变化 。用户可通过设备管理界面看到各个监控节点的工作状态,可远程控制这些监控节点的工作状态,指令会先发送至上位机上,再由上位机通过串口发至底层终端 。手机端通过自带的功能对数据进行实时保存,方便相关技术人员进行历史数据查询 。移动终端主要包括三个界面:显示界面、数据库界面、状态控制界面 。
主要采用的模块有:
1.数据解析模块
数据解析模块的功能主要是接收来自上位机的数据,对数据按照格式进行解析,根据其设备号进行分类存储 。首先,将读取的数据存入缓冲区,然后在缓冲区内查找数据的帧头和帧尾,如果找到了帧头和帧尾,就对帧头和帧尾之间的数据进行拆分,根据通信协议将字符数组的各位存储到对应字符串,按照数据帧格式将各个传感器的信息和ID号提取出来并保存 。
该模块包含一个主要函数(char[] temp),该函数主要执行如下操作:1.调用(temp, a, b)函数将对应数组位数转换成字符串形式赋值到对应控件;2.调用.(a)函数将字符串转换为整型,用于图表显示和数据库存储;3.执行 .("", null, cv)语句,向数据表中增加最新数据 。
2.网络通信模块设计
网络通信模块基于TCP协议,通过 s = new (ip地址,端口号),创建对象,当连接上上位机后,上位机会调用()方法返回连接的套接字,此时线程池创建两个线程,分别用于接收和发送操作 。之后调用()方法获取上位机TCP套接字的输入流,存入字节数组交由数据解析模块进行处理 。在设备状态显示界面,用户通过、控件进行指令下达,此时,套接字对象会调用输出流的write()方法向上位机发送指令 。关键代码如下:
【物联网专业课程设计:温室监控系统——移动终端篇(LineChart、SQLite】socket = new Socket(pcIp, pcport);//创建套接字对象pcTcpOutputStream = socket.getOutputStream();//获取PC输出流is = socket.getInputStream();//获取输入流isr = new InputStreamReader(is);//读取输入流br = new BufferedReader(isr);//创建缓存区char[] temp = response.toCharArray();//保存于字符数组new Thread(new Runnable() {//创建一个线程用来接收数据public void run() {while (true) {try {response = br.readLine();//读一行char[] temp = response.toCharArray();netDataReceived(temp);//交由数据处理函数} catch (Exception e) {e.printStackTrace();}}}}).start();
3.数据显示模块设计
该模块包含两个主要部分:实时数据显示部分与折线图显示部分 。
本设计所涉及到的控件有、 。接收线程每隔将服务器发送过来的数据存储至字符数组中,并调用(char[] temp)函数进行数据的解析、拆分,然后分别进行处理 。
对于实时数据显示部分,所有相关控件方法均放在线程中进行调用,类对象调用(str)函数显示已经拆分好的字符串 。
对于图表显示部分,则需先对类对象进行初始化和相关参数的配置,例如X轴、Y轴、限制线等参数 。其次调用(Chart, "表名", color, int)函数将对应的整型数据添加至指定图表中 。关键代码如下:
LineData data = http://www.kingceram.com/post/chart.getData();//图表获取int数据if (data != null) {//数据非空ILineDataSet set = data.getDataSetByIndex(0);if (set == null) {set = createLineDataSet(name, color);data.addDataSet(set);//执行打点操作}data.addEntry(new Entry(set.getEntryCount(), number), 0);//添加到图表中data.notifyDataChanged();chart.notifyDataSetChanged();chart.setVisibleXRangeMaximum(30);//设置坐标轴范围chart.moveViewToX(data.getEntryCount());}