前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android BlueToothBLE入门(一)——低功耗蓝牙介绍

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

作者头像
Vaccae
发布2023-08-22 08:06:16
4630
发布2023-08-22 08:06:16
举报
文章被收录于专栏:微卡智享微卡智享

学更好的别人,

做更好的自己。

——《微卡智享》

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

前言

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

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

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

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

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

BlueTooth BLE

微卡智享

简介

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

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

  • 外围设备:指功耗更低的设备,会不断地发出广播,直到与中心设备连接
  • 中心设备:可以进行扫描,寻找外设广播,并从广播中拿到数据

广播与连接

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

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

扫描时有几个重点:

  • 我们在系统中设置蓝牙中是无法扫描到广播的,必须要在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就是通过这个一个个的键值对达到传输数据的目的。

当主设备和从设备连接上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

后记

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

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

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

往期精彩回顾

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述符 Descriptor
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档