Android 与BLE设备通讯

本文介绍了Android从4.3版本开始支持的BLE低功耗蓝牙通信。内容包括BLE的基本介绍,如何在AndroidManifest.xml中声明权限,初始化BluetoothAdapter,打开蓝牙,扫描和连接设备,发现并读写服务的详细步骤,以及断开连接的方法。文中强调了连接管理和资源释放的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本介绍

BLE全称Bluetooth Low Energy即低功耗蓝牙。

Android 4.3(API Level 18)开始引入核心功能并提供了相应的 API, 应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。

Android BLE 使用的蓝牙协议是 GATT 协议,有关该协议的详细内容可以参见官方文档

 
 
 

Service

一个低功耗蓝牙设备可以定义许多 Service, Service 可以理解为一个功能的集合。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。所有的蓝牙技术联盟定义UUID共用了一个基本的UUID: 0x0000xxxx-0000-1000-8000-00805F9B34FB 为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为: 0x00002A37-0000-1000-8000-00805F9B34FB

Characteristic

在 Service 下面,又包括了许多的独立数据项,我们把这些独立的数据项称作 Characteristic。同样的,每一个 Characteristic 也有一个唯一的 UUID 作为标识符。在 Android 开发中,建立蓝牙连接后,我们说的通过蓝牙发送数据给外围设备就是往这些 Characteristic 中的 Value 字段写入数据;外围设备发送数据给手机就是监听这些 Charateristic 中的 Value 字段有没有变化,如果发生了变化,手机的 BLE API 就会收到一个监听的回调。

Android BLE API 简介

BluetoothAdapter BluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。

BluetoothDevice 代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。

BluetoothGatt 这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。

BluetoothGattService 这一个类通过 BluetoothGatt#getService 获得,如果当前服务不可见那么将返回一个 null。这一个类对应上面说过的 Service。我们可以通过这个类的 getCharacteristic(UUID uuid) 进一步获取 Characteristic 实现蓝牙数据的双向传输。

BluetoothGattCharacteristic 这个类对应上面提到的 Characteristic。通过这个类定义需要往外围设备写入的数据和读取外围设备发送过来的数据。

二、开始使用

1.声明权限,在AndroidManifest.xml里面声明:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
在API21(Android5.0)之后还需要加:

<uses-feature android:name="android.hardware.location.gps" />
在Android6.0以后还需要加:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
好了,权限声明完成就到了我们的代码环节

2.初始化BluetoothAdapter

private BluetoothAdapter mAdapter;
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mAdapter = bluetoothManager.getAdapter();

3.如果蓝牙没有打开先打开蓝牙

if (mAdapter == null || !mAdapter.isEnabled()) {
    // 弹对话框的形式提示用户开启蓝牙
    startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);  
}

4.扫描设备

扫描设备有两种,一种是过滤特别的服务扫描,一种是全部扫描

下面代码演示全部扫描

mAdapter.startLeScan(mLeScanCallback); // 开始扫描

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

   @Override
   public void onLeScan(final BluetoothDevice device, int rssi,
         byte[] scanRecord) {    
Log.i("扫描到",device.getName()+"rssi"+rssi);
}};
停止扫描

mAdapter.stopLeScan(mLeScanCallback);   // 停止扫描

5.连接GATT服务端

连接蓝牙设备可以通过 BluetoothDevice#ConnectGatt 方法连接,也可以通过 BluetoothGatt#connect 方法进行重新连接。以下分别是两个方法的官方说明:

BluetoothDevice#connectGatt
BluetoothGatt   connectGatt(Context context, boolean autoConnec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值