黃學(xué)沛+張燕+項炬+譚馳名+陳濤
摘要:針對Android平臺提供高精度定位服務(wù),對當前比較流行的網(wǎng)絡(luò)和GPS定位進行分析和研究,提出一種高效、易用、可擴展,適用于室內(nèi)外環(huán)境的高精度位置服務(wù)平臺系統(tǒng)。基于Android手機平臺設(shè)計了一套高精度位置服務(wù)系統(tǒng),利用Android提供的各種資源建立高精度位置服務(wù)終端軟件。該系統(tǒng)既可用于各大公司和企業(yè),也可用于學(xué)校和商場,實現(xiàn)了位置服務(wù)的高度整合。結(jié)果表明:該系統(tǒng)硬件設(shè)備簡單,成本較低、系統(tǒng)可靠、易于使用和擴展。
關(guān)鍵詞:Android;WiFi定位;藍牙定位;GPS定位;圖像識別定位
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)15-0040-03
隨著移動互聯(lián)網(wǎng)技術(shù)的發(fā)展,位置服務(wù)LBS( Location BasedServices)已經(jīng)滲透到人們生活的各個方面。能夠完成精確的定位是所有位置服務(wù)系統(tǒng)運行的基礎(chǔ)?;贕PS定位的位置服務(wù)是當前室外位置服務(wù)的主要途徑,但在室內(nèi),由于無法接收到良好的GPS信號,甚至出現(xiàn)GPS信號被屏蔽的現(xiàn)象,導(dǎo)致通過GPS在室內(nèi)無法完成精確定位。
為了提高室內(nèi)定位的精度和穩(wěn)定性,學(xué)者們提出了多種基于室內(nèi)環(huán)境的定位方法,如基于移動臺的位置估計方法、 基于智能手機內(nèi)部傳感器預(yù)估移動臺移動的定位算法、多模融合算法等?;谝苿优_的位置估計方法在非視距環(huán)境下具有很大的誤差,不適用于復(fù)雜室內(nèi)環(huán)境的定位;基于智能手機內(nèi)部傳感器預(yù)估移動臺移動的方法,在理論上比較新穎,但對于移動臺的移動還是主體的移動當前還沒有一個比較好的解決辦法,因此精度不高;多模融合定位算法,是將通過多種定位介質(zhì)得到的定位結(jié)果進行融合得出最終定位結(jié)果的定位方法,可以得到較高的定位精度,但需要定位主體具備多種傳感器,不適用于廣泛的位置服務(wù)。[1]
針對以上所述文獻中方法的缺陷,本文提出了一種基于智能手機GPS/WIFI/藍牙/圖像的多維級聯(lián)綜合定位方案。此方案相較于傳統(tǒng)的GPS定位,解決了由于室內(nèi)無法接收到良好的GPS信號而導(dǎo)致定位不準確或失敗的問題。相較于現(xiàn)今人們廣泛使用的高德地圖和百度地圖使用的移動基站+網(wǎng)絡(luò)定位(GSM/2G/3G//4G/WIFI)方案,該方案增加了藍牙定位和圖像定位,對其做了有益的補充和完善。該系統(tǒng)架構(gòu)簡單,可擴展性強,適用范圍廣,具有廣闊的市場前景。
1 系統(tǒng)總體設(shè)計
文中設(shè)計的多維級聯(lián)定位系統(tǒng)主要包括Android客戶端、中央服務(wù)器位置數(shù)據(jù)庫三部分。智能手機或平板終端安裝客戶端App后,就可以通過觸屏和用戶進行交互。中央服務(wù)器則負責(zé)將手機和平板的操作指令進行計算與處理,并反饋給使用者處理后的結(jié)果。手機或平板通過WIFI或GSM/3G/4G與服務(wù)器進行通信。
本系統(tǒng)整合智能手機的WIFI功能和藍牙功能,實現(xiàn)高精度定位與導(dǎo)航服務(wù),與傳統(tǒng)定位相比,本系統(tǒng)具有精度高,可精確定位至樓層甚至門牌號,其硬件設(shè)備簡單,成本較低、系統(tǒng)可靠、易于使用和擴展。
智能手機或平板電腦通過連接WIFI與Internet建立連接,打開客戶端軟件,選擇相應(yīng)的定位服務(wù)(WIFI定位/藍牙定位/圖像識別定位/高德定位),客戶端軟件發(fā)送獲取到的周圍WIFI/藍牙/圖像信息數(shù)據(jù)給中央服務(wù)器,服務(wù)器根據(jù)客戶端傳送過來的原始定位數(shù)據(jù)進行綜合定位分析,最后將計算所得位置結(jié)果發(fā)送給手機客戶端完成一次定位服務(wù)。
2 Android客戶端軟件設(shè)計
Android客戶端控制系統(tǒng)設(shè)計主要包括用戶界面UI、HTTP通信、SQLite數(shù)據(jù)庫的設(shè)計。Android客戶端由一個或多個Android組件構(gòu)成,組件包括 activities、services、content providers、broadcast receivers 等,每個組件在應(yīng)用程序中完成不同的任務(wù),每個組件可以單獨被激活,或由其他應(yīng)用程序激活。
2.1 Android 客戶端用戶界面
Android客戶端主界面分為四個碎片(Fragment)界面,每個Fragment實現(xiàn)一個定位功能,從左至右依次是WIFI定位、藍牙定位、圖像定位和位置地圖。打開客戶端軟件首先默認進入WIFI定位Fragment,通過選擇底部Tab導(dǎo)航標簽可以進入藍牙定位/圖像定位/位置地圖功能。若使用者未打開Wlan或藍牙,在進入相應(yīng)Fragment時會提示使用者打開上述設(shè)備以繼續(xù)使用定位功能。
2.2 WIFI定位的實現(xiàn)
WiFi熱點只要通電,不管它怎么加密的,都一定會向周圍發(fā)射信號。每個WiFi熱點所發(fā)出的無線信號中包含此 WiFi 熱點的唯一全球 ID。即使目標距離此WiFi熱點比較遠,目標無法與WiFi熱點建立連接,但WiFi熱點還是可以偵聽到它的存在。江蘇電信、江蘇移動、江蘇聯(lián)通等公司鋪設(shè)的位于公共場所的WiFi熱點一般都是很少變位置的,比較固定。[2]
打開客戶端軟件默認進入WIFI定位功能界面,若Wlan尚未打開,則提示當前Wlan尚未打開。使用者可通過點擊“打開Wlan”按鈕來一鍵打開Wlan。WIFI定位的基本思路是首先通過手機客戶端獲取周圍WIFI熱點的mac地址作為特征識別碼,之前也有某些通過WIFI定位方案使用WIFI熱點的名稱來作為特征識別碼,但此種方式容易遇到無線路由器更改WIFI熱點名稱所帶來的識別碼失效問題。故選用周圍WIFI熱點的mac地址作為特征識別碼比前者更穩(wěn)定,不存在WIFI名稱改變導(dǎo)致特征識別碼失效的問題。第二步是把搜集到的周圍WIFI熱點的mac地址和rssi信號強度以及高德定位所得位置作為原始定位數(shù)據(jù)發(fā)送給中央服務(wù)器,客戶端等待中央服務(wù)器返回地址數(shù)據(jù)。中央服務(wù)器接收到客戶端發(fā)送過來的原始定位數(shù)據(jù)后,首先根據(jù)mac地址進入位置數(shù)據(jù)庫(采用Mysql數(shù)據(jù)庫存儲)查詢數(shù)據(jù)庫中是否已有當前mac地址對應(yīng)的地址信息,如果有則直接返回地址信息給客戶端;如果沒有地址信息則根據(jù)高德定位所得坐標和WIFI的rssi通過距離算法反推WIFI地址并存儲道位置數(shù)據(jù)庫。
1)將網(wǎng)絡(luò)連接封裝到HttpConnect類中以方便之后復(fù)用
public class HttpConnect {
public String httpConnect(String url, String name, String filepath) {
strBoundary = UUID.randomUUID().toString();
strChangeLine = "\r\n";strPrefix = "--";try {URL mURL = new URL(url);
HttpURLConnection mHttpURLConnection = (HttpURLConnection) mURL.openConnection();
mHttpURLConnection.setRequestMethod("POST");
mHttpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + strBoundary);
DataOutputStream mDataOutputStream = new DataOutputStream(mHttpURLConnection.getOutputStream());
mDataOutputStream.writeBytes(strPrefix + strBoundary + strChangeLine);
mDataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + filepath.substring(filepath.lastIndexOf("/") + 1) + "\"" + strChangeLine);
mDataOutputStream.writeBytes(strChangeLine);File mFile = new File(filepath);
FileInputStream mFileInputStream = new FileInputStream(mFile);
byte[] byt = new byte[1024 * 2];int len;
while ((len = mFileInputStream.read(byt)) != -1) {mDataOutputStream.write(byt, 0, len);}
mDataOutputStream.writeBytes(strChangeLine);
mDataOutputStream.writeBytes(strPrefix + strBoundary + strPrefix + strChangeLine);mDataOutputStream.flush();
mBufferedReader = new BufferedReader(new InputStreamReader(mHttpURLConnection.getInputStream()));
mStringBuffer = new StringBuffer();String str;
while ((str = mBufferedReader.readLine()) != null) {mStringBuffer.append(str);}
strHttpConnectResult = mStringBuffer.toString();
Log.d("click", "httpresut:" + strHttpConnectResult);
mDataOutputStream.close();
mFileInputStream.close();mBufferedReader.close();
mHttpURLConnection.disconnect();} catch (Exception e) {e.printStackTrace();
} return strHttpConnectResult;}
2)獲取周圍WIFI的mac地址和rssi信號強度
mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mWifiInfo = mWifiManager.getConnectionInfo();
mWifiManager.startScan();
mScanResult = mWifiManager.getScanResults();return mScanResult;
3)將獲取周圍WIFI的mac地址和rssi信號強度數(shù)據(jù)發(fā)送給中央服務(wù)器
JSONArray mJsonArraySend = new JSONArray();
JSONObject mJsonObjectSend;
for (int i = 0; i < params[0].size(); i++) {mJsonObjectSend = new JSONObject();
try {mJsonObjectSend.put("mac", params[0].get(i).getMac());} catch (JSONException e) {e.printStackTrace();}try{mJsonObjectSend.put("mdb",params[0].get(i).getMdb());} catch (JSONException e) {e.printStackTrace();}mJsonArraySend.put(mJsonObjectSend);}
4)獲取中央服務(wù)器返回的位置數(shù)據(jù)
strHttpConnectResult = HttpConnect.httpConnect("http://127.0.0.1/httptest.php", ("json=" + mJsonArraySend.toString()).getBytes());JSONArray mJsonArrayReceive = null;try {mJsonArrayReceive = new JSONArray(strHttpConnectResult);} catch (JSONException e) {e.printStackTrace();}
將解析后的數(shù)據(jù)顯示到RecycleView
for (int i = 0; i < params[0].size(); i++) {for (int k = 0; k < mJsonArrayReceive.length(); k++) {JSONObject mJsonObjectReceive = null;
try {mJsonObjectReceive = mJsonArrayReceive.getJSONObject(k);} catch (JSONException e) {e.printStackTrace();}if(params[0].get(i).getMac().equals(mJsonObjectReceive.optString("mac"))){params[0].get(i).setAddress(mJsonObjectReceive.optString("address")); params[0].get(i).setDistance(mJsonObjectReceive.optInt("distance"));break;}}}
mWifiAdapter = new WifiAdapter(getActivity(), list);
rv_wifi_wifi_location.setAdapter(mWifiAdapter);
LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); rv_wifi_wifi_location.setLayoutManager(mLinearLayoutManager);
2.3 藍牙定位的實現(xiàn)
藍牙技術(shù)屬于短距離無線通信技術(shù),是利用無線連接把固定及移動的信息設(shè)備構(gòu)成個人局域網(wǎng),從而使得設(shè)備之間低成本無線互連通信的實現(xiàn)[3]。
藍牙定位技術(shù)功耗較低,主要應(yīng)用于小范圍定位,精確度為1~3m,有中等的安全性和可靠性。藍牙設(shè)備體積小,易于集成在PDA、PC及手機中,因此很容易推廣普及。對于持有集成了藍牙功能移動終端設(shè)備的客戶,只要設(shè)備的藍牙功能開啟,藍牙室內(nèi)定位系統(tǒng)就能夠?qū)ζ溥M行位置判斷。采用該技術(shù)作室內(nèi)短距離定位時容易發(fā)現(xiàn)設(shè)備且信號傳輸不受視距的影響。相比其他幾種流行的室內(nèi)定位方法,采用低功耗藍牙4.0標準的室內(nèi)定位方法具有成本低、部署方案簡單、響應(yīng)速度快等技術(shù)特點,加之手機設(shè)備廠商對藍牙4. 0標準規(guī)范的大力推廣,因而具有更好的發(fā)展前景[4]。
打開客戶端軟件,選擇底部藍牙定位Tab進入藍牙定位Fragment,若此時未手機尚未打開藍牙,則提示使用者打開藍牙以繼續(xù)使用藍牙定位服務(wù)。使用者可以點擊“打開藍牙”按鈕一鍵開啟系統(tǒng)藍牙功能,打開藍牙之后客戶端軟件將自動搜索附近藍牙設(shè)備??蛻舳塑浖⑺阉鞯降母浇{牙設(shè)備的mac地址作為特征識別碼來標識每一臺藍牙設(shè)備,該設(shè)計相較于其他一些藍牙類軟件將藍牙名稱作為特征識別碼避免了藍牙名稱重復(fù)所帶來的標識混亂問題。客戶端軟件在后臺將搜索到的附近藍牙設(shè)備的mac地址和rssi信號強度進行算法分析,最終得出和當前智能手機的實際距離并返回數(shù)據(jù)顯示到用戶界面,
1)新建廣播接收器,獲取周圍藍牙設(shè)備的mac地址和rssi信號強度
mBroadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {mIntent = intent;
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice mBluetoothDeviceNew = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (mBluetoothDeviceNew.getBondState() != BluetoothDevice.BOND_BONDED) {
mBluetoothBean = new BluetoothBean();
mBluetoothBean.setName(mBluetoothDeviceNew.getName());
mBluetoothBean.setRssi(intent.getExtras().getString(BluetoothDevice.EXTRA_RSSI));
mBluetoothBeanList.add(mBluetoothBean);
mMyBluetoothAdapter.notifyDataSetChanged();}}
2.4 圖像識別定位的實現(xiàn)
近幾年,隨著計算機軟硬件與光電傳感器技術(shù)的迅速發(fā)展,圖像處理技術(shù)與機器視覺技術(shù)的應(yīng)用已深入航空航天、農(nóng)業(yè)、軍事、醫(yī)學(xué)等多個領(lǐng)域,在紡織行業(yè)也得到了日益廣泛的應(yīng)用,如檢測纖維混紡比,自動評判織物抗皺性、起毛起球性等級織物結(jié)構(gòu)參數(shù)識別等。其中,基于成像式傳感器的自動檢測方法研究是熱門的課題之一[5]。
打開客戶端軟件,選擇底部圖像定位Tab進入圖像定位Fragment,界面顯示相機取景框,使用者調(diào)整手機位置選取要定位的建筑物,點擊“拍照”將保存圖片數(shù)據(jù)并跳轉(zhuǎn)到圖片預(yù)覽界面,確認后點擊“確定”按鈕將圖片發(fā)送到服務(wù)器進行圖像識別,客戶端等待服務(wù)器定位結(jié)果。服務(wù)器根據(jù)特征點進行圖像識別分析得到圖像特征碼(IFC,Image feature code)。將此圖像特征碼在位置數(shù)據(jù)庫中進行位置查詢并返回查詢結(jié)果給手機客戶端,客戶端將結(jié)果顯示到用戶界面。
1)打開攝像頭,獲取手機客戶端拍照圖片
Camera.Parameters mCameraParameters = mCamera.getParameters();
mCameraParameters.setPictureFormat(ImageFormat.JPEG);
mCameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO
mCamera.setParameters(mCameraParameters);
mCamera.takePicture(null, null, mCameraPictureCallback);
mCameraPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
String childDirectoryPath = "Location" + File.separator + "Picture";
mFileOperate.createChildDirectory(childDirectoryPath);
File mPictureSaveFile = new File(mFileOperate.mPath + File.separator + childDirectoryPath + File.separator + "temp.jpg");
Bitmap mBitmapResource = BitmapFactory.decodeByteArray(data, 0, data.length);
Bitmap mBitmapToSave = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix mMatrix = new Matrix();
mMatrix.setRotate(90, mBitmapResource.getWidth() / 2, mBitmapResource.getHeight() / 2);
mBitmapToSave = Bitmap.createBitmap(mBitmapResource, 0, 0, mBitmapResource.getWidth(), mBitmapResource.getHeight(), mMatrix, true);
try {if (mPictureSaveFile.exists()) {mPictureSaveFile.delete();}
FileOutputStream mFileOutputStream = new FileOutputStream(mPictureSaveFile);
mBitmapToSave.compress(Bitmap.CompressFormat.JPEG, 50, mFileOutputStream);
mFileOutputStream.close();} catch (FileNotFoundException e) {
e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}};
2)將圖片發(fā)送到中央服務(wù)器進行圖像識別
3)將服務(wù)器返回位置數(shù)據(jù)顯示到用戶界面
2.5 3D校園重建的實現(xiàn)
基于3D建模的三維校園重建功能是本系統(tǒng)設(shè)計的最終目標。通過利用3D建模技術(shù)將校園的立體結(jié)構(gòu)構(gòu)建出來,如教學(xué)樓、學(xué)生公寓、食堂、圖書館、辦公樓、實驗樓等,每棟建筑的樓層和房間也通過3D建模技術(shù)予以重建,最終構(gòu)建出一個完整的數(shù)字三維立體校園模型。通過使用壓縮算法實現(xiàn)將數(shù)字三維立體校園模型在手機終端予以展示。
3 結(jié)束語
將完成的手機應(yīng)用軟件成功安裝, 經(jīng)反復(fù)測試,可以實現(xiàn)與服務(wù)器進行交互,資源下載與上傳均可實現(xiàn),可以通過校園微博發(fā)送與接收微博信息,通過校園導(dǎo)航實現(xiàn)校園導(dǎo)航與周邊搜索等。各功能模塊工作正常,耦合度低,符合預(yù)期設(shè)計要求。
本數(shù)字校園服務(wù)平臺系統(tǒng)兼容當前較流行的B/S架構(gòu)——瀏覽器+服務(wù)器,和其他系統(tǒng)架構(gòu)如C/S架構(gòu)相比,優(yōu)勢明顯,實現(xiàn)了跨平臺同等表現(xiàn)。同時,這種方式采用的手機App具有通用性,易于移植,能夠在帶有此類操作系統(tǒng)的智能設(shè)備上安裝和使用,市場價值高,易于推廣,本系統(tǒng)所需硬件簡單易用,穩(wěn)定可靠,大大降低了開發(fā)和維護成本,并具有良好的擴展性。
參考文獻:
[1] 趙宇,周文剛.基于智能手機的室內(nèi)定位[J].計算機應(yīng)用與軟件,2015(6):91.
[2] 鈕鑫.Wifi定位的原理及應(yīng)用方向[J].福建電腦,2015(10):136.
[3] 盧來,龍科.關(guān)于藍牙室內(nèi)無線定位系統(tǒng)的技術(shù)實現(xiàn)[J].數(shù)字技術(shù)與應(yīng)用,2015(12):70.
[4] 蘇松,胡引翠,盧光耀,等.低功耗藍牙手機終端室內(nèi)定位方法[J].測繪通報,2015(12):81-84.
[5] 黎聰,閆學(xué)娜,曾祥忠,等.應(yīng)用一維傅里葉變換的剖幅區(qū)自動識別與定位[J].紡織學(xué)報,2016(1):148.