張 斌, 鄔曉靜, 邵 想, 張 帥
(鄭州大學(xué) 軟件學(xué)院, 鄭州 450002)
基于Android的防走失系統(tǒng)是指通過移動設(shè)備對人的位置坐標(biāo)進(jìn)行GPS定位,通過位置校驗算法提取精確位置信息,并對實時上傳的數(shù)據(jù)進(jìn)行分析處理,達(dá)到實時監(jiān)控的目的。該技術(shù)在車載導(dǎo)航、測繪、軍事等領(lǐng)域已有廣泛應(yīng)用。老人兒童安全問題一直是一個社會熱點問題,艾瑞發(fā)布的《2019年中國親子陪伴質(zhì)量研究報告》中指出,2008年來中國宏觀經(jīng)濟增速放緩,已婚人群養(yǎng)老與撫養(yǎng)孩子的壓力更加明顯[1],陪伴老人與孩子的時間也越來越少。雖然市面上已有的防走失定位產(chǎn)品很多,但依賴于第三方設(shè)備的定位產(chǎn)品在續(xù)航時間、價格成本、快速升級等方面有明顯的局限性。在2017~2018年中,智能手機在所有年齡段的普及率、覆蓋率不斷增長[2],超過九成的人不會在進(jìn)行家庭活動時關(guān)閉自己的移動設(shè)備[3]。智能手機具有系統(tǒng)升級快,價格低廉等優(yōu)點,而且Android6.0可使設(shè)備續(xù)航時間提升30%?;贏ndroid的防走失系統(tǒng)能夠精確定位、自動報警、幫助用戶快速導(dǎo)航到老人兒童身邊,保障老人兒童出行安全,滿足人們需求,同時其在各個層面相互獨立便于后續(xù)開發(fā)與維護。
系統(tǒng)Android端使用IntelliJ IDEA 2019為開發(fā)工具,基于kotlin語言,結(jié)合MVP(Model-View-Presenter)設(shè)計模式,采用Nv-websocket-client+Okhttp+Gson框架,在使用Android SDK 27的基礎(chǔ)上,兼容Android6.0及以上版本,實現(xiàn)了實時定位、軌跡回放、強制錄音、電子圍欄等功能。
Android系統(tǒng)會為每個程序運行時創(chuàng)建一個單例(singleton)模式的Application類,且其生命周期等于此程序生命周期,所以可以通過Application來進(jìn)行權(quán)限申請、數(shù)據(jù)共享、數(shù)據(jù)緩存等操作。程序首次運行時申請如下權(quán)限。
(1)授予用于進(jìn)行網(wǎng)絡(luò)定位的權(quán)限。此時需用到設(shè)計代碼為:
android.permission.ACCESS_COARSE_LOCATION
(2)授予該程序向外部儲存器寫入數(shù)據(jù)的權(quán)限。此時需用到設(shè)計代碼為:
android.permission.WRITE_EXTERNAL_STORAGE
(3)授予該程序錄制聲音的權(quán)限。此時需用到設(shè)計代碼為:
android.permission.RECORD_AUDIO
(4)程序在手機屏幕關(guān)閉后,后臺進(jìn)程仍然運行。此時需用到設(shè)計代碼為:
android.permission.ACCESS_FINE_LOCATION等。
在Application中建立2個HashMap用于Activity之間進(jìn)行數(shù)據(jù)傳遞和緩存用戶數(shù)據(jù),同時將緩存的數(shù)據(jù)經(jīng)過MD5算法進(jìn)行加密處理緩存到本地,既保證用戶數(shù)據(jù)安全性,也預(yù)防出現(xiàn)程序意外中斷導(dǎo)致數(shù)據(jù)丟失情況,避免用戶打開應(yīng)用重復(fù)登錄,提高人機交互友好性,實現(xiàn)后臺實時定位的功能。
在Application的onCreate()的方法中通過LogUtil.logoff=false,設(shè)置屏蔽打?。籐ogUtil.level=log.ERROE,指定把高于或等于Error的信息保存到sdcard日志文件中;LogUtil.saveDirName= "/ GuardianshipModify/log/"指定錯誤信息日志目錄。LogUtil.trace(inttype, Stringtag, Stringmsg, booleanisContinueWrite)中 type:log的類型(ERROR,WARN等),tag:輸出標(biāo)志,msg:輸出日志,isContinueWrite:true(默認(rèn)),表示繼續(xù)在原有文件寫入,若為false則表示創(chuàng)建一個新的覆蓋原來的文件。如果原來并沒有創(chuàng)建過,則無論是false,還是true都會創(chuàng)建一個新文件。globalExceptionHandler.setUncatchExceptionListener()可以回調(diào)處理程序崩潰后自定義的用戶操作,如上傳錯誤信息,保存數(shù)據(jù)信息等操作。
EventBus提供了PostThread(當(dāng)前線程)、MainThread(主線程)、BackgroundThread(后臺線程)和Async(異步線程)四種線程模式,是Android下高效的發(fā)布/訂閱事件的消息總線。因此,本系統(tǒng)采用此對象代替?zhèn)鹘y(tǒng)的Intent,Handler,Broadcast或接口函數(shù)在Fragment、Activity、Service和線程之間傳遞數(shù)據(jù)并執(zhí)行方法。EventBus有3個主要元素,分別是:Event(事件)、Subscriber(事件訂閱者,接受特定的事件)和Publisher(事件發(fā)布者,用于通知Subscriber有事件發(fā)生)。
1.2.1 客戶端發(fā)送請求設(shè)計
NetworkManager通信管理類是一個重量級類,采用單例模式,用于管理頻繁出現(xiàn)的網(wǎng)絡(luò)請求。該管理類把請求分發(fā)給目標(biāo)業(yè)務(wù)邏輯組件去處理,目標(biāo)業(yè)務(wù)邏輯組件根據(jù)相應(yīng)的請求調(diào)用相應(yīng)的方法去執(zhí)行,通過JSON接口和繼承的方式利用Gson框架將請求對象和返回對象設(shè)計為JSON對象。由于Socket通信[4]具有傳輸數(shù)據(jù)量小(費用低)、傳輸時間短、性能高、適合于客戶端和服務(wù)器之間信息實時交互、可以加密、數(shù)據(jù)安全性強等優(yōu)點,因此研究采用以Socket通信為主、Http通信[5]為輔的通信機制。請求過程如下:
Step 1準(zhǔn)備請求。在請求對象中加入seqId(實現(xiàn)當(dāng)服務(wù)器響應(yīng)長連接請求時能夠找到對應(yīng)的回調(diào))和reqCount(記錄請求超時次數(shù))兩個參數(shù),同時添加超時任務(wù)并且將該請求的回調(diào)添加到回調(diào)集合。
Step 2開始請求。請求成功或者失敗都通過seqId找到對應(yīng)回調(diào)執(zhí)行并從回調(diào)集合中移除該回調(diào),再取消超時任務(wù)。如果超時則判斷當(dāng)前請求次數(shù),當(dāng)前請求次數(shù)小于或等于3次時則再次通過WebSocket發(fā)送請求;當(dāng)前請求次數(shù)大于3次時則走Http補償通道,并根據(jù)請求成功或失敗情況執(zhí)行對應(yīng)回調(diào)??蛻舳税l(fā)送請求過程圖如圖1所示。
圖1 客戶端發(fā)送請求過程圖
1.2.2 授權(quán)、心跳和重連循環(huán)設(shè)計
為實現(xiàn)服務(wù)器端向客戶端主動發(fā)送通知,客戶端需要在用戶進(jìn)行登錄后嘗試建立連接,建立連接成功后進(jìn)行授權(quán),授權(quán)就是發(fā)送一個攜帶用戶信息的請求,而在服務(wù)器端通過這個請求后驗證用戶信息,驗證成功后服務(wù)器端就知道當(dāng)前長連接屬于哪個用戶。授權(quán)成功后開始心跳。心跳是指每隔一段時間,服務(wù)器端發(fā)送請求,如果服務(wù)器端有響應(yīng),就認(rèn)為這條連接是穩(wěn)定的。心跳連接成功后進(jìn)行數(shù)據(jù)同步,如果心跳連續(xù)失敗三次或嘗試建立連接失敗則開始繼續(xù)嘗試重連。當(dāng)重連成功后會再次進(jìn)行授權(quán),然后再次開啟心跳,至此形成了一個循環(huán)。如果多次重連失敗后系統(tǒng)會向用戶發(fā)送通知,提醒用戶檢查當(dāng)前網(wǎng)絡(luò)狀態(tài)。授權(quán)、心跳和重連循環(huán)過程如圖2所示。
圖2 授權(quán)、心跳和重連循環(huán)過程圖
Fig. 2 Diagram of authorization, heartbeat, and reconnection cycles
Android端依托于百度地圖Android SDK,采用BD09坐標(biāo)系實現(xiàn)繪制定位。BD09坐標(biāo)系是在GCJ02坐標(biāo)系(國家測繪局)[6]基礎(chǔ)上再次加密形成的,具有高度的可靠性和安全性,可以更好地保護用戶個人隱私,防止位置信息泄露。百度地圖服務(wù)具有高精度、覆蓋廣、功耗低、支持電子圍欄和室內(nèi)定位等優(yōu)點,并為開發(fā)者提供了簡單易用且功能豐富的操作接口。
1.3.1 地圖繪制和數(shù)據(jù)處理
項目導(dǎo)入百度地圖jar包[7]并在Application類中初始化Android SDK[8]。SDK會產(chǎn)生mapView和baiduMap兩個對象,分別用于顯示和控制地圖元素。
被監(jiān)護用戶登錄App之后,系統(tǒng)會為其創(chuàng)建一個對象,并初始化運動軌跡。用戶使用系統(tǒng)期間,地圖會實時顯示當(dāng)前位置和正前方的方位。用戶產(chǎn)生的運動信息會被存儲到對象中,通過SecureData類進(jìn)行數(shù)據(jù)格式化,而后被系統(tǒng)存儲到本地的track.xml文件里。系統(tǒng)根據(jù)上傳機制將track.xml文件上傳到服務(wù)器。
監(jiān)護端可以查看被監(jiān)護端當(dāng)前位置和運動軌跡,位置信息由Download類從服務(wù)器上下載track.xml文件,經(jīng)過SecureData類解析為數(shù)據(jù)信息。系統(tǒng)通過mapView對象將解析后的數(shù)據(jù)繪制為被監(jiān)護端的位置點和運動軌跡。
1.3.2 運動軌跡監(jiān)測
系統(tǒng)調(diào)用百度地圖API接口時存在定位精度[9]的問題,可能會產(chǎn)生錯誤的位置信息。為了防止錯誤的位置信息被記錄到運動軌跡中,研究特別設(shè)計了位置校驗算法。
當(dāng)設(shè)備信號不良時,百度地圖定位時會出現(xiàn)跳躍現(xiàn)象,地圖定位會產(chǎn)生一定程度的偏差,這個錯誤的定位點被稱為跳躍點。跳躍點的位置和實際位置相差約5~10 m(1 m相當(dāng)于0.000 01°經(jīng)緯度[10]),可根據(jù)經(jīng)緯度的瞬時變化檢測當(dāng)前定位點是否屬于跳躍點。當(dāng)被監(jiān)護端處于高速移動時,間隔定位點的距離可能會和跳躍點變化相似。但跳躍點是瞬時變化,高速移動是持續(xù)性變化,據(jù)此可區(qū)分跳躍點和高速點。研發(fā)判斷是否為有效軌跡點代碼詳見如下。
varhighSpeedSign= 10,error= 0
valLatOffsetLimit= 0.000 1,LonOffsetLimit= 0.001
varoffsetList:MutableList
funsavePos(currentPos:LatLng,lastPos:LatLng){
//兒童未進(jìn)行移動
if (currentPos==lastPos) return
varoffsetlati= Math.abs(currentPos.latitude-lastPos.latitude)
varoffsetlong= Math.abs(currentPos.longitude-lastPos.longitude)
valsavePos=offsetlati if (savePos) {//有效軌跡點 if(error!= 0){ if (highSpeedSign for (iinoffsetList) motionList.add(i) error= 0 //清空錯誤軌跡點信息 offsetList.clear()} emotionList.add(currentPos) }else{ //無效軌跡點 error=error+ 1 offsetList.add(lastPos)}} Web服務(wù)器端基于Java語言,采用Spring Boot框架[11],使用百度地圖API接口,前端使用Bootstrap框架,數(shù)據(jù)庫使用MongoDB[12],來實現(xiàn)數(shù)據(jù)分析、信息管理、定位與錄音管理、地圖展示等功能。 Spring Boot框架簡化新Spring應(yīng)用的初始搭建及開發(fā)過程,不再需要定義樣板化配置,也無需部署WAR文件,簡化Maven配置提供生產(chǎn)就緒功能,為客戶端提供數(shù)據(jù)訪問接口和處理機制[13]??蛻舳送ㄟ^URL調(diào)用Spring Boot方法的過程如下: (1)指定Controller方法名,并添加@RequestMapping(兼容接受POST和GET請求)注解。 (2)通過@RequestParam 和@PathVariable設(shè)置參數(shù)。 (3)客戶端通過HttpGet或者HttpPost請求訪問服務(wù)端資源。 (4)服務(wù)端接受請求并通過@ControllerAdvice進(jìn)行全局錯誤驗證,并返回結(jié)果。 系統(tǒng)數(shù)據(jù)服務(wù)器采用Spring Boot內(nèi)置Tomcat,連接DataSource數(shù)據(jù)源[14]。使用MVC分層,各個層面單獨開發(fā)并提供訪問接口(TrackService、PositionDao等),便于后期開發(fā)和維護。具體分層如下: (1)View層。根據(jù)接收到的數(shù)據(jù)展示頁面給用戶。 (2)Controller層。響應(yīng)用戶請求(@RequestMapping(value ="/updatesetting")、@RequestMapping(value ="/modifyGuardian")等)。 (3)Service層。即為業(yè)務(wù)邏輯層,通過調(diào)用DAO層的底層數(shù)據(jù)操作完成用戶訪問所要求的業(yè)務(wù)邏輯。 (4)DAO層。把數(shù)據(jù)放到持久化的介質(zhì)中,提供增刪改查[15]操作。 (5)Module層。存放實體類,并與數(shù)據(jù)庫中的屬性值基本保持一致。 由于客戶端需要頻繁訪問服務(wù)端,采用Spring Boot線程池能夠顯著提升服務(wù)端的穩(wěn)定性。Spring Boot使用ThreadPoolExecutor線程池 + Queue隊列。設(shè)定線程最大數(shù)量和隊列大小,當(dāng)周期上傳的線程池滿,就進(jìn)入緩沖隊列,線程結(jié)束或超時之后,就從線程池中刪除線程,從緩沖隊列中按序調(diào)用新線程。Spring Boot線程池流程如圖3所示。 圖3 Spring Boot線程池流程圖 為實現(xiàn)對用戶多條定位信息、軌跡信息以及錄音信息的高效管理,系統(tǒng)設(shè)計采用非關(guān)系型數(shù)據(jù)庫MongoDB。MongoDB具有查詢速度快、高并發(fā)(可達(dá)2萬并發(fā))、高容量(支持10 TB以上數(shù)據(jù)量)的優(yōu)點。MongoDB能有效提高系統(tǒng)抗壓性。MongoDB在項目中使用過程如下: (1)在pom文件引入spring-boot-starter-data-mongodb相關(guān)依賴。 (2)在application.properties中添加配置: spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test。 (3)創(chuàng)建Track、Position等實體。 (4)實現(xiàn)TrackDao、PositionDao等的增刪改查操作(加入@Component注解)。 數(shù)據(jù)控制層提供的數(shù)據(jù)服務(wù)接口返回格式是application/json,數(shù)據(jù)接口通過方法注解提供訪問方式、查看軌跡方法@RequestMapping(value ="/trackplayback")和上傳定位錄音方法@RequestMapping("/upload")等。服務(wù)器數(shù)據(jù)管理如圖4所示。 圖4 服務(wù)器數(shù)據(jù)管理圖 通過HTML5+JavaScript+百度地圖API實現(xiàn)定位錄音信息管理和軌跡回放功能。 通過請求對象中的account和datetime參數(shù)查詢被監(jiān)護人的信息并加工為position對象返回給前端,View層將position對象轉(zhuǎn)化為JavaScript數(shù)組作為標(biāo)注,使用百度地圖API中BMap的Marker添加標(biāo)注,并通過BMap中InfoWindow為標(biāo)注添加信息,信息以標(biāo)注形式展示,點擊可查詢其對應(yīng)的地點名稱(精確到街道、門牌號)和同步上傳的錄音,錄音文件通過MongoDB數(shù)據(jù)庫訪問服務(wù)器錄音文件下載播放。 軌跡回放則通過被監(jiān)護人id查詢數(shù)據(jù)并格式化為List 防走失定位錄音系統(tǒng)旨在為用戶提供一個通過手機實現(xiàn)定位錄音的功能,利用手機方便攜帶,易于訪問網(wǎng)絡(luò)的特點,為老人兒童的出行提供安全保障??蛻舳朔譃楸O(jiān)護端與被監(jiān)護端,其中被監(jiān)護端賬號密碼由監(jiān)護端創(chuàng)建并自動綁定,保障被監(jiān)護端的安全性。 Android客戶端設(shè)置了主動上傳、強制上傳和周期上傳3種通信上傳方式實現(xiàn)對被監(jiān)護端的實時監(jiān)測??蛻舳说墓δ軇澐譃?個基本模塊: (1)實時定位:監(jiān)護人可查看被監(jiān)護人實時位置,也可快速導(dǎo)航到被監(jiān)護人身邊。 (2)電子圍欄:監(jiān)護人可通過創(chuàng)建家、學(xué)校、社區(qū)等電子圍欄來將被監(jiān)護人設(shè)定在安全的圍欄內(nèi),防止被監(jiān)護人走失或發(fā)生其他意外等。 (3)軌跡回放:可以滿足監(jiān)護人及時了解被監(jiān)護人之前的活動情況。 (4)強制錄音:突發(fā)意外時,監(jiān)護人可以強制錄音以便聽取被監(jiān)護人現(xiàn)場聲音信息,進(jìn)行及時處理。 (5)多人監(jiān)控:該模塊主要滿足多個監(jiān)護人對同一個被監(jiān)護人或一個監(jiān)護人對多個被監(jiān)護人同時監(jiān)控的需求。 (6)模式設(shè)置:設(shè)置被監(jiān)護端上傳定位錄音的模式、周期與錄音時長。 服務(wù)端的功能劃分為4個模塊: (1)網(wǎng)站分析:采用Chart.js插件統(tǒng)計用戶分布和定位數(shù)量。 (2)用戶信息管理:通過BootStrap框架展示用戶信息,并向管理員提供數(shù)據(jù)管理和備份功能。 (3)定位與錄音管理:將系統(tǒng)數(shù)據(jù)庫中的定位與錄音信息提取出來并展示,管理員可以對定位與錄音進(jìn)行管理。 (4)地圖展示:用于查詢某個用戶指定時間所處位置以及錄音內(nèi)容,同時提供用戶的軌跡回放。地圖展示如圖5所示。 圖5 地圖展示界面 通過對Android系統(tǒng)架構(gòu)的研究,應(yīng)用MVP設(shè)計模式,設(shè)計并實現(xiàn)一款基于Android的防走失系統(tǒng)。該系統(tǒng)能夠應(yīng)用在移動設(shè)備上,并且充分利用硬件系統(tǒng)的性能,實用性高?;贏ndroid的開發(fā)平臺,能夠短時間內(nèi)升級新功能,并且該系統(tǒng)界面簡潔,功能清晰,易于操作,為用戶提供一種便捷實用的監(jiān)控方式。2 Web服務(wù)器端架構(gòu)設(shè)計
2.1 數(shù)據(jù)訪問與服務(wù)設(shè)計
2.2 定位錄音與軌跡回放設(shè)計
3 防走失系統(tǒng)的實現(xiàn)
3.1 Android客戶端的實現(xiàn)
3.2 Web服務(wù)端的實現(xiàn)
4 結(jié)束語