前面的两篇文章,主要是在 Android 官网关于蓝牙介绍的基础上加上自己的理解完成的。主要针对的是 Android 开发中的一些 API 的使用。

第一篇文章 Android 蓝牙开发(1) 主要是介绍了普通的蓝牙在 Android 开发中的运用。

第二篇文章 Android 蓝牙开发(2) 主要是介绍了低功耗蓝牙的开发。

这篇文章主要介绍的是蓝牙的历史和一些关于蓝牙的通用知识,还有广播包的知识。要想彻底了解蓝牙开发,这些基础的知识也是需要的,就像网络协议一样,这些都是基础的内容。我们的 API 的调用都是以这个为基础的,了解这些,开发过程中遇到问题,才可以知道什么怎么一回事。

下篇文章主要讲的就是实际开发中的一些坑。

android蓝牙原理图(Android蓝牙开发3)(1)

声明

蓝牙的发展历史

蓝牙技术最初是由爱立信创制的。技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗、低成本无线通信连接的方法。发明者希望为设备间的通讯创造一组统一规则(标准化协议)用来解决用户间相互不兼容的移动电子设备。

1998 年 5 月 20 日,索尼以立信、国际商业机器、英特尔、诺基亚及东芝公司等业界龙头创立“特别兴趣小组”(Special Interest Group SIG),即蓝牙技术联盟的前身,目标是开发一个成本低、效益高、可以在短距离范围内随意无线连接的蓝牙技术标准。负责蓝牙规范的制定和推广的国际组织。

1998年推出了 0.7 规格,1999 年推出了 0.8、0.9等等。1999 年 7 月正式公布 1.0 版本,使用 2.4GHz频谱,最高资料传输速度 1Mbps。2001 年的 1.1 版本正式列入 IEEE 标准。

蓝牙其实就是一种近距离无线通信技术。

android蓝牙原理图(Android蓝牙开发3)(2)

蓝牙历史版本.png

协议栈

android蓝牙原理图(Android蓝牙开发3)(3)

蓝牙协议栈.png

图片来自网络从下到上分别为:控制器(Controller)-->主机(host)-->应用(Application)

控制器:协议栈的底层的实现,直接和硬件相关,由芯片厂商实现,包括物理层、链路层、主机控制接口。

主机:协议栈的上层实现是硬件的抽象,与具体的硬件厂商没有关系。

应用层:使用主机层提供的 API 开发的应用。

详细介绍各个层的含义:

android蓝牙原理图(Android蓝牙开发3)(4)

gatt内部组成.png

一个 Service 可以包含若干个 Characteristic,一个 Characteristic 可以包含属性(properties)和值(value),还可以包含多个 descripter 。Characteristic 实际上具有读、写、通知等权限。我们在对一个 BLE 设备发起连接成功以后,对他进行读写操作,其实就是对 Characteristic 的操作。图中的 Profile 是一组服务的集合,这些服务组个起来就形成了一个特定的使用场景了,里面的服务是嵌入式工作人员可以添加的。BLE 蓝牙使用 UUID 来区分 Service、Characteristic 、Descripter。

应用开发

BLE 应用可以分为两大类:基于非连接的和基于连接的

基于非连接的:

意思就是外设和周边设备不发生连接,主要靠扫描到的广播来获取信息。发送广播的一方叫做 broadcaster 监听广播的一方叫做 oberver 在 GAP 层有对应的角色定义。

网络拓扑图:

android蓝牙原理图(Android蓝牙开发3)(5)

非连接网络拓扑图.png

这种方式就是广播设备不断的向外发送广播(含有特定的信息),然后观察者接受到广播按照两者之间约定好的协议进行解析拿到有用的信息。例如:iBeacon,通过这种设备我们可以实现室内定位。

其实这些设备的角色可以即使广播者又是观察者。接收到广播后作出了处理,然后又发送广播。这样就形成了双向的网络,类似于因特网,这就是蓝牙 Mesh 组网。

广播数据包格式:

android蓝牙原理图(Android蓝牙开发3)(6)

广播数据包.png

每个广播数据包由 31 byte 组成。分为有效数据和无效数据两部分。

例子:

E/TAG:scandata:02011A05FFAC0134560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

这里是扫描的数据包(转换成了 16 进制,两个代表一个字节),第一个字节是 02 表示后面的两个字节是数据部分,然后第二个字节是 01 表示了数据的类型。后面一个字节就是真正的数据了。这个广播数据单元就分析完了。下面就是另一个数据单元了。依次类推,关于数据类型的解释,官网有。

android蓝牙原理图(Android蓝牙开发3)(7)

数据类型.png

这是数据类型对应的含义表。

基于连接的:

就是两个设备建立 GATT 连接,需要双方进行通信。这里的两个角色是,外设设备(Peripheral)和中心设备(一般是手机)Centeral。

网络拓扑图:

android蓝牙原理图(Android蓝牙开发3)(8)

连接网络拓扑图.png

一个中心设备可连接多个外设,但是一个外设只能连接一个中心(外设连接成功后就会停止对外广播,别人就发现不了它了)。其中一个中心设备的连接外设的数量也是有限的。

android蓝牙原理图(Android蓝牙开发3)(9)

,