前面的两篇文章,主要是在 Android 官网关于蓝牙介绍的基础上加上本身的理解完成的。主要针对的是 Android 开发中的一些 API 的使用。
第一篇文章 Android 蓝牙开发(1) 主要是介绍了普通的蓝牙在 Android 开发中的运用。
第二篇文章 Android 蓝牙开发(2) 主要是介绍了低功耗蓝牙的开发。
这篇文章主要介绍的是蓝牙的历史和一些关于蓝牙的通用知识,还有广播包的知识。要想完全了解蓝牙开发,这些基础的知识也是须要的,就像网络协议同样,这些都是基础的内容。咱们的 API 的调用都是以这个为基础的,了解这些,开发过程当中遇到问题,才能够知道什么怎么一回事。java
下篇文章主要讲的就是实际开发中的一些坑。安全
蓝牙技术最初是由爱立信创制的。技术始于爱立信公司 1994 方案,它是研究在移动电话和其余配件间进行低功耗、低成本无线通讯链接的方法。发明者但愿为设备间的通信创造一组统一规则(标准化协议)用来解决用户间相互不兼容的移动电子设备。网络
1998 年 5 月 20 日,索尼以立信、国际商业机器、英特尔、诺基亚及东芝公司等业界龙头创立“特别兴趣小组”(Special Interest Group SIG),即蓝牙技术联盟的前身,目标是开发一个成本低、效益高、能够在短距离范围内随意无线链接的蓝牙技术标准。负责蓝牙规范的制定和推广的国际组织。并发
1998年推出了 0.7 规格,1999 年推出了 0.八、0.9等等。1999 年 7 月正式公布 1.0 版本,使用 2.4GHz频谱,最高资料传输速度 1Mbps。2001 年的 1.1 版本正式列入 IEEE 标准。设计
蓝牙其实就是一种近距离无线通讯技术。3d
低功耗蓝牙 BLErest
全称是 Bluetooth Low Energy 简称 BLE 。最大的特色就是低功耗,有些 BLE 设备一个纽扣电池可使用一两年。这对于如今的穿戴设备以及各类物联网传感器来讲是一个很大的突破。同时它的传输的数据就不多。code
在 Android 4.3 的时候开始支持低功耗蓝牙。仅仅支持中心模式,就是只能够链接其余蓝牙外设。到了 2014 年 Android 5.0 开始也支持周边模式。blog
图片来自网络接口
从下到上分别为:控制器(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。
BLE 应用能够分为两大类:基于非链接的和基于链接的
基于非链接的:
意思就是外设和周边设备不发生链接,主要靠扫描到的广播来获取信息。发送广播的一方叫作 broadcaster
监听广播的一方叫作 oberver
在 GAP 层有对应的角色定义。
网络拓扑图:
这种方式就是广播设备不断的向外发送广播(含有特定的信息),而后观察者接受到广播按照二者之间约定好的协议进行解析拿到有用的信息。例如:iBeacon,经过这种设备咱们能够实现室内定位。
其实这些设备的角色能够即便广播者又是观察者。接收到广播后做出了处理,而后又发送广播。这样就造成了双向的网络,相似于因特网,这就是蓝牙 Mesh 组网。
广播数据包格式:
每一个广播数据包由 31 byte 组成。分为有效数据和无效数据两部分。
例子:
E/TAG:scandata:02011A05FFAC0134560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
这里是扫描的数据包(转换成了 16 进制,两个表明一个字节),第一个字节是 02 表示后面的两个字节是数据部分,而后第二个字节是 01 表示了数据的类型。后面一个字节就是真正的数据了。这个广播数据单元就分析完了。下面就是另外一个数据单元了。依次类推,关于数据类型的解释,官网有。
这是数据类型对应的含义表。
基于链接的:
就是两个设备创建 GATT 链接,须要双方进行通讯。这里的两个角色是,外设设备(Peripheral)和中心设备(通常是手机)Centeral。
网络拓扑图:
一个中心设备可链接多个外设,可是一个外设只能链接一个中心(外设链接成功后就会中止对外广播,别人就发现不了它了)。其中一个中心设备的链接外设的数量也是有限的。