Android BLE基础操作框架使用详解

2023-10-29

http://www.xiaoyaoyou1212.com/2016/08/28/Android-BLE%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E6%A1%86%E6%9E%B6%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/

Android BLE基础操作框架,基于回调,操作简单。其中包含扫描、连接、广播包解析、服务读写及通知等功能。

##设备扫描

使用简介

扫描包含三种方式,第一种方式是直接扫描所有设备,可以设置循环扫描,也可以设置超时时间,扫描到的设备可以添加到BluetoothLeDeviceStore中统一进行处理,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().setScanTimeout(-1).startScan(new PeriodScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {
		bluetoothLeDeviceStore.addDevice(bluetoothLeDevice);
    }
});

第二种方式是扫描指定Mac地址的设备,一般需设置超时时间,扫描到指定设备后就停止扫描,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().setScanTimeout(5000).startScan(new PeriodMacScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {

    }
});

第三种方式是扫描指定广播名的设备,同第二种方式类似,也需设置超时时间,扫描到指定设备后也会停止扫描,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().setScanTimeout(5000).startScan(new PeriodNameScanCallback() {
    @Override
    public void scanTimeout() {

    }

    @Override
    public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {

    }
});

其中扫描到的设备信息都统一放到BluetoothLeDevice中,其中包含了设备的所有信息,以下会详细讲解具体包含哪些信息。

示例图

设备连接

使用简介

连接与扫描一样也有三种方式,第一种方式是在扫描获取设备信息BluetoothLeDevice后才可使用,可设置连接超时时间,默认超时时间为10秒,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ViseBluetooth.getInstance().connect(bluetoothLeDevice, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
    
    @Override
    public void onDisconnect() {
    
    }
});

第二种方式是连接指定Mac地址的设备,该方式使用前不需要进行扫描,该方式直接将扫描和连接放到一起,在扫描到指定设备后自动进行连接,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ViseBluetooth.getInstance().connectByMac(mac, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
    
    @Override
    public void onDisconnect() {
    
    }
});

第三种方式是连接指定名称的设备,该方式与第二种方式类似,使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ViseBluetooth.getInstance().connectByName(name, false, new IConnectCallback() {
    @Override
    public void onConnectSuccess(BluetoothGatt gatt, int status) {

    }

    @Override
    public void onConnectFailure(BleException exception) {

    }
    
    @Override
    public void onDisconnect() {
    
    }
});

连接成功后就可以进行相关处理,回调已在底层做了线程切换处理,可以直接操作视图。如果知道该设备服务的UUID,可直接调用ViseBluetooth.getInstance().withUUIDString(serviceUUID, characteristicUUID, descriptorUUID);,那么在下面操作设备时就不需要传特征(BluetoothGattCharacteristic)和描述(BluetoothGattDescriptor)相关参数,如果在连接成功后一直没设置UUID,那么在操作时则需要传该参数,该内容在下文的设备操作中会详细讲解,此处就不一一讲解了。

示例图

设备详情

使用简介

DEVICE INFO(设备信息)

  • 获取设备名称(Device Name):bluetoothLeDevice.getName()
  • 获取设备地址(Device Address):bluetoothLeDevice.getAddress()
  • 获取设备类别(Device Class):bluetoothLeDevice.getBluetoothDeviceClassName()
  • 获取主要设备类别(Major Class):bluetoothLeDevice.getBluetoothDeviceMajorClassName()
  • 获取服务类别(Service Class):bluetoothLeDevice.getBluetoothDeviceKnownSupportedServices()
  • 获取配对状态(Bonding State):bluetoothLeDevice.getBluetoothDeviceBondState()

RSSI INFO(信号信息)

  • 获取第一次信号时间戳(First Timestamp):bluetoothLeDevice.getFirstTimestamp()
  • 获取第一次信号强度(First RSSI):bluetoothLeDevice.getFirstRssi()
  • 获取最后一次信号时间戳(Last Timestamp):bluetoothLeDevice.getTimestamp()
  • 获取最后一次信号强度(Last RSSI):bluetoothLeDevice.getRssi()
  • 获取平均信号强度(Running Average RSSI):bluetoothLeDevice.getRunningAverageRssi()

SCAN RECORD INFO(广播信息)

根据扫描到的广播包AdRecordStore获取某个广播数据单元AdRecord的类型编号record.getType(),再根据编号获取广播数据单元的类型描述record.getHumanReadableType()以及该广播数据单元的长度及数据内容,最后通过AdRecordUtil.getRecordDataAsString(record)将数据内容转换成具体字符串。

示例图

 

设备操作

使用简介

在操作设备前首先要保证设备已连接成功,那么在设备连接成功获取到BluetoothGatt后直接对服务的特征值UUID进行相关处理,其中特征值UUID有可读、可写、可通知、指示器四种,获取过程如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
final String unknownServiceString = getResources().getString(R.string.unknown_service);
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
final List<Map<String, String>> gattServiceData = new ArrayList<>();
final List<List<Map<String, String>>> gattCharacteristicData = new ArrayList<>();
mGattCharacteristics = new ArrayList<>();

// Loops through available GATT Services.
for (final BluetoothGattService gattService : gattServices) {
    final Map<String, String> currentServiceData = new HashMap<>();
    uuid = gattService.getUuid().toString();
    currentServiceData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
    currentServiceData.put(LIST_UUID, uuid);
    gattServiceData.add(currentServiceData);

    final List<Map<String, String>> gattCharacteristicGroupData = new ArrayList<>();
    final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
    final List<BluetoothGattCharacteristic> charas = new ArrayList<>();

    // Loops through available Characteristics.
    for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
        charas.add(gattCharacteristic);
        final Map<String, String> currentCharaData = new HashMap<>();
        uuid = gattCharacteristic.getUuid().toString();
        currentCharaData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
        currentCharaData.put(LIST_UUID, uuid);
        gattCharacteristicGroupData.add(currentCharaData);
    }

    mGattCharacteristics.add(charas);
    gattCharacteristicData.add(gattCharacteristicGroupData);
}

在获取到BluetoothGattCharacteristic后可进行如下操作:

  • 设置通知服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    ViseBluetooth.getInstance().enableCharacteristicNotification(characteristic, new IBleCallback<BluetoothGattCharacteristic>() {
        @Override
        public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
    
        }
    
        @Override
        public void onFailure(BleException exception) {
    
        }
    }, false);
    

其中最后一个参数是设置该通知是否是指示器方式,指示器方式为有应答的通知方式,在传输时更为靠谱。如果在连接成功时已经知道该设备可通知的UUID并且已经设置成功,那么此处还可以如下设置:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().enableCharacteristicNotification(new IBleCallback<BluetoothGattCharacteristic>() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
}, false);

  • 读取信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    ViseBluetooth.getInstance().readCharacteristic(characteristic, new IBleCallback<BluetoothGattCharacteristic>() {
        @Override
        public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
    
        }
    
        @Override
        public void onFailure(BleException exception) {
    
        }
    });
    

同上,如果已设置过可读的UUID,那么此处也可以通过如下方式读取信息:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().readCharacteristic(new IBleCallback<BluetoothGattCharacteristic>() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});

  • 写入数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    ViseBluetooth.getInstance().writeCharacteristic(characteristic, new byte[]{0x00,0x01,0x02}, new IBleCallback<BluetoothGattCharacteristic>() {
        @Override
        public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
    
        }
    
        @Override
        public void onFailure(BleException exception) {
    
        }
    });
    

同样,如果在连接成功时设置过可写UUID,那么此处也可以通过如下方式写入数据:

1
2
3
4
5
6
7
8
9
10
11
ViseBluetooth.getInstance().writeCharacteristic(new byte[]{0x00,0x01,0x02}, new IBleCallback<BluetoothGattCharacteristic>() {
    @Override
    public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {

    }

    @Override
    public void onFailure(BleException exception) {

    }
});

此处的数据new byte[]{0x00,0x01,0x02}为模拟数据,在使用时替换为真实数据即可,切记每次发送的数据必须在20个字节内,如果大于20字节可采用分包机制进行处理。

示例图

总结

从以上的描述中可以知道,设备相关的所有操作都统一交给ViseBluetooth进行处理,并且该类是单例模式,全局只有一个,管理很方便。使用前必须要在Application中调用ViseBluetooth.getInstance().init(this);进行初始化,在连接设备成功时会自动获得一个BluetoothGatt,在断开连接时会将该BluetoothGatt关闭,上层不用关心连接数最大为6的限制问题,只需要在需要释放资源时调用ViseBluetooth.getInstance().clear();就行,简单易用,这也正是该项目的宗旨。

感谢

在此要感谢两位作者提供的开源库https://github.com/litesuits/android-lite-bluetoothLEhttps://github.com/alt236/Bluetooth-LE-Library—Android,这两个开源库对于本项目的完成提供了很大的帮助。

本文标题:Android BLE基础操作框架使用详解

文章作者:胡伟

发布时间:2016年08月28日 - 18时13分

最后更新:2016年11月20日 - 10时08分

原始链接:http://www.xiaoyaoyou1212.com/2016/08/28/Android-BLE基础操作框架使用详解/

许可协议: "署名-非商用-相同方式共享 3.0" 转载请保留原文链接及作者。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android BLE基础操作框架使用详解 的相关文章

  • 蓝牙资讯

    苹果公司宣称 USB C 能够带来更多灵活性 现在用户可以使用手机的 USB C 接口 为 AirPods Pro 耳机盒充电 虽然苹果没有详细介绍这款耳机 但在今天的新闻稿中依然透露了一些不一样的地方 例如新款 AirPods Pro 2
  • BES2500Y之开机进TWS配对

    使用场景 刚刚烧录程序的耳机 怎么实现开机自动进TWS配对 case APP POWERON CASE NORMAL if defined BTIF EARPHONE defined EARPHONE STAY BOTH SCAN if d
  • Bluetooth 蓝牙介绍(二):低功耗蓝牙BLE协议栈

    文章目录 Physical LAYER Link LAYER 角色 地址 物理信道 Air Interface Packet PDU Advertising physical channel PDU Primary Advertising
  • 【低功耗蓝牙】⑤ 蓝牙HID协议

    摘要 本文章主要介绍了蓝牙HID协议的实现方法 基于ESP32平台实现了蓝牙键盘 蓝牙鼠标 蓝牙自拍杆和蓝牙游戏手柄等设备 是初学者学习BLE HID协议很好的参考文章 HID设备 HID Human Interface Device 人体
  • 蓝牙之九-AT命令

    AT命令用于HF协议 该命令使参考3GPP 27 007协议 以下是HFP规范 每个命令行只有一个命令 AG侧默认不回显命令 AG使用冗长的格式返回结果 以下字符将被用于AT命令和返回结果格式中
  • 蓝牙AVRCP协议解析

    在这里讨论蓝牙的AVRCP协议 要理解AVRCP 需要先了解AVCTP 我们分两个部分来进行 1 AVCTP协议 2 AVRCP协议 下面先来看AVRCp协议 一 概述 1 定义 AVCTP Audio Video Control Tran
  • JDY-19蓝牙模块介绍及主、从机调试演示

    1 关于JDY 19蓝牙模块 1 产品简介 JDY 19透传模块是基于蓝牙4 2协议标准 工作频段为2 4GHZ范围 调制方式为GFSK 最大发射功率为4db 最大发射距离40米 采用进口原装芯片设计 支持用户通过AT命令修改设备名 波特率
  • 蓝牙mesh组网-JDY-24M初步探索

    操作步骤如下 这款JDY 24M蓝牙功能强大 我主要应用其中mesh组网这个功能 mesh组网简单来说 就是组网的这几个蓝牙是可以互相通信 一一通信是通过蓝牙地址来确定的 一 配置组网 需要用到两根USB转TTL的线 JDY 24M蓝牙2个
  • 蓝牙之十一 AVRCP协议

    Profile简介 AVRCP子协议的作用是支持CT控制TG 具体来说如果手机和一个蓝牙音箱设备连接上了 那么音箱可以控制手机播放 暂停 切歌以及获得手机上播放歌曲的信息 如专辑 歌名 歌手 时长等信息 iphone对信息获取支持较为完善
  • 使用蓝牙耳机听群晖ds218play中的音乐(audio station)

    缘起 有时需要欣赏nas中的音乐而又不影响家人 有什么方法呢 思路 研究了一下 发现新版的群晖dms支持蓝牙usb蓝牙适配器 可以使用audio station播放 蓝牙耳机收听 步骤 1 购买CSR USB蓝牙适配器 2 插入ds218p
  • 【低功耗蓝牙】① 蓝牙广播数据格式分析

    摘要 本文章主要讲解了蓝牙的发展史 蓝牙信号 蓝牙广播数据的格式 最后使用ESP32芯片MicroPython固件给出了蓝牙广播的具体代码 是蓝牙初学者很好的参考资料 也可以参考下我在B站的蓝牙视频教程 ESP32教程 第二章 低功耗蓝牙B
  • Android BLE 蓝牙低功耗教程,中央BluetoothGatt和周边BluetoothGattServer的实现

    http blog csdn net wave 1102 article details 39271693 Android4 3 规范了BLE的API 但是直到目前的4 4 还有些功能不完善 在BLE协议中 有两个角色 周边 Periphe
  • Bes 充电盒协议总结

    1 开盖 上升沿信号开机 a 充电脚设成3 0 v 然后延迟160ms b 充电脚设成5v 然后延时100 ms c充电脚设成3 0 v 2 合盖 a 开5v 然后延时3s b 关5v 然后延时45ms c 发送复位pattern 0101
  • Android BLE学习笔记

    http blog csdn net xiaoyaoyou1212 article details 51854454 个人网站 http www xiaoyaoyou1212 com 欢迎吐槽围观 前言 本文主要描述Android BLE的
  • 蓝牙DA14580学习教程(附开源可编程手环/手表全套学习资料下载地址)

    DA14580学习 DA14580用来干什么 1 超长待机的智能手环 手表和其他智能穿戴设备 2 智能鼠标 键盘 遥控器 触控板 语音和手势识别控制板等 3 计步 如小米手环 活动和睡眠监测器 血压血糖心率监测器 4 多感测器运动电脑平台
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频
  • Android 蓝牙开发基本流程

    http blog csdn net q610098308 article details 45248423 此例子基于 Android demo 对于一般的软件开发人员来说 蓝牙是很少用到的 尤其是Android的蓝牙开发 国内的例子很少
  • 蓝牙设备中的Device UUID 与 Service UUID

    Device UUID也可以被称作为DeviceID Android 设备上扫描获取到的 deviceId 为外围设备的 MAC 地址 相对固定 iOS 设备上扫描获取到的 deviceId 是系统根据外围设备 MAC 地址及发现设备的时间
  • 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构

    什么是蓝牙 在开启基于蓝牙Spec v5 2的学习前 我们先了解下什么是蓝牙 蓝牙在我们日常生活中又存在哪些实际应用呢 蓝牙无线技术是一种短距离无线通信系统 其核心特性主要是以下三点 robustness 鲁棒性 抗干扰能力强 Low po
  • 【经典蓝牙 SSP协议介绍】

    协议定义 SSP Secure Simple Pairing 安全简单配对 协议目的 1 为用户简化配对过程 2 维护或提高蓝牙无线技术的安全性 安全性指两点目标 1 被动窃听保护 2 中间人 MITM 攻击保护 协议流程 下面说下我认为的

随机推荐

  • 大整数相乘的问题

    include
  • AI算力及评估

    AI 算力及评估 准备写一下关于算力相关的文档 后续补全 算力定义 算力单位 FLOPS 每秒浮点运算次数 每秒峰值速度 每秒所执行的浮点运算次数 floating point operations per second 它常被用来估算电脑
  • IDaaS 系统 ArkID 一账通内置插件:图形验证码认证因素的配置流程

    图形验证码认证因素插件功能介绍 图形验证码认证因素插件对用户认证凭证表单进行扩充 插入图形验证码并实现相关验证功能 是 IDaaS 一账通 ArkID 系统内置功能插件之一 注意 图形验证码认证因素不具有认证 注册 修改密码等功能 仅对其他
  • Flash cookie -- 本地共享对象(LOCAL SHARED OBJECTS)

    写道 本地共享对象 有时也称为 Flash cookie 是一些可由您访问的站点在您的计算机上创建的数据文件 共享对象大多数情况下用来增强您浏览 Web 的体验 网站可以在您的计算机上编写 cookie 当您下次访问该网站时 它将加载该 c
  • 29:统计字符数

    29 统计字符数 查看 提交 统计 提问 总时间限制 1000ms 内存限制 65536kB 描述 给定一个由a z这26个字符组成的字符串 统计其中哪个字符出现的次数最多 输入 输入包含一行 一个字符串 长度不超过1000 输出 输出一行
  • Mysql数据库学习&安装

    数据库相关概念 1 数据库 存储数据的仓库 数据时有组织的进行存储 DataBase 简称DB 2 数据库管理系统 管理数据库的大型软件 DataBase Management System 简称DBMS 3 SQL Structures
  • MySQL零基础入门教程!

    手把手教你入门MySQL零基础入门教程 目前MySQL已经成为最为流行的开源关系数据库系统 并且一步一步地占领了原有商业数据库的市场 可以看到Google Facebook Yahoo 网易 久游等大公司都在使用MySQL数据库 甚至将其作
  • Navicat for MySQL 安装教程

    文章目录 一 下载地址 二 安装步骤 1 解压后得到两个应用程序 2 先安装 navicat111 mysql cs x64 exe 3 再安装 PatchNavicat exe 4 安装成功后 会有成功弹框提示 5 运行Navicat 输
  • linux中python安装mysqlclient的注意事项

    在linux中需要先安装python devel和mysql devel 例如在fedora35执行中执行以下命令 sudo dnf install python3 devel sudo dnf install community mysq
  • vue 拖拽【对多个div进行操作】

    一 原理分析 onmousedown事件 var disX ev clientX oDiv offsetLeft var disY ev clientY oDiv offsetTop onmousemove事件 var l ev clien
  • code-dict:巧用枚举让字典表的管理和使用变得简单, 优雅

    巧用枚举类型来管理数据字典 文章目录 巧用枚举类型来管理数据字典 背景 数据结构表 使用枚举来管理数据字典 枚举的增强使用 枚举里加方法 枚举的优化策略 第一步优化 枚举继承接口 第二步优化 增加 Bean 存枚举值 使用享元模式存储 Be
  • 将String类型的xml转换成对象方法

    将String类型的xml转换成对象 private Object convertXmlStrToObject Class
  • STP协议(生成树协议)

    1 STP协议概述 生成树协议 spanning tree protocol 是一种工作在OSI网络模型中第二层 数据链路层 的通信协议 是一种由交换机运行的 基本应用是防止交换机冗余链路产生的环路 用于确保以太网中无环路的逻辑拓扑结构 从
  • Oracle执行计划

    Oracle执行计划 1 什么是执行计划 Oracle explain使用 3 Explain执行顺序 1 什么是执行计划 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 执行计划描述了SQL引擎为执行SQL语句进行的操作
  • 贪心算法之装箱问题(c++)

    转载于http blog csdn net c20190413 article details 77396357 装箱问题 Description 一个工厂制造的产品形状都是长方体 它们的高度都是h 长和宽都相等 一共有六个型号 他们的长宽
  • 【AI绘图】 ControlNet教程,ControlNet v1.1来了, 更新更精细的模型

    前一段时间忙其他事情了 AI绘图的介绍相对少了一点 还请各位谅解 之前比较重要的消息就是ControlNet的模型已经更新了 增加了一些新的更有趣有用的功能 当然这里再介绍一下ControlNet作用 知识再现 ControlNet是一个神
  • python学习笔记01

    注释 数据类型与输出 注释 单行注释 多行注释 运算符 整除 取余 幂 比较 不等于 逻辑运算 and or not 数据类型 int float bool 类型转换 isinstance 判断类型是否相同 int x base 10 转化
  • 【微信小程序】微信小程序阻止IOS页面上下拖动问题

    为了阻止IOS端小程序页面上下拖动可以再对应的json文件当中添加这个配置 disableScroll true 参考链接 传送门
  • 基于CGAL、Qt5两层嵌套动态链接库的Cmake实现

    1 问题由来 因需要开发了一款基于CGAL的处理三维几何的子程序 简称子程序B 该子程序B被主程序A调用 我们知道CGAL还可以调用Qt5库用于图形显示 因此为了实现这一目标 设想利用Cmake制作一个可供主程序A调用的dll 此dll可调
  • Android BLE基础操作框架使用详解

    http www xiaoyaoyou1212 com 2016 08 28 Android BLE E5 9F BA E7 A1 80 E6 93 8D E4 BD 9C E6 A1 86 E6 9E B6 E4 BD BF E7 94