摘要
随着物联网技术的应用在我国越来越普遍。扫地机器人和智能电器无处不在。随着物联网技术的成熟,将导致社会的巨大变革。在当今这个工业经济时代,十分追求生产效率和生产力,智能产品将带来新的服务,并且以此来驱动整个生产过程,新的组织将解决创新问题,这将给整个社会经济带来更好的变化。
与此同时,手机已成为人们的必备品。一些市场研究公司发布了一套数据。数据显示,Android市场占86%,iOS占14%。如果Android手机和物联网设备能够互操作,将大大提高生产效率,提高人们工作和生活的便利性。
本课题是北京农业大学自动化智能车辆子项目,用于对自动化智能车辆采集的数据进行接收、处理和管理。
关键词 物联网,Android,自动化
Research and development of automated
Abstract
With the application of Internet of things technology is more and more common in China. Sweeping robots and smart appliances are everywhere. With the maturity of Internet of things technology, it will lead to great changes in society. In today’s industrial economy era, great pursuit of production efficiency and productivity, intelligent products will bring new services and drive the whole production process, and new organizations will solve the problem of innovation, which will bring better changes to the whole social economy.
At the same time, mobile phones have become a necessity for people. Some market research firms have published a set of figures. Android makes up 86% of the market and ios 14%, according to the data. If Android phones and iot devices can interoperate, it will greatly improve the production efficiency and improve the convenience of people’s work and life.
This project is a sub-project of Beijing agricultural university automatic intelligent vehicle, which is used to receive, process and manage the data collected by automatic intelligent vehicle.
Keywords: the Internet of Things,Android,Automation
目录
1概述 1
1.1选题背景和意义 1
1.2研究现状 1
1.3论文主要工作 1
2 开发环境说明 3
2.1 Android Studio介绍 3
2.2 JDK开发环境介绍 3
2.3 Android特征 3
2.4 lamp开发环境 4
3 需求分析 5
3.1系统开发目标 5
3.2系统需求分析 5
3.3可行性分析 6
4 设计与实现 8
4.1数据传输和指令控制的实现 8
4.1软件概要 9
4.2硬件概要 10
4.4服务器数据库设计 11
4.5服务器php脚本设计 13
4.6自动化小车安卓端登录界面设计 15
4.7自动化小车安卓端注册界面设计 16
4.8自动化小车安卓端数据管理界面设计 17
4.9动化小车安卓端操作记录管理界面设计 18
4.10动化小车安卓端控制界面设计 19
5 软件测试 20
6总结 23
6.1收获和总结 23
6.2展望未来 23
致谢 24
参考文献 25
3 需求分析
3.1系统开发目标
开发出一套完整的数据管理系统,包括安卓客户端,和服务器端。能实现:用户使用安卓客户端方便的操作存在服务器的数据,有一套完整的用户认证登陆的系统,能对数据可视化显示,分析,能对硬件自动化小车进行控制。其中,服务器端要求能良好的接收小车利用网络所传来的数据,能和自动化小车与安卓APP这2者沟通,接受二者的双重操作。
3.2系统需求分析
软件项目通过问题定义、可行性研究进入开发时期,最重要的工作就是需求分析。需求分析对整个软件开发的过程起决定性的作用。需求分析做得不完善,会给后续的开发工作带来大量的困难,造成用户对软件不满,项目工期也因此延长,沟通协调困难,严重的甚至会造成项目开发的失败,用户与软件开发者终止合同。可以说需求分析是做好软件项目的关键所在[[[6]沈鑫,陈华山.关于软件需求分析的理解[J].现代信息科技,2018,2(11):13-14+17.]]。
① 用户需求分析
本软件的是针对从事农业的人员,他们需要用本软件来观察数据,处理数据,这是其核心,所以应该要求软件设计的理念:
操作简便,不能有着复杂界面和操作步骤,应该让人进入软件很快找到需要的功能区,功能应该齐全,但也不能繁琐,使人操作时感到不快。
运行稳定,不能运行时着出现闪退,崩溃等现象,也不能有数据传输的错误,丢失,多余等现象。
让人对数据一目了然,并且流畅的对数据进行操作,这是核心,也因为本软件设计就是用来处理数据的。
② 功能需求分析
由于本课题分为自动化小车安卓端和服务器端,本软件自动化小车安卓端应该研发以下功能:
1)注册账户功能,这是基本功能,用来确认一个用户的身份
2)登录功能,这是认证身份所用,只有注册完成的用户才可进入软件
3)查看数据,用户可以查看小车的数据,通过表格的形式浏览
4)删除数据,用户通过长按数据框对其进行删除
5)视频传输,用户可以通过wifi查看自动化小车的摄像头的视频
6)行走命令,用户可以通过wifi的传输命令控制其前后左右行走
7)拍照命令,用户可以通过wifi的传输命令控制其拍照,所拍的照片
可以上传到服务器
8)传感器开关,用户可以通过wifi的控制自动化小车的穿开启开关,
9)上传操作记录,软件应当对用户的操作进行记录,并且上传到php的
服务器
10)查看操作记录,通过安卓自动化小车的软件端,用户可以通过界
面查看自己的操作纪录。
11)删除操作记录,通过安卓自动化小车的软件端,用户可以通过界
面上长按表格来对自己的自动化小车数据删除。
服务器端有如下功能:
1)验证登录,这是用来验证自动化小车安卓端传来的数据,根据用户名密码的正确与否返回相应结果。
2)注册用户,这是用来向数据库添加用户注册的账号密码
3)查询数据,这是用来查询服务器数据,返回给安卓端
4)删除数据,这是用来接收自动化小车安卓端请求后删除一部分数据
5)查询操作记录,用来收到自动化小车安卓端请求,取数据库查询操作记录表。
6)添加操作记录,这是用来接收自动化小车安卓端请求后向服务器数据库添加一条记录
7)删除操作记录,这是用来接收自动化小车安卓端请求后向服务器数据库删除一条记录
3.3可行性分析
可行性分析中,最为核心的就是对其项目从项目实施 目标、技术方案、过程控制、人力资源、市场 营销、成本利润和风险等各方面进行全方位的论证与评价[[[7]蒲冬梅.软件项目可行性分析评审的要点[J].电子技术与软件工程,2017(24):54-55.]]。
1)技术的可行性
本项目自动化小车安卓端采用java语言,其资料教程十分丰富,服务器端采用php语言,其非常适合快速开发小型服务器。
2)财务可行性
本课题以编写代码为主,硬件不在范围内,由自动化小车项目组提供经费,软件方面无大支出,因此资金上可行。
3)社会可行性
本软件用于农业上的数据收集,其对农业科学发展有建设性作用,且我们作为农科院校,正好可以对其投入应用中。且本软件不涉及政治,宗教,法律,道德等问题。所以对社会的价值主要体现在对科学技术的促进。
4)风险因素以及对策
风险因素主要体现在软件服务器的稳定性,安全性,手机系统的稳定性,安全性。由于是在安卓系统上运行,而安卓是谷歌旗下的操作系统,具有良好的经济支撑,短时间内不会有任何风险;服务器端采用lamp服务器,服务器硬件是腾讯云,其有一定不可靠性,这体现在服务器负荷和国内网络覆盖问题上,由于服务器最大负荷有限,不能承受大量用户同时访问,而且使服务器与自动化小车安卓端链接依靠无线网络,其自动化小车安卓端必须在有网络覆盖的地区。前者的对策是在有需要时换更好的服务器,后者是控制用户群体,使其在中国境内网络信号覆盖区域内使用。
本文转载自:http://www.biyezuopin.vip/onews.asp?id=16528
package cn.com.lttc.loginui;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import net.tsz.afinal.FinalActivity;
import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.annotation.view.ViewInject;
import net.tsz.afinal.http.AjaxCallBack;
import net.tsz.afinal.http.AjaxParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class controlActivity extends FinalActivity implements WheelView.WheelClickListener ,View.OnTouchListener,GestureDetector.OnGestureListener{
int FLING_MIN_VELOCITY=100;//触摸时候的移动速度
@ViewInject(id=R.id.myLayout_id)LinearLayout mylayout;
private GestureDetector mGestureDetector;
@ViewInject(id=R.id.et_cid)
EditText et_cid;
@ViewInject(id=R.id.bt_shoot, click="bn_onClick") Button bn_shoot;
@ViewInject(id=R.id.bt_drive, click="bn_onClick") Button bn_drive;
@ViewInject(id=R.id.bt_photo, click="bn_onClick") Button bn_photo;
@ViewInject(id=R.id.bt_sensor, click="bn_onClick") Button bn_sensor;
private WheelView wheel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_control);
wheel = (WheelView) findViewById(R.id.ctrls);
wheel.setWheelClickListener(this);
mylayout.setOnTouchListener(this);
mylayout.setLongClickable(true);
mGestureDetector = new GestureDetector(this, this);
}
@Override
public void onWheelClick(int type) {
switch (type) {
case WheelView.CLICK_BOTTOM_DOWN:
//下面按钮按下的时候
issue("behind");
break;
case WheelView.CLICK_LEFT_DOWN:
//左边按钮按下的时候
issue("left");
break;
case WheelView.CLICK_RIGHT_DOWN:
//右边按钮按下的时候
issue("right");
break;
case WheelView.CLICK_TOP_DOWN:
//上面按钮按下的时候
issue("front");
break;
case WheelView.CLICK_BOTTOM_UP:
//下面按钮按下抬起的时候
break;
case WheelView.CLICK_LEFT_UP:
//左边按钮按下抬起的时候
break;
case WheelView.CLICK_RIGHT_UP:
//右边按钮按下抬起的时候
break;
case WheelView.CLICK_TOP_UP:
//上面按钮按下抬起的时候
break;
}
}
public void bn_onClick(View view) {
if(et_cid.length()==0){
return ;
}
if( view.getId()==R.id.bt_shoot){
if(bn_shoot.getText().toString().equals("开启视频")){
bn_shoot.setText("关闭视频");
issue("open_shoot");
}else if(bn_shoot.getText().toString().equals("关闭视频")){
bn_shoot.setText("开启视频");
issue("close_shoot");
}
}else if(view.getId()==R.id.bt_drive){
if(bn_drive.getText().toString().equals("自动驾驶")){
bn_drive.setText("关闭自动驾驶");
issue("open_drive");
}else if(bn_drive.getText().toString().equals("关闭自动驾驶")){
bn_drive.setText("自动驾驶");
issue("close_drive");
}
}else if(view.getId()==R.id.bt_photo){
issue("photo");
}else if(view.getId()==R.id.bt_sensor){
if(bn_sensor.getText().toString().equals("开启传感器")){
bn_sensor.setText("关闭传感器");
issue("open_sensor");
}else if(bn_sensor.getText().toString().equals("关闭传感器")){
bn_sensor.setText("开启传感器");
issue("close_sensor");
}
}
}
//按下就触发
@Override
public boolean onDown(MotionEvent e){
//flushData();
return false;
}
//短按触摸屏
@Override
public void onShowPress(MotionEvent e) {}
//点击屏幕后抬起时触发该事件
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//在屏幕上拖动控件
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
//长按触摸屏
@Override
public void onLongPress(MotionEvent e) { }
//滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个 //ACTION_UP触发;参数分别表示:按下事件、抬起事件、x方向移动速度、y方向移动速度。
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final int FLING_MIN_DISTANCE = 100;
if (Math.abs((int) (e1.getX() - e2.getX())) > FLING_MIN_DISTANCE && velocityX > FLING_MIN_VELOCITY) {//右滑跳到控制界面
startActivity(new Intent(controlActivity.this, rememberActivity.class));
finish();
}else if(Math.abs((int) (e1.getX() - e2.getX())) > FLING_MIN_DISTANCE && velocityX < -FLING_MIN_VELOCITY){//左滑跳到记录界面
startActivity(new Intent(controlActivity.this, DisplayActivity.class));
finish();
}
return false;
}
//实现OnTouchListener接口中的方法
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
private String readFile(String path) {
MainActivity.verifyStoragePermissions(this);
File file = new File(path);
//如果path是传递过来的参数,可以做一个非目录的判断
if (file.isDirectory()) {
// Log.d("TestFile", "The File doesn't not exist.1");
}else {
try {
InputStream instream = new FileInputStream(file);
if (instream != null) {
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line=buffreader.readLine();
instream.close();
return line;
}
} catch (java.io.FileNotFoundException e) {
//Log.d("TestFile", "The File doesn't not exist.2");
} catch (IOException e) {
//Log.d("TestFile", e.getMessage());
}
}
return "";
}
public void writeFile(String path,String str){
/*
* 首先安卓下写文件要到sd卡位置是/mnt/sdcard/
* 还要注册权限,在AndroidManifest.xml中
*/
MainActivity.verifyStoragePermissions(this);
try {
File file=new File(path);
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(str.getBytes());
outStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void issue(String order){
if(order.length()==0)
return ;
String cid=et_cid.getText().toString();
FinalHttp fh=new FinalHttp();
String url = MainActivity.selfip+"car/addMyremember.php";
AjaxParams params = new AjaxParams();
params.put("op_time", "now()");
params.put("car_id",cid);
params.put("user_name", readFile("/mnt/sdcard/stateName.txt"));
params.put("operate_name", order);
params.put("__key", "op_time,car_id,user_name,operate_name");
fh.post(url, params,new AjaxCallBack<String>(){
@Override
public void onStart() {
super.onStart();
}
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
}
@Override
public void onSuccess(String t) {
// TODO Auto-generated method stub
super.onSuccess(t);
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
// TODO Auto-generated method stub
super.onFailure(t, errorNo, strMsg);
tu("网络异常");
}
});
}
public void tu(String s){
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}















