学习资料:官方手册

Vol 3: Core System Package [Host volume]

Part G: Generic Attribute Profile (GATT)

这篇文章格式比较好,基本上就是对GATT官方文档的翻译:

Bluetooth GATT介绍 https://www.cnblogs.com/hzl6255/p/4158363.html

下面这个图是BLE协议各层跟医院的各个科室的类比图:

跟医院类比,GATT层就是医务室,通过它可以得到各种服务──这些服务由属性组成。

在医院里,底下的检验室提供各种检查结果,由医务室综合起来给病人提供服务。

在BLE里,通过ATT层可以读写对端设备的属性,但是属性之间有什么联系、各个属性怎么组合起来提供服务,由上层GATT负责。

服务,是GATT层的关键字。

在上一节讲述ATT层时,它的属性组成有三部分:handle、type、value,其实还有第4部分:Permissions(权限)。通过ATT边是看不到Permissions的,Permissions由上层定义、使用,ATT Server使用Permissions来决定某个属性是否可读、可写等等。

属性结构如下:

GATT就是在ATT的基础上做两件事:如何定义服务、如何访问服务。

一、如何定义服务

先定义2个名词:Server、Service。Server指服务器,Service指服务,服务器可以提供服务,一个服务器可以提供多个服务。

比如手环可以提供时间服务,心跳服务、计步服务等等。

一个Server可以含有1个或多个Service,

一个Service可以包含其他Service,

一个Service含有1个或多个Characteristic(特性),

一个Characteristic含有性质(Property)、Value;还可以含有Desciptor(描述)。

名词解释:declaration和definition。

declaration含义为声明,definition含义为定义。

声明就是“咳咳咳,大家注意了,我已经把XXX做出来了”,起表明、宣示的作用;

定义就是“大家看一看,这就是我做的XXX”,把实质的内容列出来。

再举个例子,在C程序里,经常在头文件里declaration、声明某个函数,比如“int sum(int a, int b)”;然后在c文件里definition、定义、实现这个函数“int sum(int a, int b) { return a+b;}”。

在BLE中也涉及declaration和definition,比如用某个属性声明这是一个Service,接下来是Service的实质内容,即定义;用某个属性声明这是一个Characteristic,接下来是Characteristic的实质内容,即定义。

注意:这些declaration和definition,都是一个个ATT属性。

① Service的定义:

一个Service定义,从它的“声明”开始,到下一个Service的声明结束;或一直持续到最大的handle值。

所谓“声明”也就是一个属性,这个属性的type为0x2800或0x2801,表示这是一个首要服务(Primary Service)或次要服务(Secondary Service)。

它的value用来表示“这是什么服务”,即value为某个服务的UUID。

Permissions表示该声明即这个ATT属性是只读的,无需验证、无需授权。从这里可以知道,蓝牙设备能提供什么服务是公开的,它无法隐瞒,别的设备都可以来查询该设备提供什么服务。

② Characteristic的定义:

一个Characteristic定义,从它的“声明”开始,到下一个Characteristic的声明结束,或是直到下一个Service的声明结束,或一直持续到最大的handle值。

Characteristic = Characteristic声明 + Characteristic Value声明 + 可能的descriptor声明。

Characteristic声明也是一个ATT属性,type为0x2803,value含有3项内容:

a. Characteristic Properties(特性的性质):

b. Characteristic Value Handle:表示Characteristic  Value的ATT属性的handle

c. Characteristic UUID:表示Characteristic Value的ATT属性的UUID

 

Characteristic Value声明也是一个ATT属性,这一属性的handle和type等于上述ATT属性的b、c两项。

Characteristic声明、Characteristic Value声明,这2个ATT属性的形式如下:

最精简的Service定义如下,它只含有一个Characteristic,一共3个ATT属性:

Service = Service声明 + Characteristic声明 + Characteristic Value声明

 

下面是一个例子(在BLE中,用“«xxx»”表示某个UUID,它实际上是一个值):

其他的ATT属性,比如include definition、Characteristic Descriptor Declaration请看官方协议

二、如何访问服务

GATT层定义了11项Feature,即它可以做哪些事:

1. Server Configuration

2. Primary Service Discovery

3. Relationship Discovery

4. Characteristic Discovery

5. Characteristic Descriptor Discovery

6. Reading a Characteristic Value

7. Writing a Characteristic Value

8. Notification of a Characteristic Value

9. Indication of a Characteristic Value

10. Reading a Characteristic Descriptor

11. Writing a Characteristic Descriptor

这11项Feature,通过“Procedure”(规程)来实现,而Procedure要通过ATT层的Request、Response等等操作来传输数据。

比如“Server Configuration”这个Feature,需要通过“Exchange MTU”这个规程来实现;具体的操作需要Clinet向Server发出“Exchange MTU Request”,而Server可能回复“Exchange MTU Response”或“Error Response”。

Feature、Procedure和ATT层Opcode的对应关系如下图所示:

第15节_BLE协议GATT层的更多相关文章

  1. 第16节_BLE协议GAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...

  2. 第14节_BLE协议ATT层

    下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...

  3. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  4. 第03节-BLE协议各层数据格式概述

    本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...

  5. 第02节-BLE协议各层的形象化理解

    本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...

  6. 第10节-BLE协议链路层(LL)

    本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...

  7. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  8. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  9. 【Lucene3.6.2入门系列】第15节_SolrJ高亮

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...

随机推荐

  1. 环形链表 II

    给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...

  2. HTML简介 页面标记

    HTML简介 HTML 1.0 : 1993年 HTML 2.0 : 1995年 HTML 3.2 : 1997年 HTML 4.01 : 1999年 HTML  5 : 2008年 XML:可扩展标 ...

  3. 【转】Restful架构详解

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  4. 20191004 「HZOJ NOIP2019 Round #9」20191004模拟

    综述 第一次 rk1 ,激动. 题目是 COCI 18/19 Round #1 的三至五题. 得分 \(100+100+20\) \(\mathrm{cipele}\) 问题描述 HZOJ1313 题 ...

  5. GitHub官网基本介绍

    1.当我们进入官网后会出现登陆的界面,这里我一一来解释大概的意思根据图中顺序来解释(1)是输入用户.邮箱.密码的地方.(2)是当你注册好了之后或者已注册之后点击这里跳转到登陆的界面.(3)是当你第一次 ...

  6. python科学计算库-pandas

    ------------恢复内容开始------------ 1.基本概念 在数据分析工作中,Pandas 的使用频率是很高的, 一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 ...

  7. DRF--介绍和安装

    前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用,但是当后端对接 ...

  8. java4wifidog_server_README

    项目地址:https://github.com/C-hill/java4wifidog_server 开发环境:Windows  JDK7  Tomcat6  Myeclipse8.5  MySQL5 ...

  9. 解决 Github 图片加载慢的问题

    一.前言 本文主要介绍一种解决 Github 图片加载慢的方法,亲测有效. 笔者博客是使用 Github 作为图床,每次打开博客时的图片加载很慢或者根本加载不出来.这是因为 GitHub 的 CDN ...

  10. what is variable?

    what is variable? variable:pytorch中的变量,存储tensor,数值会不断变动 在 Torch 中的 Variable 就是一个存放会变化的值的地理位置. 里面的值会不 ...