Android 蓝牙BLE开发完全指南

Android 蓝牙BLE开发完全指南

如果你想开发一款能够与周围的蓝牙BLE设备通信的Android应用程序,那么你需要了解如何使用Android提供的Bluetooth Low Energy(BLE)API。本指南将帮助你快速入门BLE开发,并通过两个示例,详细介绍如何使用Android BLE API建立连接、搜索设备、读写数据等操作。

基础概念

BLE简介

Bluetooth Low Energy(BLE),又称为Bluetooth LE、Bluetooth Smart,是一种低功耗的蓝牙协议,用于连接需要节省能源的设备(如智能手表、健康设备等)。BLE设备的最大特点就是低功耗,因此它是智能家居、物联网、移动设备等领域非常重要的技术。

BLE架构

BLE协议栈通常由三个层次构成:应用程序层、核心协议层以及物理层。其中,核心协议层是BLE协议栈的核心部分,主要完成设备的发现、连接、读写等工作。

BLE UUID

UUID(Universally Unique Identifier)是用于唯一标识蓝牙BLE设备及其服务和特征的标识符。一个BLE设备可能包含多个服务和特征,每个服务或特征都有一个唯一的UUID。

BLE GATT

GATT(Generic Attribute Profile)是针对BLE设备的数据交换协议。GATT的基本概念包括服务、特征、描述符等。服务代表一个功能模块,特征则表示一个服务内的数据单元,描述符则用于描述某个特征的属性。

Android BLE API

BLE API概述

Android 4.3以上版本提供了蓝牙低功耗(BLE)API,使得Android应用程序可以直接与BLE设备通信。BLE API包含BluetoothManager、BluetoothAdapter、BluetoothDevice、BluetoothGatt等类,通过这些类可以完成BLE设备的搜索、连接、读写等操作。

BLE权限

在使用BLE API时,需要在AndroidManifest.xml文件中添加蓝牙权限:

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

获取BluetoothManager和BluetoothAdapter对象

在使用BLE API之前,首先需要获取BluetoothManager和BluetoothAdapter对象。获取BluetoothManager对象的方法如下:

final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

然后可以通过BluetoothManager对象获取BluetoothAdapter对象:

final BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();

搜索BLE设备

使用BluetoothAdapter.startLeScan()方法可以搜索周围的BLE设备并返回它们的BluetoothDevice对象。

bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
        // 处理搜索到的设备
    }
});

在搜索到设备后,可以使用BluetoothDevice.getName()方法获取设备名称,使用BluetoothDevice.getAddress()方法获取设备MAC地址。

建立连接

建立BLE连接需要首先获取BluetoothDevice对象,然后使用该对象的connectGatt()方法建立Gatt连接。

BluetoothGatt gatt = device.connectGatt(context, false, gattCallback);

在建立连接时,需要传入一个BluetoothGattCallback对象,该对象会在连接状态变化、服务发现、特征读写等事件发生时被回调。

发现服务

在BLE连接建立成功后,需要使用BluetoothGatt.discoverServices()方法发现BLE设备中的服务。

gatt.discoverServices();

在服务发现成功后,会回调BluetoothGattCallback.onServicesDiscovered()方法。

@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
    if(status == BluetoothGatt.GATT_SUCCESS){
        // 处理发现的服务
    }
}

收发数据

收发BLE数据主要通过BluetoothGattCharacteristic对象实现,在发现设备的服务和特征后,可以使用BluetoothGatt.readCharacteristic()方法读取数据,使用BluetoothGatt.writeCharacteristic()方法写入数据。

BluetoothGattCharacteristic characteristic = gattCharacteristic.getService().getCharacteristic(UUID);
gatt.readCharacteristic(characteristic);
gatt.writeCharacteristic(characteristic);

在数据读写完成后,会回调BluetoothGattCallback.onCharacteristicRead()或BluetoothGattCallback.onCharacteristicWrite()方法。

示例一

接下来我们通过一个简单的BLE操作示例来说明如何实现BLE设备的搜索、连接、读写。

  1. 搜索BLE设备
bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
        if(device.getName().equals("BLE设备名称")){
            bluetoothAdapter.stopLeScan(this);
            connect(device);
        }
    }
});
  1. 连接BLE设备
BluetoothGatt gatt;

private void connect(BluetoothDevice device){
    gatt = device.connectGatt(context, false, gattCallback);
}

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
    @Override
    public void onConnectionStateChange(final BluetoothGatt gatt, int status, int newState){
        if(newState == BluetoothProfile.STATE_CONNECTED){
            gatt.discoverServices();
        } else if(newState == BluetoothProfile.STATE_DISCONNECTED){
            gatt.close();
        }
    }
};
  1. 发现服务
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
    if(status == BluetoothGatt.GATT_SUCCESS){
        BluetoothGattService service = gatt.getService(UUID_SERVICE);
        BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
        gatt.setCharacteristicNotification(characteristic, true);
    }
}
  1. 读取/写入数据
@Override
public void onCharacteristicRead(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        byte[] data = characteristic.getValue();
        // 处理读取到的数据
    }
}

public void writeData(byte[] data){
    BluetoothGattService service = gatt.getService(UUID_SERVICE);
    BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
    characteristic.setValue(data);
    gatt.writeCharacteristic(characteristic);
}

示例二

这个示例通过一个心率监测器来说明如何使用BLE API与BLE设备通信。

  1. 搜索心率监测器
bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
        if(device.getName().equals("Heart Rate Monitor")){
            bluetoothAdapter.stopLeScan(this);
            connect(device);
        }
    }
});
  1. 连接心率监测器
BluetoothGatt gatt;

private void connect(BluetoothDevice device){
    gatt = device.connectGatt(context, false, gattCallback);
}

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
    @Override
    public void onConnectionStateChange(final BluetoothGatt gatt, int status, int newState){
        if(newState == BluetoothProfile.STATE_CONNECTED){
            gatt.discoverServices();
        } else if(newState == BluetoothProfile.STATE_DISCONNECTED){
            gatt.close();
        }
    }
};
  1. 发现服务
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
    if(status == BluetoothGatt.GATT_SUCCESS){
        BluetoothGattService service = gatt.getService(UUID_SERVICE);
        BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
        gatt.setCharacteristicNotification(characteristic, true);
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID_DESCRIPTOR);
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        gatt.writeDescriptor(descriptor);
    }
}
  1. 接收心率数据
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    if (UUID_CHARACTERISTIC.equals(characteristic.getUuid())) {
        byte[] data = characteristic.getValue();
        int flags = data[0] & 0xFF;
        int format = (flags & 0x01) == 0 ? BluetoothGattCharacteristic.FORMAT_UINT8 : BluetoothGattCharacteristic.FORMAT_UINT16;
        int heartRate = characteristic.getIntValue(format, 1);
        // 处理心率数据
    }
}

FQA

什么是支持BLE的Android设备?

Android 4.3以上版本支持BLE API,但即使设备支持BLE,也有可能会遇到兼容性问题。因此,在开发使用BLE的应用程序前需要了解设备的具体BLE特性。

为什么我搜索不到BLE设备?

搜索BLE设备需要打开蓝牙,并且设备的蓝牙需要处于可检测状态。如果搜索BLE设备时不成功,请确认蓝牙是否已经打开,并且设备是否处于可检测状态。

如何重新连接已连接的BLE设备?

通过调用BluetoothDevice.connectGatt()方法并传递false作为autoConnect参数可以重新连接已连接的BLE设备。另外,也可以使用BluetoothGatt.connect()方法重新连接。

如何处理蓝牙连接中断?

BLE设备的连接可能会由于信号中断、蓝牙关闭等原因而中断。当连接中断时,Android会回调BluetoothGattCallback.onConnectionStateChange()方法,并发送一个断开连接的广播。在收到此广播后,应用程序可以尝试重新连接设备。

结论

本指南介绍了如何使用Android BLE API进行BLE设备的搜索、连接、读写数据等操作。通过这些API,我们可以轻松地与BLE设备通信,并将BLE技术应用到各种智能设备中,为用户提供更好的产品和服务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 蓝牙BLE开发完全指南 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 飞信的CMD命令行接口批量发送信息

    下面是飞信的CMD命令行接口批量发送信息的攻略。 1. 准备工作 首先,需要准备以下工具和材料: 飞信账号:需要一个已注册的飞信账号 飞信电脑版或手机版:需要先登录飞信电脑版或手机版,获取Cookie和Token等信息 CMD命令行工具:可以使用Windows自带的CMD或者其他第三方工具,如Git Bash等 Python环境:需要安装Python3,并安…

    other 2023年6月26日
    00
  • vue中如何使用ztree

    以下是关于“Vue中如何使用zTree”的完整攻略,包括zTree的安装、使用和两个示例等。 zTree的安装 zTree是一基于jQuery的树形插件,可以用于创建树形结构的网页。Vue中使用zTree需要先安装zTree插件。 安装zTree 可以使用以下命令安装zTree插件: npm install ztree –save zTree的使用 在Vu…

    other 2023年5月7日
    00
  • Android 本地广播和强制下线功能的实现代码

    下面是关于“Android 本地广播和强制下线功能的实现代码”的完整攻略。 Android 本地广播实现代码 Android 本地广播可以帮助我们在应用内部传递消息,而不必担心其它应用会接收到这些消息。以下是实现本地广播的步骤: 1. 创建广播接收器 public class LocalBroadcastReceiver extends BroadcastR…

    other 2023年6月27日
    00
  • apt-get更换源

    以下是关于“apt-get更换源”的完整攻略,包括定义、更换步骤、示例说明和注意事项。 定义 Linux系统中,apt-get是一个常用的软件包管理工具。默认情况下,apt-get使用官方来下载软件包。但是,时候官方源的下载速度较慢,或者某些软件包在官方源中不可用在这种情况下,可以更换apt-get的源,以便更快地下载软件或者下载到所需的软件包。 更步骤 更…

    other 2023年5月8日
    00
  • 路由器怎么看IP地址 TP-Link路由器查看IP地址的方法图解

    路由器怎么看IP地址 TP-Link路由器查看IP地址的方法图解 1. 登录路由器管理界面 首先,我们需要登录到TP-Link路由器的管理界面。通常情况下,您可以通过以下步骤完成登录: 打开您的Web浏览器(如Chrome、Firefox等)。 在浏览器的地址栏中输入路由器的默认IP地址。通常情况下,TP-Link路由器的默认IP地址为192.168.0.1…

    other 2023年7月30日
    00
  • 飞卢小说如何查看版本号?飞卢小说查看版本号方法

    飞卢小说如何查看版本号攻略 飞卢小说是一款非常受欢迎的小说阅读应用程序。如果你想要查看飞卢小说的版本号,可以按照以下步骤进行操作: 打开飞卢小说应用程序:在你的手机或平板电脑上找到飞卢小说应用程序的图标,并点击打开。 进入设置页面:在飞卢小说的主界面上,通常会有一个设置图标,一般是一个齿轮或者一个三个点的图标。点击这个图标,进入设置页面。 查找版本信息:在设…

    other 2023年8月3日
    00
  • xml与Java对象的转换详解

    XML与Java对象的转换详解 1. 引言 XML(可扩展标记语言)是一种用于存储和交换数据的标记语言,它具有通用性和可读性的特点。在Java开发中,我们经常需要将XML与Java对象进行相互转换,以便在不同的系统或组件之间传输数据。本攻略将详细介绍如何实现XML与Java对象之间的转换。 2. XML转Java对象 使用DOM解析器解析XML DOM解析器…

    other 2023年6月28日
    00
  • Android动态加载Activity原理详解

    Android动态加载Activity原理详解 动态加载Activity是指在程序运行的时候动态地加载一个Activity。相比于静态加载,动态加载更加灵活,可以在运行时根据需要来加载Activity,提高了程序的扩展性和自由性。本文将详细介绍Android动态加载Activity的原理及实现方法。 动态加载Activity的原理 Android动态加载Ac…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部