基于fastble的蓝牙开发

本文介绍了基于FastBle的蓝牙开发流程,包括声明权限、初始化配置、扫描外围设备、连接与断开设备,以及GATT协议和数据通信。FastBle提供了扫描、连接、读写数据等功能,适用于Android平台的蓝牙BLE开发。
摘要由CSDN通过智能技术生成

FastBle的Github项目地址在这,大家可以看看:[FastBle - GitHub]
https://github.com/Jasonchenlijian/FastBle

它的文档也相对比较完整,大家可以查看官方文档来使用它:https://github.com/Jasonchenlijian/FastBle/wiki

FastBle的使用

1.1 声明权限

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

android.permission.BLUETOOTH : 这个权限允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;
android.permission.BLUETOOTH_ADMIN : 这个权限允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作;
android.permission.ACCESS_COARSE_LOCATION和android.permission.ACCESS_FINE_LOCATION:Android 6.0以后,这两个权限是必须的,蓝牙扫描周围的设备需要获取模糊的位置信息。这两个权限属于同一组危险权限,在清单文件中声明之后,还需要再运行时动态获取。

1.2. 初始化及配置

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    BleManager.getInstance().init(getApplication());
    BleManager.getInstance()
            .enableLog(true)
            .setReConnectCount(1, 5000)
            .setOperateTimeout(5000);
}

在使用之前,需要事先调用初始化init(Application app)方法。此外,可以进行一些自定义的配置,比如是否显示框架内部日志,重连次数和重连时间间隔,以及操作超时时间。

1.3. 扫描外围设备

APP作为中心设备,想要与外围硬件设备建立蓝牙通信的前提是首先得到设备对象,途径是扫描。在调用扫描方法之前,你首先应该先处理下面的准备工作。

判断当前Android设备是否支持BLE。
Android 4.3以后系统中加入了蓝牙BLE的功能。

BleManager.getInstance().isSupportBle();
判断当前Android设备的蓝牙是否已经打开。
可以直接调用下面的判断方法来判断本机是否已经打开了蓝牙,如果没有,向用户抛出提示。

BleManager.getInstance().isBlueEnable();
主动打开蓝牙。
除了判断蓝牙是否打开给以用户提示之外,我们也可以通过程序直接帮助用户打开蓝牙开关,打开方式有这几种:
方法1:通过蓝牙适配器直接打开蓝牙。

BleManager.getInstance().enableBluetooth();

方法2:通过startActivityForResult引导界面引导用户打开蓝牙。

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, 0x01);

需要注意的是,第一种方法是异步的,打开蓝牙需要一段时间,调用此方法后,蓝牙不会立刻就处于开启状态。如果使用此方法后紧接者就需要进行扫描,建议维护一个阻塞线程,内部每隔一段时间查询蓝牙是否处于开启状态,外部显示等待UI引导用户等待,直至开启成功。使用第二种方法,会通过系统弹出框的形式引导用户开启,最终通过onActivityResult的形式回调通知是否开启成功。

6.0及以上机型动态获取位置权限。
蓝牙打开之后,进行扫描之前,需要判断下当前设备是否是6.0及以上,如果是,需要动态获取之前在Manifest中声明的位置权限。

配置扫描规则
扫描规则可以配置1个或多个,也可以不配置使用默认(扫描10秒)。扫描的时候,会根据配置的过滤选项,对扫描到的设备进行过滤,结果返回过滤后的设备。扫描时间配置为小于等于0,会实现无限扫描,直至调用BleManger.getInstance().cancelScan()来中止扫描。

  BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
          .setServiceUuids(serviceUuids)      // 只扫描指定的服务的设备,可选
          .setDeviceName(true, names)         // 只扫描指定广播名的设备,可选
          .setDeviceMac(mac)                  // 只扫描指定mac的设备,可选
          .setAutoConnect(isAutoConnect)      // 连接时的autoConnect参数,可选,默认false
          .setScanTimeOut(10000)              // 扫描超时时间,可选,默认10秒
          .build();
  BleManager.getInstance().initScanRule(scanRuleConfig);

以上准备工作完成后,就可以开始进行扫描。

 BleManager.getInstance().scan(new BleScanCallback() {
      @Override
      public void onScanStarted(boolean success) {
      }
 
      @Override
      public void onLeScan(BleDevice bleDevice) {
      }
 
      @Override
      public void onScanning(BleDevice bleDevice) {
      }
 
      @Override
      public void onScanFinished(List<BleDevice> scanResultList) {
      }
  });

onScanStarted(boolean success): 会回到主线程,参数表示本次扫描动作是否开启成功。由于蓝牙没有打开,上一次扫描没有结束等原因,会造成扫描开启失败。
onLeScan(BleDevice bleDevice):扫描过程中所有被扫描到的结果回调。由于扫描及过滤的过程是在工作线程中的,此方法也处于工作线程中。同一个设备会在不同的时间,携带自身不同的状态(比如信号强度等),出现在这个回调方法中,出现次数取决于周围的设备量及外围设备的广播间隔。
onScanning(BleDevice bleDevice):扫描过程中的所有过滤后的结果回调。与onLeScan区别之处在于:它会回到主线程;同一个设备只会出现一次;出现的设备是经过扫描过滤规则过滤后的设备。
onScanFinished(List scanResultList):本次扫描时段内所有被扫描且过滤后的设备集合。它会回到主线程,相当于onScanning设备之和。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在安卓FastBle中搜索特定蓝牙设备,可以采用以下步骤: 1. 扫描周围蓝牙设备 ``` BleManager.getInstance().scan(new BleScanCallback() { @Override public void onScanStarted(boolean success) { // 扫描开始 } @Override public void onLeScan(BleDevice bleDevice) { // 扫描到蓝牙设备 } @Override public void onScanning(BleDevice bleDevice) { // 正在扫描蓝牙设备 } @Override public void onScanFinished(List<BleDevice> scanResultList) { // 扫描结束 } }); ``` 2. 配置要搜索的蓝牙设备的过滤条件 ``` ScanFilter scanFilter = new ScanFilter.Builder() .setDeviceName("你要搜索的蓝牙设备名称") .build(); List<ScanFilter> scanFilterList = new ArrayList<>(); scanFilterList.add(scanFilter); ``` 其中,"你要搜索的蓝牙设备名称" 需要替换成你要搜索的特定蓝牙设备的名称。 3. 应用过滤条件进行搜索 ``` BleManager.getInstance().scan(scanFilterList, new BleScanCallback() { @Override public void onScanStarted(boolean success) { // 扫描开始 } @Override public void onLeScan(BleDevice bleDevice) { // 扫描到符合过滤条件的蓝牙设备 } @Override public void onScanning(BleDevice bleDevice) { // 正在扫描符合过滤条件的蓝牙设备 } @Override public void onScanFinished(List<BleDevice> scanResultList) { // 扫描结束 } }); ``` 其中,如果你要搜索的特定蓝牙设备的名称不唯一,可以使用设备的MAC地址(即设备的硬件地址)进行过滤,例如: ``` ScanFilter scanFilter = new ScanFilter.Builder() .setDeviceAddress("你要搜索的蓝牙设备MAC地址") .build(); ``` 其中,"你要搜索的蓝牙设备MAC地址" 需要替换成你要搜索的特定蓝牙设备的MAC地址。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值