总结
现在新技术层出不穷,假如每次出新的技术,我们都深入的研究的话,很轻易分散精神。新的技术大概很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很轻易被我们遗忘,到末了真的须要使用的时候,又要重新来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面临新技术,不要抵触,拥抱变革就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,相识一下它的优缺点、能干什么大概不能干什么。这个时间,并不是我们不能接受的。
假如偶尔间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的相识过程。但是假如我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
(跨平台开发(Flutter)、java基础与原理,自界说view、NDK、架构设计、性能优化、完整商业项目开发等)
网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
须要这份系统化学习资料的朋侪,可以戳这里获取
一个人可以走的很快,但一群人才华走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都接待参加我们的的圈子(技术交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
一个广播包是由若干个广播单元 AD Structure 构成的。每个 AD Structure 的组成是:第一个字节表示长度值 length,表示接下来的 length 个字节是数据部门,数据部门的第一个字节表示数据的类型 AD Type,AD Type 决定了下面的数据代表了什么,关于每个数值代表的数据类型见官方文档,剩下的 length - 1 个字节表示真正的数据
02 01 06
02 表示接下来的数据有两个字节 01 表示数据类型,此处类型是 Flags 06 就是具体的数值了 0x06 = 0000 0110 每一位都有不同的含义,见官方文档
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 中的方法
这几个方法所得到内容都不是直接从 Android 中收到的广播(ScanResult.getScanRecord().getBytes())中剖析出来的,而是从原始数据包中剖析的。
getTxPower 获取传输功率,假如这个 iBeacon 不支持的话,那么结果就是 127
背面这几个方法作用不大,关键看设备是否支持
关键方法
ScanRecord 中的这几个方法就很重要的,这几个方法都和我们收到的广播包有关系。
比如:假如应答包中对 Tx Power Level 举行了设置我们就可以通过 getTxPowerLevel() 来直接获取。比如上面例子中的广播包,通过调用方法 getTxPowerLevel() 就可以得到 0
其他方法雷同,只要你的应答包中数据的格式正确,就可以剖析出来。
举例分析:
比如 Android 端收到的广播包是:
0201061AFF4C0002150123456789ABCDEF0123456789ABCDEF00000007C5 广播包
020A00 0303F1FF 0E16F1FF6400000007AC233F66C401 070965526F7574650000 应答包
末了
想要相识更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包罗:Android学习PDF+架构视频+源码条记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继承精进的朋侪。
网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
须要这份系统化学习资料的朋侪,可以戳这里获取
一个人可以走的很快,但一群人才华走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都接待参加我们的的圈子(技术交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
题资料,高级进阶架构资料** 这几块的内容。非常适合近期有面试和想在技术道路上继承精进的朋侪。
网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
须要这份系统化学习资料的朋侪,可以戳这里获取
一个人可以走的很快,但一群人才华走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都接待参加我们的的圈子(技术交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |