董 婷
(榆林學院 信息工程學院,陜西 榆林 719000)
隨著機動車的迅猛發(fā)展,環(huán)境不斷惡化。為了解決交通擁堵以及環(huán)境污染這兩個世界問題,政府便開始提倡綠色生活,環(huán)保出行。《基于安卓的便民自行車管理系統(tǒng)》便是在綠色生活,環(huán)保出行的大環(huán)境背景下誕生的。用戶可以在安卓手機上安裝本文介紹的《基于安卓的便民自行車管理系統(tǒng)》方便快捷的使用便民自行車,通過軟件可以查看附近車輛位置,用軟件內(nèi)的掃碼功能可以實現(xiàn)解鎖車輛。并開始計時收費,并且實現(xiàn)騎行路線規(guī)劃與導航,行程結(jié)束后可以支付并反饋騎行體驗。
在服務(wù)器啟動后,進入便民自行車管理系統(tǒng)客戶端,新用戶需要注冊登錄賬號。用戶通過在APP內(nèi)注冊頁面輸入的信息會返回到服務(wù)端進行數(shù)據(jù)庫匹配和增加操作。管理員也可以使用APP進行注冊,只需要在注冊框下方點擊管理員權(quán)限。
用戶注冊時會進行是否注冊過的邏輯判斷,注冊的賬號通過邏輯判斷后,在用戶輸入密碼的時候進行加密處理,管理員注冊時需要進行權(quán)限選擇。
百度地圖提供的免費定位服務(wù) 分為高精度定位模式 低功耗定位模式 僅設(shè)備定位模式 三種模式,高精度定位模式:在高精度定位模式下,會同時使用移動網(wǎng)絡(luò)定位和GPS定位,優(yōu)先返回最高精度的定位結(jié)果[1-2]; 低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網(wǎng)絡(luò)定位(Wi-Fi和基站定位) 僅用設(shè)備定位模式:這種定位模式下,不需要連接網(wǎng)絡(luò),只使用GPS進行定位,這種模式下不支持室內(nèi)環(huán)境的定位[3]。具體操作配置如下:
(1)在百度SDK官網(wǎng)下載com.baidu.location.service包。
(2)將com.baidu.location.service包直接拷貝到工程中。
(3)進行簡單配置即可獲取定位結(jié)果,也可以根據(jù)demo內(nèi)容自行封裝。
騎行距離計算是通過定位獲取經(jīng)度、緯度、距離和一個角度。具體計算步驟如下:
圖1 計算距離二維坐標圖
(1)(Math.PI / 180) * latitude1作用是將角度轉(zhuǎn)換為弧度,經(jīng)緯度坐標是角度值,計算時需要換為弧度。這里所有的計算都是用弧度[4]。
(2)函數(shù)以正北方(due north) 也就是指南針的方向為0度,順時針方向增加。如下圖,Distance距離如果是d的話,dx就是x軸方向的長度,即longitude經(jīng)度方向的長度;dy就是y軸方向的長度,即latitude緯度方向的長度。
dx、dy的計算方式也可以是以正東(due east)方向為0度[5]。
dx=distance*cos(θ)
dy=distance*cos(θ)
其中區(qū)別是cos與sin互換。
(3)截面過球心,此時截面的面積最大,此圓叫球的大圓(Great Cycle),沿著經(jīng)線進行截面,得到的都是大圓(Great Cycle)。球面被不經(jīng)過球心的截面所截得的圓 叫做小圓[6]。緯度圈所在的圓是一個小圓。地球半徑R,平均值R=6371.0km,可以參看《根據(jù)2個經(jīng)緯度點,計算這2個經(jīng)緯度點之間的距離(通過經(jīng)度緯度得到距離)》。其中值得一提的是,維基百科推薦使用Haversine公式,理由是Great-circle distance公式用到了大量余弦函數(shù), 而兩點間距離很短時(比如地球表面上相距幾百米的兩點),余弦函數(shù)會得出0.999...的結(jié)果, 會導致較大的舍入誤差[7]。而Haversine公式采用了正弦函數(shù),即使距離很小,也能保持足夠的有效數(shù)字。 以前采用三角函數(shù)表計算時的確會有這個問題,但經(jīng)過實際驗證,采用計算機來計算時,兩個公式的區(qū)別不大[8]。 穩(wěn)妥起見,這里還是采用Haversine公式。
其中
haversin(θ)=sin2(θ/2)=(1-cos(θ))/2
R為地球半徑,可取平均值 6371km;
φ1, φ2表示兩點的緯度;
Δλ 表示兩點經(jīng)度的差值。
圖2 二維碼區(qū)域解析圖
首先,介紹二維碼的一部分知識:二維碼一共有 40 個尺寸。官方叫版本 Version。Version 1 是 21 x 21 的矩陣,Version 2 是 25 x 25 的矩陣,Version 3 是 29 的尺寸,每增加一個 version,就會增加 4 的尺寸,公式是:(V-1)*4 + 21(V是版本號) 最高 Version 40,(40-1)*4+21 = 177,所以最高是 177 x 177 的正方形。
由于在本系統(tǒng)中沒有智能鎖設(shè)備的設(shè)計,在本系統(tǒng)中采用聯(lián)圖網(wǎng)制作生成模擬車輛的二維碼,在便民公共自行車管理系統(tǒng)中掃碼可以獲取單車的信息,二維碼是每個單車唯一的身份認證,每輛車都是唯一編號,掃二維碼和手動輸入單車編號效果一樣。然后通過地圖獲取到開鎖的定位,然后連續(xù)發(fā)起定位請求,請求的時間間隔為3000ms。實現(xiàn)掃碼開鎖的具體步驟如下:
(1)開啟camera,在后臺獨立線程中完成掃描任務(wù);
(2)在掃描界面繪制了一個正方形的掃描區(qū)(viewfinder)提示用戶將二維碼置于掃描區(qū)以準確掃描;
(3)然后將掃描的結(jié)果發(fā)送到服務(wù)器端;
(4)掃描成功后會將掃描結(jié)果展示在界面上。
圖3 掃碼開鎖原理圖
Server生成二維碼的內(nèi)容是手機段訪問服務(wù)器的登陸網(wǎng)址,再加上生成的uuid,這個uuid是用來確定是具體某個用戶的請求。Server是通過一個長連接維持用戶請求和服務(wù)器之間的通信,直到用戶通過手機端將請求信息發(fā)送給Server,然后長連接每隔一段時間通過uuid監(jiān)測是否有用戶的開鎖信息,如果有,則長連接結(jié)束,跳轉(zhuǎn)到騎行頁面,將車輛信息返回給用戶。
新用戶注冊登錄后會出現(xiàn)錢包充值的頁面,根據(jù)用戶所選的面值充值到用戶個人的錢包中,在用戶騎行結(jié)束后系統(tǒng)會自動扣除用戶的錢包余額。余額會在用戶的個人界面中展示方便用戶查看。
充值模塊通過構(gòu)建前端ChargeActivity.Java頁面中有充值金額和手動輸入框。新用戶可以通過在手機端選擇面值,然后將充值的金額儲存在數(shù)據(jù)庫用戶表中。充值后手機端會提示充值成功。
圖4 手機端單車管理流程圖
管理員注冊后登錄系統(tǒng)在手機端Fragment/Device.Java頁面的右上角點擊添加單車的按鈕,編輯單車的編號和單價。添加單車后,可以在頁面內(nèi)進行修改和刪除單車信息。管理員添加的單車信息發(fā)送到服務(wù)端在deviceAddSubmit類中進行編號是否重復的邏輯判斷,判斷后將單車信息添加到Device表中。
本系統(tǒng)采用流行的Android移動端開發(fā)和比較流行的SpringMVC框架,運用MySQL數(shù)據(jù)庫來完成系統(tǒng)的設(shè)計與開發(fā)。系統(tǒng)全面覆蓋分析了用戶的需求,最終達到了預(yù)期的效果。用戶和管理都可以使用便民自行車管理系統(tǒng)的客戶端進行操作,實現(xiàn)了城市中公共自行車方便、便捷的使用。
本系統(tǒng)通過安卓手機客戶端和互聯(lián)網(wǎng)+讓用戶可以方便快捷的進行公共自行車的使用,用戶在系統(tǒng)中可以看到附近的車輛以及通過手機掃碼開鎖。然后管理員可以方便快捷的添加、管理、維修車輛以及進行系統(tǒng)維護等操作。