当前位置: 首页 > news >正文

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 设备交互的各种回调方法。开发者需要根据具体的业务需求,实现这些回调方法来处理连接、服务发现、数据读写等操作的结果。

相关文章:

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

BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗&#xff08;BLE&#xff09;设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析&#xff1a; 1. onConnectionStateChange 触发时机&am…...

K8S学习之基础十四:k8s中Deployment控制器概述

Deployment控制器概述&#xff1a; Deployment控制器是k8s中最常用的资源对象&#xff0c;为Replicaset和Pod创建提供了一种声明式的定义方法&#xff0c;在Deployment对象中描述一个期望的状态&#xff0c;Deployment控制器就会按照一定的控制速率把实际状态改成期望状态&…...

Vue3快速入门笔记

目录 1.Vue3简介1.1.性能提升1.2.源码升级1.3.拥抱TypeScript1.4.新特性 2.创建Vue3工程2.1.基于 vue-cli 创建2.2. 基于 vite 创建&#xff08;推荐&#xff09;2.3.代码运行 3.Vue3核心语法3.1.OptionsAPI(选项式API) 与 CompositionAPI(组合式API)3.2.setup3.3.ref 创建&…...

【LeetCode104】二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路与算法 树的最大深度可以通过其左子树和右子树的最大深度来定义。对于给定节点&#xff0c;最大深度为 1&#xff08;当前节点&#xff0…...

SQLAlchemy系列教程:理解SQLAlchemy元数据

SQLAlchemy是Python开发人员的强大ORM工具。SQLAlchemy中的元数据是对象-关系映射配置的集合&#xff0c;允许开发人员无缝地定义和使用数据库模式。 使用元数据 SQLAlchemy中的元数据充当各种数据库描述符&#xff08;如表、列和索引&#xff09;的容器。这使开发人员能够通…...

Apache Shiro 反序列化漏洞全解析(Shiro-550 Shiro-721)

一、前言 Apache Shiro 是一个强大的 Java 安全框架&#xff0c;广泛用于用户认证、授权、加密和会话管理。然而&#xff0c;由于 Shiro 在某些版本中存在反序列化漏洞&#xff0c;攻击者可以通过特定手法实现远程代码执行&#xff08;RCE&#xff09;&#xff0c;进而获取服务…...

计算机毕业设计Python+DeepSeek-R1大模型空气质量预测分析(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

实例详细演示在Pytest中如何忽略警告

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 当你尝试运行Pytest代码时&#xff0c;那些不相关的警告突然弹出&#xff0c;是不是…...

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...

mysql进阶(三)

MySQL架构和存储引擎 1. MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器 的连接器。整体架构图如下所⽰&#xff1a; 2. 连接层 …...

MySQL 架构、索引优化、DDL解析、死锁排查

私人博客传送门 MySQL 认识索引 | 魔筝炼药师 MySQL 索引优化 | 魔筝炼药师 OnlineDDL&#xff08;在 MySQL 5.7 数据库里&#xff0c;InnoDB引擎&#xff0c;执行一条DDL会发生什么事情&#xff09; | 魔筝炼药师 MySQL 死锁排查 | 魔筝炼药师...

AVM 环视拼接 鱼眼相机

https://zhuanlan.zhihu.com/p/651306620 AVM 环视拼接方法介绍 从内外参推导IPM变换方程及代码实现&#xff08;生成AVM环视拼接图&#xff09;_avm拼接-CSDN博客 经典文献阅读之--Extrinsic Self-calibration of the Surround-view System: A Weakly... (环视系统的外参自…...

【Flink银行反欺诈系统设计方案】5.反欺诈系统全生命周期设计

【Flink银行反欺诈系统设计方案】反欺诈系统全生命周期设计 概要&#xff1a;1. 事前反欺诈准备核心模块与架构&#xff1a; 2. 事中反欺诈发现与告警核心模块与架构&#xff1a; 3. 事后反欺诈事件分析核心模块与架构&#xff1a; 4. 反欺诈闭环架构设计整体技术栈&#xff1a…...

aardio - 虚表 —— 两个虚表之间互相拖动交换数据

插入到虚表末尾的方法&#xff1a; import win.ui; import godking.vlistEx; /*DSG{{*/ mainForm win.form(text"vlistEx - table adapter";right849;bottom578;border"thin") mainForm.add( radiobutton{cls"radiobutton";text"移动&qu…...

VScode 中文符号出现黄色方框的解决方法

VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处&#xff1a; 只需要打开设置搜索unicode&#xff0c;然后将这一项的勾选取消掉就可以了&#xff1a; 取消之后的效果如下&#xff1a; 另一种情况&#xff1a;中文显示出现黄色…...

LINUX网络基础 [二] - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …...

Spring统一格式返回

目录 一&#xff1a;统一结果返回 1&#xff1a;统一结果返回写法 2&#xff1a;String类型报错问题 解决方法 二&#xff1a;统一异常返回 统一异常返回写法 三&#xff1a;总结 同志们&#xff0c;今天咱来讲一讲统一格式返回啊&#xff0c;也是好久没有讲过统一格式返…...

Unity多Pass渲染与GPU Instancing深度优化指南

一、技术背景与挑战 1. 多Pass渲染的定位 多Pass渲染策略通过单个Shader中定义多个渲染阶段&#xff08;如阴影生成、光照计算、后处理等&#xff09;实现复杂视觉效果&#xff0c;但传统实现会显著增加DrawCall数量。例如标准渲染管线中&#xff0c;一个物体可能经历Base Pa…...

Redis高频面试题10个

1. Redis 的特点及与 Memcached 的区别 特点&#xff1a; 基于内存的键值数据库&#xff0c;支持持久化&#xff08;RDB/AOF&#xff09;。 单线程模型&#xff0c;通过 IO 多路复用实现高并发。 支持多种数据结构&#xff1a;字符串、哈希、列表、集合、有序集合等。 提供…...

【数据库】MySQL常见聚合查询详解

在数据库操作中&#xff0c;聚合查询是非常重要的一部分。通过聚合查询&#xff0c;我们可以对数据进行汇总、统计和分析。MySQL提供了丰富的聚合函数来满足不同的需求。本文将详细介绍MySQL中常见的40个聚合函数及其使用场景&#xff0c;并通过8个的案例展示它们的用法。 一、…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...