摘要:該文敘述Android手機(jī)定位信息的采集和發(fā)送軟件的設(shè)計(jì),并使用JAVA語言編程實(shí)現(xiàn)。測試顯示達(dá)到設(shè)計(jì)要求。
關(guān)鍵詞: GPS; TCP; Socket; Android
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)36-8646-02
1 背景
隨著技術(shù)發(fā)展和成本的降低,智能手機(jī)快速普及。大量智能手機(jī)采用ANDORID操作系統(tǒng)、具備GPS定位功能。手機(jī)用戶可以下載安裝地圖軟件便能在手機(jī)顯示屏上顯示手機(jī)所在地理位置,進(jìn)一步可以進(jìn)行導(dǎo)航等,這大大方便了人們的生活。
2 應(yīng)用需求及分析
某些應(yīng)用需要定時(shí)獲取人員的位置并能在管理中心的計(jì)算機(jī)地圖上顯示,管理中心可以了解人員的位置根據(jù)需要進(jìn)行工作調(diào)度。人員的位置信息可以通過該人員所持智能手機(jī)獲得,通過開發(fā)相應(yīng)的軟件定期讀取人員智能手機(jī)的地理位置信息并傳送到指定管理中心的服務(wù)器,開發(fā)軟件使管理中心能在地圖上顯示手機(jī)的位置。軟件由手機(jī)客戶端軟件和服務(wù)器端軟件兩個(gè)部分組成,手機(jī)客戶端軟件應(yīng)實(shí)現(xiàn):能將手機(jī)的定位信息取出并通過手機(jī)網(wǎng)絡(luò)發(fā)送到指定的服務(wù)器。服務(wù)器端軟件應(yīng)實(shí)現(xiàn):接收存儲(chǔ)手機(jī)發(fā)送的定位數(shù)據(jù),并在地圖上顯示人員的位置。該文只涉及手機(jī)客戶端軟件。
3 軟件設(shè)計(jì)
功能要求: 根據(jù)需求, 手機(jī)客戶端軟件主要實(shí)現(xiàn)兩個(gè)功能:1) 獲取手機(jī)定位信息功能: 能夠讀取手機(jī)內(nèi)置的GPS定位數(shù)據(jù);2) 數(shù)據(jù)發(fā)送功能: 能將讀取的GPS定位數(shù)據(jù)發(fā)送到指定的主機(jī)。
性能要求: 1) 每隔30秒采集并發(fā)送定位信息;2) 定時(shí)時(shí)間、主機(jī)地址等參數(shù)用戶可以進(jìn)行設(shè)置。
4 軟件架構(gòu)
手機(jī)客戶端軟件由人機(jī)界面層、界面維護(hù)層、業(yè)務(wù)層,數(shù)據(jù)接入層構(gòu)成。如圖1所示。
圖1 軟件結(jié)構(gòu)
4.1界面層
進(jìn)行人機(jī)交互,界面如圖2所示。
圖2 UI 界面設(shè)計(jì)
顯示用戶填寫的系統(tǒng)參數(shù)條目,包含服務(wù)器地址(IP)、服務(wù)器端口、更新時(shí)間、用戶識(shí)別碼,通過勾選可以啟動(dòng)或停止定位跟蹤服務(wù),接收用戶的輸入。可以顯示所處位置的經(jīng)度和緯度信息。用戶可以點(diǎn)擊“保存配置”按鈕保存填寫的參數(shù)(調(diào)用界面支持模塊等),以后運(yùn)行程序無需重復(fù)設(shè)置。啟動(dòng)定位跟蹤服務(wù)后,用戶可以點(diǎn)擊”退出”按鈕退出應(yīng)用程序。
4.2界面維護(hù)層
同頁面”保存配置”按鈕對(duì)應(yīng),調(diào)用數(shù)據(jù)接入層模塊執(zhí)行用戶參數(shù)讀寫;更新界面上顯示的經(jīng)度和緯度信息;對(duì)應(yīng)界面上”退出”按鈕,實(shí)現(xiàn)程序退出功能。
4.3業(yè)務(wù)層
封裝成一個(gè)服務(wù),含GPS信息獲取模塊和GPS信息發(fā)送模塊,分別實(shí)現(xiàn)GPS信息的讀取和GPS信息的上傳功能.GPS信息獲取模塊讀取內(nèi)置GPS定位信息,獲取其中緯度和經(jīng)度信息并轉(zhuǎn)換成字符串,形成信息幀,調(diào)用發(fā)送模塊的發(fā)送功能發(fā)送到信息幀到服務(wù)器;同時(shí)通過廣播事件進(jìn)行位置信息擴(kuò)散,以便界面維護(hù)層能接收新的位置信息及時(shí)更新界面上顯示的經(jīng)度和緯度信息。
4.4數(shù)據(jù)接入層
系統(tǒng)參數(shù)保存在文件中,數(shù)據(jù)接入層實(shí)現(xiàn)對(duì)文件中信息的讀寫。
5 關(guān)鍵技術(shù)及代碼
軟件采用eclipse+adt開發(fā),界面ACTIVITY 由xml進(jìn)行定義,使用了TextView,EditView,CheckBox等頁面元素,采用線性頁面布局,使用TableRow進(jìn)行定位。客戶端程序核心功能是獲取GPS定位信息、發(fā)送定位信息到服務(wù)器。
5.1 GPS信息獲取
調(diào)用了系統(tǒng)定位服務(wù),設(shè)置定位參數(shù),核心代碼如下:
//獲得定位服務(wù)管理器 lm=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE); //設(shè)置定位參數(shù)
Criteria criteria = new Criteria();
// 查詢精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查詢海撥:否
criteria.setAltitudeRequired(false);
// 是否查詢方位角 : 否
criteria.setBearingRequired(false);
// 是否允許付費(fèi):否
criteria.setCostAllowed(false);
// 電量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
String bestProvider = lm.getBestProvider(criteria, true);
location= lm.getLastKnownLocation(bestProvider);
//設(shè)置定期更新位置信息 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,locationListener);
//設(shè)置位置監(jiān)聽器,接收位置信息
private LocationListener locationListener = new LocationListener() {
// 位置發(fā)生改變后調(diào)用
public void onLocationChanged(Location l) {
if(l!=null){
location=l;}}
5.2 定位信息發(fā)送給服務(wù)器
手機(jī)客戶端采用TCP/IP協(xié)議同計(jì)算機(jī)服務(wù)器通信,使用socket編程發(fā)送定位數(shù)據(jù)。核心代碼如下:
try
{//創(chuàng)建Socket
SocketAddress address = new InetSocketAddress(serverIP, serverPORT);
Socket socket = new Socket();
socket.connect(address,DefalutWaitTime);
// 獲取socket的輸出流并包裝成PrintWriter
if (socket.isConnected()) {
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()));
//輸出
out.println(localinfor);
//關(guān)閉出流
out.println("bye");
out.close();
//關(guān)閉Socket
socket.close();
}}
catch (Exception e)
{// TODO: 處理異常
System.out.println( e.toString());}
6 測試
測試用手機(jī)操作系統(tǒng)是android4.2,安裝開發(fā)的客戶端軟件,設(shè)置手機(jī)通過wlan接入內(nèi)網(wǎng),使用內(nèi)網(wǎng)進(jìn)行測試,服務(wù)器通過網(wǎng)線接入內(nèi)網(wǎng)。手機(jī)運(yùn)行程序,設(shè)置服務(wù)器地址:10.24.21.3,端口8000,更新周期為10秒,用戶識(shí)別碼為:10001,啟動(dòng)定位跟蹤服務(wù)后 ,手機(jī)界面顯示如圖3所示。顯示讀出的地理位置GPS坐標(biāo)為緯度:117.36654106,經(jīng)度:31.93015923。
圖3 手機(jī)運(yùn)行顯示界面截圖
在服務(wù)器端接收程序接收到手機(jī)發(fā)送的定位信息,如圖4所示。
圖4 服務(wù)器端定位信息接收界面截圖
服務(wù)器地圖顯示效果如圖5所示。
圖5 服務(wù)器端定位信息在地圖上顯示截圖
地圖顯示位置正確。
7 小結(jié)
通過ANDROID手機(jī)定位信息采集及上傳軟件開發(fā)測試,了解了ANDROID 應(yīng)用開發(fā)的過程和特點(diǎn),實(shí)現(xiàn)了GPS定位信息的讀取和上傳定位信息到服務(wù)器端功能,對(duì)相關(guān)技術(shù)進(jìn)行了驗(yàn)證,為后期ANDROID應(yīng)用開發(fā)打下良好的基礎(chǔ)。
參考文獻(xiàn):
[1] 張冬玲. Android應(yīng)用開發(fā)教程[M].北京:清華大學(xué)出版社,2013.
[2] 董迎紅,王薇.Java程序設(shè)計(jì)案例教程與實(shí)訓(xùn)[M]. 北京:北京大學(xué)出版社,2011.
[3] http://www.cnblogs.com/fly_binbin/archive/2010/12/16/1908518.html.
//設(shè)置位置監(jiān)聽器,接收位置信息
private LocationListener locationListener = new LocationListener() {
// 位置發(fā)生改變后調(diào)用
public void onLocationChanged(Location l) {
if(l!=null){
location=l;}}
5.2 定位信息發(fā)送給服務(wù)器
手機(jī)客戶端采用TCP/IP協(xié)議同計(jì)算機(jī)服務(wù)器通信,使用socket編程發(fā)送定位數(shù)據(jù)。核心代碼如下:
try
{//創(chuàng)建Socket
SocketAddress address = new InetSocketAddress(serverIP, serverPORT);
Socket socket = new Socket();
socket.connect(address,DefalutWaitTime);
// 獲取socket的輸出流并包裝成PrintWriter
if (socket.isConnected()) {
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()));
//輸出
out.println(localinfor);
//關(guān)閉出流
out.println("bye");
out.close();
//關(guān)閉Socket
socket.close();
}}
catch (Exception e)
{// TODO: 處理異常
System.out.println( e.toString());}
6 測試
測試用手機(jī)操作系統(tǒng)是android4.2,安裝開發(fā)的客戶端軟件,設(shè)置手機(jī)通過wlan接入內(nèi)網(wǎng),使用內(nèi)網(wǎng)進(jìn)行測試,服務(wù)器通過網(wǎng)線接入內(nèi)網(wǎng)。手機(jī)運(yùn)行程序,設(shè)置服務(wù)器地址:10.24.21.3,端口8000,更新周期為10秒,用戶識(shí)別碼為:10001,啟動(dòng)定位跟蹤服務(wù)后 ,手機(jī)界面顯示如圖3所示。顯示讀出的地理位置GPS坐標(biāo)為緯度:117.36654106,經(jīng)度:31.93015923。
圖3 手機(jī)運(yùn)行顯示界面截圖
在服務(wù)器端接收程序接收到手機(jī)發(fā)送的定位信息,如圖4所示。
圖4 服務(wù)器端定位信息接收界面截圖
服務(wù)器地圖顯示效果如圖5所示。
圖5 服務(wù)器端定位信息在地圖上顯示截圖
地圖顯示位置正確。
7 小結(jié)
通過ANDROID手機(jī)定位信息采集及上傳軟件開發(fā)測試,了解了ANDROID 應(yīng)用開發(fā)的過程和特點(diǎn),實(shí)現(xiàn)了GPS定位信息的讀取和上傳定位信息到服務(wù)器端功能,對(duì)相關(guān)技術(shù)進(jìn)行了驗(yàn)證,為后期ANDROID應(yīng)用開發(fā)打下良好的基礎(chǔ)。
參考文獻(xiàn):
[1] 張冬玲. Android應(yīng)用開發(fā)教程[M].北京:清華大學(xué)出版社,2013.
[2] 董迎紅,王薇.Java程序設(shè)計(jì)案例教程與實(shí)訓(xùn)[M]. 北京:北京大學(xué)出版社,2011.
[3] http://www.cnblogs.com/fly_binbin/archive/2010/12/16/1908518.html.
//設(shè)置位置監(jiān)聽器,接收位置信息
private LocationListener locationListener = new LocationListener() {
// 位置發(fā)生改變后調(diào)用
public void onLocationChanged(Location l) {
if(l!=null){
location=l;}}
5.2 定位信息發(fā)送給服務(wù)器
手機(jī)客戶端采用TCP/IP協(xié)議同計(jì)算機(jī)服務(wù)器通信,使用socket編程發(fā)送定位數(shù)據(jù)。核心代碼如下:
try
{//創(chuàng)建Socket
SocketAddress address = new InetSocketAddress(serverIP, serverPORT);
Socket socket = new Socket();
socket.connect(address,DefalutWaitTime);
// 獲取socket的輸出流并包裝成PrintWriter
if (socket.isConnected()) {
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()));
//輸出
out.println(localinfor);
//關(guān)閉出流
out.println("bye");
out.close();
//關(guān)閉Socket
socket.close();
}}
catch (Exception e)
{// TODO: 處理異常
System.out.println( e.toString());}
6 測試
測試用手機(jī)操作系統(tǒng)是android4.2,安裝開發(fā)的客戶端軟件,設(shè)置手機(jī)通過wlan接入內(nèi)網(wǎng),使用內(nèi)網(wǎng)進(jìn)行測試,服務(wù)器通過網(wǎng)線接入內(nèi)網(wǎng)。手機(jī)運(yùn)行程序,設(shè)置服務(wù)器地址:10.24.21.3,端口8000,更新周期為10秒,用戶識(shí)別碼為:10001,啟動(dòng)定位跟蹤服務(wù)后 ,手機(jī)界面顯示如圖3所示。顯示讀出的地理位置GPS坐標(biāo)為緯度:117.36654106,經(jīng)度:31.93015923。
圖3 手機(jī)運(yùn)行顯示界面截圖
在服務(wù)器端接收程序接收到手機(jī)發(fā)送的定位信息,如圖4所示。
圖4 服務(wù)器端定位信息接收界面截圖
服務(wù)器地圖顯示效果如圖5所示。
圖5 服務(wù)器端定位信息在地圖上顯示截圖
地圖顯示位置正確。
7 小結(jié)
通過ANDROID手機(jī)定位信息采集及上傳軟件開發(fā)測試,了解了ANDROID 應(yīng)用開發(fā)的過程和特點(diǎn),實(shí)現(xiàn)了GPS定位信息的讀取和上傳定位信息到服務(wù)器端功能,對(duì)相關(guān)技術(shù)進(jìn)行了驗(yàn)證,為后期ANDROID應(yīng)用開發(fā)打下良好的基礎(chǔ)。
參考文獻(xiàn):
[1] 張冬玲. Android應(yīng)用開發(fā)教程[M].北京:清華大學(xué)出版社,2013.
[2] 董迎紅,王薇.Java程序設(shè)計(jì)案例教程與實(shí)訓(xùn)[M]. 北京:北京大學(xué)出版社,2011.
[3] http://www.cnblogs.com/fly_binbin/archive/2010/12/16/1908518.html.