学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为3150字,预计阅读8分钟
前言
距上篇文章发布都一个多月了,先声明,我可不会停更。这么长时间没更新文章,其实原因就三点:
原因一是工作上事确实多,近一个月跑了17个城市,基本不是在客户现场就是去下一个地方的飞机或高铁上。
原因二是上次更完《Android监听消息(二)——电话及短信监听》后,就要开始研究两台设备数据的通信了。本身就是随身设备,所以最好的通讯方式就是蓝牙,以前做PDA和蓝牙打印机倒是做过通讯,不过那个是传统的蓝牙模式,也比较简单,研究了下还是觉得蓝牙BLE不错,但是和传统的蓝牙通讯方式差异很大,所以也是边学习边研究,相对的时间也就长了。
原因三没别的,就是懒。估计是大姨父的周期,不过已经慢慢调整过来了。
这篇文章主要就是先介绍下蓝牙BLE,因为我也是初接触,只是把我自己了解的的先介绍一下。
BlueTooth BLE
微卡智享
简介
BLE全称为Bluetooth Low Energy,低功耗蓝牙技术,它比起传统蓝牙更省电,能够在安卓设备之间进行短距离通信。BLE只有在需要时才会连接,这样有效地减少了能耗。虽然BLE传输速度较低,但它能够实现实时数据传输和双向通信,非常适合传输小量数据。此外,BLE还可以与多种设备相连,而且还可以使用广播模式来发送信息,如心率检测仪,健身设备等。
蓝牙BLE有两个角色,分别是中心设备和外围设备
广播与连接
上面说到外围设备来发出广播,所以我这就当它为Server了,而中心设备进行扫描连接,那就是Client。
整个连接流程来说,就是外围设备要先添加服务,然后发送广播,中心设备开始进行扫描,扫描到后进行连接,然后数据进行交互。
扫描时有几个重点:
GATT协议
GATT协议中定义了两个角色,一个是Service,一个是Characteristic,每个Service可以包含多个Characteristic,且他们都有特定的UUID,类似于 0000ff00-0000-1000-8000-00805f9b34fb 这样的字符串。每个Service代表提供某种服务的能力,比如跟心率有关的Service;Characteristic代表的是一个键值对,Service就是通过这个一个个的键值对达到传输数据的目的。
当主设备和从设备连接上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 进行读写通信的。
它的定义就是描述 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 | 描述符,核心类,同上 |
后记
Android BLE蓝牙这块就简单的介绍完了,了解这些基本的东西,那跑代码时不至于啥也不懂了,下篇就会做着Demo来实现蓝牙的BLE通讯。
现在Demo还在做中,主要是想做Demo也加入点新东西的练手,所以Demo中也直接用MVI来写的,BLE里面相关的通讯,我也尽量都整全到一个公共类中,这样在开发阶段也可以直接复制过来用,结果就是做的时间更长了。
下半年的学计划主要在Android里,主要在多进程架构,Android Framework和Jetpack Compose这几方面,当然如果有感兴趣的东西可能也会串插进来。
完
往期精彩回顾