您好,根据重庆理工大学的硕士学位论文(2016年),该论文介绍了基于蓝牙技术的推送系统的设计和实现。文章分析了基于蓝牙技术的推送系统的原理,实现了以蓝牙节点、移动终端、服务器为三大模块的推送系统。实验结果表明,以蓝牙4.0设备发射信号、BluetoothAdapter扫描搜索、HttpURLConnection传输数据、JPush推送信息、Sae云平台移植组成的室内定位推送系统具有开发周期短、消息推送实时性强、稳定性好等优点。基于此构建的蓝牙技术的推送系统在室内定位方面具有很大的市场价值。

您好!推送系统的工作原理主要包括数据收集、用户画像构建、内容匹配与推荐,以及推送执行等关键步骤。

在室内环境根据所需部署一定数量的蓝牙节点AP,携带安装相应APP的移动终端进入定位区域采集各节点发出的信息。APP接收各蓝牙节点发出的设备名和信号强度等信息并将其发送至服务器端,服务器端结合室内定位算法访问离线建立的数据库从而得到终端具体位置。最后通过得到的具体位置调用第三方推送服务器完成消息的推送。

系统核心部分包括采集模块、传输模块和推送模块。而访问数据库和调用第三方推送服务器的操作都集成在服务器中。

请根据提供的内容完成内容重构,并保持段落结构:

持有相应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方法实现了核心数据的接收和处理。核心代码如下:

```java

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++;

}

//如果找到蓝牙设备

```

在onLeScan方法内部,我们可以获取到所需的设备名和信号强度值。由于Scancallback是一个循环,设备会不断地搜索来自附近的蓝牙节点发出的信息,并且不会自动关闭此扫描,因此能够在此循环中加入耗时操作,很好地解决了室内定位的耗时问题。以下是重构后的内容:

```java

if (patternfound) {

// 在这里获取所需的节点发送信息,例如设备名和信号强度值

ibeaconName = device.getName();

mrssi = rssi;

}

}

// 在onLeScan方法内部就能拿到所需的节点发送信息。由于Scancallback是一个循环,设备会不断地搜索来自附近的蓝牙节点发出的信息,并且不会自动关闭此扫描,因此能够在此循环中加入耗时操作,很好地解决了室内定位的耗时问题。

// 3传输模块

// 经过APP搜索得到的蓝牙节点的有用信息要通过联网耗时操作传输到服务器端,然后服务器根据搜索到的信息来进行相应处理。Android通过HTTP访问网络通常有两种方式:Apache的HttpClient和Java的HttpURLConnection。前者是Android SDK集成了Apache的模块,后者是Java的JDK中自带的类。尽管HttpClient更加丰富、高效,但是考虑到实时定位要多次地访问服务器,因此这里选择性能和稳定性更好的HttpURLConnection进行访问传输。核心代码如下:

// 定义访问服务器地址

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数据,并返回

return inputStream2String(connection.getInputStream());

} else {

System.out.println("请求失败");

}

```

服务器将传输来的数据结合数据库和室内定位算法进行处理,得到位置坐标,用x和y表示。根据坐标进行相应的消息推送。PUSH(推送)技术相对于PULL(拉取)技术而言,其获得信息的实时性和针对性更强,是一种由服务器主动推送消息的服务机制。实现推送的方式大致分为四类:C2DM(谷歌提供)、MQTT协议(非开源)、XMPP协议、第三方推送平台[7]。考虑到资源的可利用性以及第三方平台的逐渐成熟、免费、开发周期短等优点,选择极光推送JPush作为第三方推送服务器进行消息推送。利用JPush实现服务器向客户端推送消息需要部署两个核心点:Android端和服务器端。

以下是部署步骤:

1. Android端:导入官网提供的的推送所需jar包和3个so文件;向APP的配置文件AndroidManifest.xml中加入推送所需权限;在应用程序根目录下创建继承application的类,在其方法中加入JPushInterface.init(this)语句来初始化JPush的SDK。

2. 服务器端:导入相应jar包和3个依赖包;在服务器端写入相应逻辑。关键在于创建JPushClient对象,传入创建应用时产生的参数AppKey和Master Secret;再创建PushPayload对象,传入想传输的消息message;最后通过jpushClient.sendPush(payload)即可以通过服务器向JPush服务器推送消息,此消息再经过JPush服务器推送到客户端APP。

3. 本地服务器搭建测试和云部署:项目最初是通过搭建本地服务器进行调试,调试成功之后再将项目代码部署到云服务器上。

搭建本地服务器核心环境:使用MyEclipse10.7、MySQL5.6和TomCat7.0。在连接数据库时,请确保数据库的用户名、密码和访问端口与安装MySQL服务器中的设置一致。

测试:服务器端采用基本的MVC模式。室内定位算法拟采用基于蓝牙4.0的接近度分类室内定位算法进行实现[8-9]。这种非参数化的室内定位算法需要事先在定位范围内采集数据并放入数据库中,然后设置好数据库的连接,用TomCat启动程序即可。定位范围拟采用6 m×6 m空间,在空间内4个角布置4个蓝牙节点,客户端根据需要设置固定时间间隔访问服务器进行定位。为方便观察定位结果,将接收的信号强度值、设备名称和定位坐标分开调试并输出到服务器控制台显示。调试结果分别如图3和图4所示。其中flag作为登录和定位的标识,而返回的json作为是否访问成功的标识,结果为1表示访问成功。调试结果表明能够根据所搭建环境和拟采用的算法进行实时定位。

云部署:为了使应用能够广泛应用且不受距离限制,可以将本地服务器代码部署到云服务器上,让所有安装相应APP的用户能够通过网络获得相应服务。Sae是新浪提供的云服务器,其在国内云提供商中发展时间最长,功能相对完善,文档全面完整,且支持PHP、Python、Java等语言。

(1)工程文件上传:将本地编写好的工程文件利用MyEclipse导出war包,并确保war包名与Sae官网创建的应用名称相同(这里用bluetooth表示)。注意本地JDK版本的匹配,最好选择1.6。

(2)数据库连接配置:云服务器自带数据库服务,这与本地MySQL类似,同样可以利用JDBC进行访问。只需修改其中的用户名、密码和端口号即可。

```java

//URL中的AppName需要替换成相应的AppName

URL="jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_AppName";

USERNAME="SaeUserInfo.getAccesskey()";

PASSWORD="SaeUserInfo.getSecretkey()";

AppName="SaeUserInfo.getAppName()";

```

本系统主要由蓝牙节点、移动端APP和服务器三大部分组成,其中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技术的推送系统。该系统具有较好的稳定性和实时性,能够依赖于室内定位算法提供较准确的定位,在室内定位应用领域具有巨大的市场价值。

参考文献:

[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.

本研究主要探讨了基于移动终端的旅游信息推送服务系统的关键技术。首先,我们参考了一些相关的文献和书籍。其中包括Smith D和FRIESEN J合著的Android recipes: a problem-solution approach (Second Edition)[M],以及马昭征等人的相关研究成果。这些文献为我们提供了关于Android开发、移动终端技术以及基于HTTP的安卓与服务器交互方法等方面的知识。

在此基础上,我们详细阐述了基于移动终端的旅游信息推送服务系统的关键技术研究。首先,我们介绍了田雷等人关于基于移动终端的旅游信息推送服务系统关键技术研究所取得的成果[D]。接着,我们分析了莫倩和熊硕等人提出的基于蓝牙4.0的接近度分类室内定位算法[J]。这一算法在提高室内定位精度方面具有一定的优势。此外,我们还综述了一些国内外关于Range-free indoor positioning system using smartphone with Bluetooth capability 的研究进展[J]。

为了实现基于移动终端的旅游信息推送服务系统,我们还研究了云平台搭建的关键技术研究[J]。这一技术可以有效地提高系统的可扩展性和稳定性。最后,我们通过实际案例验证了所提出的方法的有效性[J]。

综上所述,本研究在前人的基础上,对基于移动终端的旅游信息推送服务系统的关键技术进行了深入探讨,并提出了一种有效的实现方法。这对于推动相关领域的研究和技术发展具有一定的参考价值。