丈夫志四海,万里犹比邻。这篇文章主要讲述Android-BLE蓝牙原理相关的知识,希望能为你提供帮助。
https://www.jianshu.com/p/f98e77c9ec65
蓝牙4.1BLE协议栈的结构图如下:
文章图片
- PHY(Physical Layer):物理层,蓝牙是工作在2.4GHz附近,这是工业、科学、医疗ISM的频段,免许可证。WIFI也是工作在同一个频段。蓝牙把频段切分为40个通道,3个广播通道,37个数据通道,按照一个规律跳频通信。
- LL(Linker Layer):链路层,用于控制设备的射频状态,设备将处于五种状态之一:等待、广告、扫描、初始化、连接。广播设备不需要建立连接就可以发送数据,而扫描设备接收广播设备发送的数据;发起连接的设备通过发送连接请求来回应广播设备,如果广播设备接受连接请求,那么广播设备与发起连接的设备将会进入连接状态。发起连接的设备称为主机,接受连接请求的设备称为从机。
- HCI(Host Controller Interface):主机和控制器就是通过这个接口来进行同学的,通信的介质就是HCI命令。这层在协议栈中是可选的,一些小型终端可能没有,但是android设备上肯定有,这层是蓝牙上层和芯片的交互必经之路,对于蓝牙硬件开发者,这里的log能够很好的帮助解决问题。
- HOST部分要复杂一些,有链路控制和适配层(L2CAP),安全管理(SM)等。其中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可以做的事情,也就是它的profile。
- 第5个我们又提到一个BLE设备实际上就是一组Service的集合,那BLE蓝牙以什么来标识多个Service呢。答案就是UUID。BLE中的Service,Characteristic,Descripter都是使用UUID来作为唯一标识。所以我们在读写BLE蓝牙数据时,都要带上相应的UUID。
- GAP(Generic Access Profile):通用访问控制配置文件。定义了BLE整个通信过程中的流程,负责处理设备访问模式和程序,包括设备发现,建立连接,终止连接,初始化安全特性,设备配置。GAP层总是作为下面四种角色之一:(1)广播者:不可连接的广播设备。(2)观察者:扫描设备,但不发起建立连接。(3)外部设备:可连接的广播设备,可以在单个链路层连接中作为从机。(4)集中器:扫描广播设备并发起连接,可以在单个链路层连接中作为主机。
推荐阅读
- ANDROID NFC读M1卡
- 在Termux(非root的安卓Linux模拟器)中安装和使用ftp服务器(pure-ftpd)(原创)[简单极致]
- android 7.0+ FileProvider 访问隐私文件 相册相机安装应用的适配
- android开发(底部导航条的实现 | navigation tab)
- android 6.0+ 动态权限获取
- android dumpsys
- android开发(android studio的下载安装与简单使用 | sdk的安装与编译)
- Android 程序结构
- 安卓Recycleview简单的网格布局-初学者的关键点