Android开发蓝牙基础总结,Android开发手册

01 表示这是随机设备地址

8b 03 00 b0 01 c2 是此设备的MAC,根据从低向高的发送规则,所以真实MAC是 c2:01:b0:00:03:8b

01 代表首要广播信道的带宽

00 代表次要广播信道的带宽,此处表示不使用次要信道

ff 表示广播SID

7f 代表Tx Power的大小,此处是127dbm

af 代表RSSI的大小,此处是-81dbm

00 00 代表周期广播间隔

00 代表直接地址类型,次数是公共设备地址

00 00 00 00 00 00 代表直接BD_ADDR

1e 代表接下的的数据的字节数(长度),以下数据就是最重要的广播数据了

上面的内容就是对应第一行的解释了,其实 Android SDK 已经帮我们把这些数据中的部分内容解析出来,我们可以直接通过对应的 SDK 的方法来直接获取。

下面我们再来看 真正意义上的广播包

格式是这样的:

[图片上传失败…(image-d5e4c6-1606809640424)]

一个广播包是由若干个广播单元 AD Structure 构成的。每个 AD Structure 的组成是:第一个字节表示长度值 length,表示接下来的 length 个字节是数据部分,数据部分的第一个字节表示数据的类型 AD Type,AD Type 决定了下面的数据代表了什么,关于每个数值代表的数据类型见官方文档,剩下的 length - 1 个字节表示真正的数据

02 01 06

02 表示接下来的数据有两个字节 01 表示数据类型,此处类型是 Flags 06 就是具体的数值了 0x06 = 0000 0110 每一位都有不同的含义,见官方文档

image

1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 27 11 4c b9 c5

1a 表示接下来的数据有 26 字节

FF 表示数据类型,此处类型是 厂商自定义数据类型(这里的厂商指的是苹果公司,因为 iBeacon 是苹果公司提出的)

4C 00 表示公司的 ID,此处的 004C 代表苹果公司

02 15 Beacon 的标识位,必须是这样的

fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25

表示 Beacon UUID

27 11 是 major 的值

4C b9 是 minor 的值

C5 表示 Measured Power 表示的是此设备在 1 米处的 RSSI 值,用于距离测算

这段内容其实主要是苹果公司在蓝牙协议的基础上定义的。

如果符合 1AFF4C000215 则说明此设备是 iBeacon 设备

蓝牙应答包

04 3e 38 0d 01 1b 00 01 8b 03 00 b0 01 c2 01 00 ff 7f af 00 00 00 00 00 00 00 00 00 1e 29个字节

02 0a 00 08 16 f0 ff 64 27 11 4c b9 11 09 4d 69 6e 69 42 65 61 63 6f 6e 5f 30 30 39 30 37 30个字节

其中第一行与上面一样,这里不再介绍

02 0a 00

02 表示接下来的数据长度 2 个字节

0a 表示数据类型 这里表示 Tx Power Level 取值范围是 -127 到 127 dBm

00 表示 0 dBm

08 16 f0 ff 64 27 11 4c b9

08 表示数据长度

16 表示 Service Data 由 Service UUID 和 service 数据组成 前两个字节是 UUID 后面是数据

f0ff 是 Service UUID

64 27 11 4c b9 是数据

11 09 4d 69 6e 69 42 65 61 63 6f 6e

11 表示数据长度

09 表示设备完整的名字

4d 69 6e 69 42 65 61 63 6f 6e 就是设备名字的 ASSIC 码了 对应 MiniBeacon

M i n i B e a c o n

5f 30 30 39 30 37

这几个数据就是 Beacon 开发者随便乱加入的数据了,不符合协议内容

Android 中接受到的广播包

上面我们分别分析了蓝牙原始数据包中的广播包和应答包,其实对于 iBeacon 来说广播包中的大多数内容其确定的,只有 UUID Major Minor 会有变化。而且每个位置所代表的作用都已经被 苹果公司 定义好了。如果想要 iBeacon 发出的数据包有更多的内容,那么我们就可以在应答包中做文章了,应答包是有 32 个字节的。我们只需要按照协议的内容向应答包中添加数据就可以了。

对于 Android 客户端,通过 Scanresult.getScanRecord().getBytes() 获得的广播包是 62 个字节,它把上面原始数据包中的内容提取出来了,只保留了第二行内容。就是 蓝牙广播包第二行(30 byte) + 蓝牙应答包第二行(最多 32 byte,数目不确定),如果位数不够的话就用 0 补充。

所以我们现在就可以很好根据获得的 byte[] 数组来解析广播包了。

// 现在就获得广播包了

byte[] result = ScanResult.getScanRecord().getBytes();

// UUID 包含 result[9] 和 result[24]

result[9]—result[24];

// Major

result[25] result[26]

// Minor

result[27] result[28]

// Measured Power

result[29]

// 一般我们都是直接会先把 广播包转成 16 进制的格式然后来截取

String uuid = broadcast.substring(18, 50);

// 至于后面应答包的内容就要根据具体的广播包格式来进行解析了,比如你们公司的硬件开发人员把电池电量放入了里面,那么你们就约定好放在什么位置,到时候你直接取就可以了。

关于 ScanResult 中的方法

image

这几个方法所获得内容都不是直接从 Android 中收到的广播(ScanResult.getScanRecord().getBytes())中解析出来的,而是从原始数据包中解析的。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习交流

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值