




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
目錄前言 [13]進行系統(tǒng)的設(shè)計,系統(tǒng)中的數(shù)據(jù)集中存儲在服務(wù)器端,服務(wù)器采用MySQL數(shù)據(jù)庫負責(zé)數(shù)據(jù)存取以及相應(yīng)的業(yè)務(wù)處理工作,并為客戶端提供對應(yīng)的接口返回JSON數(shù)據(jù)。移動客戶端實現(xiàn)系統(tǒng)的各個功能模塊,包括用戶交互UI設(shè)計,應(yīng)用邏輯設(shè)計,訪問服務(wù)器數(shù)據(jù)存取解析等操作,實現(xiàn)用戶注冊登陸、GPS定位以及周邊環(huán)境噪聲監(jiān)測等功能,最后利用獎勵機制提高用戶主動參與活動的積極性??蛻舳死胔ttp協(xié)議訪問服務(wù)器。4.2移動客戶端設(shè)計移動客戶端是應(yīng)用開發(fā)的關(guān)鍵部分,如何開發(fā)一款移動應(yīng)用取決于使用的目標(biāo)群體,我們需要站在用戶的角度去考慮關(guān)注的要點。應(yīng)用設(shè)計中,我們通常以高內(nèi)聚低耦合作為劃分模塊的準(zhǔn)則,低耦合使得代碼在后期更易于修改和維護,高內(nèi)聚則意在模塊之間關(guān)系要清晰明了,這使得代碼在運行時更加安全。另外在完成模塊設(shè)計和功能實現(xiàn)的同時,我們還要考慮良好的用戶交互體驗。移動客戶端的核心架構(gòu)圖如圖4.1所示:圖4.1移動客戶端核心架構(gòu)圖4.1中,移動客戶端被分成多個層次:用戶交互層、應(yīng)用層、數(shù)據(jù)存儲層、本地數(shù)據(jù)持久層、網(wǎng)絡(luò)交互層,每一層都有其本職工作并為上層提供服務(wù)。1、用戶交互層:該層主要負責(zé)完成用戶交互UI界面的設(shè)計,點擊事件的接受和響應(yīng)。2、應(yīng)用層:該層涵蓋了移動客戶端的各個模塊功能:(1)登陸\注冊模塊:主要負責(zé)用戶的注冊、登陸、密碼找回等功能。(2)業(yè)務(wù)邏輯模塊:負責(zé)完成移動客戶端主要輔助功能的實現(xiàn),包括百度地圖API接口實現(xiàn)、定位功能、噪聲監(jiān)測和數(shù)值轉(zhuǎn)換功能實現(xiàn)。(3)網(wǎng)絡(luò)編程模塊:由于本次設(shè)計使用了xUtils3開發(fā)框架,該開發(fā)框架的網(wǎng)絡(luò)模塊大大方便了在實際開發(fā)中的網(wǎng)絡(luò)模塊的開發(fā)。(4)傳感器模塊:主要負責(zé)處理移動設(shè)備傳感器檢測收集的感知數(shù)據(jù),如GPS定位信息、噪聲監(jiān)測信息等。3、數(shù)據(jù)存取層:數(shù)據(jù)存取層主要負責(zé)對本地數(shù)據(jù)的存取,包括讀取用戶登陸、注冊信息,對定位位置信息、噪聲監(jiān)測數(shù)值等進行存取操作。4、本地數(shù)據(jù)持久層:該層主要負責(zé)本地數(shù)據(jù)的持久化存儲,分為硬盤持久化存儲和內(nèi)存持久化存儲。5、網(wǎng)絡(luò)交互層:該層負責(zé)完成移動客戶端通過網(wǎng)絡(luò)請求訪問服務(wù)器端的API接口,接受和響應(yīng)網(wǎng)絡(luò)數(shù)據(jù)。對服務(wù)器響應(yīng)的json數(shù)據(jù)通過Gson進行解析獲得我們需要的數(shù)據(jù)。4.3服務(wù)器端設(shè)計4.3.1服務(wù)器端概要設(shè)計服務(wù)器端主要負責(zé)實現(xiàn)后臺業(yè)務(wù)邏輯和系統(tǒng)的數(shù)據(jù)存儲操作,并為客戶端提供接口服務(wù)。服務(wù)器端核心架構(gòu)圖如圖4.2所示:圖4.2服務(wù)器端核心架構(gòu)圖如圖4.2所示:服務(wù)器端分成了3個部分,業(yè)務(wù)邏輯層根據(jù)對應(yīng)的業(yè)務(wù)請求進行服務(wù)器的訪問,交互接口層則是對業(yè)務(wù)邏輯層分別進行封裝后為客戶端提供對應(yīng)的API接口服務(wù)。業(yè)務(wù)邏輯層根據(jù)具體的業(yè)務(wù)模塊分為:用戶登陸\注冊模塊、定位信息存取模塊、噪聲監(jiān)測值存取模塊等服務(wù)器功能以及其與數(shù)據(jù)庫的交互。4.3.2數(shù)據(jù)庫設(shè)計本節(jié)簡單介紹了服務(wù)器端數(shù)據(jù)庫中重要的表結(jié)構(gòu)(1)用戶表loginuser字段類型說明Idint(10)用戶標(biāo)志,主鍵,自增user_loginnamevarchar(20)用戶名user_nicknamevarchar(40)用戶昵稱user_pwdvarchar(20)用戶密碼user_avatarurlvarchar(40)用戶頭像urluser_gendervarchar(20)用戶性別user_telvarchar(40)用戶聯(lián)系方式user_participationdecimal(10)用戶參與度user_rankint(20)用戶分?jǐn)?shù)值user_createtimevarchar(255)用戶注冊時間(2)噪聲定位數(shù)值表positioninfo字段類型說明Idint(10)信息標(biāo)識,主鍵,自增user_loginnamevarchar(20)用戶名noise_valuevarchar(255)噪聲值LatitudeDouble定位經(jīng)度LongitudeDouble定位緯度4.3.3Ngrok內(nèi)網(wǎng)映射一款應(yīng)用的各類數(shù)據(jù)是存儲在公共服務(wù)器上,為了給任意用戶提供數(shù)據(jù)存取服務(wù),服務(wù)器需要對外開放給用戶進行訪問,所以在這里使用到了Ngrok內(nèi)網(wǎng)映射服務(wù)。Ngrok是當(dāng)下非常流行的一項反向代理服務(wù),用于進行內(nèi)網(wǎng)穿透,通過在公共的端點和本地運行的Web服務(wù)器之間建立一個安全的通道。這樣我們就可以將本地的Web服務(wù)器部署在外網(wǎng)上供所有用戶進行使用和調(diào)試等操作,本服務(wù)支持80端口以及自定義tcp端口轉(zhuǎn)發(fā)等。4.4客戶端與服務(wù)器端交互設(shè)計本章的前三節(jié)中介紹了本系統(tǒng)的整體架構(gòu),并對客戶端和服務(wù)器端進行了詳細設(shè)計??蛻舳朔矫孢M行了詳細設(shè)計,包括UI設(shè)計和交互頁面設(shè)計等??蛻舳嗽L問服務(wù)器是通過網(wǎng)絡(luò)請求模塊進行連接,本次設(shè)計中使用了xUtils3開發(fā)框架,大大方便了在應(yīng)用設(shè)計中網(wǎng)絡(luò)模塊的開發(fā)??蛻舳送ㄟ^xUtils3集成的http網(wǎng)絡(luò)傳輸協(xié)議,主要是以get的方式為主??蛻舳烁鶕?jù)對應(yīng)的業(yè)務(wù)需求,利用http協(xié)議發(fā)送Resquest請求給后臺服務(wù)器,服務(wù)器接收到請求后處理業(yè)務(wù),同時根據(jù)請求的要求返回一個JSON格式的響應(yīng)數(shù)據(jù)給客戶端,客戶端接收到這個響應(yīng)數(shù)據(jù)后,通過GSON工具對JSON數(shù)據(jù)進行解析成為可識別的數(shù)據(jù)格式,并反饋給用戶。4.5本章小結(jié)本章的主要工作為:1、考慮采用C/S架構(gòu)對系統(tǒng)進行整體的架構(gòu)設(shè)計。2、完成客戶端架構(gòu)設(shè)計和客戶端交互界面的設(shè)計。3、完成服務(wù)器端架構(gòu)設(shè)計,設(shè)計服務(wù)器端數(shù)據(jù)庫,將服務(wù)器部署在公網(wǎng)上供用戶使用。4、采用http網(wǎng)絡(luò)傳輸協(xié)議實現(xiàn)客戶端與服務(wù)器端的交互。
第五章系統(tǒng)實現(xiàn)本章在完成前文所述功能設(shè)計的基礎(chǔ)上,完成了模塊功能的具體實現(xiàn),包括客戶端的核心功能實現(xiàn)、服務(wù)器端核心API實現(xiàn)以及服務(wù)器架設(shè)方式的介紹。5.1客戶端核心模塊的實現(xiàn)5.1.1噪聲監(jiān)測定位服務(wù)移動客戶端的噪聲監(jiān)測定位服務(wù)主要集中在百度地圖上進行實現(xiàn),如圖5.1、5.2分別是定位服務(wù)和噪聲分布定位和監(jiān)測圖。圖5.1定位服務(wù)圖圖5.2噪聲分布定位和監(jiān)測圖為了實現(xiàn)如圖5.1和5.2所示的信息,需要實現(xiàn)以下幾點要求:1、在系統(tǒng)中使用百度地圖SDK。(1)申請密鑰如果想要使用百度地圖SDK,先向百度官方申請開發(fā)者密鑰。如圖5.3所示:圖5.3百度地圖密鑰申請(2)下載相關(guān)SDK如圖5.4所示,根據(jù)系統(tǒng)所需要使用到的功能選擇所要下載的安裝包。圖5.4百度地圖開發(fā)資源(3)環(huán)境配置將安裝包導(dǎo)入到AndroidStudio的libs包中如圖5.5所示。圖5.5libs包中文件(4)在項目的AndroidManifest.xml中的application中添加開發(fā)密鑰和默認(rèn)服務(wù)。
android:value="1j7P7Z42qw1657zL10QZibgy1rnW6Yso"
/>
(5)添加項目中所需要的權(quán)限,以下為定位相關(guān)權(quán)限。<!—精確定位權(quán)限
-->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>
<!—網(wǎng)絡(luò)定位權(quán)限-->
<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、定位服務(wù)中,為了在地圖上直觀的顯示出定位信息,需要在定位位置添加相應(yīng)的覆蓋物。ll用于存放自己的經(jīng)緯度坐標(biāo)用于添加覆蓋物等操作。option對象是覆蓋物選型對象,用于設(shè)置覆蓋物的各種屬性。在定位操作結(jié)束后,將isFirstLocate設(shè)置為false。
//用于存放經(jīng)緯度,即自己的坐標(biāo)
LatLng
ll
=
new
LatLng(location.getLatitude(),
location.getLongitude());
/*用于獲取定位經(jīng)緯度*/
/*在自己的位置添加覆蓋物,用于顯示監(jiān)測噪聲位置等信息*/
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);
//將覆蓋物設(shè)為中心點顯示
baiduMap.animateMapStatus(update);
4、本次設(shè)計中,噪聲監(jiān)測功能是通過手機的聲音傳感器來實現(xiàn)的,將麥克風(fēng)收集到的周邊聲音通過對應(yīng)的轉(zhuǎn)化算法轉(zhuǎn)化為分貝值,用于判定周圍聲音強度。AudioRecord類中通過方法getNoiseLevel()方法對聲音進行了收集和數(shù)值轉(zhuǎn)化,轉(zhuǎn)化后的數(shù)值進行返回用于存取。
/*計算噪聲分貝值*/
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、為了給用戶更直觀的查看到周邊環(huán)境的噪聲強度,選擇直接將服務(wù)器中的數(shù)據(jù)以定位標(biāo)志的形式顯示在百度地圖上供用戶進行預(yù)覽,用戶只需要點擊覆蓋物,即可顯示點擊位置的噪聲值。(1)從服務(wù)器上獲取所有已知噪聲數(shù)值以及定位的數(shù)據(jù),將其以覆蓋物的形式顯示在百度地圖上。Marker作用是添加自定義標(biāo)識,同時可以為marker添加點擊事件。bundle.putSerializable()自定義bundle傳遞序列化對象數(shù)據(jù),當(dāng)噪聲值傳遞給點擊事件后彈出的布局中。
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添加點擊事件,點擊標(biāo)識后彈出布局顯示當(dāng)前定位的噪聲分貝值。location是新建的TextView布局,用于存放噪聲值。InfoWindow方法是百度地圖提供的創(chuàng)建自定義View方法,參數(shù)分別給自定義布局對象,對象位置和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移動客戶端網(wǎng)絡(luò)編程本次設(shè)計中,客戶端的網(wǎng)絡(luò)編程是使用xUtils3開源框架來進行實現(xiàn)的。xUtils3中擁有HttpUtils網(wǎng)絡(luò)模塊,具有更全面的http請求協(xié)議支持,大致包括了GET請求、POST請求、如何使用其他請求方式、上傳文件、下載文件、使用緩存等功能。下面是針對為用戶提供服務(wù)器噪聲定位數(shù)據(jù),使用xUtils3框架實現(xiàn)的網(wǎng)絡(luò)交互:private
void
getvalue(){
RequestParams
params
=
new
RequestParams(
"http://campus.free.ngrok.cc/Service/servlet/GetValue");
x.http().get(params,
new
Callback.CacheCallback<String>()
{…}通過http網(wǎng)絡(luò)請求,請求方式是為get方式,返回的數(shù)據(jù)json數(shù)據(jù),由于服務(wù)器端返回的是jsonArray數(shù)據(jù)格式,所以定義VoiceBean對象類進行json數(shù)據(jù)的解析,解析方式則是通過Google提供的用于解析json的一個開源框架Gson。5.1.3移動客戶端主界面邏輯移動客戶端的主要功能界面是用FragmentTabHost實現(xiàn)的選項卡菜單界面,分別為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)我們還需要設(shè)計一個選項卡菜單布局文件為tab_item_view.xml:(3)最后構(gòu)建主活動界面,在構(gòu)建之前要實例化TabHost聲明了mFragmentArray、mImageArray、mTextArray三個對象,分別是活動界面、選項卡圖標(biāo)和選項卡名稱,initView()方法構(gòu)建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循環(huán)依次將選項卡插入到布局中,設(shè)置圖標(biāo)和文字。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移動客戶端活動跳轉(zhuǎn)在Android中進行頁面跳轉(zhuǎn)主要使用Intent實現(xiàn)活動的顯示跳轉(zhuǎn),它不僅指明了當(dāng)前組件想要執(zhí)行的動作,還可以在不同組件之間進行數(shù)據(jù)傳遞。在本文中大部分的活動跳轉(zhuǎn)都使用Intent進行,下面就是使用Intent進行活動跳轉(zhuǎn)同時進行數(shù)據(jù)傳遞:
if
(loginBean.getFlag().equals("0"))
{
Intent
school_intent
=
new
Intent(MainActivity.this,
HomePageActivity.class);
/*用于將用戶名參數(shù)傳遞給后面的活動*/
school_intent.putExtra("username",transfor);
startActivity(school_intent);
}
以上是登陸界面的活動跳轉(zhuǎn),登陸成功后,界面跳轉(zhuǎn)到主活動界面,通過putExtra方法的重載,我們可以將用戶名信息傳遞給主活動界面,當(dāng)主活動頁面啟動后,我們就可以通過getStringExtra方法從Intent中取出數(shù)據(jù),用于在標(biāo)題位置注明用戶如下所示:private
String
getUsername(){
toolbar
=
(Toolbar)
findViewById(R.id.homepage_toolbar);
Intent
intent
=
getIntent();
String
str
=
intent.getStringExtra("username");
return
str;
}
5.2服務(wù)器端的實現(xiàn)5.2.1基本說明本文中,服務(wù)器是以自己的計算機作為服務(wù)器,數(shù)據(jù)庫則是采用的MySQL關(guān)系型數(shù)據(jù)庫,服務(wù)器是使用MyEclipse開發(fā)工具中集成的Tomcat搭建服務(wù)器,使用的是Java語言,用MyEclipse為客戶端建立servlet。為了給更多的用戶群體移動訪問服務(wù)器,通過Ngrok反向代理服務(wù)進行內(nèi)網(wǎng)穿透,將服務(wù)器部署在公網(wǎng)便于測試和使用。5.2.2服務(wù)器核心API接口噪聲定位顯示用戶想要直觀的查看噪聲定位分布以及噪聲數(shù)值,需要訪問服務(wù)器獲取服務(wù)器上的所有數(shù)據(jù),此時通過http請求訪問服務(wù)器,服務(wù)器從數(shù)據(jù)庫中獲取到所有數(shù)據(jù)以后返回一個jsonarray數(shù)據(jù)給客戶端。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();
}
用戶登陸客戶在使用客戶端程序時,需要進行用戶登陸操作,登陸時需要提供對應(yīng)的用戶名密碼參數(shù),服務(wù)器接收到參數(shù)后與數(shù)據(jù)庫進行匹配操作,操作完成后返回json格式的響應(yīng)數(shù)據(jù),其中“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內(nèi)網(wǎng)穿透5.3.1基本說明Ngrok是當(dāng)下非常流行的一項反向代理服務(wù),用于進行內(nèi)網(wǎng)穿透,通過在公共的端點和本地運行的Web服務(wù)器之間建立一個安全的通道。這樣我們就可以將本地的Web服務(wù)器部署在外網(wǎng)上供所有用戶進行使用和調(diào)試等操作,本服務(wù)支持80端口以及自定義tcp端口轉(zhuǎn)發(fā)等。5.3.2使用方法(1)在ngrok官網(wǎng)申請一個賬號,并登陸。(2)點擊隧道管理,進行開通隧道。(3)購買免費版本的。(4)依次填入各項信息,注意本地端口要和tomcat的web項目的http訪問端口對應(yīng),如圖5.6。圖5.6購買隧道(5)添加成功后,就可以在管理界面查看對應(yīng)的隧道信息,如圖5.7所示,復(fù)制隧道ID。5.7隧道管理(6)下載Ngrok工具后啟動,如圖5.8所示,填入隧道id后回車即可成功開啟。5.8啟動Ngrok工具(7)最后啟動Tomcat上的服務(wù)器,就可以訪問服務(wù)器進行交互。5.4本章小結(jié)本章介紹了移動客戶端核心模塊的具體實現(xiàn)方法和服務(wù)器搭建方式,簡單介紹了服務(wù)器核心API的實現(xiàn),最后講解了ngrok的使用方式。
第六章總結(jié)和展望6.1本文總結(jié)本文在著手應(yīng)用設(shè)計之前,做了充分的調(diào)查與研究。在對社區(qū)應(yīng)用發(fā)展背景進行了解后,對群智感知技術(shù)、獎勵機制以及Android開發(fā)技術(shù)進行了深入研究,從而完成了系統(tǒng)的設(shè)計。經(jīng)過需求分析、功能設(shè)計以及架構(gòu)設(shè)計后,實現(xiàn)了系統(tǒng)模塊功能。本文首先介紹了Android移動應(yīng)用開發(fā)特點,包括Android的4層平臺架構(gòu)、Android開發(fā)的優(yōu)勢。同時介紹了本文中涉及到的Android開源框架xUtils3,列舉了它的主要功能與特性,簡單分析了Android多種開發(fā)應(yīng)用模式的之間的區(qū)別。此外,本文著重分析了群智感知技術(shù)的數(shù)據(jù)采集方式,比較了機會感知和參與式感知的不同之處,提出使用獎勵機制來提高用戶參與任務(wù)的積極性。然后,本文對系統(tǒng)應(yīng)用進行了需求分析,包括用戶群體和應(yīng)用環(huán)境分析,并在此基礎(chǔ)上完成了應(yīng)用的主要功能設(shè)計。此外,還在設(shè)計中引入了獎勵機制模型的設(shè)計,系統(tǒng)功能更加完善。緊接著,本文對系統(tǒng)做了較為詳細的研究與設(shè)計,完成了系統(tǒng)的架構(gòu)設(shè)計,包括客戶端和服務(wù)器端的設(shè)計,同時還介紹了服務(wù)器端的Ngrok內(nèi)網(wǎng)映射技術(shù)。對客戶端和服務(wù)器端交互設(shè)計也做了簡單的介紹。最后,本文詳細地介紹了系統(tǒng)功能模塊的實現(xiàn)方法,包括客戶端主要功能的實現(xiàn)方法和前提要素、服務(wù)器端的搭建和API接口實現(xiàn)以及Ngrok內(nèi)外映射的使用方法。從課題研究到系統(tǒng)設(shè)計再到模塊實現(xiàn),具有較強的創(chuàng)新與實踐意義。6.2未來工作展望隨著移動應(yīng)用開發(fā)技術(shù)的飛速發(fā)展,用戶的需求也逐漸變得多樣化。移動應(yīng)用也要在原有的基礎(chǔ)上不斷開拓創(chuàng)新,多次開發(fā)來滿足廣大用戶的要求,在提供良好的用戶體驗前提下,提供更加智能、優(yōu)質(zhì)的服務(wù)。由于作者技術(shù)學(xué)識淺薄,本文仍然有許多的改進之處。例如本文原計劃將噪聲采集環(huán)境定于室內(nèi)例如圖書館等地。由于技術(shù)的限制,將噪聲采集范圍定在了百度地圖上的某一點,用戶只能將自身所處的位置的噪聲進行采集上傳,由于環(huán)境是處在校園中,校園作為學(xué)習(xí)交流場所,本身不會存在大量的噪聲因素,所以存在著上傳數(shù)據(jù)差距不明顯,不具代表性等因素。另外,本文雖然創(chuàng)新性的引入了獎勵機制來提高用戶積極性,但是并沒有對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期貨市場流動性提供者行為分析考核試卷
- 共享美甲店合同范本
- 廣告創(chuàng)作與音頻效果考核試卷
- 2025年01月浙江麗水市縉云縣事業(yè)單位面向全國引進高層次人才和緊缺人才7人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解-1
- 培養(yǎng)小學(xué)生的樂觀積極計劃
- 家具零售店鋪運營管理實務(wù)考核試卷
- 顯示器件制造中的潔凈室技術(shù)考核試卷
- 學(xué)習(xí)資源平臺與在線學(xué)習(xí)探索計劃
- 實際購房合同范本
- 企業(yè)內(nèi)部審計的實施方法計劃
- 電力工程施工的重點和難點及保證措施
- 人教版七年級音樂教學(xué)計劃
- GB/T 44895-2024市場和社會調(diào)查調(diào)查問卷編制指南
- 2020年礦建監(jiān)理工作總結(jié)
- 我國職業(yè)教育與經(jīng)濟高質(zhì)量發(fā)展耦合協(xié)調(diào)關(guān)系研究
- 建筑施工安全生產(chǎn)包保責(zé)任實施方案
- 社區(qū)商業(yè)招商與運營管理方案
- 校園食品安全培訓(xùn)課件
- 2024年初一英語閱讀理解專項練習(xí)及答案
- 中國航空學(xué)會-2024低空經(jīng)濟場景白皮書
- 23J916-1 住宅排氣道(一)
評論
0/150
提交評論