低功耗蓝牙开发之设备扫描

1、前言:

了解点蓝牙开发的童鞋都知道,在进行蓝牙设备的扫描以前须要开启蓝牙。不了解的童鞋能够阅读上一篇文章:蓝牙开发之开启蓝牙。成功开启设备蓝牙功能以后,咱们须要拿到周围蓝牙设备信息,这就须要使用到扫描功能。android

2、开启蓝牙扫描:

1.获取BluetoothAdapter(蓝牙适配器)

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
复制代码

2.获取BluetoothLeScanner(蓝牙扫描器)

熟悉蓝牙的童鞋应该知道,在Android 4.3(API 18)时,增长了使用BluetoothAdapter扫描低功耗蓝牙的扫描方法bluetoothAdapter.startLeScan()可是在Android 5.0(API 21)以后就废弃了,并提倡咱们使用BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback)替代,在废弃的方法里能够指定蓝牙低功耗蓝牙的UUID去指定要去扫描的设备,同时在回调方法里获取蓝牙设备信息。总之使用蓝牙扫描器扫描低功耗蓝牙设备的优势是不言而喻的,因此这里你们应该有个取舍,或者兼容到Android 4.3,不过我认为没有必要的,而且该版本设备占有率也不高。数组

言归正传,咱们首先获取蓝牙扫描器对象:bash

if (bluetoothAdapter != null) {

bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();

}复制代码

3.添加权限:

上一步骤中咱们已经说过,咱们推荐使用BLuetoothLeScanner进行低功耗蓝牙的扫描,可是使用该方法进行扫描须要模糊定位权限,因此须要在注册清单中添加:ui

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />复制代码

4.开始扫描:

使用蓝牙扫描器对象调用开始扫描方法进行扫描:spa

bluetoothLeScanner.startScan(filters, settings, callback)复制代码
说一下三个参数的含义:
  • List<ScanFilter> filters:蓝牙扫描的过滤条件,是一个ScanFilter集合,若是没有过滤条件的话能够填null;
  • ScanSettings settings:扫描配置,能够不进行任何设置,也就是new ScanSettings.Builder().build()传递一个空对象;
  • ScanCallback callback:扫描回调,用于接收扫描回调的结果和扫描失败的回调;

注意:使用该方法扫描低功耗蓝牙设备须要知足Android系统版本在Build.VERSION_CODES.LOLLIPOP以上.net

5.扫描参数解析:

(1)ScanFilter:扫描过滤条件。3d

官方API提供了多种方法添加过滤条件:code

​​

关于过滤条件这儿,我也尝试过屡次,有些过滤条件不太好使,你们有其余想法,但愿可以指正。
cdn

  1. 使用ScanFilter在扫描前将扫描规则加入,获得即为符合规则的设备信息;
  • 使用设备名进行过滤,区分大小写;
  • 使用设备Mac地址进行过滤,需严格按照原则进行;
  • 使用ServiceUuid进行过滤无效(初步缘由判断为:扫描获得的uuid集合为空);
  • 使用ServiceData进行过滤须要ServiceUuid配合ServiceData进行使用,同时配置的ServiceData为完整数据中的不可变部分;
  • 蓝牙的ServiceUuid只有四位能够修改:"0000****-0000-1000-8000-00805F9B34FB";
  • 数据均为16进制字符串转化的Byte数组;

注意:使用该方法进行过滤有些方式不太好使;对象

2.不添加过滤规则,扫描完成后代码过滤;

(2)ScanSettings :参数扫描配置类

官方API提供了多个方法:

​​

通常咱们只使用setScanMode()方法就能够,其余参数使用默认值。

该方法有三种取值:

  • SCAN_MODE_LOW_POWER:低功耗模式,默认的扫描模式,当应用不在前台时默认执行。
  • SCAN_MODE_BALANCED:平衡模式
  • SCAN_MODE_LOW_LATENCY:高频模式,前台时建议使用此模式。

6.扫描结果

咱们在开始扫描的时候使用了ScanCallback,在onScanResult(int callbackType, ScanResult result)方法里处理回调扫描到的设备信息;若是扫描失败会回调该方法onScanFailed(int errorCode)。

相关文章
相关标签/搜索