前言:

之前介绍过很多蓝牙beacon、搜索、连接、通讯的文章。不过最近我发现:之前写的蓝牙广播包搜索的工程,搜索频率太慢,而且不能一直保持搜索状态。因此,这里探讨下高频蓝牙广播包扫描 —— 蓝牙BLE扫描。

注: 本文将从对比之前慢的和现在快的两个工程进行展开


1、初始化-onCreate

新的:

// Get the local Bluetooth adapter
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter(); // Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

老的:

// Register for broadcasts when a device is discovered
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, filter);
// Register for broadcasts when discovery has finished
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, filter); // Get the local Bluetooth adapter
mBtAdapter = BluetoothAdapter.getDefaultAdapter();

可见:老的是通过注册广播过滤条件BluetoothDevice.ACTION_FOUNDBluetoothAdapter.ACTION_DISCOVERY_FINISHED,来实现监听蓝牙设备扫描的发现和停止扫描事件。而mReceiver则是回调函数,接下来会介绍;新的暂时看不出啥头绪,仅仅获得bluetoothManagermBluetoothAdapter,接下来会用到。


2、开始扫描-doDiscovery

新的:

// Start device discover with the BluetoothAdapter
private void doDiscovery() {
// If we're already discovering, stop it
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
// Request discover from BluetoothAdapter
//use filter not work!!!!!!!!!!
//UUID[] uuid_arrays = new UUID[1];
//uuid_arrays[0] = ParcelUuid.fromString(UUID_SERVICE).getUuid();
//mBluetoothAdapter.startLeScan(uuid_arrays,mLeScanCallback);
//Log.d("RSSI",uuid_arrays[0].toString() + " " + UUID.randomUUID().toString());
mBluetoothAdapter.startLeScan(mLeScanCallback);
}

老的:

// Start device discover with the BluetoothAdapter
private void doDiscovery() {
// If we're already discovering, stop it
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
// Request discover from BluetoothAdapter
mBtAdapter.startDiscovery();
}

可见:区别在于一个是BLE操作、一个是普通蓝牙操作。


3、监听

新的:

// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(device_filter(device)){
//mDevicesNameVector.add(device.getName());
//mDevicesAddrVector.add(device.getAddress());
//mRSSIVector.add((short)rssi);
Log.d("RSSI",device.getAddress() + " " + device.getName() + " " + String.valueOf(rssi));
...
}
}
});
}
};

老的:

// The BroadcastReceiver that listens for discovered devices and
// changes the title when discovery is finished
//【查找蓝牙设备】
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("onReceive","OK");
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mDevicesNameVector.add(device.getName());
mDevicesAddrVector.add(device.getAddress());
short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);
mRSSIVector.add(rssi);
Log.d("RSSI",device.getName()+" "+String.valueOf(rssi));
// When discovery is finished, change the Activity title
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
setProgressBarIndeterminateVisibility(false);
if (mDevicesNameVector.size() != 0) {
Message msg = new Message();//消息
Bundle bundle = new Bundle();
bundle.clear();Log.d("onReceive","1");
msg.what = 0x01;//消息类别
bundle.putShort("msg",(short) 0);Log.d("onReceive","2");
msg.setData(bundle);Log.d("onReceive","3");
myHandler.sendMessage(msg);Log.d("onReceive","4");
}
}
}
};

可见:新的相对比较简单、可以持续不断的扫描获取(同一个设备会被不断的扫描到);老的则分为两步:第一步是每次扫描到一次新设备都会有一个FOUND事件、最后停止扫描了还有个FINISH事件,这里我在FINISH事件结束时发出一个msg来通知进行其他操作。


4、权限文件配置

新的:

<uses-permission a:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission a:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission a:name="android.permission.BLUETOOTH"/>
<uses-permission a:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-feature a:name="android.hardware.bluetooth_le" a:required="true"/>

老的:

<uses-permission a:name="android.permission.BLUETOOTH" />
<uses-permission a:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission a:name="android.permission.ACCESS_COARSE_LOCATION" />

可见: 相差不大,新的比老的多了bluetooth_le说明。


5、最后说明

当你尝试使用BLE SCAN之后,你会感觉有一种飞一般的感觉,几乎同一个设备每一秒都会被扫描到多次。拿这些高频扫描的大量数据,就可以做类似beacon、距离估算、定位等小应用了!效果会比老的scan方法要好很多~


LINKS

[1]. 本项目GITHUB链接地址

[2]. 在Linux下搭建安卓APP的开发烧写环境(makefile版)—— 在Linux上用命令行+VIM开发安卓APP

[3]. android developer TextView

[4]. android developer Vector

[5]. android developer String

[6]. android developer Formatter

[7]. android developer Matcher

[8]. android developer Pattern

[9]. 等宽字体-Android 设置字体的三种方法(TypeFace)

[10]. Android 设置TextView滑动滚动条和滑动效果


@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975

[安卓] 20、基于蓝牙BLE的广播包高频快速搜索的更多相关文章

  1. 玩转BLE(2)_使用bluepy扫描BLE的广播数据

    1. 前言 在linux平台下,bluez是一个很不错的软件,提供了很多基于命令行的测试工具,如hciconfig.hcitool.hcidump.bluetoothctl等.利用这些工具,我们可以方 ...

  2. [蓝牙] 2、蓝牙BLE协议及架构浅析&amp;&amp;基于广播超时待机说广播事件

    第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别   蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为 ...

  3. 蓝牙4.0 BLE 广播包解析

    在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进行分析.在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补 ...

  4. 一分钟读懂低功耗蓝牙(BLE)连接数据包

    一分钟读懂低功耗蓝牙(BLE)连接数据包 1.概述 BLE 连接过程中有三个重要的数据包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ. SCAN_REQ: 扫描请求,由主设备(M ...

  5. 【转】蓝牙ble app开发(三) -- 抓包

    原文网址:http://blog.csdn.net/lckj686/article/details/43156617 关于android 蓝牙app开发抓包的重要性在 android 蓝牙ble ap ...

  6. 蓝牙4.0BLE抓包(二) – 广播包解析

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播 ...

  7. 蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  8. 蓝牙BLE: 蓝牙4.0 BLE广播数据解析(转)

    BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 1. 广播模式 BLE 中有两种角色 Central 和 Per ...

  9. 微信小程序之蓝牙 BLE 踩坑记录

    前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE ...

随机推荐

  1. iOS 生成二维码

    首先先下载生成二维码的支持文件 libqrencode 添加依赖库 CoreGraphics.framework. QuartzCore.framework.AVFoundation.framewor ...

  2. mysql spider之拆库无忧

    数据库的三板斧 先上MySQL,之后再上读写分离,然后呢? 后面典型的做法是垂直拆库和水平分表. 一旦数据库拆了之后,代价就来了. 1.事务不能跨库了(少,但是很重要,可以适当改写) 2.相关的关联查 ...

  3. WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是VMware Workstation + Win8 Pro的虚拟环境, 在漫长的WPexpress_full下 ...

  4. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  5. photoshop cc 版本安装失败解决办法

    好久没有碰ps,看了下在ps版本都到cc了.忍不住也想尝试最新版本,但是安装出现了很多问题,导致我花了很多时间才搞定,现在分享给大家几点经验吧. Exit Code: Please see speci ...

  6. Codeforces 219D Choosing Capital for Treeland

    http://codeforces.com/problemset/problem/219/D 题目大意: 给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达 ...

  7. GCD 之线程死锁

    GCD 确实好用 ,很强大,相比NSOpretion 无法提供 取消任务的功能. 如此强大的工具用不好可能会出现线程死锁. 如下代码: - (void)viewDidLoad { [super vie ...

  8. 【Android】Sensor框架HAL层解读

    Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer).磁力传感器(magnetic field).方向传感器( ...

  9. WEB打印(jsp版)

    <%@ page contentType="text/html; charset=UTF-8" language="java"%> <%@in ...

  10. phpsocketclient以及server样例

    一个菜鸟朋友,突然问了我这个问题...如今稍稍有点时间,就写了一个简单的样例给他,顺便贴上来 server端: <? php /** * @author 邹颢 zouhao619@gmail.c ...