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 的广播工作流程如下图所示。

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

2.4 广播的网络拓扑结构

大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 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 之上的的,如下图所示:

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

2、Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 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,并且定义了只有第一个是必须的,其它是可选实现的。
3、Characteristic 是在 GATT 事务中的最低界别的,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 定义心率数据格式,接下来就是对应格式的实际心率数据。

实际上,和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。

3.4 更多内容

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 开发的视频。
————————————————
版权声明:本文为CSDN博主「fqerfcqewfd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43172830/article/details/83828092

iOS - GATT Profile 简介相关推荐

  1. GATT Profile 简介

    网上关于讲解 BLE 的内容比较少,看到这篇文章写的非常详细 Introduction to Bluetooth Low Energy,作为 BLE 的入门时介绍是非常合适的.本文主要翻译了一下这篇文 ...

  2. Onvif Profile简介

    Onvif Profile简介 https://www.onvif.org/profiles/ ONVIF Profiles是什么? ONVIF提供很多的profile概要文件,用于规范ONVIF设备 ...

  3. iOS Provisioning Profile(Certificate)与Code Signing详解

    引言 关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做 iOS 开发的同学没少被折腾.对于一个 iOS ...

  4. iOS 版 MWeb 简介— Markdown 编辑利器

    原文地址:http://zh.mweb.im/introducing-mweb-for-ios.html MWeb 首先是一个 Markdown 编辑器,所使用的 Markdown 语法为 Githu ...

  5. Apple iOS MDM service 简介

    2019独角兽企业重金招聘Python工程师标准>>> 转载:http://blog.nienyiho.com/apple-ios-mdm-service-introduction/ ...

  6. iOS Provisioning Profile(配置文件)与Code Signing详解

    关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一个iOS开发小白.半吊 ...

  7. iOS手势操作简介(三)

    监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法是 自定义一个view 实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听view触摸事件,有 ...

  8. iOS手势操作简介(一)

    iOS中能够响应手势操作的类必须要继承自UIResponder,才能够处理手势响应操作. 默认继承了UIResponder的类有:UIApplication UIViewController UIVi ...

  9. iOS 的 XMPPFramework 简介

    XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开 ...

最新文章

  1. 小程序画布画海报保存成图片可以保存实现完整代码
  2. 可搜索本机文档内容软件:anytext(批量检索文档内容)(不是很好用,推荐用filelocator)
  3. c++代码转为go_Go调用C/C++
  4. 四、规则组织的衍生组织——经向破斜组织数学模型的建立
  5. Redis常见面试题详解
  6. raptor累乘流程图_Markdown快速上手指南
  7. 计算机组成原理——Cache与主存的地址映射
  8. PrismJS,一款漂亮的代码高亮工具
  9. 关于Extjs gridpanel设置autoHeight:true时,横向滚动条的问题
  10. 创建SpringMVC项目
  11. oppoa1计算机记录删了怎么办,捡到oppoA1怎么解锁
  12. android 沙盒双开 微信,微信双开回来了,而且还不会被封号
  13. 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
  14. 无锁编程与分布式编程那个更适合多核CPU?
  15. 手机浏览器java_三款最热java手机浏览器横评(组图)
  16. 如果能理解医生的准确意图,深度学习会是医疗诊断的未来吗?
  17. hutool生成二维码
  18. win系统如何运行msi后缀文件
  19. linux之wait函数
  20. 【转载】如何让自己像打王者荣耀一样发了疯、拼了命、石乐志的学习?

热门文章

  1. MySQL——事务管理
  2. 傻瓜教学——什么是while循环语句?以及怎么使用。
  3. 【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换
  4. 洛阳师范学院文科计算机专业,2021年洛阳师范学院重点专业排名及优势王牌专业分数线(文科 理科)...
  5. 2016百度之星 - 初赛(Astar Round2A)解题报告
  6. 数据结构中堆、栈和队列的理解
  7. MySQL---某一列累加
  8. 氪8号积木机器人编程_氪1号 能力风暴 教育机器人 积木系列 (AI,智能,编程)
  9. 查理·芒格推荐的投资人必读书单
  10. DSPACE的道路报错问题