




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录前言 [13]进行系统的设计,系统中的数据集中存储在服务器端,服务器采用MySQL数据库负责数据存取以及相应的业务处理工作,并为客户端提供对应的接口返回JSON数据。移动客户端实现系统的各个功能模块,包括用户交互UI设计,应用逻辑设计,访问服务器数据存取解析等操作,实现用户注册登陆、GPS定位以及周边环境噪声监测等功能,最后利用奖励机制提高用户主动参与活动的积极性。客户端利用http协议访问服务器。4.2移动客户端设计移动客户端是应用开发的关键部分,如何开发一款移动应用取决于使用的目标群体,我们需要站在用户的角度去考虑关注的要点。应用设计中,我们通常以高内聚低耦合作为划分模块的准则,低耦合使得代码在后期更易于修改和维护,高内聚则意在模块之间关系要清晰明了,这使得代码在运行时更加安全。另外在完成模块设计和功能实现的同时,我们还要考虑良好的用户交互体验。移动客户端的核心架构图如图4.1所示:图4.1移动客户端核心架构图4.1中,移动客户端被分成多个层次:用户交互层、应用层、数据存储层、本地数据持久层、网络交互层,每一层都有其本职工作并为上层提供服务。1、用户交互层:该层主要负责完成用户交互UI界面的设计,点击事件的接受和响应。2、应用层:该层涵盖了移动客户端的各个模块功能:(1)登陆\注册模块:主要负责用户的注册、登陆、密码找回等功能。(2)业务逻辑模块:负责完成移动客户端主要辅助功能的实现,包括百度地图API接口实现、定位功能、噪声监测和数值转换功能实现。(3)网络编程模块:由于本次设计使用了xUtils3开发框架,该开发框架的网络模块大大方便了在实际开发中的网络模块的开发。(4)传感器模块:主要负责处理移动设备传感器检测收集的感知数据,如GPS定位信息、噪声监测信息等。3、数据存取层:数据存取层主要负责对本地数据的存取,包括读取用户登陆、注册信息,对定位位置信息、噪声监测数值等进行存取操作。4、本地数据持久层:该层主要负责本地数据的持久化存储,分为硬盘持久化存储和内存持久化存储。5、网络交互层:该层负责完成移动客户端通过网络请求访问服务器端的API接口,接受和响应网络数据。对服务器响应的json数据通过Gson进行解析获得我们需要的数据。4.3服务器端设计4.3.1服务器端概要设计服务器端主要负责实现后台业务逻辑和系统的数据存储操作,并为客户端提供接口服务。服务器端核心架构图如图4.2所示:图4.2服务器端核心架构图如图4.2所示:服务器端分成了3个部分,业务逻辑层根据对应的业务请求进行服务器的访问,交互接口层则是对业务逻辑层分别进行封装后为客户端提供对应的API接口服务。业务逻辑层根据具体的业务模块分为:用户登陆\注册模块、定位信息存取模块、噪声监测值存取模块等服务器功能以及其与数据库的交互。4.3.2数据库设计本节简单介绍了服务器端数据库中重要的表结构(1)用户表loginuser字段类型说明Idint(10)用户标志,主键,自增user_loginnamevarchar(20)用户名user_nicknamevarchar(40)用户昵称user_pwdvarchar(20)用户密码user_avatarurlvarchar(40)用户头像urluser_gendervarchar(20)用户性别user_telvarchar(40)用户联系方式user_participationdecimal(10)用户参与度user_rankint(20)用户分数值user_createtimevarchar(255)用户注册时间(2)噪声定位数值表positioninfo字段类型说明Idint(10)信息标识,主键,自增user_loginnamevarchar(20)用户名noise_valuevarchar(255)噪声值LatitudeDouble定位经度LongitudeDouble定位纬度4.3.3Ngrok内网映射一款应用的各类数据是存储在公共服务器上,为了给任意用户提供数据存取服务,服务器需要对外开放给用户进行访问,所以在这里使用到了Ngrok内网映射服务。Ngrok是当下非常流行的一项反向代理服务,用于进行内网穿透,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。这样我们就可以将本地的Web服务器部署在外网上供所有用户进行使用和调试等操作,本服务支持80端口以及自定义tcp端口转发等。4.4客户端与服务器端交互设计本章的前三节中介绍了本系统的整体架构,并对客户端和服务器端进行了详细设计。客户端方面进行了详细设计,包括UI设计和交互页面设计等。客户端访问服务器是通过网络请求模块进行连接,本次设计中使用了xUtils3开发框架,大大方便了在应用设计中网络模块的开发。客户端通过xUtils3集成的http网络传输协议,主要是以get的方式为主。客户端根据对应的业务需求,利用http协议发送Resquest请求给后台服务器,服务器接收到请求后处理业务,同时根据请求的要求返回一个JSON格式的响应数据给客户端,客户端接收到这个响应数据后,通过GSON工具对JSON数据进行解析成为可识别的数据格式,并反馈给用户。4.5本章小结本章的主要工作为:1、考虑采用C/S架构对系统进行整体的架构设计。2、完成客户端架构设计和客户端交互界面的设计。3、完成服务器端架构设计,设计服务器端数据库,将服务器部署在公网上供用户使用。4、采用http网络传输协议实现客户端与服务器端的交互。
第五章系统实现本章在完成前文所述功能设计的基础上,完成了模块功能的具体实现,包括客户端的核心功能实现、服务器端核心API实现以及服务器架设方式的介绍。5.1客户端核心模块的实现5.1.1噪声监测定位服务移动客户端的噪声监测定位服务主要集中在百度地图上进行实现,如图5.1、5.2分别是定位服务和噪声分布定位和监测图。图5.1定位服务图图5.2噪声分布定位和监测图为了实现如图5.1和5.2所示的信息,需要实现以下几点要求:1、在系统中使用百度地图SDK。(1)申请密钥如果想要使用百度地图SDK,先向百度官方申请开发者密钥。如图5.3所示:图5.3百度地图密钥申请(2)下载相关SDK如图5.4所示,根据系统所需要使用到的功能选择所要下载的安装包。图5.4百度地图开发资源(3)环境配置将安装包导入到AndroidStudio的libs包中如图5.5所示。图5.5libs包中文件(4)在项目的AndroidManifest.xml中的application中添加开发密钥和默认服务。
android:value="1j7P7Z42qw1657zL10QZibgy1rnW6Yso"
/>
(5)添加项目中所需要的权限,以下为定位相关权限。<!—精确定位权限
-->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>
<!—网络定位权限-->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2、在布局文件中添加地图控件。<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
3、定位服务中,为了在地图上直观的显示出定位信息,需要在定位位置添加相应的覆盖物。ll用于存放自己的经纬度坐标用于添加覆盖物等操作。option对象是覆盖物选型对象,用于设置覆盖物的各种属性。在定位操作结束后,将isFirstLocate设置为false。
//用于存放经纬度,即自己的坐标
LatLng
ll
=
new
LatLng(location.getLatitude(),
location.getLongitude());
/*用于获取定位经纬度*/
/*在自己的位置添加覆盖物,用于显示监测噪声位置等信息*/
BitmapDescriptor
bitmap
=
BitmapDescriptorFactory.fromResource(R.drawable.location);
OverlayOptions
option
=
new
MarkerOptions()
.position(ll)
.icon(bitmap)
.zIndex(12)
.draggable(true);
baiduMap.addOverlay(option);
MapStatusUpdate
update
=
MapStatusUpdateFactory.newLatLng(ll);
//将覆盖物设为中心点显示
baiduMap.animateMapStatus(update);
4、本次设计中,噪声监测功能是通过手机的声音传感器来实现的,将麦克风收集到的周边声音通过对应的转化算法转化为分贝值,用于判定周围声音强度。AudioRecord类中通过方法getNoiseLevel()方法对声音进行了收集和数值转化,转化后的数值进行返回用于存取。
/*计算噪声分贝值*/
public
int
getNoiseLevel(){
mAudioRecord
=
new
android.media.AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT,
BUFFER_SIZE);
if(mAudioRecord
==
null){
Log.e("sound","mAudioRecord初始化失败");
}
mAudioRecord.startRecording();
short[]
buffer
=
new
short[BUFFER_SIZE];
int
r
=
mAudioRecord.read(buffer,0,BUFFER_SIZE);
long
v
=
0;
for(int
i=0;i<buffer.length;i++){
v+=buffer[i]*buffer[i];
}
double
mean
=
v/(double)r;
double
volumn
=
10
*
Math.log10(mean);
ivolumn
=
(int)
Math.abs(volumn);
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord
=
null;
return
ivolumn;
}
}
5、为了给用户更直观的查看到周边环境的噪声强度,选择直接将服务器中的数据以定位标志的形式显示在百度地图上供用户进行预览,用户只需要点击覆盖物,即可显示点击位置的噪声值。(1)从服务器上获取所有已知噪声数值以及定位的数据,将其以覆盖物的形式显示在百度地图上。Marker作用是添加自定义标识,同时可以为marker添加点击事件。bundle.putSerializable()自定义bundle传递序列化对象数据,当噪声值传递给点击事件后弹出的布局中。
for(JsonElement
l:jsonArray)
{
VoiceBean
valueBean
=
gson.fromJson(l,
VoiceBean.class);
OverlayOptions
options;
latLng
=
new
LatLng(Double.valueOf(valueBean.getLotitude()),
Double.valueOf(valueBean.getLongitude()));
options
=
new
MarkerOptions()
.position(latLng)
.icon(bitmap)
.zIndex(9)
.draggable(true);
marker
=
(Marker)baiduMap.addOverlay(options);
Bundle
bundle
=
new
Bundle();
bundle.putSerializable("info",valueBean.getNoise()+"db");
marker.setExtraInfo(bundle);
}
initMarkerClickEvent();
(2)为自定义marker添加点击事件,点击标识后弹出布局显示当前定位的噪声分贝值。location是新建的TextView布局,用于存放噪声值。InfoWindow方法是百度地图提供的创建自定义View方法,参数分别给自定义布局对象,对象位置和y轴方向上的偏移量。private
void
initMarkerClickEvent(){
baiduMap.setOnMarkerClickListener(new
BaiduMap.OnMarkerClickListener()
{
@Override
public
boolean
onMarkerClick(Marker
marker)
{
String
info
=
(String)marker.getExtraInfo().get("info");
InfoWindow
mInfoWindow;
TextView
location
=
new
TextView(getApplicationContext());
location.setBackgroundResource(R.drawable.background);
location.setPadding(30,
20,
30,
50);
location.setText("分贝值为:"+info);
location.setTextColor(Color.parseColor("#000000"));
final
LatLng
ll
=
marker.getPosition();
Point
p
=
baiduMap.getProjection().toScreenLocation(ll);
LatLng
llInfo
=
baiduMap.getProjection().fromScreenLocation(p);
mInfoWindow
=
new
InfoWindow(location,llInfo,0);
baiduMap.showInfoWindow(mInfoWindow);
Toast.makeText(getApplicationContext(),
info,
Toast.LENGTH_SHORT).show();
return
false;
}
});
}
5.1.2移动客户端网络编程本次设计中,客户端的网络编程是使用xUtils3开源框架来进行实现的。xUtils3中拥有HttpUtils网络模块,具有更全面的http请求协议支持,大致包括了GET请求、POST请求、如何使用其他请求方式、上传文件、下载文件、使用缓存等功能。下面是针对为用户提供服务器噪声定位数据,使用xUtils3框架实现的网络交互:private
void
getvalue(){
RequestParams
params
=
new
RequestParams(
"http://campus.free.ngrok.cc/Service/servlet/GetValue");
x.http().get(params,
new
Callback.CacheCallback<String>()
{…}通过http网络请求,请求方式是为get方式,返回的数据json数据,由于服务器端返回的是jsonArray数据格式,所以定义VoiceBean对象类进行json数据的解析,解析方式则是通过Google提供的用于解析json的一个开源框架Gson。5.1.3移动客户端主界面逻辑移动客户端的主要功能界面是用FragmentTabHost实现的选项卡菜单界面,分别为Hotspot、Auxiliary和PersonalInfo3个选项界面。FragmentTabHost替代了TabHost的类,TabHost在4.3.0版本后被废弃了。(1)首先,我们在activity_homepage.xml布局文件中放置一个FragmentTabHost布局:<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
(2)我们还需要设计一个选项卡菜单布局文件为tab_item_view.xml:(3)最后构建主活动界面,在构建之前要实例化TabHost声明了mFragmentArray、mImageArray、mTextArray三个对象,分别是活动界面、选项卡图标和选项卡名称,initView()方法构建FragmentTabHost选项卡。
private
Class
mFragmentArray[]
=
{Hotspot.class,
Auxiliary.class,
PersonalInfo.class};
private
int
mImageArray[]
=
{R.drawable.tab_hotspot,R.drawable.tab_auxiliary,R.drawable.tab_personal_info};
private
String
mTextArray[]
=
{"校园热点","辅助功能","我的信息"};
通过for循环依次将选项卡插入到布局中,设置图标和文字。for(int
i=0;i<count;i++){
TabHost.TabSpec
tabSpec
=
mTabHost.newTabSpec(mTextArray[i]).setIndicator(getTabItemView(i));
mTabHost.addTab(tabSpec,mFragmentArray[i],bundle);
mTabHost.getTabWidget().getChildAt(i)
.setBackgroundResource(R.drawable.background);
}
5.1.4移动客户端活动跳转在Android中进行页面跳转主要使用Intent实现活动的显示跳转,它不仅指明了当前组件想要执行的动作,还可以在不同组件之间进行数据传递。在本文中大部分的活动跳转都使用Intent进行,下面就是使用Intent进行活动跳转同时进行数据传递:
if
(loginBean.getFlag().equals("0"))
{
Intent
school_intent
=
new
Intent(MainActivity.this,
HomePageActivity.class);
/*用于将用户名参数传递给后面的活动*/
school_intent.putExtra("username",transfor);
startActivity(school_intent);
}
以上是登陆界面的活动跳转,登陆成功后,界面跳转到主活动界面,通过putExtra方法的重载,我们可以将用户名信息传递给主活动界面,当主活动页面启动后,我们就可以通过getStringExtra方法从Intent中取出数据,用于在标题位置注明用户如下所示:private
String
getUsername(){
toolbar
=
(Toolbar)
findViewById(R.id.homepage_toolbar);
Intent
intent
=
getIntent();
String
str
=
intent.getStringExtra("username");
return
str;
}
5.2服务器端的实现5.2.1基本说明本文中,服务器是以自己的计算机作为服务器,数据库则是采用的MySQL关系型数据库,服务器是使用MyEclipse开发工具中集成的Tomcat搭建服务器,使用的是Java语言,用MyEclipse为客户端建立servlet。为了给更多的用户群体移动访问服务器,通过Ngrok反向代理服务进行内网穿透,将服务器部署在公网便于测试和使用。5.2.2服务器核心API接口噪声定位显示用户想要直观的查看噪声定位分布以及噪声数值,需要访问服务器获取服务器上的所有数据,此时通过http请求访问服务器,服务器从数据库中获取到所有数据以后返回一个jsonarray数据给客户端。public
void
doPost(HttpServletRequest
request,
HttpServletResponse
response)
throws
ServletException,
IOException
{
PrintWriter
out
=
response.getWriter();
Connection
con
=
null;
PreparedStatement
ps
=
null;
ResultSet
rs
=
null;
String
sql
=
null;
JSONArray
jsonarray
=
new
JSONArray();
JSONObject
jsonobj
=
new
JSONObject();
con
=
DbConn.getConn();
try
{
sql
=
"select
*
from
positioninfo";
ps
=
con.prepareStatement(sql);
rs
=
ps.executeQuery();
while(rs.next()){
jsonobj.put("ID",
rs.getInt("id"));
jsonobj.put("user",
rs.getString("user_loginname"));
jsonobj.put("noise",
rs.getString("noise_value"));
jsonobj.put("lotitude",
rs.getString("lotitude"));
jsonobj.put("longitude",
rs.getString("longitude"));
System.out.println(jsonobj.toString());
jsonarray.add(jsonobj);
}
out
=
response.getWriter();
out.println(jsonarray);
}
catch
(Exception
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
finally
{
try
{
if(rs
!=
null){
rs.close();
}
if(ps
!=
null){
ps.close();
}
if(con
!=
null){
con.close();
}
}
catch
(SQLException
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
}
out.flush();
out.close();
}
用户登陆客户在使用客户端程序时,需要进行用户登陆操作,登陆时需要提供对应的用户名密码参数,服务器接收到参数后与数据库进行匹配操作,操作完成后返回json格式的响应数据,其中“flag”值为0时,密码正确,“flag”值为1时,密码错误,“flag”值为2时,用户不存在。public
void
doPost(HttpServletRequest
request,
HttpServletResponse
response)
throws
ServletException,
IOException
{
PrintWriter
out
=
response.getWriter();
Connection
con
=
null;
PreparedStatement
ps
=
null;
ResultSet
rs1
=
null;
ResultSet
rs2
=
null;
String
sql
=
null;
String
username
=
request.getParameter("username");
String
password
=
request.getParameter("password");
con
=
DbConn.getConn();
try
{
sql
=
"select
count(id)
from
loginuser
where
user_loginname
=
?";
ps
=
con.prepareStatement(sql);
ps.setString(1,
username);
rs1
=
ps.executeQuery();
while(rs1.next()){
int
count
=
rs1.getInt(1);
if(count
>
0){
sql
=
"select
user_pwd
from
loginuser
where
user_loginname
=
?";
ps
=
con.prepareStatement(sql);
ps.setString(1,
username);
rs2
=
ps.executeQuery();
while(rs2.next()){
String
pwd
=
rs2.getString(1);
if(pwd.equals(password)){
out.write("{\"flag\":\"0\"}");
//密码正确
}
else
{
out.write("{\"flag\":\"1\"}");
//密码错误
}
}
}
else
{
out.write("{\"flag\":\"2\"}");
//用户不存在
}
}
}
catch
(SQLException
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
finally
{
try
{
if(rs2
!=
null){
rs2.close();
}
if(rs1
!=
null){
rs1.close();
}
if(ps
!=
null){
ps.close();
}
if(con
!=
null){
con.close();
}
}
catch
(SQLException
e)
{
//
TODO
Auto-generated
catch
block
e.printStackTrace();
}
}
out.flush();
out.close();
}
5.3Ngrok内网穿透5.3.1基本说明Ngrok是当下非常流行的一项反向代理服务,用于进行内网穿透,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。这样我们就可以将本地的Web服务器部署在外网上供所有用户进行使用和调试等操作,本服务支持80端口以及自定义tcp端口转发等。5.3.2使用方法(1)在ngrok官网申请一个账号,并登陆。(2)点击隧道管理,进行开通隧道。(3)购买免费版本的。(4)依次填入各项信息,注意本地端口要和tomcat的web项目的http访问端口对应,如图5.6。图5.6购买隧道(5)添加成功后,就可以在管理界面查看对应的隧道信息,如图5.7所示,复制隧道ID。5.7隧道管理(6)下载Ngrok工具后启动,如图5.8所示,填入隧道id后回车即可成功开启。5.8启动Ngrok工具(7)最后启动Tomcat上的服务器,就可以访问服务器进行交互。5.4本章小结本章介绍了移动客户端核心模块的具体实现方法和服务器搭建方式,简单介绍了服务器核心API的实现,最后讲解了ngrok的使用方式。
第六章总结和展望6.1本文总结本文在着手应用设计之前,做了充分的调查与研究。在对社区应用发展背景进行了解后,对群智感知技术、奖励机制以及Android开发技术进行了深入研究,从而完成了系统的设计。经过需求分析、功能设计以及架构设计后,实现了系统模块功能。本文首先介绍了Android移动应用开发特点,包括Android的4层平台架构、Android开发的优势。同时介绍了本文中涉及到的Android开源框架xUtils3,列举了它的主要功能与特性,简单分析了Android多种开发应用模式的之间的区别。此外,本文着重分析了群智感知技术的数据采集方式,比较了机会感知和参与式感知的不同之处,提出使用奖励机制来提高用户参与任务的积极性。然后,本文对系统应用进行了需求分析,包括用户群体和应用环境分析,并在此基础上完成了应用的主要功能设计。此外,还在设计中引入了奖励机制模型的设计,系统功能更加完善。紧接着,本文对系统做了较为详细的研究与设计,完成了系统的架构设计,包括客户端和服务器端的设计,同时还介绍了服务器端的Ngrok内网映射技术。对客户端和服务器端交互设计也做了简单的介绍。最后,本文详细地介绍了系统功能模块的实现方法,包括客户端主要功能的实现方法和前提要素、服务器端的搭建和API接口实现以及Ngrok内外映射的使用方法。从课题研究到系统设计再到模块实现,具有较强的创新与实践意义。6.2未来工作展望随着移动应用开发技术的飞速发展,用户的需求也逐渐变得多样化。移动应用也要在原有的基础上不断开拓创新,多次开发来满足广大用户的要求,在提供良好的用户体验前提下,提供更加智能、优质的服务。由于作者技术学识浅薄,本文仍然有许多的改进之处。例如本文原计划将噪声采集环境定于室内例如图书馆等地。由于技术的限制,将噪声采集范围定在了百度地图上的某一点,用户只能将自身所处的位置的噪声进行采集上传,由于环境是处在校园中,校园作为学习交流场所,本身不会存在大量的噪声因素,所以存在着上传数据差距不明显,不具代表性等因素。另外,本文虽然创新性的引入了奖励机制来提高用户积极性,但是并没有对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水渠改移施工方案
- 砖烟囱施工方案
- 中介招聘合同范例
- 农户养殖加工合同范例
- 肺癌患者放疗护理
- 企业愿景与品牌战略的结合计划
- 冷库承建合同范例
- 积极心态在工作生活中的重要性计划
- 小班科学探究精神的培养活动计划
- 博物馆展品安全管理措施计划
- 中华英才网行测
- 《铁路轨道维护》课件-起道作业
- WS 308-2019 医疗机构消防安全管理
- (高鸿业)微观经济学习题解析+微观经济学题库解析
- 《尿11-脱氢血栓烷B2与其他危险因素的交互效应在急性冠脉综合征患者中的研究》
- 咨询公司项目风险控制方案
- 校园食品安全培训课件
- 开关柜更换改造施工方案
- 《眼科常用眼药及护》课件
- 污水处理厂防水防腐工程施工方案
- 幕墙作业安全技术交底
评论
0/150
提交评论