基于Android的环境监测软件开发.doc

上传人:rrsccc 文档编号:8921513 上传时间:2021-01-25 格式:DOC 页数:33 大小:124.71KB
返回 下载 相关 举报
基于Android的环境监测软件开发.doc_第1页
第1页 / 共33页
基于Android的环境监测软件开发.doc_第2页
第2页 / 共33页
基于Android的环境监测软件开发.doc_第3页
第3页 / 共33页
基于Android的环境监测软件开发.doc_第4页
第4页 / 共33页
基于Android的环境监测软件开发.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《基于Android的环境监测软件开发.doc》由会员分享,可在线阅读,更多相关《基于Android的环境监测软件开发.doc(33页珍藏版)》请在三一文库上搜索。

1、物联网应用课程设计物联网应用课程设计基于Android的环境监测软件开发专业计算机科学与技术学生姓名班级学号指导教师完成日期2015.12.255目 录目 录01 概 述11.1 课程设计目的11.2 课程设计内容与要求12 系统需求分析22.1 系统目标22.2 主体功能22.3 开发环境33 系统总体设计33.1 系统的功能模块划分33.2 流程图44 系统详细设计44.1 Android端界面布局44.2 Android端串口打开关闭(SerialPort类)74.3 Android端查找串口(SerialPortFinder类)84.4 Android端主界面方法(MainActivi

2、ty类)94.5 实验箱端的控制程序105 调试错误及解决措施116 小结12参考文献13附录141 概 述1.1 课程设计目的 物联网应用课程设计,是物联网工程专业的一门必修核心实践课程。该课程设计采用项目驱动的方式,让学生开展物联网相关的应用系统开发。通过面向实际应用的项目式系统的开发,使学生巩固嵌入式系统与物联网应用系统设计与开发技术、掌握物联网系统开发基本流程与典型开发技术、锻炼学生编程能力和应用系统开发能力,为学生后继的毕业设计、求职深造打下坚实的基础。1.2 课程设计内容与要求本次课程设计的任务,是开发一款基于Android端的对环境进行监测的软件,通过串口的读写数据,对温度、湿度

3、进行监测。 1.2.1.功能要求 在eclipse上开发一个软件能够监测环境温度和湿度的软件。通过串口烧写代码,在开发板上显示温度和湿度的曲线图。1.2.2. 实现要求基本任务要求:1. 在AndroidSDK开发平台上,开发一个能够在Android系统上运行的物联网环境监测软件。2. 环境数据(温度、湿度、光照等)由CC2530传感器节点通过串口上传到Android开发板。 3. Android开发板上的环境监测软件读取串口发来的数据。4. Android开发板上的环境监测软件通过动态曲线,展现实时的环境数据。提高任务要求:1. 环境数据可以存储到后台数据库。2.历史数据可以查询,并可通过曲

4、线展现。2 系统需求分析2.1 系统目标在开发的Android软件上点击相应的开关按钮,能够通过串口读写数据来监测环境的温度和湿度并显示曲线图。2.2 主体功能实验箱端实现的功能:A、接继电器的CC2530能够通过串口和PC互连B、能够通过PC端的串口调试助手对芯片进行收发数据C、通过发送相应的数据控制芯片上环境的监测。Android端实现的功能:A、代码实现对环境的监测B、Android NDK的应用接入,通过JNI接口实现SerialPort的native方法C、SerialPort实现了Android内核对串口的读写操作D、PC接入的串口和AVD的串口的连接实现2.3 开发环境开发软件:

5、Eclipse IAR 8.1硬件环境:windows7宇音力新物联网实验箱 3 系统总体设计3.1 系统的功能模块划分本系统主要有以下2个功能模块:硬件功能模块:通过读写串口来控制继电器的通断。软件功能模块:通过Android端的软件来实现串口的读写功能。Android端软件OpenSP ButtonOFF ButtonON Button串口实验箱的继电器模块开始3.2 流程图点击OpenSp打开串口运行程序发送数据给串口,串口发送给实验箱实验箱接受数据,判断接受数据,开始显示温度湿度结束4 系统详细设计4.1 Android端界面布局1、效果图 2、主要控件1)Open SP Button

6、主要实现串口的打开关闭2)ON Button向串口发送字符串”A1#”用于打开串口3)OFF Button向串口发送字符串”A0#”用于关闭串口3、主要程序代码 4.2 Android端串口打开关闭(SerialPort类)1、 实现的方法功能主要用来加载SO文件,通过JNI的方式打开关闭串口。2、 主要程序代码Java类private native static FileDescriptor open(String path, int baudrate); public native void close(); static System.loadLibrary(serial_port);

7、C类JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baudrate)int fd;speed_t speed;jobject mFileDescriptor;/* Check arguments */speed = getBaudrate(baudrate);if (speed = -1) /* TODO: throw an exception */LOGE(Invalid baudrate);return NULL;

8、.JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close(JNIEnv *env, jobject thiz)jclass SerialPortClass = (*env)-GetObjectClass(env, thiz);jclass FileDescriptorClass = (*env)-FindClass(env, java/io/FileDescriptor);jfieldID mFdID = (*env)-GetFieldID(env, SerialPortClass, mFd, Ljava/io/FileD

9、escriptor;);jfieldID descriptorID = (*env)-GetFieldID(env, FileDescriptorClass, descriptor, I);jobject mFd = (*env)-GetObjectField(env, thiz, mFdID);jint descriptor = (*env)-GetIntField(env, mFd, descriptorID);LOGD(close(fd = %d), descriptor);close(descriptor);4.3 Android端查找串口(SerialPortFinder类)1、实现

10、的方法和功能用来找到系统中可以用的串口2、主要程序代码 public String getAllDevices() Vector devices = new Vector(); / Parse each driver Iterator itdriv; try itdriv = getDrivers().iterator(); while(itdriv.hasNext() Driver driver = itdriv.next(); Iterator itdev = driver.getDevices().iterator(); while(itdev.hasNext() String devi

11、ce = itdev.next().getName(); String value = String.format(%s (%s), device, driver.getName(); devices.add(value); catch (IOException e) e.printStackTrace(); return devices.toArray(new Stringdevices.size(); 4.4Android主界面方法(MainActivity类)1、实现的方法和功能用来监听页面布局3个按钮的点击事件来触发相应的操作,即打开串口和发送相应的字符串2、主要程序代码final B

12、utton button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) try sp =new SerialPort(new File(/dev/ttyS2),115200); catch (SecurityException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); mOutputStream

13、= (FileOutputStream) sp.getOutputStream(); mInputStream = (FileInputStream) sp.getInputStream(); Toast.makeText(getApplicationContext(), open, Toast.LENGTH_SHORT).show(); ); final Button button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() Override pub

14、lic void onClick(View v) try mOutputStream.write(new String(A0#).getBytes(); catch (IOException e) e.printStackTrace(); Toast.makeText(getApplicationContext(), open, Toast.LENGTH_SHORT).show(); );4.5 实验箱端的控制程序1、实现的方法和功能 编写的程序烧写入实验箱,能够使实验箱实现继电器开关控制的操作,接受串口发来的数据判断进行相应的操作2、主要程序代码if(UartState = CONTROL_

15、RELAY) /控制 /判断接收的数据合法性 if(RxData0=d|RxData0=D)&(RxData1=1|RxData1=2) if(RxData1=1) RELAY1 = RELAY1; /低电平点亮 else RELAY2 = RELAY2; else if(RxData0=A)&(RxData1=0|RxData1=1) if(RxData1=0) RELAY1 = 0; RELAY2 = 0; else RELAY1 = 1; RELAY2 = 1; 6 小结 通过这段时间对物联网程序设计的学习,我学到了很多东西,譬如IAR的编写、Android端程序软件的编写等。本次课程设

16、计分为两周周,第一周,对硬件方面进行编写调试,实现实验箱的功能。第二周,在Android端编写相应的程序,并通过串口和实验箱进行连接进行相应的读写操作 在程序设计的过程中,遇到了各种各样的问题,通过请教同学和百度最终得以解决。比如,用eclipse读取串口的c代码,需要下载并配置ndk,如何调试串口等。 本次课程收益巨大,让我进一步了解了物联网工程这个大方向,通过软硬件结合开发,增强了我们的综合能力。不仅学习了学术上的知识,而且为以后入职前做好了准备,了解了程序员的工作内容和作息。希望在今后的开发道路上越走越远。参考文献1姜仲,刘丹等,Zigbee技术与实训教程 M.北京:清华大学出版社,20

17、14.12.2王向辉 张国印等,Android应用程序开发 M.北京:清华大学出版社,2015.2.附录:Copyright 2009 Cedric Priscal * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http:/www.apache.org/licenses/LICENSE-

18、2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations

19、 under the License. */package android_serialport_api;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.util.Log;public class SerialPort priv

20、ate static final String TAG = SerialPort;/* * Do not remove or rename the field mFd: it is used by native method close(); */private FileDescriptor mFd;private FileInputStream mFileInputStream;private FileOutputStream mFileOutputStream;public SerialPort(File device, int baudrate, int flags) throws Se

21、curityException, IOException /* Check access permission */if (!device.canRead() | !device.canWrite() try /* Missing read/write permission, trying to chmod the file */Process su;su = Runtime.getRuntime().exec(/system/bin/su);String cmd = chmod 666 + device.getAbsolutePath() + n+ exitn;su.getOutputStr

22、eam().write(cmd.getBytes();if (su.waitFor() != 0) | !device.canRead()| !device.canWrite() throw new SecurityException(); catch (Exception e) e.printStackTrace();throw new SecurityException();mFd = open(device.getAbsolutePath(), baudrate, flags);if (mFd = null) Log.e(TAG, native open returns null);th

23、row new IOException();mFileInputStream = new FileInputStream(mFd);mFileOutputStream = new FileOutputStream(mFd);/ Getters and setterspublic InputStream getInputStream() return mFileInputStream;public OutputStream getOutputStream() return mFileOutputStream;/ JNIprivate native static FileDescriptor op

24、en(String path, int baudrate, int flags);public native void close();static System.loadLibrary(serial_port);package android_serialport_api;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.LineNumberReader;import java.util.Iterator;import java.util.Vector;import

25、android.util.Log;public class SerialPortFinder public class Driver public Driver(String name, String root) mDriverName = name;mDeviceRoot = root;private String mDriverName;private String mDeviceRoot;Vector mDevices = null;public Vector getDevices() if (mDevices = null) mDevices = new Vector();File d

26、ev = new File(/dev);File files = dev.listFiles();int i;for (i=0; ifiles.length; i+) if (filesi.getAbsolutePath().startsWith(mDeviceRoot) Log.d(TAG, Found new device: + filesi);mDevices.add(filesi);return mDevices;public String getName() return mDriverName;private static final String TAG = SerialPort

27、;private Vector mDrivers = null;Vector getDrivers() throws IOException if (mDrivers = null) mDrivers = new Vector();LineNumberReader r = new LineNumberReader(new FileReader(/proc/tty/drivers);String l;while(l = r.readLine() != null) / Issue 3:/ Since driver name may contain spaces, we do not extract

28、 driver name with split()String drivername = l.substring(0, 0x15).trim();String w = l.split( +);if (w.length = 5) & (ww.length-1.equals(serial) Log.d(TAG, Found new driver + drivername + on + ww.length-4);mDrivers.add(new Driver(drivername, ww.length-4);r.close();return mDrivers;public String getAll

29、Devices() Vector devices = new Vector();/ Parse each driverIterator itdriv;try itdriv = getDrivers().iterator();while(itdriv.hasNext() Driver driver = itdriv.next();Iterator itdev = driver.getDevices().iterator();while(itdev.hasNext() String device = itdev.next().getName();String value = String.form

30、at(%s (%s), device, driver.getName();devices.add(value); catch (IOException e) e.printStackTrace();return devices.toArray(new Stringdevices.size();public String getAllDevicesPath() Vector devices = new Vector();/ Parse each driverIterator itdriv;try itdriv = getDrivers().iterator();while(itdriv.hasN

31、ext() Driver driver = itdriv.next();Iterator itdev = driver.getDevices().iterator();while(itdev.hasNext() String device = itdev.next().getAbsolutePath();devices.add(device); catch (IOException e) e.printStackTrace();return devices.toArray(new Stringdevices.size();package android_serialport_api.sampl

32、e;import java.io.File;import java.io.IOException;import java.security.InvalidParameterException;import android.content.SharedPreferences;import android_serialport_api.SerialPort;import android_serialport_api.SerialPortFinder;public class Application extends android.app.Application public SerialPortF

33、inder mSerialPortFinder = new SerialPortFinder();private SerialPort mSerialPort = null;public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException if (mSerialPort = null) /* Read serial port parameters */SharedPreferences sp = getSharedPreferences(android_seria

34、lport_api.sample_preferences, MODE_PRIVATE);String path = sp.getString(DEVICE, );int baudrate = Integer.decode(sp.getString(BAUDRATE, -1);/* Check parameters */if ( (path.length() = 0) | (baudrate = -1) throw new InvalidParameterException();/* Open the serial port */mSerialPort = new SerialPort(new

35、File(/dev/ttySAC1), 9600, 0);mSerialPort = new SerialPort(new File(path), baudrate, 0);return mSerialPort;public void closeSerialPort() if (mSerialPort != null) mSerialPort.close();mSerialPort = null;package android_serialport_api.sample;import java.io.IOException;import android.os.Bundle;import and

36、roid.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class ConsoleActivity extends SerialPortActivity EditText mReception;EditText Emission;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.console);mReception = (EditText) findVi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1