协议栈
图片来自网络
从下到上分别为:控制器(Controller)–>主机(host)–>应用(Application)
控制器:协议栈的底层的实现,直接和硬件相关,由芯片厂商实现,包括物理层、链路层、主机控制接口。
主机:协议栈的上层实现是硬件的抽象,与具体的硬件厂商没有关系。
应用层:使用主机层提供的 API 开发的应用。
详细介绍各个层的含义:
-
PHY(Physical Layer)物理层,蓝牙是工作在 2.4GHz 附近,这是工业、科学、医疗 ISM 的频段,免许可证。WIFI 也是工作在同一个频段。蓝牙把频段切分为 40 个通道,其中 3 个广播通道,37 个数据通道,按照一个规律跳频通信。
-
LL(Linker Layer)链路层,用于控制设备的射频状态,设备将处于五种状态之一:等待、广告、扫描、初始化、连接。广播设备不需要建立连接就可以发送数据,而扫描设备接受广播设备发送的数据;发起连接的设备通过发送连接请求来回应广播设备,如果广播设备接受请求,那么广播设备与发起连接的设备将会进入连接状态。发起连接的设备称为主机,接受连接请求的设备称为从机。
-
HCI(Host Controller Interface):主机和控制器就是通过这个接口来进行通讯的,通讯的介质就是 HCI 命令。这层在协议栈中是可选的,一些小型终端可能没有,但是 Android 设备上肯定有,这层是蓝牙上层和芯片的交互必经之路,对于蓝牙硬件开发者,这里的 log 能够很好的帮助解决问题。
-
HOST 部分要复杂。有链路控制和适配层(L2CAP),安全管理(SM)等。重点看属性协议层,也就是 ATT。它是整个 BLE 通信的基础。ATT负责数据封装,向外暴露为 “属性”,提供“属性”的为服务端,获取“属性”的为客户端。ATT 是专门为 BLE 低功耗蓝牙而设计的传输协议,结构简单,传输数据短。
-
GATT(Generic Attribute Profile):全称叫做通用属性配置文件,是基于 ATT 做的进一步的逻辑封装,定义数据的交互方式和含义,APP 开发就是用的这一层。GATT 定义了三个非常重要的概念:服务(Service)、特征(Characteristic)、描述(Descripter)。他们的关系如下图
一个 Service 可以包含若干个 Characteristic,一个 Characteristic 可以包含属性(properties)和值(value),还可以包含多个 descripter
。Characteristic 实际上具有读、写、通知等权限。我们在对一个 BLE 设备发起连接成功以后,对他进行读写操作,其实就是对 Characteristic 的操作。图中的 Profile 是一组服务的集合,这些服务组个起来就形成了一个特定的使用场景了,里面的服务是嵌入式工作人员可以添加的。BLE 蓝牙使用 UUID 来区分 Service、Characteristic 、Descripter。
- GAP(Generic Access Profile):通用访问控制配置文件。定义了 BLE 整个通信过程中的流程,负责处理设备访问模式和程序,包括设备发现、建立连接、终止连接等等。GAP 层总是作为下面四种角色之一:(1)广播者:不可连接的广播设备。(2)观察者:扫描设备,但不发起建立连接 (3)外部设备:可连接的广播设备,可以在单个链路层连接中作为从机。(4)集中器:扫描广播设备并发起连接,可以在单链路层连接中作为主机。
应用开发
BLE 应用可以分为两大类:基于非连接的和基于连接的
基于非连接的:
意思就是外设和周边设备不发生连接,主要靠扫描到的广播来获取信息。发送广播的一方叫做 broadcaster
监听广播的一方叫做 oberver
在 GAP 层有对应的角色定义。
网络拓扑图:
这种方式就是广播设备不断的向外发送广播(含有特定的信息),然后观察者接受到广播按照两者之间约定好的协议进行解析拿到有用的信息。例如:iBeacon,通过这种设备我们可以实现室内定位。
其实这些设备的角色可以即使广播者又是观察者。接收到广播后作出了处理,然后又发送广播。这样就形成了双向的网络,类似于因特网,这就是蓝牙 Mesh 组网。
广播数据包格式:
每个广播数据包由 31 byte 组成。分为有效数据和无效数据两部分。
-
无效数据部分:因为广播数据包的长度必须是 31 字节,如果有效数据不够 31 个字节那么剩下的就用 0 来补全。这一部分就是无效的,也就是无效数据。
-
有效数据部分:包含若干个广播数据单元,称为 AD Structure。每个 AD Structure 的组成格式是:第一个字节是长度值 Length,表示接下来的 Length 个字节是数据部分。数据分别的第一个字节表示数据类型 AD Type,剩下的 Length - 1 是真正的数据。数据类型很重要,有标准的规定,决定了数据代表什么意思和怎么解析
例子:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
文末
我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。
以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持)
部分资料一览:
- 330页PDF Android学习核心笔记(内含8大板块)
-
Android学习的系统对应视频
-
Android进阶的系统对应学习资料
- Android BAT大厂面试题(有解析)
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
T大厂面试题(有解析)**
[外链图片转存中…(img-e13xWHX4-1712218458002)]