蓝牙通信技术基础

1. 概述

1.1 蓝牙是什么

  • 一种短距离无线通信技术
  • 爱立信公司创建,如今由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。
  • 现在用的都是低功耗蓝牙 Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)
  • 在 5.0 以后才支持外设模式,

1.2 蓝牙的优点

  • 低功率 便于电池供电设备工作
  • 使用方便,点对点连接
  • 短距离,低成本,以及高速
  • 在智能设备的普及性高,应用广。

1.3 蓝牙通信流程

  • 注册适配器打开蓝牙
  • 注册广播监听蓝牙状态
  • 搜索附近设备和已配对设备
  • 选择未配对设备进行配对
  • 选择已配对设备进行连接通信

1.4 蓝牙发展历史

在这里插入图片描述

1.5 蓝牙模块分类

  • 蓝牙技术分为经典蓝牙(BT)和低耗能(LE)两种技术类型。
    其中经典蓝牙(BT)包括基础速率/增强数据率(BR/EDR),BR/EDR型是以点对点网络拓扑结构创建一对一设备通信;LE型则使用点对点(一对一)、广播(一对多)和网格(多对多)等多种网络拓扑结构

    低功耗蓝牙和传统蓝牙实际上有很大的不同,低功耗蓝牙是nokia的wibree标准上发展起来的。在功耗上,传统蓝牙有3个级别的功耗,class1、class2、class3分别支持100m、10m、1m的传输距离;低功耗蓝牙没有功耗级别,一般发送功率在7dbm。
    在这里插入图片描述

  • 蓝牙芯片的三种功能配置:


在这里插入图片描述

  • 蓝牙的详细分类:在这里插入图片描述

在这里插入图片描述

1.6 蓝牙协议栈

蓝牙协议栈由主机 + HCI(可选) + 控制器三大块组成,其中对于单芯片方案是没用HCI的。

  • 主机(Host) :主机部分由核心协议层(L2CAP、SDP、SMP、ATT)和核心规范(GAP、GATT)构成;

  • HCI:此部分定义了主机和控制器之间通信的接口标准(Vol 4: Host Controller Interface)

  • 控制器(Controller):此部分拆分为低功耗蓝牙(Vol 6: Low Energy Controller)(Vol 2: BR/EDR Controller)
    在这里插入图片描述

    红色部分是BR/EDR经典蓝牙的必选项,绿色部分是LE低功耗蓝牙必选项, 蓝色部分是公共部分;
    当然经典蓝牙也可以具备绿色部分特性。HCI接口根据芯片架构有关,是可选项。两者在物理层的差异性图中没有体现,不涉及芯片设计,这块可暂不关注。

GAP规范(通用接入规范)

定义了所有蓝牙设备的基础功能,设备间发现、连接、配对绑定的流程;蓝牙设备中四种角色;广播和扫描响应报文的格式;还有一些通用蓝牙参数定义,比如设备地址、名称、配对秘钥和设备的外观特征值,用于区分是什么设备,手机还是电脑;明确了作为一个低功耗蓝牙设备的基本需求,包含哪些层级以及如何协同工作的。
- 定义了蓝牙设备中的四种角色,广播者、观察者、外设角色、中心角色。广播者是一定具备发送广播包能力的设备,可以没有接收装置,比如beacon传感器等;观察者是一定具备接收报文能力的设备,去接收广播者的信息,可以没有发送装置,实际应用中这种设备好像还没出现过;外设角色使用可连接广播事件去建立链路层的连接,连接成功后,将成为slave 角色,必须同时具备接收和发射装置;中心角色接收到外设角色的可连接广播包后,可向其发起连接,连接成功后,将成为Master角色,必须同时具备接收和发射装置。
- 规范了一些通用的蓝牙参数:蓝牙设备地址、设备名称、配对秘钥、外观特征值(用于区分设备是手机还是电脑)。
- 其他详情可参考《Core_v4.2.pdf》中Part C: Generic Access Profile

ATT(属性协议)

定义了访问对端设备上数据的一组规则,是GATT规范的基础,也是低功耗蓝牙的基石。定义了Host端属性报文格式和报文类型。

  • Requests:请求报文,客户端发给服务端,且需要服务端的一个应答Responses;(C->S,带ACK的请求报文)
  • Responses :响应报文,和Requests成对出现,服务端对客户端Requests的Responses;
  • Commands :命令报文,客户端发给服务端,不需要应答;
  • Notifications :通知报文,服务端主动发给客户端的通知;
  • Indications :通知报文,相比Notifications,客户端要应答确认Confirmations ,是否收到通知了;
  • Confirmations :和Indications 成对出现;

GATT(通用属性规范)

位于ATT之上,定义了属性的类型及其使用方法。 GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题。

L2CAP层(链路控制和适配协议)

屏蔽了控制器传输协议中的许多特性,方便高层协议的开发;报文分片和重组(SAR);流控、重传、报文完整性校验等。
在这里插入图片描述

SMP(安全管理协议)

定义了蓝牙设备配对、认证、解密等行为的安全操作。

LLCP/LL (链路层控制)

低功耗蓝牙参考 《Core_v4.2.pdf》中Part B: Link Layer Specification章节部分。

PHY(物理层)

低功耗蓝牙采用40个信道,分为数据信道和广播信道;广播信道占用3个,用于发现设备、建立连接、广播数据;数据信道占用37个,用于已建立连接设备间的数据通信。建立连接的两个设备,必须同一时间处于同一信道上才能通信。
在这里插入图片描述

1.7 相关专业词汇

  • profile
    profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器 ,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。
  • service
    service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据
  • characteristic
    characteristic特征值,ble主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
  • UUID
    UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识

注:每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleprofile,还是标准的防丢器profile,他们都是由一些列service组成,然后每个service又包含了多个characteristic,主机和从机之间的通信,均是通过characteristic来实现。

2.规范

ATT是指蓝牙协议中的Attribute,用于描述和定义蓝牙设备的服务和特征。
GAP是指蓝牙通用接入协议,是蓝牙设备之间的连接协议,用于建立蓝牙设备之间的连接、协商连接参数等。
GATT是指通用属性配置文件,是蓝牙低功耗技术的一个应用层协议,用于传输蓝牙设备(如智能手表、智能家居设备等)的数据信息。

2.1 通用接入规范 GAP(Generic Access Profile)

GAP(Generic Access Profile)是用来控制设备连接和广播。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如 Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。

  • 设备角色
    GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。
    外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
    中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。

  • 广播数据
    在 GAP 中外围设备通过两种方式向外广播数据: Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复),每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如设备的名字。(广播的数据格式我将另外专门写一个篇博客来讲。)

  • 广播流程
    GAP 的广播工作流程如下图所示。
    在这里插入图片描述

    从图中我们可以清晰看出广播数据和扫描回复数据是怎么工作的。外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太容易扫描到。

  • 广播的网络拓扑结构
    大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。也有些情况是不需要连接的,只要外设广播自己的数据即可。用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。因为基于 GATT 连接的方式的,只能是一个外设连接一个中心设备。使用广播这种方式最典型的应用就是苹果的 iBeacon。广播工作模式下的网络拓扑图如下:

2.2 通用属性规范 GATT (Generic Attribute Profile)

现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。
GATT 的全名是 Generic Attribute Profile(姑且翻译成:普通属性协议),它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service, Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用 16 bit ID 作为每一项的索引。
一旦两个设备建立起了连接,GATT 就开始起作用了,这也意味着,你必需完成前面的 GAP 协议。这里需要说明的是,GATT 连接,必需先经过 GAP 协议。实际上,我们在 Android 开发中,可以直接使用设备的 MAC 地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过 GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。
GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。

GATT 连接的网络拓扑

下图展示了 GTT 连接网络拓扑结构。这里很清楚的显示,一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设。ConnectedTopology一旦建立起了连接,通信就是双向的了,对比前面的 GAP 广播的网络拓扑,GAP 通信是单向的。如果你要让两个设备外设能通信,就只能通过中心设备中转。
在这里插入图片描述

GATT 通信事务

GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应。
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。
下图展示一个外设(GATT 服务端)和中心设备(GATT 客户端)之间的数据交换流程,可以看到的是,每次都是主设备发起请求:
在这里插入图片描述

GATT 结构

GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的的,如下图所示:
在这里插入图片描述

- ProfileProfile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。
- ServiceService 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。

官方通过了一些标准 Service,完整列表在这里。以 Heart Rate Service为例,可以看到它的官方通过 16 bit UUID 是 0x180D,包含 3 个 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,并且定义了只有第一个是必须的,它是可选实现的。
- Characteristic在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。
与 Service 类似,每个 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一标识。你可以免费使用 Bluetooth SIG 官方定义的标准 Characteristic,使用官方定义的,可以确保 BLE 的软件和硬件能相互理解。当然,你可以自定义 Characteristic,这样的话,就只有你自己的软件和外设能够相互理解。
举个例子, Heart Rate Measurement Characteristic,这是上面提到的 Heart Rate Service 必需实现的 Characteristic,它的 UUID 是 0x2A37。它的数据结构是,开始 8 bit 定义心率数据格式(是UINT8 还是 UINT16?),接下来就是对应格式的实际心率数据。
实际上,和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。

2.3 GAP和GATT的区别与联系

GAP 和 GATT 有什么不同呢?

  • GAP :定义一个 BLE 网络栈的通用拓扑结构。
  • GATT:描述关于如何数据在连接中如何传输的细节。GATT 尤其关注于数据如何被格式化、打包、然后跟据分发规则去在网络中发送。属性协议(ATT)与GATT紧密相连,那么GATT 处于 ATT 的上层,使用 ATT 去描述数据如何在两个连接的设备中交换。

GAP (Generic Access Profile)

GAP 即通用存取协议,BLE设备可以使用两种机制与外部世界通信:广播或连接。GAP 就是用来定义设备跟设备之前是用过广播呢,还是连接去通信的。
下面 GAP 将回答 怎么连接或广播? 和 连接后 GAP 可以做什么?两个问题。
- 怎么连接或广播?
一个设备通过选择 GAP 中指定的一个角色去连接到一个 BLE 网络。
- 广播: 这个过程中,设备没有连接。包含广播者和观察者两种角色。
- 广播者
- 观察者
- 连接:设备之间必须连接,一般生产环境中更常用。
- 外设:一个设备广播他的存在,使得中心设备能与它建立连接。在建立连接后,设备不再广播数据给其他中心设备,保持连接。
- 外设是低功耗的因为他们只定期发送一些 beacons
- Bean 是一种 BLE 外设。
- 中心设备:一个设备通过监听包,去连接一个外设,一个中心可以连很多个外设。
- 当一个中心设备想要连接外设的时候,它发一个连接请求给外设。如果外设接受了,那么就建立了连接。
- 你的电脑在连接 Bean 的时候就是一个中心设备。
- 连接后能做什么?
- 中心设备可以修改连接参数:中心设备创建一些连接的参数,中心设备可以更改参数,外设只能通过请求中心设备去更改参数。
- 外设或中心设备可以中止连接:两者可以主动、或者因为异常而断开连接。

GATT(Generic Attribute Profile)

类似 GAP,在这一层协议上,我们有两种角色:
- 客户端:发送请求给 GATT 服务器,能够读/写 服务器的数据。
- 服务端:服务端负责存储属性,一旦客户端发起请求,服务端进行回应。
所以,当我们使用 GAP 协议建立了连接,然后就可以使用 GATT 协议进行数据的存取实现不同的义务功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android蓝牙通信demo是一个展示如何在Android设备之间进行蓝牙通信的示例应用程序。该应用程序使用Android的蓝牙API来实现设备之间的数据传输。 在这个demo中,我们首先需要配置Bluetooth适配器,并确保蓝牙功能已开启。然后,我们可以搜索可用的蓝牙设备并显示在应用程序中。一旦找到目标设备,我们可以发起连接请求并建立蓝牙连接。 一旦建立了蓝牙连接,我们可以使用蓝牙Socket进行数据传输。我们可以发送和接收数据,通过使用输入流和输出流进行读写操作。我们可以发送字符串、字节数组等数据。 在示例应用程序中,我们可以做一些简单的任务,如发送文字消息、发送文件等。通过蓝牙通信,我们可以将数据从一个设备发送到另一个设备。 这个demo还涵盖了错误处理和异常处理。例如,如果连接失败或数据传输出错,我们可以捕获异常并进行相应的错误处理。 总而言之,Android蓝牙通信demo向我们展示了如何使用Android的蓝牙API来进行设备之间的数据传输。这是一个简单而实用的示例应用程序,可以帮助开发人员了解和使用Android设备的蓝牙功能。 ### 回答2: Android 蓝牙通信 demo 是一个示例程序,用于演示如何在 Android 设备之间进行蓝牙通信。 首先,需要在 Android 设备上打开蓝牙,并确保设备之间已经配对。然后,可以使用 Android 的蓝牙 API 来建立蓝牙连接。在 demo 中,可以选择设备进行连接,发送和接收数据。 在 demo 中,可以使用开发者提供的界面来搜索并选择要连接的设备。一旦连接建立,可以使用发送按钮发送数据,接收按钮接收数据。发送数据时,需要将数据转换为字节数组,并使用蓝牙连接的输出流发送数据。接收数据时,则需要使用蓝牙连接的输入流读取数据,并将其转换为字符串显示在界面上。 为了使通信更稳定和可靠,可以在 demo 中实现一些额外的功能。例如,可以添加错误处理机制,以处理连接中断的情况。还可以添加数据校验和验证机制,以确保接收到的数据是可靠和完整的。 综上所述,Android 蓝牙通信 demo 提供了一个基础示例,可以帮助开发者了解和使用 Android 的蓝牙 API 进行设备间的蓝牙通信。通过 demo,开发者可以学习如何建立蓝牙连接,发送和接收数据,并通过添加额外的功能来提高通信的稳定性和可靠性。 ### 回答3: Android蓝牙通信Demo是一个用于演示Android设备之间通过蓝牙进行通信的示例程序。它可以帮助开发人员理解蓝牙通信的原理和方式,以便开发自己的蓝牙应用程序。 该Demo通常包括以下几个主要功能: 1. 蓝牙设备的搜索和配对:通过蓝牙适配器搜索周围的蓝牙设备,并与选择的设备进行配对。 2. 连接与断开连接:建立蓝牙通信连接并在通讯完成后主动断开连接。 3. 数据的传输:通过蓝牙通信通道传输数据,可以是文本、图片、音频或者其他类型的数据。 4. 状态监测和回调处理:监测蓝牙状态的变化,并处理相应的回调事件,例如设备连接状态的改变、数据的接收和发送等。 开发这样一个Demo的具体步骤如下: 1. 初始化蓝牙适配器:使用Android提供的蓝牙API初始化蓝牙适配器,并判断设备是否支持蓝牙功能。 2. 搜索和配对蓝牙设备:使用适配器进行设备的搜索,并将搜索到的设备显示在应用界面中。用户可以选择一个设备进行配对。 3. 建立连接:通过选中的设备建立蓝牙连接,并监听连接状态的变化。 4. 传输数据:在连接建立后,通过蓝牙通信通道发送和接收数据。 5. 断开连接:通信完成后,主动断开连接。 在开发Demo的过程中,还需要注意以下几点: 1. 蓝牙权限:在AndroidManifest.xml文件中添加蓝牙权限,以便应用能够使用蓝牙功能。 2. 异步操作:蓝牙通信过程中的搜索、配对、连接和数据传输等操作都应该放在子线程中进行,以免阻塞主线程。 3. 错误处理:要对可能的错误情况进行处理,例如设备不支持蓝牙蓝牙未开启或配对失败等情况。 通过实践使用该Demo,开发人员可以更好地掌握Android蓝牙通信技术,为开发实际的蓝牙应用程序提供参考和基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bindebug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值