APP下载

基于Android的多维级联定位技术的研究与实现

2016-07-04黄学沛+张燕+项炬+谭驰名+陈涛

电脑知识与技术 2016年15期

黄学沛+张燕+项炬+谭驰名+陈涛

摘要:针对Android平台提供高精度定位服务,对当前比较流行的网络和GPS定位进行分析和研究,提出一种高效、易用、可扩展,适用于室内外环境的高精度位置服务平台系统。基于Android手机平台设计了一套高精度位置服务系统,利用Android提供的各种资源建立高精度位置服务终端软件。该系统既可用于各大公司和企业,也可用于学校和商场,实现了位置服务的高度整合。结果表明:该系统硬件设备简单,成本较低、系统可靠、易于使用和扩展。

关键词:Android;WiFi定位;蓝牙定位;GPS定位;图像识别定位

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)15-0040-03

随着移动互联网技术的发展,位置服务LBS( Location BasedServices)已经渗透到人们生活的各个方面。能够完成精确的定位是所有位置服务系统运行的基础。基于GPS定位的位置服务是当前室外位置服务的主要途径,但在室内,由于无法接收到良好的GPS信号,甚至出现GPS信号被屏蔽的现象,导致通过GPS在室内无法完成精确定位。

为了提高室内定位的精度和稳定性,学者们提出了多种基于室内环境的定位方法,如基于移动台的位置估计方法、 基于智能手机内部传感器预估移动台移动的定位算法、多模融合算法等。基于移动台的位置估计方法在非视距环境下具有很大的误差,不适用于复杂室内环境的定位;基于智能手机内部传感器预估移动台移动的方法,在理论上比较新颖,但对于移动台的移动还是主体的移动当前还没有一个比较好的解决办法,因此精度不高;多模融合定位算法,是将通过多种定位介质得到的定位结果进行融合得出最终定位结果的定位方法,可以得到较高的定位精度,但需要定位主体具备多种传感器,不适用于广泛的位置服务。[1]

针对以上所述文献中方法的缺陷,本文提出了一种基于智能手机GPS/WIFI/蓝牙/图像的多维级联综合定位方案。此方案相较于传统的GPS定位,解决了由于室内无法接收到良好的GPS信号而导致定位不准确或失败的问题。相较于现今人们广泛使用的高德地图和百度地图使用的移动基站+网络定位(GSM/2G/3G//4G/WIFI)方案,该方案增加了蓝牙定位和图像定位,对其做了有益的补充和完善。该系统架构简单,可扩展性强,适用范围广,具有广阔的市场前景。

1 系统总体设计

文中设计的多维级联定位系统主要包括Android客户端、中央服务器位置数据库三部分。智能手机或平板终端安装客户端App后,就可以通过触屏和用户进行交互。中央服务器则负责将手机和平板的操作指令进行计算与处理,并反馈给使用者处理后的结果。手机或平板通过WIFI或GSM/3G/4G与服务器进行通信。

本系统整合智能手机的WIFI功能和蓝牙功能,实现高精度定位与导航服务,与传统定位相比,本系统具有精度高,可精确定位至楼层甚至门牌号,其硬件设备简单,成本较低、系统可靠、易于使用和扩展。

智能手机或平板电脑通过连接WIFI与Internet建立连接,打开客户端软件,选择相应的定位服务(WIFI定位/蓝牙定位/图像识别定位/高德定位),客户端软件发送获取到的周围WIFI/蓝牙/图像信息数据给中央服务器,服务器根据客户端传送过来的原始定位数据进行综合定位分析,最后将计算所得位置结果发送给手机客户端完成一次定位服务。

2 Android客户端软件设计

Android客户端控制系统设计主要包括用户界面UI、HTTP通信、SQLite数据库的设计。Android客户端由一个或多个Android组件构成,组件包括 activities、services、content providers、broadcast receivers 等,每个组件在应用程序中完成不同的任务,每个组件可以单独被激活,或由其他应用程序激活。

2.1 Android 客户端用户界面

Android客户端主界面分为四个碎片(Fragment)界面,每个Fragment实现一个定位功能,从左至右依次是WIFI定位、蓝牙定位、图像定位和位置地图。打开客户端软件首先默认进入WIFI定位Fragment,通过选择底部Tab导航标签可以进入蓝牙定位/图像定位/位置地图功能。若使用者未打开Wlan或蓝牙,在进入相应Fragment时会提示使用者打开上述设备以继续使用定位功能。

2.2 WIFI定位的实现

WiFi热点只要通电,不管它怎么加密的,都一定会向周围发射信号。每个WiFi热点所发出的无线信号中包含此 WiFi 热点的唯一全球 ID。即使目标距离此WiFi热点比较远,目标无法与WiFi热点建立连接,但WiFi热点还是可以侦听到它的存在。江苏电信、江苏移动、江苏联通等公司铺设的位于公共场所的WiFi热点一般都是很少变位置的,比较固定。[2]

打开客户端软件默认进入WIFI定位功能界面,若Wlan尚未打开,则提示当前Wlan尚未打开。使用者可通过点击“打开Wlan”按钮来一键打开Wlan。WIFI定位的基本思路是首先通过手机客户端获取周围WIFI热点的mac地址作为特征识别码,之前也有某些通过WIFI定位方案使用WIFI热点的名称来作为特征识别码,但此种方式容易遇到无线路由器更改WIFI热点名称所带来的识别码失效问题。故选用周围WIFI热点的mac地址作为特征识别码比前者更稳定,不存在WIFI名称改变导致特征识别码失效的问题。第二步是把搜集到的周围WIFI热点的mac地址和rssi信号强度以及高德定位所得位置作为原始定位数据发送给中央服务器,客户端等待中央服务器返回地址数据。中央服务器接收到客户端发送过来的原始定位数据后,首先根据mac地址进入位置数据库(采用Mysql数据库存储)查询数据库中是否已有当前mac地址对应的地址信息,如果有则直接返回地址信息给客户端;如果没有地址信息则根据高德定位所得坐标和WIFI的rssi通过距离算法反推WIFI地址并存储道位置数据库。

1)将网络连接封装到HttpConnect类中以方便之后复用

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信号强度数据发送给中央服务器

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)获取中央服务器返回的位置数据

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();}

将解析后的数据显示到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 蓝牙定位的实现

蓝牙技术属于短距离无线通信技术,是利用无线连接把固定及移动的信息设备构成个人局域网,从而使得设备之间低成本无线互连通信的实现[3]。

蓝牙定位技术功耗较低,主要应用于小范围定位,精确度为1~3m,有中等的安全性和可靠性。蓝牙设备体积小,易于集成在PDA、PC及手机中,因此很容易推广普及。对于持有集成了蓝牙功能移动终端设备的客户,只要设备的蓝牙功能开启,蓝牙室内定位系统就能够对其进行位置判断。采用该技术作室内短距离定位时容易发现设备且信号传输不受视距的影响。相比其他几种流行的室内定位方法,采用低功耗蓝牙4.0标准的室内定位方法具有成本低、部署方案简单、响应速度快等技术特点,加之手机设备厂商对蓝牙4. 0标准规范的大力推广,因而具有更好的发展前景[4]。

打开客户端软件,选择底部蓝牙定位Tab进入蓝牙定位Fragment,若此时未手机尚未打开蓝牙,则提示使用者打开蓝牙以继续使用蓝牙定位服务。使用者可以点击“打开蓝牙”按钮一键开启系统蓝牙功能,打开蓝牙之后客户端软件将自动搜索附近蓝牙设备。客户端软件将搜索到的附近蓝牙设备的mac地址作为特征识别码来标识每一台蓝牙设备,该设计相较于其他一些蓝牙类软件将蓝牙名称作为特征识别码避免了蓝牙名称重复所带来的标识混乱问题。客户端软件在后台将搜索到的附近蓝牙设备的mac地址和rssi信号强度进行算法分析,最终得出和当前智能手机的实际距离并返回数据显示到用户界面,

1)新建广播接收器,获取周围蓝牙设备的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 图像识别定位的实现

近几年,随着计算机软硬件与光电传感器技术的迅速发展,图像处理技术与机器视觉技术的应用已深入航空航天、农业、军事、医学等多个领域,在纺织行业也得到了日益广泛的应用,如检测纤维混纺比,自动评判织物抗皱性、起毛起球性等级织物结构参数识别等。其中,基于成像式传感器的自动检测方法研究是热门的课题之一[5]。

打开客户端软件,选择底部图像定位Tab进入图像定位Fragment,界面显示相机取景框,使用者调整手机位置选取要定位的建筑物,点击“拍照”将保存图片数据并跳转到图片预览界面,确认后点击“确定”按钮将图片发送到服务器进行图像识别,客户端等待服务器定位结果。服务器根据特征点进行图像识别分析得到图像特征码(IFC,Image feature code)。将此图像特征码在位置数据库中进行位置查询并返回查询结果给手机客户端,客户端将结果显示到用户界面。

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)将图片发送到中央服务器进行图像识别

3)将服务器返回位置数据显示到用户界面

2.5 3D校园重建的实现

基于3D建模的三维校园重建功能是本系统设计的最终目标。通过利用3D建模技术将校园的立体结构构建出来,如教学楼、学生公寓、食堂、图书馆、办公楼、实验楼等,每栋建筑的楼层和房间也通过3D建模技术予以重建,最终构建出一个完整的数字三维立体校园模型。通过使用压缩算法实现将数字三维立体校园模型在手机终端予以展示。

3 结束语

将完成的手机应用软件成功安装, 经反复测试,可以实现与服务器进行交互,资源下载与上传均可实现,可以通过校园微博发送与接收微博信息,通过校园导航实现校园导航与周边搜索等。各功能模块工作正常,耦合度低,符合预期设计要求。

本数字校园服务平台系统兼容当前较流行的B/S架构——浏览器+服务器,和其他系统架构如C/S架构相比,优势明显,实现了跨平台同等表现。同时,这种方式采用的手机App具有通用性,易于移植,能够在带有此类操作系统的智能设备上安装和使用,市场价值高,易于推广,本系统所需硬件简单易用,稳定可靠,大大降低了开发和维护成本,并具有良好的扩展性。

参考文献:

[1] 赵宇,周文刚.基于智能手机的室内定位[J].计算机应用与软件,2015(6):91.

[2] 钮鑫.Wifi定位的原理及应用方向[J].福建电脑,2015(10):136.

[3] 卢来,龙科.关于蓝牙室内无线定位系统的技术实现[J].数字技术与应用,2015(12):70.

[4] 苏松,胡引翠,卢光耀,等.低功耗蓝牙手机终端室内定位方法[J].测绘通报,2015(12):81-84.

[5] 黎聪,闫学娜,曾祥忠,等.应用一维傅里叶变换的剖幅区自动识别与定位[J].纺织学报,2016(1):148.