Android ble理解

Android BLE 基础概念解析

核心角色:Central 与 Peripheral

BLE 通信采用不对称的客户端-服务器模型:

  1. Central(中心设备)

    • 角色:主动扫描并连接其他设备(通常是手机、平板等)
    • Android 实现:应用程序即 Central
    • 类比:商场中主动寻找店铺的顾客
  2. Peripheral(外围设备)

    • 角色:被动广播自身存在(如传感器、智能设备等)
    • Android 实现:自 API 21 起可充当 Peripheral(实现较复杂)
    • 类比:播放广告吸引顾客的商场店铺

关键点:大多数场景中,Android 手机是 Central,连接的智能设备是 Peripheral。

客户端-服务器模型

在 BLE 的 GATT 协议中:

  • 手机 (Central) = 客户端 (Client)

  • 智能设备 (Peripheral) = 服务器 (Server)

核心架构:GATT 协议

连接建立后,所有通信通过 GATT 协议进行,其分层结构如下:

  • Profile:标准应用规范(如心率监测),定义必须包含的服务
  • Service:独立功能单元(如电池服务),包含相关数据
  • Characteristic
    • 基础通信实体
    • 包含 Value(实际数据)和 Properties(操作权限)
    • 支持 READ/WRITE/NOTIFY/INDICATE 等操作
  • Descriptor
    • 特征元数据
    • 关键 CCCD 用于启用/禁用 NOTIFY/INDICATE

结构关系:Profile → Service → Characteristic → Value & Descriptor

Android BLE 关键类

类名 功能 关键操作
BluetoothAdapter 代表蓝牙硬件 蓝牙开关、设备扫描
BluetoothDevice 远端设备 connectGatt() 建立连接
BluetoothGatt 通信核心 服务发现、读写操作
BluetoothGattService GATT 服务 getCharacteristic()
BluetoothGattCharacteristic GATT 特征 读写 Value
BluetoothGattDescriptor 特征描述符 配置通知
BluetoothLeScanner 设备扫描 ScanCallback 处理结果

典型交互流程

  1. 权限检查

    • 声明 BLUETOOTH 相关权限
    • 注意 Android 各版本的权限变化
  2. 设备扫描

    • 获取 BluetoothLeScanner
    • 配置 ScanSettings/ScanFilter
    • 在 ScanCallback 中处理结果
  3. 设备连接

    • 调用 connectGatt()
    • 通过 BluetoothGattCallback 监听状态
  4. 服务发现

    • connected 状态调用 discoverServices()
    • 在 onServicesDiscovered 中处理
  5. 数据通信

    • 读/写 Characteristic
    • 开启通知: a) 启用本地通知 b) 配置 CCCD 描述符 c) 接收 onCharacteristicChanged
  6. 断开连接

    • 调用 disconnect()
    • 执行 close() 释放资源

重要注意事项

  • 所有操作均为异步执行
  • BluetoothGatt 非线程安全,建议使用操作队列
  • 注意标准 UUID 与自定义 UUID 的区别
  • 不同 Android 版本对 BLE 的支持存在差异
相关推荐
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧6 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法7 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7257 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄7 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿8 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds8 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹8 小时前
【Java基础】多态 | 打卡day2
java·开发语言