Android BlueToothBLE入门(一)——低功耗蓝牙介绍

学更好的别人,

做更好的自己。

——《微卡智享》

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第1张图片

本文长度为3150,预计阅读8分钟

前言

距上篇文章发布都一个多月了,先声明,我可不会停更。这么长时间没更新文章,其实原因就三点:

原因一是工作上事确实多,近一个月跑了17个城市,基本不是在客户现场就是去下一个地方的飞机或高铁上。

原因二是上次更完《Android监听消息(二)——电话及短信监听》后,就要开始研究两台设备数据的通信了。本身就是随身设备,所以最好的通讯方式就是蓝牙,以前做PDA和蓝牙打印机倒是做过通讯,不过那个是传统的蓝牙模式,也比较简单,研究了下还是觉得蓝牙BLE不错,但是和传统的蓝牙通讯方式差异很大,所以也是边学习边研究,相对的时间也就长了。

原因三没别的,就是懒。估计是大姨父的周期,不过已经慢慢调整过来了。

这篇文章主要就是先介绍下蓝牙BLE,因为我也是初接触,只是把我自己了解的的先介绍一下。

74ef1f37a5ae62f5ab794add0c3480bd.png

BlueTooth BLE

699e25c15ef13be458e69f84722c82fc.png

微卡智享

简介

BLE全称为Bluetooth Low Energy,低功耗蓝牙技术,它比起传统蓝牙更省电,能够在安卓设备之间进行短距离通信。BLE只有在需要时才会连接,这样有效地减少了能耗。虽然BLE传输速度较低,但它能够实现实时数据传输和双向通信,非常适合传输小量数据。此外,BLE还可以与多种设备相连,而且还可以使用广播模式来发送信息,如心率检测仪,健身设备等。

蓝牙BLE有两个角色,分别是中心设备和外围设备

  • 外围设备:指功耗更低的设备,会不断地发出广播,直到与中心设备连接

  • 中心设备:可以进行扫描,寻找外设广播,并从广播中拿到数据

广播与连接

上面说到外围设备来发出广播,所以我这就当它为Server了,而中心设备进行扫描连接,那就是Client。

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第2张图片

整个连接流程来说,就是外围设备要先添加服务,然后发送广播,中心设备开始进行扫描,扫描到后进行连接,然后数据进行交互。

扫描时有几个重点:

  • 我们在系统中设置蓝牙中是无法扫描到广播的,必须要在App中实现。

  • 扫描需要申请蓝牙权限,所以这个要记得打开,考虑到 LE 信标通常与位置相关联,还须声明 ACCESS_FINE_LOCATION 权限。没有此权限,扫描将无法返回任何结果。而在Android 10 需要你开启gps,否则蓝牙不可用。

  • Google为了防止Android7中的BLE扫描滥用,从而做了一些限制,即不要在30s内对蓝牙扫描 重复开启-关闭超过5次。建议:设置扫描周期>6s, 用户点击扫描后不要重复进行扫描,可以做一个是否正在扫描的标志位,如果 正在扫描就不做重复扫描动作了。 

GATT协议

GATT协议中定义了两个角色,一个是Service,一个是Characteristic,每个Service可以包含多个Characteristic,且他们都有特定的UUID,类似于 0000ff00-0000-1000-8000-00805f9b34fb 这样的字符串。每个Service代表提供某种服务的能力,比如跟心率有关的Service;Characteristic代表的是一个键值对,Service就是通过这个一个个的键值对达到传输数据的目的。

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第3张图片

当主设备和从设备连接上GATT协议之后,就可以询问从设备可以提供哪些服务,在得到从设备的反馈报文后,就可以通过双方协商好的UUID获取到Service服务,然后再从Service中根据UUID获取到可读的Characteristic和可写的Characteristic,操作Characteristic就可以实现具体的数据通信。

关于UUID

UUID 即为“Universally Unique Identifier”用于标识蓝牙服务以及通讯特征访问属性,不同的蓝牙服务和属性使用不同的访问方法。

蓝牙技术联盟SIG定义UUID共用了一个基本的UUID:

0x0000xxxx-0000-1000-8000-00805F9B34FB。总共128位

为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。使用16位的UUID便于记忆和操作,如SIG定义了“Device Information”的16位UUID为0x180A。

所以我们自己在蓝牙通讯时,可以自行定义上面xxxx部分,用于识别自己的蓝牙方式,并且在扫描蓝牙时可能通过定义好的UUID来过滤掉没有必要的蓝牙广播。

特征及描述符

特征 Characteristic

Characteristic 是Gatt通信最小的逻辑单元,一个 characteristic 包含一个单一 value 变量 和 0-n个用来描述 characteristic 变量的 描述符 Descriptor。与 service 相似,每个 characteristic 用 16bit或者32bit的uuid作为标识,实际的通信中,也是通过 Characteristic 进行读写通信的。

描述符 Descriptor

它的定义就是描述 GattCharacteristic 值已定义的属性,比如指定可读的属性,可接受范围等,比如为写的 特征添加描述符。

后面我的Demo中主要也是连接后通过Characteristic进行数据的通信,

Android BLE中的几个关键类

# 类名 说明
1 BluetoothAdapter

映射了设备的蓝牙模块,通过BluetoothManager来获取,但其最终还是调用BluetoothAdapter.getDefaultAdapter()获取的

2 BluetoothLeScanner

扫描和停止扫描的类,常用方法startScan和stopScan

3

BluetoothDevice

蓝牙设备(即外围设备),获取方法getRemoteDevice(Mac地址连接),和上面的蓝牙startScan扫描,connectGatt连接Gatt并返回一个BluetoothGatt,该方法是BLE连接的核心方法

4

BluetoothGatt

核心类,此对象是对GATT协议的封装,布尔类型参数表示是否断后重连。由于是从远程设备处获取信息,所以蓝牙设备是服务端而手机是客户端。BluetoothGatt对象可对客户端进行相关操作。 ‍

5

BluetoothGattCallback

作为connectGatt方法的参数,实现BluetoothGatt的回调,非常重要

6

BluetoothGattService

蓝牙Gatt服务,核心类,通过getCharacteristic获取特征,getuuid获取服务UUID‍

7

BluetoothGattCharacteristic

特征,核心类,通过修改Characteristic特征进行设备间的数据传输‍

8

BluetoothGattDescriptor

描述符,核心类,同上

  • 一个Gatt包含多个服务;一个服务包含多个特征;一个特征包含多个描述符;

  • 一个描述符对应一个特征;一个特征对应一个服务;一个服务对应一个Gatt

69d2a89ac4ad672999f7d63868d94abb.png

后记

Android BLE蓝牙这块就简单的介绍完了,了解这些基本的东西,那跑代码时不至于啥也不懂了,下篇就会做着Demo来实现蓝牙的BLE通讯。

现在Demo还在做中,主要是想做Demo也加入点新东西的练手,所以Demo中也直接用MVI来写的,BLE里面相关的通讯,我也尽量都整全到一个公共类中,这样在开发阶段也可以直接复制过来用,结果就是做的时间更长了。

下半年的学计划主要在Android里,主要在多进程架构,Android Framework和Jetpack Compose这几方面,当然如果有感兴趣的东西可能也会串插进来。

92b726b4a9dc005cb556f836010be177.png

dcabd84c525550078b3c15a3c03fc9c7.png

往期精彩回顾

 

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第4张图片

Android监听消息(二)——电话及短信监听

 

 

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第5张图片

Android监听消息(一)——应用消息捕获

 

 

Android BlueToothBLE入门(一)——低功耗蓝牙介绍_第6张图片

测试新版Android Studio的手机镜像效果

 

你可能感兴趣的:(android)