书虫请看原文 Introduction to Bluetooth Low Energy,作为 BLE 的入门时介绍是非常合适的。

1.引言

现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

2.GAP

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

2.1.设备角色

GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。

  • 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
  • 中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。

2.2.广播数据

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

2.3.广播流程

GAP 的广播工作流程如下图所示。 

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

广播的网络拓扑结构

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

3.GATT

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 连接。

3.1.GATT 连接的网络拓扑

下图展示了 GATT 连接网络拓扑结构。这里很清楚的显示,一个外设只能连接一个中心设备,而一个中心设备可以连接多个外

设。一旦建立起了连接,通信就是双向的了,对比前面的 GAP 广播的网络拓扑,GAP 通信是单向的。如果你要让两个设备外设能通信,就只能通过中心设备中转。

3.2. GATT 通信事务

GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应。

一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。

下图展示一个外设(GATT 服务端)和中心设备(GATT 客户端)之间的数据交换流程,可以看到的是,每次都是主设备发起请求:

3.3. GATT 结构

GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的的,如下图所示: 

  • Profile Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。

  • Service Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。

读ATT分组类型,数据格式:

通过空中抓取的数据:

应答数据格式

应答数据包:

读取特征值PDU以及抓包:

获取UUID:

官方通过了一些标准 Service,完整列表在这里。以 Heart Rate Service为例,可以看到它的官方通过 16 bit UUID 是 0x180D,包含 3 个 Characteristic:Heart Rate MeasurementBody 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)。

更多内容

  • Bluetooth SIG 官方文档

    • 蓝牙核心协议文档
    • Bluetooth Developer Portal
    • 官方通过的 BLE Profile
    • 官方通过的 BLE Service
    • 官方通过的 BLE Characteristic
  • 移动开发资源

    • Android BLE GUIDE - Android developer 官网的入门文章,里面有实例代码和讲解视频。
    • Application Accelerator Kit - iOS, Android or Windows Phone 移动开发样例
    • 视频: Core Bluetooth 101 - WWDC 2012 关于 BLE 开发的视频。

蓝牙(三)GATT协议相关推荐

  1. 蓝牙 att gatt 协议

    1 简介 通过ATT层可以读写对端设备的属性,但是属性之间有什么联系.各个属性怎么组合起来提供服务,由上层GATT负责. 读写对端设备的属性,就是ATT的关键词. 2 uuid uuid 通用唯一识别 ...

  2. 【IoT】蓝牙 GAP 和 GATT 协议简析

    文章背景: 理论知识是实践开发的基础,对于产品研发来说更是如此,理论结合实践才可以开发出满足市场需求的稳定产品. 1.基础简介 1.1.profile profile 可以理解为一种规范,一个标准的通 ...

  3. GATT协议及蓝牙核心系统结构

    GATT协议 GATT generic Attributes的缩写,中文是通用属性,是低功耗蓝牙设备之间进行通信的协议. GATT定义了一种多层的数据结构,已连接的低功耗蓝牙设备用它来进行通信. GA ...

  4. GATT协议学习笔记

    目录 前言 一.Server Configuration 1.1 Exchange MTU 二.PRIMARY SERVICE DISCOVERY 2.1 Discover All Primary S ...

  5. 蓝牙人机接口设备协议(HID)概念以及封包格式介绍

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack)传统蓝牙音频协议之蓝牙人机接口设备协议(HID)概念介绍 HID协议有很多应用,比如蓝牙鼠标,键盘,手柄,自拍杆等都会用到HID协议! ...

  6. 蓝牙BLE GATT完全分析和运用

    很多人都做过蓝牙开发,很多人也能够通过仿照GATT例程的方式添加一个属性服务,但是很多人都未必能够清晰地理解BLE的属性profile,也很容易被属性Attribute和特性characteristi ...

  7. ATT 和 GATT 协议学习

    文章目录 1 ATT(Attribute protocol) 1.1 基本概念 1.2 属性 PDU 1.2.1 属性 PDU 格式 1.2.2 顺序协议 1.3 属性协议 PDU 1.3.1 Rea ...

  8. aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读

    家有影院致力于帮助渴望学习.热爱电影.希望通过自己双手搭建出适合自己的家庭影院的朋友.如果你是这样的人,我们和500位同样热爱家庭影院的伙伴愿意一起帮助你实现梦想.同时,我们还能帮助你找到价格优惠的靠 ...

  9. 蓝牙基带协议(baseband specification)

    一.蓝牙基带协议(baseband specification)概述 1.组网方式 微微网(piconet) 点对点,点对多.一个主设备连接255个从设备,最多7个从设备处于active状态. 散射网 ...

  10. aac蓝牙编解码协议_【科普】蓝牙耳机主流编码格式(SBC、AAC、aptX)

    自从2016年,苹果在新款的iPhone上,取消了传统的3.5mm耳机接口,带来了蓝牙耳机的蓬勃发展. 受益于市场的不断增长,蓝牙耳机的技术也在不断进步,现在市面上可供选择的蓝牙耳机可谓是相当的多. ...

最新文章

  1. python3下载教程-《Python3从入门到放弃》视频教程
  2. 数据结构与算法(C++版)
  3. 解决maltab的中文和英文字体问题,中文乱码
  4. Go语言线程与协程之间的关系之GMP模型
  5. JVM 的 工作原理,层次结构 以及 GC工作原理
  6. 符号化Symbol(符号)体系(转载)
  7. java redis使用卡死_jedispool连redis高并发卡死的问题
  8. tableview的reloadData 产生的问题
  9. 活水亭观书有感其一_如何将iPad置于“信息亭”模式,将其限制为单个应用程序...
  10. cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...
  11. PHP开发框架[国内框架]
  12. 面试官 | Oracle JDK 和 OpenJDK 有什么区别?
  13. 利用深度学习识别番茄早期植株中的塔图绝对菌
  14. Helm 3 完整教程(十八):Helm 流控制结构(2)with 语句
  15. 【转】细说@Html.ActionLink()的用法
  16. 高性能高并发服务的瓶颈及突破思路
  17. i.mx6ull uboot移植
  18. linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
  19. 下载google drive文件
  20. matlab plotyy 属性如何调整,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...

热门文章

  1. 项羽为什么会输给刘邦
  2. 【HTLM作业】HTML网页设计--青春在线学校网站设计
  3. mysql熔断机制_go-hystrix熔断机制
  4. 天载炒股分析指数缩量反弹
  5. 取消烦人的自动代理配置
  6. 开发Firefox扩展实战——切换主题
  7. 机器人制作初学者的常见误区
  8. 网页调用exe程序(写注册表)
  9. jdk8 新特性之 函数式接口
  10. 如何将qt的.ui文件转换成.py文件(pycharm+pyuic5+Qtdesigner)以及遇到的问题(自己的记录不是教程)