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

news2025/4/8 1:29:54

学更好的别人,

做更好的自己。

——《微卡智享》

919dd8777b139018ee49dcb1fbdbda52.jpeg

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

前言

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

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

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

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

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

74ef1f37a5ae62f5ab794add0c3480bd.png

BlueTooth BLE

699e25c15ef13be458e69f84722c82fc.png

微卡智享

简介

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

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

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

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

广播与连接

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

f65d730099a07ece5d21ec50068b4d54.png

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

扫描时有几个重点:

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

3d059a9f5e2042c5bb09eacc8269b5fc.png

当主设备和从设备连接上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中的几个关键类

#类名说明
1BluetoothAdapter

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

2BluetoothLeScanner

扫描和停止扫描的类,常用方法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

往期精彩回顾

 

4d735885f9085f5571f32d6f80679531.jpeg

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

 

 

f98e520a5d7d624d44a2c957b5aaf882.jpeg

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

 

 

77d0dc038e487b8aaf1811f907653aa7.jpeg

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript之事件(十)

JavaScript之事件 1、事件绑定2、事件类型3、事件的传播4、事件对象1、事件对象常用的属性2、事件对象常用的方法 事件可用于处理、验证用户输入、用户动作和浏览器动作。 1、事件绑定 事件绑定就是给HTML标签绑定特定的事件,当该事件触发,则会执行相应的…

一款射频芯片的layout设计指导案例-篇章2

《一款射频芯片的layout设计指导案例-篇章1》中,我们阐述了RTL8762元件布局顺序、DC/DC电路元件布局走线、电源Bypass布局规范、外部flash布局走线、RF布局走线, 本篇阐述晶振、ESD、板层等相关指导建议—— 40MHz晶振布局走线规范 在没有结构限制情况下…

chatgpt赋能python:Python如何在同一行输入三个数?

Python如何在同一行输入三个数? Python语言是一门广泛使用的编程语言,被广泛应用于数据分析、机器学习、Web开发、科学计算、人工智能等领域。但是,有时候我们需要在同一行输入多个变量或数字,这可能给一些初学者带来一些困惑。本…

暑期实习开始啦「GitHub 热点速览」

作者:HelloGitHub-小鱼干 无巧不成书,刚好最近有小伙伴在找实习,而 GitHub 热榜又有收录实习信息的项目在榜。所以,无意外本周特推就收录了这个实习项目,当然还有国内版本。除了应景的实习 repo 之外,还有帮…

快手 | 后端Java实习生 | 一面

目录 1.Redis缓存和MySQL数据一致性如何保证?2.你使用缓存,在高并发的情况下,如果多个缓存同时过期了怎么办?3.消息队列积压了怎么办?4.jdk1.8之后Java内存模型分别哪几个部分?每个部分用一句话概括一下&am…

GaussDB云数据库SQL应用系列-定时任务管理

前言 GaussDB数据库定时任务主要可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等,它是指在指定的时间间隔内自动执行一次或多次SQL语句的程序。 一、GaussDB数据库定时任务介绍 GaussDB数据库兼容Oracle定时任务功能主要通过DBE_TASK高级功能…

POSTGRESQL PSQL 命令中如何使用变量带入查询和函数

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

chatgpt赋能python:Python如何删除已经写好的代码?

Python如何删除已经写好的代码? 在编程中,大多数时候写出来的代码都是需要保留的。但是,随着项目的发展和需求的变化,有些代码可能就没有用了。这时,我们需要删除这些无用的代码,以保持程序的简洁性和效率…

Nginx、location匹配、Rewrite重写模块

Nginx、location匹配、Rewrite重写模块 一、常用的Nginx正则表达式二、location匹配概述1、location大致可以分为三类2、location常用的匹配规则3、location 优先级4、location 示例说明5、实际网站使用中,至少有三个匹配规则定义 三、rewrite重写1、rewrite 跳转场…

记录--JavaScript 中有趣的 9 个常用编码套路

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1️⃣ set对象:数组快速去重 常规情况下,我们想要筛选唯一值,一般会想到遍历数组然后逐个对比,或者使用成熟的库比如lodash之类的。 不过,ES…

Spark RDD分区

文章目录 一、RRD分区(一)RDD分区概念(二)RDD分区作用 二、RDD分区数量(一)RDD分区原则(二)影响分区的因素(三)使用parallelize()方法创建RDD时的分区数量1、…

软件测试之环境搭建—苏汽web系统测试环境搭建

一、搭建环境的准备工作 1、安装好RedHat,输入用户名:root,密码:123456,右键点击桌面,打开终端输入“ifconfig”查询IP地址 2.打开xshell,点击文件,选择新建连接,在输入…

【数据分析之道-Matplotlib(七)】Matplotlib直方图

文章目录 专栏导读1、hist()基本语法2、使用 hist() 函数绘制多个数据组的直方图3、修改直方图的颜色及边框颜色4、六一儿童节为主题,使用直方图进行可视化 专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享pyth…

POI报表的高级应用

POI报表的高级应用 掌握基于模板打印的POI报表导出理解自定义工具类的执行流程 熟练使用SXSSFWorkbook完成百万数据报表打印理解基于事件驱动的POI报表导入 模板打印 概述 自定义生成Excel报表文件还是有很多不尽如意的地方,特别是针对复杂报表头,单元格…

我们世界中的10个算法

下面的图表展示了我们日常生活中最常用的算法。它们被应用在互联网搜索引擎、社交网络、WiFi、手机甚至卫星等各个领域。 1.排序算法 排序算法用于将一组数据按照特定的顺序进行排列。它们被广泛应用于各种场景,如搜索引擎中的搜索结果排序、数据分析中的数据整理和…

转转前端周刊第六十八期

转转前端周刊 本刊意在将整理业界精华文章给大家,期望大家一起打开视野 如果你有发现一些精华文章想和更多人分享,可以点击我们的公众号名称,将文章链接和你的解读文案发给我们!我们会对内容进行筛选和审核,保留你的推…

基于TensorFlow Object Detection API实现RetinaNet目标检测网络(附源码)

文章目录 一、RetinaNet简介1. Backbone网络2. FPN网络 二、RetinaNet实现1. tf.train.CheckPoint简介2. RetinaNet的TensorFlow源码 一、RetinaNet简介 RetinaNet是作者Tsung-Yi Lin和Kaiming He于2018年发表的论文Focal Loss for Dense Object Detection中提出的网络。Retina…

运维小白必学篇之基础篇第十六集:DNS架构FTP实验

DNS架构FTP实验 目录 DNS架构FTP实验 服务端 客户端 服务端 在ftp架构了安装dns域名服务 yum -y install bind 配置主配置文件 vim /etc/named.conf listen-on port 53 { 192.168.50.1; }; allow-query { 192.168.50.0/24; }; 配置区域文件 vim /etc/named.rfc1912.zones…

深聊丨“紫东太初”大模型背后有哪些值得细读的论文(一)

原创:谭婧 没有人想等待,没有人想落伍。 新鲜论文时兴火热,成为大模型发展迅猛的标志之一,人们用“刷论文”这个游荡意味的动词替代另一个颇为严肃的动作,“读论文”。 论文被当作“教材”和“新知识”,在a…

矢量网络分析仪RS罗德与施瓦ZNB8 9KHZ至8.5GHZ德国二手

Rohde & Schwarz ZNB8网络分析仪,8.5 GHz,2 或 4 端口 ​罗德与施瓦茨 ZNB8 Rohde & Schwarz ZNB8 矢量网络分析仪具有高达 140 dB(10 Hz IF 带宽)的宽动态范围、低于 0.004 dB RMS(10 kHz IF 带宽&#xff…