Android-蓝牙ble(介绍篇)

本章关键:蓝牙发展史蓝牙ble蓝牙ble工作流程

前言

从2021年到现在,从事android iot边缘开发工程师3年了。刚进公司的时候,主要接触的模块就是蓝牙ble,也是通过入手ble相关的知识点,慢慢的深入理解了何谓iot、何谓边缘计算、何谓通讯协议。这里非常感谢我的同事hackill 老板,在我进公司的时候带我了解公司的生态,给我科普iot相关的知识,尤其是蓝牙。 很多开发同学在开发的时候,会接触蓝牙的相关开发工作,但是一开始可能有点不知道怎么入手。写这篇文章,一来是对自己这几年工作的总结,二来也希望能帮到有蓝牙开发需要的同事。

蓝牙的概念梳理

首先,我们日常生活中,提到的蓝牙包括蓝牙手表、蓝牙耳机、蓝牙音箱等等。这里的蓝牙是一个统称,只要是应用了蓝牙协议通信的设备,我们都称之为蓝牙。蓝牙是一种通信协议,是一种无线通信技术标准,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波无线电波,经由2.4至2.485 GHz的ISM频段来进行通信。跟我们通常使用的wifi、lan、zigbee的通道是一样的。蓝牙目前遍布了我们生活的方方面面。

蓝牙的发展史

蓝牙发展经历了很多年,从蓝牙1.0到现在最新的蓝牙5.0,从蓝牙的传输速率、传输距离、功耗、安全性等等都有了极大的提高和完善。 从第一代到第五代蓝牙技术的特性和变化见下图:

蓝牙版本 发布年份 特性与改进
1.0 1994 初始版本,存在互不兼容问题,传输速率约748~810kbps,单工传输,易受干扰
1.1 1997 改进硬件地址匿名性,提高隐私保护
1.2 2004 向下兼容1.1,引入自适应频率跳跃(AFH),提高传输速度至约90KB/S,L2CAP层增加流量控制和错误纠正机制
2.0+EDR 2004 引入非跳跃窄频通道,提高广播能力,支持多速度水平,增加Sniff省电功能和简单安全配对(SSP)
3.0+HS 2009 采用交替射频技术,提高数据传输速率至24Mbps,增强电源控制,降低空闲功耗
4.0 2010 引入低功耗蓝牙BLE,支持高速、传统和低功耗三种模式,提升传输距离至100米以上,优化延迟和数据传输效率,增强安全性
4.1 2013 软件更新,支持多设备连接,增加智能连接功能,提高灵活性和掌控度
4.2 2014 进一步优化性能,增强安全性和隐私保护
5.0 2016 传输距离是4.2LE的4倍,速度提升至2倍,最高可达24Mbps,支持室内定位导航,无需配对接收信标数据,物联网优化。引入了一些新的特性,包括扩展的广播包容量。在早期的蓝牙版本中,广播包的大小被限制在31字节。但是在蓝牙5.0中,这个限制被扩大到了255字节,从而允许设备在一个单一的广播包中发送更多的数据

蓝牙的分类

蓝牙按照功耗主要可以分为以下2种类型:

  • 经典蓝牙(Classic Bluetooth)。这是最早的蓝牙版本,支持蓝牙协议4.0以下。它主要用于手机、音响、汽车等设备之间的音频或数据传输。经典蓝牙的特点是较高的传输速度和较大的传输距离,但功耗相对较大。
  • 低功耗蓝牙(Bluetooth Low Energy, BLE)。低功耗蓝牙支持蓝牙协议4.0或更高版本,不向后兼容经典蓝牙。它专注于低功耗和低延迟,适用于实时性要求高但功耗要求低的场景,如鼠标键盘、智能家居和智能穿戴设备。

此外,根据对协议的支持情况,还可以分为双模式蓝牙,它同时支持经典蓝牙和低功耗蓝牙,这种比较特殊。每种类型的蓝牙技术都有其特定的应用场景和优势,随着技术的发展,蓝牙将继续演进以适应更多元化的应用需求。

其中,蓝牙4.0引入了低耗电蓝牙BLE(Bluetooth Low Energy),后文简称Ble ,蓝牙5.0在Ble上支持了蓝牙的扩展广播包,我们本次的介绍的重点就是围绕蓝牙ble展开的。

蓝牙ble的基本概念

传统的经典蓝牙(Classic Bluetooth)通常发送大量的数据,比如一般用于数据量比较大的传输,语音、音乐等较高数据量的传输。

然而蓝牙ble是一种低功耗的设备,它经常会搭配电池使用,例如:防丢器、手环、手表等设备。 蓝牙ble是一种C/S架构的,其中C是Client,也就是控制端,通常是android手机、中控屏等。S是Serve,也就是提供服务的,通常就是蓝牙等终端子设备。其中,C-S是1:n的关系 ,即一个Client可以连接多个蓝牙设备。这个其实好理解的,举个例子,跳绳的时候,我使用手机同时连接我的手环、智能绳子和蓝牙耳机。

适用场景

蓝牙ble的特点:低功耗、低延时,传输数据量较少。因此蓝牙ble被大量使用在医疗领域、穿戴配件、安防领域等。 BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,它在医疗、穿戴设备和安防领域具有广泛的应用。

  1. 医疗领域

    • 远程患者监控:BLE技术可以用于收集患者的健康数据,如心率、血压、血糖等,并实时发送给医疗人员。这对于需要持续监控健康状况的患者来说,可以大大提高生活质量,并减少医疗成本。
    • 医疗设备追踪:在医院环境中,BLE可以用于追踪和定位医疗设备,如轮椅、心电图机等,从而提高医疗资源的管理效率。
  2. 穿戴设备

    • 健康和健身追踪:BLE技术在健康和健身追踪设备中得到了广泛的应用,如智能手环、智能手表等设备可以通过BLE连接到用户的手机,实时监测和记录用户的运动数据和健康状况。
    • 智能穿戴:除了健康和健身追踪,BLE还被用于其他类型的智能穿戴设备,如智能眼镜、智能鞋等。这些设备可以通过BLE与用户的手机或其他设备进行通信,提供各种便捷的功能。
  3. 安防领域

    • 室内定位:在商场、博物馆等公共场所,BLE技术可以用于提供精确的室内定位服务,帮助用户找到他们想去的地方。
    • 物品追踪:BLE标签可以附着在钥匙、背包等易丢失的物品上,当物品丢失时,可以通过手机上的BLE追踪应用找回。
    • 智能家居:在智能家居系统中,BLE技术可以用于控制各种家用设备,如灯光、空调、电视等。
  4. 蓝牙mesh

    蓝牙BLE(Bluetooth Low Energy)在蓝牙Mesh网络中有着重要的应用。蓝牙Mesh是一种网络协议,目前是由蓝牙SIG联盟制定和维护的,它的设计允许大量的蓝牙设备进行互联,并可以在这些设备之间传输数据。这种网络架构特别适合于需要大规模设备互联的应用场景,如智能家居、工业自动化、城市照明等。以下是BLE在蓝牙Mesh中的一些具体应用:

    • 智能家居:在智能家居中,蓝牙Mesh网络可以连接各种家用设备,如灯光、空调、电视、门锁等。用户可以通过手机或其他控制设备,通过BLE技术控制这些设备的开关、亮度、温度等。此外,这些设备还可以互相通信,实现更复杂的自动化场景,如当你打开家门时,灯光自动开启。

    • 城市照明:在城市照明中,蓝牙Mesh网络可以用于连接大量的街灯,实现远程控制和监控。通过BLE技术,可以实现对街灯的开关、亮度等进行精细化管理,以节约能源和维护成本。

    • 工业自动化:在工业自动化中,蓝牙Mesh网络可以用于连接各种传感器和控制设备,实现实时数据收集和设备控制。这对于提高生产效率和安全性非常有帮助。

    • 资产追踪:在大型仓库或商场中,蓝牙Mesh网络可以用于追踪和定位各种物品。通过在物品上安装BLE标签,可以实时了解物品的位置和状态,以提高管理效率。

  5. beacon信标。蓝牙 BLE(Bluetooth Low Energy)在信标(Beacon)中的应用非常广泛。信标是一种小型无线发射器,它们使用 BLE 技术向附近的设备广播信号。这些信号可以被智能设备(如智能手机或平板电脑)接收并进行处理,实现各种功能。以下是 BLE 在信标中的一些具体应用:

    • 室内导航:在大型建筑物(如商场、机场或博物馆)内,可以部署 BLE 信标来提供室内导航服务。用户的设备可以接收来自多个信标的信号,通过计算信号强度来确定用户的精确位置。

    • 营销曝光:商家可以使用 BLE 信标在店铺或特定地点发送特定的广告或促销信息。当用户的设备接近信标时,他们可以收到这些信息,从而提高商家的销售。

    • 事件触发:在某些应用中,BLE 信标可以用于触发特定的事件。例如,在智能家居中,当用户的设备接近信标时,可以自动打开门锁或灯光。

    • 资产跟踪:在仓库或医院中,可以通过在重要物品上安装 BLE 信标来跟踪它们的位置。这可以帮助管理者更有效地管理资产,并减少丢失。

总的来说,BLE技术以其低功耗、高效率的特点,在医疗、穿戴设备和安防领域,其中在蓝牙BLE基础上衍生设计的蓝牙Mesh网络中的应用,使得大规模设备互联成为可能,为各种应用场景带来了极大的便利。蓝牙BLE在信标中的应用,为各种场景提供了精确的定位和无线通信能力,从而实现了许多创新的服务和应用。

基本流程

工作步骤:

graph LR 扫描 --> 扫描到蓝牙设备 --> 开始建立GATT连接 --> 进行通信 --> 通信结束 --> 断开连接

通过上述流程图可以看出,基本的使用流程就是发现设备、连接设备、开始通信。首先,为了让大家理解这个过程,我们必须先了解蓝牙ble协议的几个基本重要的知识点。

核心概念

蓝牙 BLE(Bluetooth Low Energy)设备的主要组成可以分为以下几个核心部分:

  1. 控制器(Controller):这是 BLE 设备的物理部分,负责无线电频率的通信。它包括一个射频前端,一个物理层(PHY),和一个链路层(Link Layer)。

  2. 主机(Host) :这部分是 BLE 协议栈的软件部分,包括 L2CAP(逻辑链路控制和适配协议),安全管理,属性协议(ATT),和通用属性档案(GATT,是蓝牙ble的通信规范标准)。

  3. 应用程序(Application):这是运行在 BLE 设备上的软件,它使用主机提供的服务来实现特定的功能。

  4. 配置文件(Profiles):这些是预定义的设备角色,描述了设备如何使用 BLE 服务来实现特定的应用。

  5. 服务和特性(Services and Characteristics):这些是 BLE 设备提供的特定功能,例如心率监测或温度传感。服务包含一个或多个特性,每个特性都有一个值和多个描述符。

  6. 广播和连接(Advertising and Connections):BLE设备可以广播其存在和提供的服务,以便其他设备可以发现并连接它。

以上就是蓝牙 BLE 的主要组成部分,每个部分都对 BLE 设备的功能和性能有重要的影响。

现在我们来查看一下设备和APP之间基本的通信时序图:

sequenceDiagram participant Client participant Device participant 周围(环境) Note right Of Client:扫描阶段 Device-->>周围(环境): 向外发送广播包 Client-->>周围(环境): 开启蓝牙扫描 周围(环境)-->>Client: 捕获蓝牙ble广播包 Note right Of Client:广播解析 Client->>Client:解析蓝牙的广播包
(mac地址、service) Note right Of Client:连接阶段 Client->>Device:发起Gatt连接 Device->>Client:响应Gatt连接 Client->>Device:Mtu协商 Device->>Client:返回Mtu协商结果 Client->>Device:发现服务 Device->>Client:返回服务列表 Client->>Device:唤醒服务 Device->>Client:服务唤醒结果 Note right Of Client:通信阶段 Client->>Device:发送数据 Device->>Client:返回数据 Note right Of Client:断开连接 Client->>Device:断开连接 Device->>Client:断开链接
  1. 设备上电,开始向外发送ble广播包(这个过程就是为了让手机能够发现到设备)
  2. 控制端(通常我们使用app,也就是手机)打开蓝牙进行蓝牙扫描
  3. 通过捕获蓝牙设备的广播包来发现设备
  4. 当app发现设备的时候,需要过滤对应的设备是否是我们需要的目标设备。我们会通过解析广播里面带的mac地址以及广播的services来判断是否是我们需要的设备。
  5. app向目标设备发起蓝牙Gatt连接。(Gatt:GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,BLE)设备用于发送和接收数据的主要方式。它是一种在BLE连接中交换数据的通用规范,也是一种C-S设计架构的)。
  6. 设备响应GATT连接
  7. 手机发起MTU协商。MTU(Maximum Transmission Unit):最大传输单元,指一次数据传输的最大payload,通常用Byte来做单位(蓝牙协议里面的MTU有几个比较典型的mtu值,分别为23 Bytes、247 Bytes、517 Bytes,虽然这个值是由蓝牙协议栈协商出来的,但是我在工作当中,通常这个值具体是多少很大程度上是取决于设备端)。
  8. 设备响应MTU协商结果。
  9. 手机发现Services(通常蓝牙的Services由UUID组成的一系列集合),查看Services里面是否有符合我们要求的服务。(不同类型的服务对应的UUID也是不同的,例如:健康类服务、天气服务等,但是有些公司其实不太区分,只是拿UUID判断是否是属于自己公司的产品,这个后面我们会展开细说。)
  10. 发现符合是服务之后,手机请求打开设备服务的通道,也就是notify Service
  11. 在上述过程都顺利完成之后,手机就算是和设备建立了简单的蓝牙连接了,后续就可以进行通信了。
  12. 当蓝牙使用完毕需要断开的时候,手机可以主动断开和设备的蓝牙连接

总结

蓝牙ble基本使用过程主要分为:扫描发现蓝牙设备解析蓝牙广播包建立GATT连接mtu协商打开服务进行通信断开连接

想必看到这里,大家对蓝牙ble就有了一个基本的了解,下一篇,我们将重点介绍蓝牙ble的扫描过程。

相关推荐
Estar.Lee28 分钟前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
温辉_xh1 小时前
uiautomator案例
android
工业甲酰苯胺2 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java
Estar.Lee4 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯4 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey5 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!7 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟8 小时前
Android音频采集
android·音视频
小白也想学C9 小时前
Android 功耗分析(底层篇)
android·功耗