Android 低功率蓝牙之BluetoothGattCallback回调方法详解

BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗(BLE)设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析:

1. onConnectionStateChange

  • 触发时机:当与 BLE 设备的连接状态发生变化时触发。

  • 参数

    • gattBluetoothGatt 对象,表示当前连接的 GATT 客户端。

    • status:连接状态的变化结果,BluetoothGatt.GATT_SUCCESS 表示成功。

    • newState:新的连接状态,可能的值有 BluetoothProfile.STATE_CONNECTED 或 BluetoothProfile.STATE_DISCONNECTED

  • 常见操作

    • 连接成功后,调用 gatt.discoverServices() 开始发现服务。

    • 断开连接后,释放资源或尝试重新连接。

java

复制

@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {if (newState == BluetoothProfile.STATE_CONNECTED) {// 连接成功,开始发现服务gatt.discoverServices();} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {// 断开连接,释放资源gatt.close();}
}

2. onServicesDiscovered

  • 触发时机:当发现 BLE 设备的服务完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • status:服务发现的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 获取服务列表并查找特定的特征(Characteristic)或描述符(Descriptor)。

java

复制

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {List<BluetoothGattService> services = gatt.getServices();for (BluetoothGattService service : services) {// 处理每个服务}}
}

3. onCharacteristicRead

  • 触发时机:当读取特征值完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • characteristic:被读取的特征对象。

    • status:读取操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理读取到的特征值。

java

复制

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {byte[] data = characteristic.getValue();// 处理读取到的数据}
}

4. onCharacteristicWrite

  • 触发时机:当写入特征值完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • characteristic:被写入的特征对象。

    • status:写入操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 确认写入操作是否成功。

java

复制

@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 写入成功}
}

5. onCharacteristicChanged

  • 触发时机:当特征值发生变化时触发(通常是由于通知或指示)。

  • 参数

    • gattBluetoothGatt 对象。

    • characteristic:发生变化的特征对象。

  • 常见操作

    • 处理特征值的变化。

java

复制

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {byte[] data = characteristic.getValue();// 处理变化的数据
}

6. onDescriptorRead

  • 触发时机:当读取描述符完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • descriptor:被读取的描述符对象。

    • status:读取操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理读取到的描述符值。

java

复制

@Override
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {byte[] data = descriptor.getValue();// 处理读取到的描述符数据}
}

7. onDescriptorWrite

  • 触发时机:当写入描述符完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • descriptor:被写入的描述符对象。

    • status:写入操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 确认写入操作是否成功。

java

复制

@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 写入成功}
}

8. onReadRemoteRssi

  • 触发时机:当读取远程设备的 RSSI(信号强度)完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • rssi:读取到的 RSSI 值。

    • status:读取操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理读取到的 RSSI 值。

java

复制

@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 处理 RSSI 值}
}

9. onMtuChanged

  • 触发时机:当 MTU(最大传输单元)大小发生变化时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • mtu:新的 MTU 大小。

    • status:MTU 变化的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理 MTU 变化后的数据传输。

java

复制

@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 处理 MTU 变化}
}

10. onPhyUpdate

  • 触发时机:当物理层(PHY)更新完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • txPhy:发送端的 PHY。

    • rxPhy:接收端的 PHY。

    • status:PHY 更新的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理 PHY 更新后的通信。

java

复制

@Override
public void onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 处理 PHY 更新}
}

11. onPhyRead

  • 触发时机:当读取物理层(PHY)信息完成时触发。

  • 参数

    • gattBluetoothGatt 对象。

    • txPhy:发送端的 PHY。

    • rxPhy:接收端的 PHY。

    • status:读取操作的结果,BluetoothGatt.GATT_SUCCESS 表示成功。

  • 常见操作

    • 处理读取到的 PHY 信息。

java

复制

@Override
public void onPhyRead(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {// 处理读取到的 PHY 信息}
}

总结

BluetoothGattCallback 是 Android BLE 开发中非常重要的类,它提供了与 BLE 设备交互的各种回调方法。开发者需要根据具体的业务需求,实现这些回调方法来处理连接、服务发现、数据读写等操作的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek group-limited expert routing和负载均衡

Ref https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py GitHub - deepseek-ai/EPLB: Expert Parallelism Load Balancer DeepSeek-V3 Technical Report DeepSeek的路由方法 class Gate(nn.Module):def __init__(self, args: ModelArgs):super().__…

Python的Pandas和matplotlib库:让数据可视化贼简单

在数据爆炸的时代&#xff0c;数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言&#xff0c;拥有众多用于数据可视化的库&#xff0c;而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据&#xff0c;还具备强大的数据可视化功能&#xff0c;让我们轻…

【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现

基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM&#xff08;Influence Region Map&#xff09;通过建模障碍物的影响区域&#xff0c;量化环境中的安全风险&#xff0c;为RRT算法提供启发式引导。RRT&#xff08;Rapidly-exploring Random…

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包

用linuxdeployqt打包太麻烦&#xff0c;每次程序编译都要用linuxdeployqt打包一次&#xff0c;而且每次都要很长时间&#xff0c;通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件&#xff08;只要没有增加新模块&#xff0c;只要用一次就可以&#xff09; …

Github 2025-03-06 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-03-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Terraform:基础设施即代码的开源工具 创建周期:3626 天开发语言:Go协议类型:OtherStar数量:40393 个Fork数量:9397 次关注人数:…

redis 与 DB 的一致性 7 种策略

为什么要使用 redis 做缓存?封底估算为什么是单行数据的QPS,而不是总的? 什么时候使用DB,Redis,本地缓存 数据的分类一致性的方案1. 先清除Redis,再更新 DB2. 先更新DB,再清除 Redis使用场景: 3. 延迟删除与延迟双删使用场景 4. 监听 binlog 清除5. 双写使用场景: 6. 监听bin…

使用 Elasticsearch 进行集成测试初始化​​数据时的注意事项

作者&#xff1a;来自 Elastic piotrprz 在创建应该使用 Elasticsearch 进行搜索、数据聚合或 BM25/vector/search 的软件时&#xff0c;创建至少少量的集成测试至关重要。虽然 “模拟索引” 看起来很诱人&#xff0c;因为测试甚至可以在几分之一秒内运行&#xff0c;但它们实际…

【selenium工具操作web页面中的下拉框元素 】

使用F12定位下拉框中的元素 使用F12定位下拉框中的元素 1、有一类元素不是直接显示的页面上的&#xff0c;而是需要点击某些其他元素后才会显示在页面上&#xff0c;比如这里的下拉框。 2、这类元素会有一个特点&#xff1a;鼠标如果移开(没在元素上)&#xff0c;这些元素就会…

C++ set map 详解

文章目录 1. 容器2. set和multiset2.1 set2.1.1 构造函数2.1.2 insert和erase2.1.2.1 insert2.1.2.2 erase 2.1.3 查找和访问2.1.3.1 set迭代器相关2.1.3.2 find && count2.1.3.3 范围查找 2.2 multiset2.2.1 insert和erase2.2.2 find和count 2.3 set和multiset的在算法…

Unity网络开发基础 (2) 网络协议基础

本文章不作任何商业用途 仅作学习与交流 部分图片来自Unity唐老师 目录 1.虚拟模型 2.实际模型 TCP/IP 3.传输层协议 TCP/UDP TCP 协议详解 1. 核心机制 2. 头部格式&#xff08;20 字节最小&#xff09; UDP 协议详解 1. 核心特点 2. 头部格式&#xff08;固定 8 字节…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

JDBC、MyBatis 、MyBatis-Plus面试总结(一)

以下为你整理了一些 MyBatis 和 MyBatis-Plus 中 mapper.xml 相关的常见面试问题及答案&#xff1a; 基础概念类 问题 1&#xff1a;什么是 mapper.xml 文件&#xff0c;它在 MyBatis 中有什么作用&#xff1f; 答案&#xff1a;mapper.xml 文件是 MyBatis 中用于定义 SQL 语…

GCC RISCV 后端 -- GCC Passes 注释

在前面文章提到&#xff0c;当GCC 前端完成对C源代码解析完成后&#xff0c;就会使用 处理过程&#xff08;Passes&#xff09;机制&#xff0c;通过一系列的处理过程&#xff0c;将 GENERIC IR 表示的C程序 转步转换成 目标机器的汇编语言。过程描述如下图所示&#xff1a; 此…

基于Python实现的智能旅游推荐系统(Django)

基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页&#xff0c;旅游资讯&#xff0c;景点信息…

鸿蒙全栈开发 D2

课程目标 掌握ArkTS基础语法与核心概念理解声明式UI开发范式能独立开发简单鸿蒙应用组件建立规范的代码编写习惯 第一部分&#xff1a;初识ArkTS 1.1 语言全景认知 #mermaid-svg-V5mnjQN3DAHkfoBo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size…

【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践

YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档&#xff1a; 单机&#xff08;主备&#xff09;部署 | YashanDB Doc 另外还参考摩天轮文章&#xff1a; YashanDB 23.2.9.101 企业版安装步骤抢先看&#xff01; - 墨天轮 …

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】

闲话系列&#xff1a;每日一题&#xff0c;秃头有我&#xff0c;Hello&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;,我是IF‘Maxue&#xff0c;欢迎大佬们来参观我写的蓝桥杯系列&#xff0c;我好久没有更新博客了&#xff0c;因为up猪我寒假用自己的劳动换了…

爬虫Incapsula reese84加密案例:Etihad航空

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…

缓存雪崩 缓存击穿 缓存穿透

1. redis使用场景-缓存-缓存穿透 在实际开发中&#xff0c;Redis 被广泛应用于缓存&#xff0c;以提高系统性能和响应速度。然而&#xff0c;在使用缓存时&#xff0c;需要注意一些问题&#xff0c;其中 缓存穿透 是一个常见且需要重点关注的场景。 什么是缓存穿透 ● 缓存穿…

【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文

🍋改进模块🍋:多尺度大核注意力机制(MLKA) 🍋解决问题🍋:MLKA模块结合多尺度、门控机制和空间注意力,显著增强卷积网络的模型表示能力。 🍋改进优势🍋:超分辨的MLKA模块对小目标和模糊目标涨点很明显 🍋适用场景🍋:小目标检测、模糊目标检测等 🍋思路…