资源描述
物联网个人项目报告我们组的物联网大作业是“食享”APP,它是一款基于位置的轻量级美食分享交流应用。在项目中我主要负责Android端后台开发,以及小组报告的撰写。 1绪论1.1课题研究背景本小组从物联网的定义出发,觉得从全球定位系统这个点出发,相对于我们的整体水平,更容易实现。随着全球经济的飞速发展,传统的商务模式已经不能满足企业生存发展的需要.于是电子商务这一新兴产业便应运而生。从近几年电子商务的发展速度和规模来看,足以显示其带来的巨大的商业价值。互联网和宽带上网的普及使电子商务在中国异军突起,并日益渗透到人们的日常生活中。电子商务是运用现代通信技术、计算机和网络技术进行的一种社会经济形态,其目的是通过降低社会经营成本、提高社会生产效率、优化社会资源配置,从而实现社会财富的最大化利用。电子商务按照经济活动的类别可分为两大类别:第一,企业间的电子商务,即企业与企业之间,通过网络进行产品或服务的经营活动“第二企业与消费者之间的电子商务,即企业通过网络为消费者提供一个产品或者服务的经营活动。本课题所研究的美食网站主要是为个人消费者提供产品和服务等,从事的是第二类电子商务活动。1.2课题主要内容注册与登陆界面;美食拍照与定位;地图显示与分享位置;用户聊天与互动(美食微博);(互动包括:聊天,关注,点赞,评论等)用户个性化添加标签;1.3主要内容介绍美食分享软件系统包括了一般用户、系统管理员两种用户,根据其不同的角色对系统有不同的需求。1.3.1 一般用户需求 一般用户可以通过安装在Android系统上的应用程序来访问美食分享软件。在手机端,用户可以注册或者登录系统,登录之后能够进行搜索美食,查看美食,收藏美食,上传美食等操作。这些功能已经全部实现了。1.3.2 管理员需求 当管理员登录美食分享系统时,可以对整个系统进行管理,包括添加美食种类,删除美食种类,更改每日推荐等等。这些功能都已经实现,而且直接登录数据库图形化管理工具Navicat,操作数据库更为方便。性能方面,就下面数据精确度几个指标进行展开:我们的系统能够做到:用户在进行美食搜索时要保证查全率、查准率,所有符合条件的美食都能被找到,这达到了预期的目标。1.3.3 时间特性 1. 打开一个新的链接的时间不能超过3秒。2. 系统处理美食搜索操作响应时间不能超过10秒。3. 我们的系统,打开一个新链接需要时间不到1秒,在毫秒的量级; 4. 进行美食搜索操作同样也不到1秒,当然,这与我们的数据库里能够搜索的内容偏少有关。(2)适应性 本软件系统应能在Android 2.2及其以上手机操作系统上良好运行,Web端应能使用IE6.0以上内核的浏览器,Chrome浏览器,FireFox浏览器进行访问,完全达到预期目标。(3)安全性我们的系统具有一定程度的权限管理,逻辑分析以及检测数据完整性功能,各个功能模块需要相应的权限才能访问。例如:非注册用户(游客)只具备浏览美食,搜索美食的权限,只有登录用户才可以对美食进行收藏、上传等操作。这一部分在Web端和Android端已经实现,但是还有一些本地验证等还需要进一步的完善。(4)可靠性只要服务器不宕机(充当服务器的PC不关机),系统可以保证一直正常运行。2模块搭建2.4.2 系统主要功能接口设计众所周知,接口是提供给其他模块或者系统使用的一种约定或者规范。因此接口必须要保证足够的稳定性和易用性。这是设计接口的基本要求。在Android端,各个Activity模块之间的数据交互主要是利用Bundle类对数据进行封装,然后通过Intent机制在各个模块之间进行传输。Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。要在不同的activity之间传递数据,就要在intent中包含相应的内容,一般来说数据中最基本的应该包括: Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK- reference中的Android.content.intent类,里面的constants中定义了所有的action。 Data: 要事实的具体的数据,一般由一个Uri变量来表示。 Category:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。 Type:显式指定Intent的数据类型(MIME)(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)。2.4.3 登录模块 (1)请求消息接口含义:客户端通过socket请求提交用户信息进行验证接口协议:TCP/IP协议命令字:dout.writeUTF参数描述约束uid系统给用户分配的id必须是注册成功的idpwd密码必须是对应的密码(2)接收消息接口含义:客户端接收来自服务器端发来的消息接口协议:TCP/IP协议命令字:din.writeUTF参数描述约束uid系统给用户分配的id必须是注册成功的idpwd密码必须是对应的密码这部分的核心代码实现如下:2.4.4 注册模块(1) 请求消息接口含义:客户端通过socket请求提交用户信息进行注册接口协议:TCP/IP协议命令字:dout.writeUTF参数描述约束u_name用户名不能为空u_pwd1密码两次密码输入一致u_qqQQ数字u_Email邮箱地址不能为空u_dis个人描述无(2) 接收消息接口含义:客户端接收来自服务器端发来的消息接口协议:TCP/IP协议命令字:din.writeUTF参数描述约束uid系统给用户分配的id必须是注册成功的idu_name用户名提交的用户名这部分的核心代码实现如下:2.4.5 拍照模块这一部分调用了手机上的相机api,同时将得到的照片提交到上传模块中,与其他内容一起提交到服务器中。拍照的API函数:myCamera.takePicture调用的过程:返回数据:接口含义:拍照模块向上传模块发送图片数据接口协议:TCP/IP协议命令字:onPictureTaken参数描述约束data图片二进制数据无主要实现代码:2.4.6 地图模块这一部分调用了Google地图的API,同时将得到的照片提交到上传模块中,与其他内容一起提交到服务器中。调用的Google地图API包括以下几个方面:返回数据:接口含义:地图模块向上传模块发送图片数据接口协议:TCP/IP协议命令字:setResult参数描述约束RESULT_OK标识符无lat经度浮点数lon纬度浮点数主要实现代码:其他模块的接口设计与上述几个模块的接口设计类似,在这不再赘述。2.5 系统的设计模式应用2.5.1 MVC设计模式MVC全名是Model View Controller,是模型(model)视图(view)控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC结构如图2-5所示:图2-5 MVC结构图2.5.2 抽象工厂模式下面是系统封装的抽象工厂描述性说明(1) 创建抽象工厂类public class BeanFactory(2) 保存相关对象保存Service相关对象private Map serviceMap = new HashMap();保存Dao相关对象private Map daoMap = new HashMap();(3) 返回相关对象实例return serviceMap.get(c.getName();return daoMap.get(c.getName();(4) 将创建好多的对象放到Map中serviceMap.put(c.getName(), service); daoMap.put(c.getName(), dao);(5) 返回系列产品return service; return dao;抽象工厂模式示意图如图2-6所示。图2-62.5.3 Filter统一控制本系统采用Filter技术面向切面编程,实现了统一处理字符集;简单的webCache,统一控制缓存;只有经过登录页面登陆成功才能进入其他页面。体现了一个责任链模式,提供了一种声明式服务,具有可插拔的能力。采用Filter技术对Request和Response请求进行了拦截,这对系统后期的完善,权限的分配,病毒的拦截有至关重要的作用。采用Filter技术主要是调用下面的方法public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) /完成相关的控制语句chain.doFilter(request, response);通过本系统中的用户维护说明Filter的基本原理如图2-7所示。图2-7 Filter统一控制流程图2.6系统的AOP 设计应用面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming)。声明式编程是和命令式编程(Imperative Programming)相对的概念。我们平时使用的编程语言,比如C+、Java、Ruby、Python等,都属命令式编程。命令式编程的意思是, 程序员需要一步步写清楚程序需要如何做什么(How to do What)。声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么(Where to do What)。比起命令式编程来,声明式编程是在一个更高的层次上编程。声明式编程语言是更高级的语言。声明式编程通常处理一些总结性、总览性的工作,不适 合做顺序相关的细节相关的底层工作。本系统中能用到AOP的地方:1.统一字符编码处理2.打印出所有业务类的工作流程日志3.所有关键业务方法都加上事务管理功能2.7系统的非功能设计(如性能、安全性等)这一部分已经在第一节阐述,这里不再赘述。2.8系统的数据库设计本系统中的信息表主要有10张表:头像表、用户信息表、美食种类表、美食信息表、每日推荐表、我的收藏表、广告表、广告图片表和最大编号表。他们之间的关系可以用图2-8来表示。图 2-8 数据库设计图部分数据库建表语句如下:create database mstx;use mstx;CREATE TABLE mstx_user(/*用户信息表*/uidintNOT NULL,u_namechar(50)NOT NULL,u_qqvarchar(15),u_pwdvarchar(50),u_Emailvarchar(50),u_headint,u_adminboolean NOT NULL,u_moodvarchar(50),u_integralint,u_hobbyvarchar(50),u_levelint,u_numberint,PRIMARY KEY(uid),FOREIGN KEY(u_head) REFERENCES mstx_head(tid);FOREIGN KEY(gid) REFERENCES mstx_ads(gid);CREATE TABLE mstx_info(/*美食信息表*/mid int NOT NULL,info_titlechar(50)NOT NULL,info_distext,info_lonfloat(17,14),info_latfloat(17,14),info_sortint,info_pricedouble,info_timeTIMESTAMP,uidint,hotel_namechar(50),PRIMARY KEY(mid),FOREIGN KEY(uid) REFERENCES mstx_user(uid),FOREIGN KEY(info_sort) REFERENCES mstx_sort(sid);其他表格设计类似,不再赘述。2.9Ui界面我们的ui界面秉承着清新的风格开发出来的。整个软件界面使用一个线性布局,让所有的元素从屏幕上方向下填充,并给整个线性布局进行权重划分。线性布局的最上方是一个TextView,显示当前城市的名字,接着是一个线性布局,布局的左上方是三个TextView,分别显示拍照等功能,通过点击相应的TextView,下方的一个线性布局展现不同的功能。功能面板文字的下方是一个大的线性布局,用来显示未来三天的天气情况。在这个大的线性布局中,又含有三个小的线性布局,这三个小线性布局中包含了各种button等(这些控件从上到下垂直居中显示)。通过给整个XML文件中LinearLayout布局的的子级布局添加权重,让各个部分从上到下有序的显示,让功能面板位于屏幕下方显示,以匹配不同尺寸屏幕,让软件的显示效果更好。软件的整体布局风格是清新,优美,大方。 2.10功能设计功能上实现实时的获取天气信息,获取百度api返回数据,解析百度api返回的json数据,根据解析到的数据绘制气温趋势图,并将数据反馈到app上的相应的区域。通过使用ViewPager类,来实现天气预报软件中多个城市间的无缝页面切换。由于组员都缺少JAVA开发经验,对安卓开发也不熟悉,所以我们决定采用调用API的方法来实时获取不同城市的天气预报数据,在这次项目中我们将采用百度的车载API。通过HttpClient类和AsyncTask异步类来获取网络数据。最后通过Gson类来解析获取的网络数据,并给页面中的所有的布局空间设置id,在AsyncTask得到网络数据之后将这些数据同步到软件界面上,呈现给用户。后台是由食享的后端云采用网络上流行的Bmob后端云平台,其提供一定容量的免费服务器资源,和一系列安卓和苹果API以供初级开发者使用。我们可以在Bmob网页端注册账号生成免费的云应用,将云应用的密钥结合在android studio工程内导入相关API包搭建食享和Bmob后端云的通信。通过在工程内创建用于文件传输的类,可以通过该类实现在不同界面对数据的上传和后端云数据调取。我们的APP前期向后端云上传的数据包括照片拍摄日期和时间,照片上传时的地理位置,以及照片文件。Bmob后端云提供了丰富的数据类型和云逻辑,以地理位置为例,其提供了名为BmobGeoPoint的数据类型,其内容为double类型的的经纬度,该数据类型还有确定一定范围内表中其他item 的的方法,还有计算两个item之间距离的方法、计算两个item之间角度的方法等。通过后端云的强大的逻辑功能我们可以方便得实现展现该用户方圆一公里之内一定时间段之内上传的照片。除了目前实现的功能,后端云还提供了用户注册,消息推送,移动支付等API,这为我们后期丰富食享产品功能提供了方便。Bmob目前已经支持Android6.0,免费版支持每月最高300万次请求和50万行表单,满足目前应用的负载。3课程感悟1. 我们团队在开发过程中,虽然经常联系,但是并没有很好地进行技术交流,特别是前期搭建Android开发环境,配置Apache服务器阶段,软件版本的不一致,出现各种不兼容的情况,导致了开发进度的延缓。2. 模块化的思想很重要,每个人完成各部分内容,然后向其他人提供自己的接口,能够很大程度上提高效率,这也是我们开发过程所遵循的原则。3. 在进度计划上,由于每个人都自己的事情,我们安排得稍显仓促,实际的开发工作在短短一个月时间内完成(原计划是一个半月),这也导致了我们系统部分功能没有实现,引以为鉴。
展开阅读全文