田林青,余成波,孔庆达,王艳丽
(重庆理工大学 远程测试与控制研究所,重庆市400054)
摘要:互联网和移动终端的普及推动着LBS向ILBS发展,而蓝牙与移动终端良好的契合使其成为室内定位技术的首选。分析了基于蓝牙技术的推送系统的原理,实现了以蓝牙节点、移动终端、服务器为三大模块的推送系统。实验结果表明,以蓝牙4.0设备发射信号、BluetoothAdapter扫描搜索、HttpURLConnection传输数据、JPush推送信息、Sae云平台移植组成的室内定位推送系统具有开发周期短、消息推送实时性强、稳定性好等优点。基于此构建的蓝牙技术的推送系统在室内定位方面具有很大的市场价值。
关键词:蓝牙;ILBS;信息推送
中图分类号:TP393.0文献标识码:ADOI: 10.19358/j.issn.1674 7720.2016.20.017
引用格式:田林青,余成波,孔庆达,等. 基于蓝牙技术的推送系统的设计和实现[J].微型机与应用,2016,35(20):61 64.
0引言
近几年,LBS(基于位置信息服务)技术已经在人们生活中得到广泛应用,比如通过GPS来获得位置信息。然而,互联网和移动终端的普及和发展,推动着LBS向ILBS(基于室内位置服务)过渡。一些景点、商场、博物馆、机场等公共场所需要室内定位来提供精确的位置信息,而GPS等室外定位技术由于信号在室内衰减快,不能用于室内定位。室内定位技术主要有蓝牙、ZigBee、WiFi、射频识别、超宽带等。由于蓝牙和移动终端的良好契合以及蓝牙4.0版本推出以来的低功耗、低成本、高性价比等优点,使得蓝牙技术成为移动终端室内定位技术的首选。本文基于蓝牙技术,选取蓝牙4.0设备作为信号发射节,BluetoothAdapter用来扫描搜索各节点信息,HttpURLConnection用来传输采集到的所需信息,JPush用来向终端推送消息,以及最后将本地服务器端程序部署到Sae云平台,从而完成整个推送系统的设计。
1推送系统分析
1.1推送系统工作原理
推送系统工作原理图如图1所示。在室内环境根据所需部署一定数量的蓝牙节点AP,携带安装相应APP的移动终端进入定位区域采集各节点发出的信息[1-2]。APP接收各蓝牙节点发出的设备名和信号强度等信息并将其发送至服务器端,服务器端结合室内定位算法访问离线建立的数据库从而得到终端具体位置。最后通过得到的具体位置调用第三方推送服务器完成消息的推送[3]。系统核心部分包括采集模块、传输模块和推送模块。而访问数据库和调用第三方推送服务器的操作都集成在服务器中。
1.2硬件选型
推送系统的硬件部分主要是对蓝牙发射节点的选取。蓝牙4.0是2012年最新蓝牙版本,是蓝牙3.0的升级版本,较3.0版本具有更省电、成本低、3 ms低延迟、超长有效连接距离、AES128加密等优点。与4.0以后的版本比较,4.0的优势则在于其成熟的技术已经得到广泛的应用以及具有更高的性价比,因此蓝牙4.0设备是实验首选的蓝牙发射节点。本系统采用CC2540作为核心芯片,尺寸为41×41×21(mm),采用电池CR2477(1000 mAh),采用工作时间能持续一年以上的iBeacon作为蓝牙发射节点。其能提供空旷地大于50 m以上的信号接收以及500 ms的广播频率和-0 dBm的广播功率,满足系统所需要求。产品如图2所示。通过产品表面USB接口旁边的开关即可打开设备。
2采集模块
持有相应APP的移动终端进入蓝牙节点覆盖区域,当用户打开APP并且根据用户名和密码登录成功之后便可以进行定位。而定位的触发是通过定位按钮来进行开启定位的。这样APP就会自动接收来自蓝牙节点的信息,这些信息包括UUID、NAME、RSSI、Major、Minor、MAC等。而采集模块要做的就是根据接收到的多个蓝牙节点数据,从中获得所需数据,然后将有用的数据打包以进行传输。通常的做法是利用Android四大组件之一的Broadcast Receiver[4]。先对Receiver进行注册,然后再在实例化的Receiver中根据filter过滤广播。由于实例化的Receiver是一个条件循环语句,因此便能在其内部处理多个节点发过来的信息,从而对有用数据进行整理打包。但此方法的弊端在于广播接收器本身就是一个子线程,而这个子线程持续的时间不长便会自动结束,因此不能在其中加入访问网络等耗时操作,否则子线程关闭时会强制结束在其中加入的操作。然而此系统的定位本身就是一个访问服务器的网络耗时操作,还涉及数据库的访问和消息推送,因此这种方法并不可取。
针对搜索BLE低功耗蓝牙设备,Android官方提供了一种专门扫描蓝牙设备的方法startLeScan。这种方法通过蓝牙适配器BluetoothAdapter启动,并且需要传入BluetoothAdapter.LeScanCallback类型参数,这里将其命令为Scancallback。而其内部的onLeScan方法实现了核心数据的接收和处理。核心代码如下:
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
int startByte = 2;
boolean patternfound = false;
//寻找iBeacon
while (startByte <= 5) {
if (((int) scanRecord[startByte + 2] & 0xff) == 0x02 &&((int) scanRecord[startByte + 3] & 0xff) == 0x15) {
patternfound = true;
break;
}
startByte++;
}
//如果找到蓝牙设备
if (patternfound) {
//此处限于篇幅,获得所需的设备名和信号强度值即可
ibeaconName = device.getName();
mrssi = rssi;
}
}
在onLeScan方法内部就能拿到所需的节点发送信息。由于Scancallback是一个循环,设备会不断地搜索来自附近的蓝牙节点发出的信息,并且不会自动关闭此扫描,因此能够在此循环中加入耗时操作,很好地解决了室内定位的耗时问题。
3传输模块
经过APP搜索得到的蓝牙节点的有用信息要通过联网耗时操作传输到服务器端,然后服务器根据搜索到的信息来进行相应处理。Android通过HTTP访问网络通常有两种方式:Apache的HttpClient和Java的HttpURLConnection[5]。前者是Android SDK集成了Apache的模块,后者是Java的JDK中自带的类。尽管HttpClient更加丰富、高效,但是考虑到实时定位要多次地访问服务器,因此这里选择性能和稳定性更好的HttpURLConnection进行访问传输[6]。核心代码如下:
//定义访问服务器地址
String request_url="";
//定义传输的参数,即采集模块中得到的数据
String params="";
//拼接
URL url = new URL(request_url + params);
//开启连接
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
//连接超时时限设置(根据需要设置)
connection.setConnectTimeout(5*1000);
//POST方式较GET方式更安全
connection.setRequestMethod("POST");
//表示访问网络时需要传入参数
connection.setDoInput(true);
//利用状态码判断访问服务器是否成功
if (connection.getResponseCode() == 200) {
//构造方法,传入参数。从服务器端拿到相应json数据
returninputStream2String(connection.getInputStream());
}
4推送模块
服务器将传输来的数据结合数据库和室内定位算法进行处理,得到位置坐标,此处用x和y表示,然后根据此坐标进行相应的消息推送。PUSH(推送)技术相对于PULL(拉取)技术而言,其获得信息的实时性和针对性更强,是一种由服务器主动推送消息的服务机制。实现推送的方式大致分为四类:C2DM(谷歌提供)、MQTT协议(非开源)、XMPP协议、第三方推送平台[7]。考虑到资源的可利用性以及第三方平台的逐渐成熟、免费、开发周期短等优点,选择极光推送JPush作为第三方推送服务器进行消息推送。利用JPush实现服务器向客户端推送消息需要部署两个核心点:Android端和服务器端。而这种部署方式在JPush官方文档中已经做了大致说明,现将其总结如下。
(1)Android端
①导入官网提供的的推送所需jar包和3个so文件;so文件需在main目录下新建一个名为jniLibs的文件夹用来存放,这样jar包才能通过文件名读取so文件。
②向APP的配置文件AndroidManifest.xml中加入推送所需权限;应用程序包名package应和官方创建应用时的包名一致;配置文件中name="JPUSH_APPKEY"一项的value值应该填入官网创建应用后生成的AppKey,这样JPush服务器才会根据此key值推送消息到嵌入此key值的客户端。
③在应用程序根目录下创建继承application的类,在其方法中加入JPushInterface.init(this)语句来初始化JPush的SDK。
(2)服务器端
①导入相应jar包和3个依赖包。
②在服务器端写入相应相应逻辑。关键在于创建JPushClient对象,传入创建应用时产生的参数AppKey和Master Secret;再创建PushPayload对象,传入想传输的消息message;最后通过jpushClient.sendPush(payload)即可以通过服务器向JPush服务器推送消息,此消息再经过JPush服务器推送到客户端APP。
5本地服务器搭建测试和云部署
相应逻辑和室内定位算法的实现几乎全在服务器端。服务器是收发消息的中转站,访问数据库并调用JPush推送消息。项目最初是通过搭建本地服务器进行调试,调试成功之后再将项目代码部署到云服务器上。
5.1本地服务器搭建测试
搭建:MyEclipse10.7+MySQL5.6+TomCat7.0构成本地服务器核心环境;连接数据库时注意数据库的用户名、密码和访问端口应与安装MySQL服务器中一致。
测试:服务器端逻辑采用基本的MVC模式。室内定位算法拟采用基于蓝牙4.0的接近度分类室内定位算法进行实现[8-9]。这种非参数化的室内定位算法需要事先在定位范围内采集数据并放入数据库中,然后设置好数据库的连接,用TomCat启动程序即可。定位范围拟采用6 m×6 m空间,在空间内4个角布置4个蓝牙节点,客户端根据需要设置固定时间间隔访问服务器进行定位。为方便观察定位结果,将接收的信号强度值、设备名称和定位坐标分开调试并输出到服务器控制台显示。调试结果分别如图3和图4所示。
其中flag作为登录和定位的标识,而返回的json作为是否访问成功的标识,结果为1表示访问成功。调试结果表明能够根据所搭建环境和拟采用的算法进行实时定位。
5.2云部署
应用要得到广泛的应用,其应用范围就要不受距离的限制。将本地服务器代码部署到云服务器上,让所有安装相应APP的用户能够通过网络就能获得相应服务是必然的选择[10]。Sae是新浪提供的云服务器,其在国内云提供商中发展时间最长,功能相对完善,文档全面完整,且支持PHP、Python、Java等语言。
(1)工程文件上传:将本地写好的工程文件利用MyEclipse导出war包,且war包名要和Sae官网创建的应用名称相同,这里用bluetooth表示。注意本地JDK版本的匹配,选1.6最好。
(2)数据库连接配置:云服务器自带数据库服务,这和本地MySQL类似,一样可以利用JDBC进行访问,修改其中的用户名、密码和端口号即可。
//URL中的AppName需要替换成相应的AppName
URL="jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_AppName";
USERNAME="SaeUserInfo.getAccesskey()";
PASSWORD="SaeUserInfo.getSecretkey()";
AppName="SaeUserInfo.getAppName()";
其中SaeUserInfo类需要到Sae官网去下载。代码上传后,利用Web端网页进行用户名、密码登录测试。当成功访问云服务器数据库后应该返回json格式的数据1,测试结果如图5所示。
在URL处输入所要访问的链接来检验代码是否上传成功。通过访问所传war包中的登录模块,返回json={“result”:1},结果与图3、图4中的本地服务器测试返回的json一致,因此代码上传成功。
6系统测试与效果分析
设计app,实现基本的登录、注册功能,并在登录成功后提供定位推送功能,通过登录成功界面的定位按钮进行定位。
为了更加清楚地观察收发过程核心数据的变化,设计一个界面(图6所示)作为点击定位按钮后来实时地显示蓝牙节点数据。图6中接收的数据会传输到服务器端,经过提前写好的室内定位算法并且访问数据库从而完成相应的推送(图7所示)。
推送的结果是源于对定位区域6 m×6 m的四等分。经多次定位区域内随机测试,客户端能根据终端位置变化实时地接收到推送的消息。
7结论
本文研制了一种基于蓝牙4.0技术的推送系统。该系统主要由蓝牙节点、移动端APP、服务器Server三大部分组成。并且根据系统的核心难点对各部分的关键模块做了分析,其中包括采集模块、传输模块和推送模块。最后将写好的本地服务器代码部署到云服务器,完成了整个系统的设计。经测试,该推送系统具有良好的稳定性和实时性,能够依赖于室内定位算法提供较准确的定位,在室内定位应用领域具有巨大的市场价值。
参考文献
[1] 石志京,徐铁峰,刘太君,等.基于iBeacon基站的室内定位技术研究[J].移动通信,2012,39(7):88-91.
[2] RIDA M E, Liu Fuqiang, JADI Y, et al.Indoor location position based on Bluetooth signal strength[C].2015 2nd International Conference on Information Science and Control Engineering,2015:769-773.
[3] 刘平.Android手机访问服务器的一种数据交互方法[J].通信与网络,2010,18(9):96-98.
[4] SMITH D, FRIESEN J. Android recipes:a problemsolution approach (Second Edition)[M].New York: Apress Media,2012.
[5] 马昭征.基于HTTP的安卓与服务器交互方法的实现[J].无线互联科技,2015(3):92-96,114.
[6] 李宁.Android开发完全讲义[M].北京:中国水利水电出版社,2012.
[7] 田雷.基于移动终端的旅游信息推送服务系统关键技术研究[D].杭州:浙江大学,2010.
[8] 莫倩,熊硕.基于蓝牙4.0的接近度分类室内定位算法[J].宇航计测技术,2014,34(6):66-70.
[9] LEE S W,KOO B H,JIN M G, et al. Rangefree indoor positioning system using smartphone with Bluetooth capability [J]. 2014 IEEE/ION Position, Location and Navigation Symposium, PLANS 2014, 2014:657-662.
[10] 张爱玉,周卫东,夏吉广,等.云平台搭建的关键技术研究[J]. 中国安防,2012(9):88-94.